summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rwxr-xr-x.travis-build.sh67
-rwxr-xr-x.travis-deps.sh40
-rwxr-xr-x.travis-upload.sh129
-rw-r--r--.travis.yml45
-rwxr-xr-x.travis/clang-format/script.sh37
-rwxr-xr-x.travis/common/post-upload.sh22
-rwxr-xr-x.travis/common/pre-upload.sh6
-rwxr-xr-x.travis/linux/build.sh3
-rwxr-xr-x.travis/linux/deps.sh3
-rwxr-xr-x.travis/linux/docker.sh17
-rwxr-xr-x.travis/linux/upload.sh14
-rwxr-xr-x.travis/macos/build.sh12
-rwxr-xr-x.travis/macos/deps.sh4
-rwxr-xr-x.travis/macos/upload.sh110
-rw-r--r--CMakeLists.txt43
-rw-r--r--CMakeModules/DownloadExternals.cmake18
-rw-r--r--README.md2
-rw-r--r--appveyor.yml167
-rw-r--r--dist/citra.icnsbin1027012 -> 211056 bytes
-rw-r--r--dist/citra.icobin509287 -> 370070 bytes
-rw-r--r--dist/citra.manifest24
-rw-r--r--dist/citra.svg80
-rw-r--r--dist/doc-icon.pngbin8791 -> 7768 bytes
-rw-r--r--dist/icons/checked.pngbin0 -> 451 bytes
-rw-r--r--dist/icons/failed.pngbin0 -> 428 bytes
-rw-r--r--dist/icons/icons.qrc6
-rw-r--r--externals/CMakeLists.txt23
m---------externals/cryptopp/cryptopp0
m---------externals/dynarmic0
m---------externals/enet0
m---------externals/soundtouch0
-rw-r--r--src/audio_core/codec.cpp4
-rw-r--r--src/audio_core/codec.h4
-rw-r--r--src/audio_core/hle/source.cpp49
-rw-r--r--src/audio_core/hle/source.h2
-rw-r--r--src/audio_core/interpolate.cpp86
-rw-r--r--src/audio_core/interpolate.h31
-rw-r--r--src/citra/citra.cpp2
-rw-r--r--src/citra/citra.rc8
-rw-r--r--src/citra/config.cpp11
-rw-r--r--src/citra/default_ini.h29
-rw-r--r--src/citra/emu_window/emu_window_sdl2.cpp10
-rw-r--r--src/citra/emu_window/emu_window_sdl2.h4
-rw-r--r--src/citra_qt/CMakeLists.txt8
-rw-r--r--src/citra_qt/bootmanager.cpp10
-rw-r--r--src/citra_qt/bootmanager.h4
-rw-r--r--src/citra_qt/citra-qt.rc12
-rw-r--r--src/citra_qt/configuration/config.cpp23
-rw-r--r--src/citra_qt/configuration/configure.ui15
-rw-r--r--src/citra_qt/configuration/configure_dialog.cpp1
-rw-r--r--src/citra_qt/configuration/configure_graphics.ui33
-rw-r--r--src/citra_qt/configuration/configure_system.cpp3
-rw-r--r--src/citra_qt/configuration/configure_web.cpp102
-rw-r--r--src/citra_qt/configuration/configure_web.h40
-rw-r--r--src/citra_qt/configuration/configure_web.ui190
-rw-r--r--src/citra_qt/debugger/graphics/graphics_cmdlists.cpp4
-rw-r--r--src/citra_qt/debugger/graphics/graphics_surface.cpp3
-rw-r--r--src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp41
-rw-r--r--src/citra_qt/main.cpp48
-rw-r--r--src/citra_qt/main.h2
-rw-r--r--src/citra_qt/ui_settings.h2
-rw-r--r--src/common/common_types.h4
-rw-r--r--src/common/quaternion.h5
-rw-r--r--src/common/scm_rev.cpp.in2
-rw-r--r--src/common/scm_rev.h1
-rw-r--r--src/common/string_util.cpp2
-rw-r--r--src/common/string_util.h2
-rw-r--r--src/common/vector_math.h29
-rw-r--r--src/core/CMakeLists.txt20
-rw-r--r--src/core/arm/arm_interface.h22
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.cpp93
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.h17
-rw-r--r--src/core/arm/dyncom/arm_dyncom.cpp19
-rw-r--r--src/core/arm/dyncom/arm_dyncom.h5
-rw-r--r--src/core/arm/dyncom/arm_dyncom_interpreter.cpp8
-rw-r--r--src/core/arm/skyeye_common/armstate.h2
-rw-r--r--src/core/core.cpp12
-rw-r--r--src/core/core.h9
-rw-r--r--src/core/core_timing.cpp36
-rw-r--r--src/core/core_timing.h6
-rw-r--r--src/core/file_sys/archive_backend.cpp2
-rw-r--r--src/core/file_sys/archive_ncch.cpp29
-rw-r--r--src/core/file_sys/archive_sdmc.cpp41
-rw-r--r--src/core/file_sys/archive_selfncch.cpp60
-rw-r--r--src/core/file_sys/archive_selfncch.h13
-rw-r--r--src/core/file_sys/ncch_container.cpp423
-rw-r--r--src/core/file_sys/ncch_container.h274
-rw-r--r--src/core/file_sys/savedata_archive.cpp41
-rw-r--r--src/core/file_sys/title_metadata.cpp212
-rw-r--r--src/core/file_sys/title_metadata.h125
-rw-r--r--src/core/frontend/emu_window.cpp97
-rw-r--r--src/core/frontend/emu_window.h114
-rw-r--r--src/core/frontend/framebuffer_layout.cpp36
-rw-r--r--src/core/frontend/framebuffer_layout.h11
-rw-r--r--src/core/frontend/input.h25
-rw-r--r--src/core/frontend/motion_emu.cpp89
-rw-r--r--src/core/frontend/motion_emu.h52
-rw-r--r--src/core/gdbstub/gdbstub.cpp24
-rw-r--r--src/core/hle/applets/erreula.cpp4
-rw-r--r--src/core/hle/applets/mii_selector.cpp10
-rw-r--r--src/core/hle/applets/mii_selector.h57
-rw-r--r--src/core/hle/applets/mint.cpp4
-rw-r--r--src/core/hle/applets/swkbd.cpp4
-rw-r--r--src/core/hle/function_wrappers.h108
-rw-r--r--src/core/hle/ipc.h8
-rw-r--r--src/core/hle/ipc_helpers.h12
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp2
-rw-r--r--src/core/hle/kernel/kernel.h5
-rw-r--r--src/core/hle/kernel/memory.cpp30
-rw-r--r--src/core/hle/kernel/memory.h2
-rw-r--r--src/core/hle/kernel/mutex.cpp5
-rw-r--r--src/core/hle/kernel/mutex.h3
-rw-r--r--src/core/hle/kernel/process.cpp3
-rw-r--r--src/core/hle/kernel/resource_limit.cpp2
-rw-r--r--src/core/hle/kernel/resource_limit.h2
-rw-r--r--src/core/hle/kernel/semaphore.cpp3
-rw-r--r--src/core/hle/kernel/semaphore.h3
-rw-r--r--src/core/hle/kernel/shared_memory.cpp30
-rw-r--r--src/core/hle/kernel/shared_memory.h2
-rw-r--r--src/core/hle/kernel/thread.cpp68
-rw-r--r--src/core/hle/kernel/thread.h48
-rw-r--r--src/core/hle/kernel/vm_manager.cpp19
-rw-r--r--src/core/hle/kernel/vm_manager.h6
-rw-r--r--src/core/hle/kernel/wait_object.cpp13
-rw-r--r--src/core/hle/lock.cpp11
-rw-r--r--src/core/hle/lock.h18
-rw-r--r--src/core/hle/service/apt/apt.cpp729
-rw-r--r--src/core/hle/service/apt/apt.h20
-rw-r--r--src/core/hle/service/apt/apt_s.cpp8
-rw-r--r--src/core/hle/service/cam/cam.cpp2
-rw-r--r--src/core/hle/service/cfg/cfg.cpp6
-rw-r--r--src/core/hle/service/cfg/cfg.h2
-rw-r--r--src/core/hle/service/csnd_snd.cpp2
-rw-r--r--src/core/hle/service/dlp/dlp_clnt.cpp21
-rw-r--r--src/core/hle/service/dlp/dlp_fkcl.cpp18
-rw-r--r--src/core/hle/service/dlp/dlp_srvr.cpp9
-rw-r--r--src/core/hle/service/dsp_dsp.cpp7
-rw-r--r--src/core/hle/service/fs/archive.cpp20
-rw-r--r--src/core/hle/service/fs/archive.h7
-rw-r--r--src/core/hle/service/hid/hid.cpp44
-rw-r--r--src/core/hle/service/hid/hid.h2
-rw-r--r--src/core/hle/service/ir/ir_rst.cpp2
-rw-r--r--src/core/hle/service/ldr_ro/cro_helper.h6
-rw-r--r--src/core/hle/service/nim/nim.cpp18
-rw-r--r--src/core/hle/service/nim/nim.h11
-rw-r--r--src/core/hle/service/nim/nim_u.cpp2
-rw-r--r--src/core/hle/service/ns/ns.cpp16
-rw-r--r--src/core/hle/service/ns/ns.h16
-rw-r--r--src/core/hle/service/ns/ns_s.cpp34
-rw-r--r--src/core/hle/service/ns/ns_s.h (renamed from src/core/hle/service/ns_s.h)9
-rw-r--r--src/core/hle/service/ns_s.cpp33
-rw-r--r--src/core/hle/service/nwm/nwm_uds.cpp485
-rw-r--r--src/core/hle/service/nwm/nwm_uds.h12
-rw-r--r--src/core/hle/service/nwm/uds_beacon.cpp7
-rw-r--r--src/core/hle/service/nwm/uds_beacon.h30
-rw-r--r--src/core/hle/service/nwm/uds_connection.cpp88
-rw-r--r--src/core/hle/service/nwm/uds_connection.h56
-rw-r--r--src/core/hle/service/nwm/uds_data.cpp103
-rw-r--r--src/core/hle/service/nwm/uds_data.h86
-rw-r--r--src/core/hle/service/service.cpp5
-rw-r--r--src/core/hle/service/sm/sm.cpp4
-rw-r--r--src/core/hle/service/sm/sm.h3
-rw-r--r--src/core/hle/service/sm/srv.cpp28
-rw-r--r--src/core/hle/service/sm/srv.h1
-rw-r--r--src/core/hw/gpu.cpp20
-rw-r--r--src/core/hw/gpu.h4
-rw-r--r--src/core/loader/3dsx.cpp20
-rw-r--r--src/core/loader/3dsx.h2
-rw-r--r--src/core/loader/elf.cpp16
-rw-r--r--src/core/loader/elf.h2
-rw-r--r--src/core/loader/loader.h35
-rw-r--r--src/core/loader/ncch.cpp371
-rw-r--r--src/core/loader/ncch.h203
-rw-r--r--src/core/loader/nro.cpp12
-rw-r--r--src/core/loader/nro.h2
-rw-r--r--src/core/loader/nso.cpp12
-rw-r--r--src/core/loader/nso.h2
-rw-r--r--src/core/memory.cpp354
-rw-r--r--src/core/memory.h91
-rw-r--r--src/core/memory_setup.h10
-rw-r--r--src/core/settings.cpp2
-rw-r--r--src/core/settings.h11
-rw-r--r--src/core/telemetry_session.cpp86
-rw-r--r--src/core/telemetry_session.h22
-rw-r--r--src/input_common/CMakeLists.txt2
-rw-r--r--src/input_common/main.cpp15
-rw-r--r--src/input_common/main.h7
-rw-r--r--src/input_common/motion_emu.cpp168
-rw-r--r--src/input_common/motion_emu.h46
-rw-r--r--src/input_common/sdl/sdl.cpp2
-rw-r--r--src/network/packet.cpp40
-rw-r--r--src/network/packet.h4
-rw-r--r--src/network/room.cpp89
-rw-r--r--src/network/room.h21
-rw-r--r--src/network/room_member.cpp128
-rw-r--r--src/network/room_member.h59
-rw-r--r--src/tests/CMakeLists.txt4
-rw-r--r--src/tests/core/arm/arm_test_common.cpp137
-rw-r--r--src/tests/core/arm/arm_test_common.h84
-rw-r--r--src/tests/core/arm/dyncom/arm_dyncom_vfp_tests.cpp50
-rw-r--r--src/tests/core/arm/dyncom/vfp_vadd_f32.inc13456
-rw-r--r--src/tests/core/memory/memory.cpp56
-rw-r--r--src/video_core/CMakeLists.txt4
-rw-r--r--src/video_core/command_processor.cpp492
-rw-r--r--src/video_core/geometry_pipeline.cpp274
-rw-r--r--src/video_core/geometry_pipeline.h49
-rw-r--r--src/video_core/pica.cpp21
-rw-r--r--src/video_core/pica_state.h13
-rw-r--r--src/video_core/pica_types.h18
-rw-r--r--src/video_core/primitive_assembly.cpp15
-rw-r--r--src/video_core/primitive_assembly.h7
-rw-r--r--src/video_core/regs_framebuffer.h10
-rw-r--r--src/video_core/regs_pipeline.h43
-rw-r--r--src/video_core/regs_rasterizer.h14
-rw-r--r--src/video_core/regs_shader.h7
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp56
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h9
-rw-r--r--src/video_core/renderer_opengl/gl_shader_gen.cpp115
-rw-r--r--src/video_core/renderer_opengl/gl_state.cpp13
-rw-r--r--src/video_core/renderer_opengl/gl_state.h3
-rw-r--r--src/video_core/shader/shader.cpp44
-rw-r--r--src/video_core/shader/shader.h49
-rw-r--r--src/video_core/shader/shader_interpreter.cpp18
-rw-r--r--src/video_core/shader/shader_jit_x64_compiler.cpp49
-rw-r--r--src/video_core/shader/shader_jit_x64_compiler.h2
-rw-r--r--src/video_core/swrasterizer/clipper.cpp46
-rw-r--r--src/video_core/swrasterizer/framebuffer.cpp2
-rw-r--r--src/video_core/swrasterizer/lighting.cpp308
-rw-r--r--src/video_core/swrasterizer/lighting.h19
-rw-r--r--src/video_core/swrasterizer/rasterizer.cpp29
-rw-r--r--src/video_core/swrasterizer/rasterizer.h6
-rw-r--r--src/video_core/swrasterizer/texturing.cpp4
-rw-r--r--src/video_core/utils.h14
-rw-r--r--src/web_service/CMakeLists.txt2
-rw-r--r--src/web_service/telemetry_json.cpp3
-rw-r--r--src/web_service/telemetry_json.h7
-rw-r--r--src/web_service/verify_login.cpp28
-rw-r--r--src/web_service/verify_login.h24
-rw-r--r--src/web_service/web_backend.cpp138
-rw-r--r--src/web_service/web_backend.h32
241 files changed, 20955 insertions, 2730 deletions
diff --git a/.gitignore b/.gitignore
index ec74b0fa4..7999a40e1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,12 +9,16 @@ src/common/scm_rev.cpp
9# Project/editor files 9# Project/editor files
10*.swp 10*.swp
11.idea/ 11.idea/
12.vs/
12.vscode/ 13.vscode/
13 14
14# *nix related 15# *nix related
15# Common convention for backup or temporary files 16# Common convention for backup or temporary files
16*~ 17*~
17 18
19# Visual Studio CMake settings
20CMakeSettings.json
21
18# OSX global filetypes 22# OSX global filetypes
19# Created by Finder or Spotlight in directories for various OS functionality (indexing, etc) 23# Created by Finder or Spotlight in directories for various OS functionality (indexing, etc)
20.DS_Store 24.DS_Store
diff --git a/.travis-build.sh b/.travis-build.sh
deleted file mode 100755
index df6e236b6..000000000
--- a/.travis-build.sh
+++ /dev/null
@@ -1,67 +0,0 @@
1#!/bin/bash
2
3set -e
4set -x
5
6if grep -nr '\s$' src *.yml *.txt *.md Doxyfile .gitignore .gitmodules .travis* dist/*.desktop \
7 dist/*.svg dist/*.xml; then
8 echo Trailing whitespace found, aborting
9 exit 1
10fi
11
12# Only run clang-format on Linux because we don't have 4.0 on OS X images
13if [ "$TRAVIS_OS_NAME" = "linux" ]; then
14 # Default clang-format points to default 3.5 version one
15 CLANG_FORMAT=clang-format-3.9
16 $CLANG_FORMAT --version
17
18 if [ "$TRAVIS_EVENT_TYPE" = "pull_request" ]; then
19 # Get list of every file modified in this pull request
20 files_to_lint="$(git diff --name-only --diff-filter=ACMRTUXB $TRAVIS_COMMIT_RANGE | grep '^src/[^.]*[.]\(cpp\|h\)$' || true)"
21 else
22 # Check everything for branch pushes
23 files_to_lint="$(find src/ -name '*.cpp' -or -name '*.h')"
24 fi
25
26 # Turn off tracing for this because it's too verbose
27 set +x
28
29 for f in $files_to_lint; do
30 d=$(diff -u "$f" <($CLANG_FORMAT "$f") || true)
31 if ! [ -z "$d" ]; then
32 echo "!!! $f not compliant to coding style, here is the fix:"
33 echo "$d"
34 fail=1
35 fi
36 done
37
38 set -x
39
40 if [ "$fail" = 1 ]; then
41 exit 1
42 fi
43fi
44
45#if OS is linux or is not set
46if [ "$TRAVIS_OS_NAME" = "linux" -o -z "$TRAVIS_OS_NAME" ]; then
47 export CC=gcc-6
48 export CXX=g++-6
49 export PKG_CONFIG_PATH=$HOME/.local/lib/pkgconfig:$PKG_CONFIG_PATH
50
51 mkdir build && cd build
52 cmake ..
53 make -j4
54
55 ctest -VV -C Release
56elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
57 set -o pipefail
58
59 export MACOSX_DEPLOYMENT_TARGET=10.9
60 export Qt5_DIR=$(brew --prefix)/opt/qt5
61
62 mkdir build && cd build
63 cmake .. -GXcode
64 xcodebuild -configuration Release
65
66 ctest -VV -C Release
67fi
diff --git a/.travis-deps.sh b/.travis-deps.sh
deleted file mode 100755
index 451886984..000000000
--- a/.travis-deps.sh
+++ /dev/null
@@ -1,40 +0,0 @@
1#!/bin/sh
2
3set -e
4set -x
5
6#if OS is linux or is not set
7if [ "$TRAVIS_OS_NAME" = "linux" -o -z "$TRAVIS_OS_NAME" ]; then
8 export CC=gcc-6
9 export CXX=g++-6
10 mkdir -p $HOME/.local
11
12 if [ ! -e $HOME/.local/bin/cmake ]; then
13 echo "CMake not found in the cache, get and extract it..."
14 curl -L http://www.cmake.org/files/v3.6/cmake-3.6.3-Linux-x86_64.tar.gz \
15 | tar -xz -C $HOME/.local --strip-components=1
16 else
17 echo "Using cached CMake"
18 fi
19
20 if [ ! -e $HOME/.local/lib/libSDL2.la ]; then
21 echo "SDL2 not found in cache, get and build it..."
22 wget http://libsdl.org/release/SDL2-2.0.5.tar.gz -O - | tar xz
23 cd SDL2-2.0.5
24 ./configure --prefix=$HOME/.local
25 make -j4 && make install
26 else
27 echo "Using cached SDL2"
28 fi
29
30 export DEBIAN_FRONTEND=noninteractive
31 # Amazing placebo security
32 curl http://apt.llvm.org/llvm-snapshot.gpg.key | sudo -E apt-key add -
33 sudo -E add-apt-repository "deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-3.9 main"
34 sudo -E apt-get -yq update
35 sudo -E apt-get -yq install clang-format-3.9
36
37elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
38 brew update
39 brew install qt5 sdl2 dylibbundler
40fi
diff --git a/.travis-upload.sh b/.travis-upload.sh
deleted file mode 100755
index 2cc968298..000000000
--- a/.travis-upload.sh
+++ /dev/null
@@ -1,129 +0,0 @@
1if [ "$TRAVIS_EVENT_TYPE" = "push" ]&&[ "$TRAVIS_BRANCH" = "master" ]; then
2 GITDATE="`git show -s --date=short --format='%ad' | sed 's/-//g'`"
3 GITREV="`git show -s --format='%h'`"
4 mkdir -p artifacts
5
6 if [ "$TRAVIS_OS_NAME" = "linux" -o -z "$TRAVIS_OS_NAME" ]; then
7 REV_NAME="citra-linux-${GITDATE}-${GITREV}"
8 ARCHIVE_NAME="${REV_NAME}.tar.xz"
9 COMPRESSION_FLAGS="-cJvf"
10 mkdir "$REV_NAME"
11
12 cp build/src/citra/citra "$REV_NAME"
13 cp build/src/citra_qt/citra-qt "$REV_NAME"
14 elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
15 REV_NAME="citra-osx-${GITDATE}-${GITREV}"
16 ARCHIVE_NAME="${REV_NAME}.tar.gz"
17 COMPRESSION_FLAGS="-czvf"
18 mkdir "$REV_NAME"
19
20 cp build/src/citra/Release/citra "$REV_NAME"
21 cp -r build/src/citra_qt/Release/citra-qt.app "$REV_NAME"
22
23 # move qt libs into app bundle for deployment
24 $(brew --prefix)/opt/qt5/bin/macdeployqt "${REV_NAME}/citra-qt.app"
25
26 # move SDL2 libs into folder for deployment
27 dylibbundler -b -x "${REV_NAME}/citra" -cd -d "${REV_NAME}/libs" -p "@executable_path/libs/"
28
29 # Make the changes to make the citra-qt app standalone (i.e. not dependent on the current brew installation).
30 # To do this, the absolute references to each and every QT framework must be re-written to point to the local frameworks
31 # (in the Contents/Frameworks folder).
32 # The "install_name_tool" is used to do so.
33
34 # Coreutils is a hack to coerce Homebrew to point to the absolute Cellar path (symlink dereferenced). i.e:
35 # ls -l /usr/local/opt/qt5:: /usr/local/opt/qt5 -> ../Cellar/qt5/5.6.1-1
36 # grealpath ../Cellar/qt5/5.6.1-1:: /usr/local/Cellar/qt5/5.6.1-1
37 brew install coreutils
38
39 REV_NAME_ALT=$REV_NAME/
40 # grealpath is located in coreutils, there is no "realpath" for OS X :(
41 QT_BREWS_PATH=$(grealpath "$(brew --prefix qt5)")
42 BREW_PATH=$(brew --prefix)
43 QT_VERSION_NUM=5
44
45 $BREW_PATH/opt/qt5/bin/macdeployqt "${REV_NAME_ALT}citra-qt.app" \
46 -executable="${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt"
47
48 # These are the files that macdeployqt packed into Contents/Frameworks/ - we don't want those, so we replace them.
49 declare -a macos_libs=("QtCore" "QtWidgets" "QtGui" "QtOpenGL" "QtPrintSupport")
50
51 for macos_lib in "${macos_libs[@]}"
52 do
53 SC_FRAMEWORK_PART=$macos_lib.framework/Versions/$QT_VERSION_NUM/$macos_lib
54 # Replace macdeployqt versions of the Frameworks with our own (from /usr/local/opt/qt5/lib/)
55 cp "$BREW_PATH/opt/qt5/lib/$SC_FRAMEWORK_PART" "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$SC_FRAMEWORK_PART"
56
57 # Replace references within the embedded Framework files with "internal" versions.
58 for macos_lib2 in "${macos_libs[@]}"
59 do
60 # Since brew references both the non-symlinked and symlink paths of QT5, it needs to be duplicated.
61 # /usr/local/Cellar/qt5/5.6.1-1/lib and /usr/local/opt/qt5/lib both resolve to the same files.
62 # So the two lines below are effectively duplicates when resolved as a path, but as strings, they aren't.
63 RM_FRAMEWORK_PART=$macos_lib2.framework/Versions/$QT_VERSION_NUM/$macos_lib2
64 install_name_tool -change \
65 $QT_BREWS_PATH/lib/$RM_FRAMEWORK_PART \
66 @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
67 "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$SC_FRAMEWORK_PART"
68 install_name_tool -change \
69 "$BREW_PATH/opt/qt5/lib/$RM_FRAMEWORK_PART" \
70 @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
71 "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$SC_FRAMEWORK_PART"
72 done
73 done
74
75 # Handles `This application failed to start because it could not find or load the Qt platform plugin "cocoa"`
76 # Which manifests itself as:
77 # "Exception Type: EXC_CRASH (SIGABRT) | Exception Codes: 0x0000000000000000, 0x0000000000000000 | Exception Note: EXC_CORPSE_NOTIFY"
78 # There may be more dylibs needed to be fixed...
79 declare -a macos_plugins=("Plugins/platforms/libqcocoa.dylib")
80
81 for macos_lib in "${macos_plugins[@]}"
82 do
83 install_name_tool -id @executable_path/../$macos_lib "${REV_NAME_ALT}citra-qt.app/Contents/$macos_lib"
84 for macos_lib2 in "${macos_libs[@]}"
85 do
86 RM_FRAMEWORK_PART=$macos_lib2.framework/Versions/$QT_VERSION_NUM/$macos_lib2
87 install_name_tool -change \
88 $QT_BREWS_PATH/lib/$RM_FRAMEWORK_PART \
89 @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
90 "${REV_NAME_ALT}citra-qt.app/Contents/$macos_lib"
91 install_name_tool -change \
92 "$BREW_PATH/opt/qt5/lib/$RM_FRAMEWORK_PART" \
93 @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
94 "${REV_NAME_ALT}citra-qt.app/Contents/$macos_lib"
95 done
96 done
97
98 for macos_lib in "${macos_libs[@]}"
99 do
100 # Debugging info for Travis-CI
101 otool -L "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$macos_lib.framework/Versions/$QT_VERSION_NUM/$macos_lib"
102 done
103
104 # Make the citra-qt.app application launch a debugging terminal.
105 # Store away the actual binary
106 mv ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt-bin
107
108 cat > ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt <<EOL
109#!/usr/bin/env bash
110cd "\`dirname "\$0"\`"
111chmod +x citra-qt-bin
112open citra-qt-bin --args "\$@"
113EOL
114 # Content that will serve as the launching script for citra (within the .app folder)
115
116 # Make the launching script executable
117 chmod +x ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt
118
119 fi
120
121 # Copy documentation
122 cp license.txt "$REV_NAME"
123 cp README.md "$REV_NAME"
124
125 tar $COMPRESSION_FLAGS "$ARCHIVE_NAME" "$REV_NAME"
126
127 # move the compiled archive into the artifacts directory to be uploaded by travis releases
128 mv "$ARCHIVE_NAME" artifacts/
129fi
diff --git a/.travis.yml b/.travis.yml
index cdb638f7a..8bad23208 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,38 +2,39 @@ language: cpp
2matrix: 2matrix:
3 include: 3 include:
4 - os: linux 4 - os: linux
5 env: NAME="linux build"
5 sudo: required 6 sudo: required
6 dist: trusty 7 dist: trusty
8 services: docker
9 addons:
10 apt:
11 packages:
12 - p7zip-full
13 install: "./.travis/linux/deps.sh"
14 script: "./.travis/linux/build.sh"
15 after_success: "./.travis/linux/upload.sh"
7 - os: osx 16 - os: osx
17 env: NAME="macos build"
8 sudo: false 18 sudo: false
9 osx_image: xcode7.3 19 osx_image: xcode7.3
10 20 install: "./.travis/macos/deps.sh"
11addons: 21 script: "./.travis/macos/build.sh"
12 apt: 22 after_success: "./.travis/macos/upload.sh"
13 sources: 23 - os: linux
14 - ubuntu-toolchain-r-test 24 env: NAME="clang-format"
15 packages: 25 dist: trusty
16 - gcc-6 26 addons:
17 - g++-6 27 apt:
18 - qt5-default 28 packages:
19 - libqt5opengl5-dev 29 - clang-format-3.9
20 - xorg-dev 30 script: "./.travis/clang-format/script.sh"
21 - lib32stdc++6 # For CMake
22
23cache:
24 directories:
25 - "$HOME/.local"
26
27install: "./.travis-deps.sh"
28script: "./.travis-build.sh"
29after_success: "./.travis-upload.sh"
30 31
31deploy: 32deploy:
32 provider: releases 33 provider: releases
33 api_key: 34 api_key:
34 secure: Mck15DIWaJdxDiS3aYVlM9N3G6y8VKUI1rnwII7/iolfm1s94U+tgvbheZDmT7SSbFyaGaYO/E8HrV/uZR9Vvs7ev20sHsTN1u60OTWfDIIyHs9SqjhcGbtq95m9/dMFschOYqTOR+gAs5BsxjuoeAotHdhpQEwvkO2oo5oR0zhGy45gjFnVvtcxT/IfpZBIpVgcK3aLb9zT6ekcJbSiPmEB15iLq3xXd0nFUNtEZdX3D6Veye4n5jB6n72qN8JVoKvPZAwaC2K0pZxpcGJaXDchLsw1q+4eCvdz6UJfUemeQ/uMAmjfeQ3wrzYGXe3nCM3WmX5wosCsB0mw4zYatzl3si6CZ1W+0GkV4Rwlx03dfp7v3EeFhTsXYCaXqhwuLZnWOLUik8t9vaSoFUx4nUIRwfO9kAMUJQSpLuHNO2nT01s3GxvqxzczuLQ9he5nGSi0RRodUzDwek1qUp6I4uV3gRHKz4B07YIc1i2fK88NLXjyQ0uLVZ+7Oq1+kgDp6+N7vvXXZ5qZ17tdaysSbKEE0Y8zsoXw7Rk1tPN19vrCS+TSpomNMyQyne1k+I5iZ/qkxPTLAS5qI6Utc2dL3GJdxWRAEfGNO9AIX3GV/jmmKfdcvwGsCYP8hxqs5vLYfgacw3D8NLf1941lQUwavC17jm9EV9g5G3Pn1Cp516E= 35 secure: Mck15DIWaJdxDiS3aYVlM9N3G6y8VKUI1rnwII7/iolfm1s94U+tgvbheZDmT7SSbFyaGaYO/E8HrV/uZR9Vvs7ev20sHsTN1u60OTWfDIIyHs9SqjhcGbtq95m9/dMFschOYqTOR+gAs5BsxjuoeAotHdhpQEwvkO2oo5oR0zhGy45gjFnVvtcxT/IfpZBIpVgcK3aLb9zT6ekcJbSiPmEB15iLq3xXd0nFUNtEZdX3D6Veye4n5jB6n72qN8JVoKvPZAwaC2K0pZxpcGJaXDchLsw1q+4eCvdz6UJfUemeQ/uMAmjfeQ3wrzYGXe3nCM3WmX5wosCsB0mw4zYatzl3si6CZ1W+0GkV4Rwlx03dfp7v3EeFhTsXYCaXqhwuLZnWOLUik8t9vaSoFUx4nUIRwfO9kAMUJQSpLuHNO2nT01s3GxvqxzczuLQ9he5nGSi0RRodUzDwek1qUp6I4uV3gRHKz4B07YIc1i2fK88NLXjyQ0uLVZ+7Oq1+kgDp6+N7vvXXZ5qZ17tdaysSbKEE0Y8zsoXw7Rk1tPN19vrCS+TSpomNMyQyne1k+I5iZ/qkxPTLAS5qI6Utc2dL3GJdxWRAEfGNO9AIX3GV/jmmKfdcvwGsCYP8hxqs5vLYfgacw3D8NLf1941lQUwavC17jm9EV9g5G3Pn1Cp516E=
35 file_glob: true 36 file_glob: true
36 file: "artifacts/*.tar.*" 37 file: "artifacts/*"
37 skip_cleanup: true 38 skip_cleanup: true
38 on: 39 on:
39 repo: citra-emu/citra-nightly 40 tags: true
diff --git a/.travis/clang-format/script.sh b/.travis/clang-format/script.sh
new file mode 100755
index 000000000..80a0f47e5
--- /dev/null
+++ b/.travis/clang-format/script.sh
@@ -0,0 +1,37 @@
1#!/bin/bash -ex
2
3if grep -nr '\s$' src *.yml *.txt *.md Doxyfile .gitignore .gitmodules .travis* dist/*.desktop \
4 dist/*.svg dist/*.xml; then
5 echo Trailing whitespace found, aborting
6 exit 1
7fi
8
9# Default clang-format points to default 3.5 version one
10CLANG_FORMAT=clang-format-3.9
11$CLANG_FORMAT --version
12
13if [ "$TRAVIS_EVENT_TYPE" = "pull_request" ]; then
14 # Get list of every file modified in this pull request
15 files_to_lint="$(git diff --name-only --diff-filter=ACMRTUXB $TRAVIS_COMMIT_RANGE | grep '^src/[^.]*[.]\(cpp\|h\)$' || true)"
16else
17 # Check everything for branch pushes
18 files_to_lint="$(find src/ -name '*.cpp' -or -name '*.h')"
19fi
20
21# Turn off tracing for this because it's too verbose
22set +x
23
24for f in $files_to_lint; do
25 d=$(diff -u "$f" <($CLANG_FORMAT "$f") || true)
26 if ! [ -z "$d" ]; then
27 echo "!!! $f not compliant to coding style, here is the fix:"
28 echo "$d"
29 fail=1
30 fi
31done
32
33set -x
34
35if [ "$fail" = 1 ]; then
36 exit 1
37fi
diff --git a/.travis/common/post-upload.sh b/.travis/common/post-upload.sh
new file mode 100755
index 000000000..90deaaec8
--- /dev/null
+++ b/.travis/common/post-upload.sh
@@ -0,0 +1,22 @@
1#!/bin/bash -ex
2
3# Copy documentation
4cp license.txt "$REV_NAME"
5cp README.md "$REV_NAME"
6
7tar $COMPRESSION_FLAGS "$ARCHIVE_NAME" "$REV_NAME"
8
9# Find out what release we are building
10if [ -z $TRAVIS_TAG ]; then
11 RELEASE_NAME=head
12else
13 RELEASE_NAME=$(echo $TRAVIS_TAG | cut -d- -f1)
14fi
15
16mv "$REV_NAME" $RELEASE_NAME
17
187z a "$REV_NAME.7z" $RELEASE_NAME
19
20# move the compiled archive into the artifacts directory to be uploaded by travis releases
21mv "$ARCHIVE_NAME" artifacts/
22mv "$REV_NAME.7z" artifacts/
diff --git a/.travis/common/pre-upload.sh b/.travis/common/pre-upload.sh
new file mode 100755
index 000000000..3c2fc79a2
--- /dev/null
+++ b/.travis/common/pre-upload.sh
@@ -0,0 +1,6 @@
1#!/bin/bash -ex
2
3GITDATE="`git show -s --date=short --format='%ad' | sed 's/-//g'`"
4GITREV="`git show -s --format='%h'`"
5
6mkdir -p artifacts
diff --git a/.travis/linux/build.sh b/.travis/linux/build.sh
new file mode 100755
index 000000000..98433d184
--- /dev/null
+++ b/.travis/linux/build.sh
@@ -0,0 +1,3 @@
1#!/bin/bash -ex
2
3docker run -v $(pwd):/citra ubuntu:16.04 /bin/bash /citra/.travis/linux/docker.sh
diff --git a/.travis/linux/deps.sh b/.travis/linux/deps.sh
new file mode 100755
index 000000000..be3f6bece
--- /dev/null
+++ b/.travis/linux/deps.sh
@@ -0,0 +1,3 @@
1#!/bin/sh -ex
2
3docker pull ubuntu:16.04
diff --git a/.travis/linux/docker.sh b/.travis/linux/docker.sh
new file mode 100755
index 000000000..e27af5600
--- /dev/null
+++ b/.travis/linux/docker.sh
@@ -0,0 +1,17 @@
1#!/bin/bash -ex
2
3cd /citra
4
5apt-get update
6apt-get install -y build-essential libsdl2-dev qtbase5-dev libqt5opengl5-dev libcurl4-openssl-dev libssl-dev wget git
7
8# Get a recent version of CMake
9wget https://cmake.org/files/v3.9/cmake-3.9.0-Linux-x86_64.sh
10echo y | sh cmake-3.9.0-Linux-x86_64.sh --prefix=cmake
11export PATH=/citra/cmake/cmake-3.9.0-Linux-x86_64/bin:$PATH
12
13mkdir build && cd build
14cmake .. -DUSE_SYSTEM_CURL=ON -DCMAKE_BUILD_TYPE=Release
15make -j4
16
17ctest -VV -C Release
diff --git a/.travis/linux/upload.sh b/.travis/linux/upload.sh
new file mode 100755
index 000000000..dd265e0fd
--- /dev/null
+++ b/.travis/linux/upload.sh
@@ -0,0 +1,14 @@
1#!/bin/bash -ex
2
3. .travis/common/pre-upload.sh
4
5REV_NAME="citra-linux-${GITDATE}-${GITREV}"
6ARCHIVE_NAME="${REV_NAME}.tar.xz"
7COMPRESSION_FLAGS="-cJvf"
8
9mkdir "$REV_NAME"
10
11cp build/src/citra/citra "$REV_NAME"
12cp build/src/citra_qt/citra-qt "$REV_NAME"
13
14. .travis/common/post-upload.sh
diff --git a/.travis/macos/build.sh b/.travis/macos/build.sh
new file mode 100755
index 000000000..c957cdf21
--- /dev/null
+++ b/.travis/macos/build.sh
@@ -0,0 +1,12 @@
1#!/bin/bash -ex
2
3set -o pipefail
4
5export MACOSX_DEPLOYMENT_TARGET=10.9
6export Qt5_DIR=$(brew --prefix)/opt/qt5
7
8mkdir build && cd build
9cmake .. -DUSE_SYSTEM_CURL=ON -DCMAKE_OSX_ARCHITECTURES="x86_64;x86_64h" -DCMAKE_BUILD_TYPE=Release
10make -j4
11
12ctest -VV -C Release
diff --git a/.travis/macos/deps.sh b/.travis/macos/deps.sh
new file mode 100755
index 000000000..30ec99b62
--- /dev/null
+++ b/.travis/macos/deps.sh
@@ -0,0 +1,4 @@
1#!/bin/sh -ex
2
3brew update
4brew install qt5 sdl2 dylibbundler p7zip
diff --git a/.travis/macos/upload.sh b/.travis/macos/upload.sh
new file mode 100755
index 000000000..19c80fdf0
--- /dev/null
+++ b/.travis/macos/upload.sh
@@ -0,0 +1,110 @@
1#!/bin/bash -ex
2
3. .travis/common/pre-upload.sh
4
5REV_NAME="citra-osx-${GITDATE}-${GITREV}"
6ARCHIVE_NAME="${REV_NAME}.tar.gz"
7COMPRESSION_FLAGS="-czvf"
8
9mkdir "$REV_NAME"
10
11cp build/src/citra/citra "$REV_NAME"
12cp -r build/src/citra_qt/citra-qt.app "$REV_NAME"
13
14# move qt libs into app bundle for deployment
15$(brew --prefix)/opt/qt5/bin/macdeployqt "${REV_NAME}/citra-qt.app"
16
17# move SDL2 libs into folder for deployment
18dylibbundler -b -x "${REV_NAME}/citra" -cd -d "${REV_NAME}/libs" -p "@executable_path/libs/"
19
20# Make the changes to make the citra-qt app standalone (i.e. not dependent on the current brew installation).
21# To do this, the absolute references to each and every QT framework must be re-written to point to the local frameworks
22# (in the Contents/Frameworks folder).
23# The "install_name_tool" is used to do so.
24
25# Coreutils is a hack to coerce Homebrew to point to the absolute Cellar path (symlink dereferenced). i.e:
26# ls -l /usr/local/opt/qt5:: /usr/local/opt/qt5 -> ../Cellar/qt5/5.6.1-1
27# grealpath ../Cellar/qt5/5.6.1-1:: /usr/local/Cellar/qt5/5.6.1-1
28brew install coreutils || brew upgrade coreutils || true
29
30REV_NAME_ALT=$REV_NAME/
31# grealpath is located in coreutils, there is no "realpath" for OS X :(
32QT_BREWS_PATH=$(grealpath "$(brew --prefix qt5)")
33BREW_PATH=$(brew --prefix)
34QT_VERSION_NUM=5
35
36$BREW_PATH/opt/qt5/bin/macdeployqt "${REV_NAME_ALT}citra-qt.app" \
37 -executable="${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt"
38
39# These are the files that macdeployqt packed into Contents/Frameworks/ - we don't want those, so we replace them.
40declare -a macos_libs=("QtCore" "QtWidgets" "QtGui" "QtOpenGL" "QtPrintSupport")
41
42for macos_lib in "${macos_libs[@]}"
43do
44 SC_FRAMEWORK_PART=$macos_lib.framework/Versions/$QT_VERSION_NUM/$macos_lib
45 # Replace macdeployqt versions of the Frameworks with our own (from /usr/local/opt/qt5/lib/)
46 cp "$BREW_PATH/opt/qt5/lib/$SC_FRAMEWORK_PART" "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$SC_FRAMEWORK_PART"
47
48 # Replace references within the embedded Framework files with "internal" versions.
49 for macos_lib2 in "${macos_libs[@]}"
50 do
51 # Since brew references both the non-symlinked and symlink paths of QT5, it needs to be duplicated.
52 # /usr/local/Cellar/qt5/5.6.1-1/lib and /usr/local/opt/qt5/lib both resolve to the same files.
53 # So the two lines below are effectively duplicates when resolved as a path, but as strings, they aren't.
54 RM_FRAMEWORK_PART=$macos_lib2.framework/Versions/$QT_VERSION_NUM/$macos_lib2
55 install_name_tool -change \
56 $QT_BREWS_PATH/lib/$RM_FRAMEWORK_PART \
57 @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
58 "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$SC_FRAMEWORK_PART"
59 install_name_tool -change \
60 "$BREW_PATH/opt/qt5/lib/$RM_FRAMEWORK_PART" \
61 @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
62 "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$SC_FRAMEWORK_PART"
63 done
64done
65
66# Handles `This application failed to start because it could not find or load the Qt platform plugin "cocoa"`
67# Which manifests itself as:
68# "Exception Type: EXC_CRASH (SIGABRT) | Exception Codes: 0x0000000000000000, 0x0000000000000000 | Exception Note: EXC_CORPSE_NOTIFY"
69# There may be more dylibs needed to be fixed...
70declare -a macos_plugins=("Plugins/platforms/libqcocoa.dylib")
71
72for macos_lib in "${macos_plugins[@]}"
73do
74 install_name_tool -id @executable_path/../$macos_lib "${REV_NAME_ALT}citra-qt.app/Contents/$macos_lib"
75 for macos_lib2 in "${macos_libs[@]}"
76 do
77 RM_FRAMEWORK_PART=$macos_lib2.framework/Versions/$QT_VERSION_NUM/$macos_lib2
78 install_name_tool -change \
79 $QT_BREWS_PATH/lib/$RM_FRAMEWORK_PART \
80 @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
81 "${REV_NAME_ALT}citra-qt.app/Contents/$macos_lib"
82 install_name_tool -change \
83 "$BREW_PATH/opt/qt5/lib/$RM_FRAMEWORK_PART" \
84 @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
85 "${REV_NAME_ALT}citra-qt.app/Contents/$macos_lib"
86 done
87done
88
89for macos_lib in "${macos_libs[@]}"
90do
91 # Debugging info for Travis-CI
92 otool -L "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$macos_lib.framework/Versions/$QT_VERSION_NUM/$macos_lib"
93done
94
95# Make the citra-qt.app application launch a debugging terminal.
96# Store away the actual binary
97mv ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt-bin
98
99cat > ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt <<EOL
100#!/usr/bin/env bash
101cd "\`dirname "\$0"\`"
102chmod +x citra-qt-bin
103open citra-qt-bin --args "\$@"
104EOL
105# Content that will serve as the launching script for citra (within the .app folder)
106
107# Make the launching script executable
108chmod +x ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt
109
110. .travis/common/post-upload.sh
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9151ff786..d9c2f78a2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,6 +2,7 @@
2cmake_minimum_required(VERSION 3.6) 2cmake_minimum_required(VERSION 3.6)
3list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules") 3list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
4list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules") 4list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
5include(DownloadExternals)
5 6
6project(citra) 7project(citra)
7 8
@@ -12,6 +13,15 @@ option(ENABLE_QT "Enable the Qt frontend" ON)
12option(CITRA_USE_BUNDLED_QT "Download bundled Qt binaries" OFF) 13option(CITRA_USE_BUNDLED_QT "Download bundled Qt binaries" OFF)
13 14
14option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON) 15option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
16option(CITRA_USE_BUNDLED_CURL "FOR MINGW ONLY: Download curl configured against winssl instead of openssl" OFF)
17if (ENABLE_WEB_SERVICE AND CITRA_USE_BUNDLED_CURL AND WINDOWS AND MSVC)
18 message("Turning off use bundled curl as msvc can compile curl on cpr")
19 SET(CITRA_USE_BUNDLED_CURL OFF CACHE BOOL "" FORCE)
20endif()
21if (ENABLE_WEB_SERVICE AND NOT CITRA_USE_BUNDLED_CURL AND MINGW)
22 message(AUTHOR_WARNING "Turning on CITRA_USE_BUNDLED_CURL. Override it only if you know what you are doing.")
23 SET(CITRA_USE_BUNDLED_CURL ON CACHE BOOL "" FORCE)
24endif()
15 25
16if(NOT EXISTS ${CMAKE_SOURCE_DIR}/.git/hooks/pre-commit) 26if(NOT EXISTS ${CMAKE_SOURCE_DIR}/.git/hooks/pre-commit)
17 message(STATUS "Copying pre-commit hook") 27 message(STATUS "Copying pre-commit hook")
@@ -129,8 +139,8 @@ else()
129 set(CMAKE_C_FLAGS_RELEASE "/O2 /GS- /MD" CACHE STRING "" FORCE) 139 set(CMAKE_C_FLAGS_RELEASE "/O2 /GS- /MD" CACHE STRING "" FORCE)
130 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "" FORCE) 140 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "" FORCE)
131 141
132 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG" CACHE STRING "" FORCE) 142 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG /MANIFEST:NO" CACHE STRING "" FORCE)
133 set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE) 143 set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE)
134endif() 144endif()
135 145
136# Set file offset size to 64 bits. 146# Set file offset size to 64 bits.
@@ -151,24 +161,6 @@ set_property(DIRECTORY APPEND PROPERTY
151# System imported libraries 161# System imported libraries
152# ====================== 162# ======================
153 163
154# This function downloads a binary library package from our external repo.
155# Params:
156# remote_path: path to the file to download, relative to the remote repository root
157# prefix_var: name of a variable which will be set with the path to the extracted contents
158function(download_bundled_external remote_path lib_name prefix_var)
159 set(prefix "${CMAKE_BINARY_DIR}/externals/${lib_name}")
160 if (NOT EXISTS "${prefix}")
161 message(STATUS "Downloading binaries for ${lib_name}...")
162 file(DOWNLOAD
163 https://github.com/citra-emu/ext-windows-bin/raw/master/${remote_path}${lib_name}.7z
164 "${CMAKE_BINARY_DIR}/externals/${lib_name}.7z" SHOW_PROGRESS)
165 execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${CMAKE_BINARY_DIR}/externals/${lib_name}.7z"
166 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals")
167 endif()
168 message(STATUS "Using bundled binaries at ${prefix}")
169 set(${prefix_var} "${prefix}" PARENT_SCOPE)
170endfunction()
171
172find_package(PNG QUIET) 164find_package(PNG QUIET)
173if (NOT PNG_FOUND) 165if (NOT PNG_FOUND)
174 message(STATUS "libpng not found. Some debugging features have been disabled.") 166 message(STATUS "libpng not found. Some debugging features have been disabled.")
@@ -295,15 +287,22 @@ function(create_directory_groups)
295 endforeach() 287 endforeach()
296endfunction() 288endfunction()
297 289
298# generate git revision information 290# Gets a UTC timstamp and sets the provided variable to it
291function(get_timestamp _var)
292 string(TIMESTAMP timestamp UTC)
293 set(${_var} "${timestamp}" PARENT_SCOPE)
294endfunction()
295
296# generate git/build information
299include(GetGitRevisionDescription) 297include(GetGitRevisionDescription)
300get_git_head_revision(GIT_REF_SPEC GIT_REV) 298get_git_head_revision(GIT_REF_SPEC GIT_REV)
301git_describe(GIT_DESC --always --long --dirty) 299git_describe(GIT_DESC --always --long --dirty)
302git_branch_name(GIT_BRANCH) 300git_branch_name(GIT_BRANCH)
301get_timestamp(BUILD_DATE)
303 302
303enable_testing()
304add_subdirectory(externals) 304add_subdirectory(externals)
305add_subdirectory(src) 305add_subdirectory(src)
306enable_testing()
307 306
308 307
309# Installation instructions 308# Installation instructions
diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake
new file mode 100644
index 000000000..138a15d5a
--- /dev/null
+++ b/CMakeModules/DownloadExternals.cmake
@@ -0,0 +1,18 @@
1
2# This function downloads a binary library package from our external repo.
3# Params:
4# remote_path: path to the file to download, relative to the remote repository root
5# prefix_var: name of a variable which will be set with the path to the extracted contents
6function(download_bundled_external remote_path lib_name prefix_var)
7set(prefix "${CMAKE_BINARY_DIR}/externals/${lib_name}")
8if (NOT EXISTS "${prefix}")
9 message(STATUS "Downloading binaries for ${lib_name}...")
10 file(DOWNLOAD
11 https://github.com/citra-emu/ext-windows-bin/raw/master/${remote_path}${lib_name}.7z
12 "${CMAKE_BINARY_DIR}/externals/${lib_name}.7z" SHOW_PROGRESS)
13 execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${CMAKE_BINARY_DIR}/externals/${lib_name}.7z"
14 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals")
15endif()
16message(STATUS "Using bundled binaries at ${prefix}")
17set(${prefix_var} "${prefix}" PARENT_SCOPE)
18endfunction() \ No newline at end of file
diff --git a/README.md b/README.md
index e766918f7..31f5afe27 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ For development discussion, please join us @ #citra on freenode.
17 17
18Most of the development happens on GitHub. It's also where [our central repository](https://github.com/citra-emu/citra) is hosted. 18Most of the development happens on GitHub. It's also where [our central repository](https://github.com/citra-emu/citra) is hosted.
19 19
20If you want to contribute please take a look at the [Contributor's Guide](CONTRIBUTING.md), [TODO list](https://docs.google.com/document/d/1SWIop0uBI9IW8VGg97TAtoT_CHNoP42FzYmvG1F4QDA) and [Developer Information](https://github.com/citra-emu/citra/wiki/Developer-Information). You should as well contact any of the developers in the forum in order to know about the current state of the emulator. 20If you want to contribute please take a look at the [Contributor's Guide](CONTRIBUTING.md) and [Developer Information](https://github.com/citra-emu/citra/wiki/Developer-Information). You should as well contact any of the developers in the forum in order to know about the current state of the emulator because the [TODO list](https://docs.google.com/document/d/1SWIop0uBI9IW8VGg97TAtoT_CHNoP42FzYmvG1F4QDA) isn't maintained anymore.
21 21
22### Building 22### Building
23 23
diff --git a/appveyor.yml b/appveyor.yml
index 9a6206a8b..5524eb576 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,15 +1,21 @@
1# shallow clone 1# shallow clone
2clone_depth: 10 2clone_depth: 10
3 3
4# don't build on tag
5skip_tags: true
6
7cache: 4cache:
8 - C:\ProgramData\chocolatey\bin -> appveyor.yml 5 - C:\ProgramData\chocolatey\bin -> appveyor.yml
9 - C:\ProgramData\chocolatey\lib -> appveyor.yml 6 - C:\ProgramData\chocolatey\lib -> appveyor.yml
10 7
11os: Visual Studio 2017 8os: Visual Studio 2017
12 9
10environment:
11 # Tell msys2 to add mingw64 to the path
12 MSYSTEM: MINGW64
13 # Tell msys2 to inherit the current directory when starting the shell
14 CHERE_INVOKING: 1
15 matrix:
16 - BUILD_TYPE: mingw
17 - BUILD_TYPE: msvc
18
13platform: 19platform:
14 - x64 20 - x64
15 21
@@ -18,59 +24,150 @@ configuration:
18 24
19install: 25install:
20 - git submodule update --init --recursive 26 - git submodule update --init --recursive
27 - ps: |
28 if ($env:BUILD_TYPE -eq 'mingw') {
29 $dependencies = "mingw64/mingw-w64-x86_64-cmake",
30 "mingw64/mingw-w64-x86_64-qt5",
31 "mingw64/mingw-w64-x86_64-curl",
32 "mingw64/mingw-w64-x86_64-SDL2"
33 # redirect err to null to prevent warnings from becoming errors
34 # workaround to prevent pacman from failing due to cyclical dependencies
35 C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S mingw64/mingw-w64-x86_64-freetype mingw64/mingw-w64-x86_64-fontconfig" 2> $null
36 C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S $dependencies" 2> $null
37 }
21 38
22before_build: 39before_build:
23 - mkdir build 40 - mkdir %BUILD_TYPE%_build
24 - cd build 41 - cd %BUILD_TYPE%_build
25 - cmake -G "Visual Studio 15 2017 Win64" -DCITRA_USE_BUNDLED_QT=1 -DCITRA_USE_BUNDLED_SDL2=1 -DCMAKE_USE_OPENSSL=0 .. 42 - ps: |
43 if ($env:BUILD_TYPE -eq 'msvc') {
44 # redirect stderr and change the exit code to prevent powershell from cancelling the build if cmake prints a warning
45 cmd /C 'cmake -G "Visual Studio 15 2017 Win64" -DCITRA_USE_BUNDLED_QT=1 -DCITRA_USE_BUNDLED_SDL2=1 -DCMAKE_USE_OPENSSL=0 .. 2>&1 && exit 0'
46 } else {
47 C:\msys64\usr\bin\bash.exe -lc "cmake -G 'MSYS Makefiles' -DUSE_SYSTEM_CURL=1 -DCITRA_USE_BUNDLED_CURL=1 -DCMAKE_BUILD_TYPE=Release .. 2>&1"
48 }
26 - cd .. 49 - cd ..
27 50
28build: 51build_script:
29 project: build/citra.sln 52 - ps: |
30 parallel: true 53 if ($env:BUILD_TYPE -eq 'msvc') {
54 # https://www.appveyor.com/docs/build-phase
55 msbuild msvc_build/citra.sln /maxcpucount /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
56 } else {
57 C:\msys64\usr\bin\bash.exe -lc 'mingw32-make -C mingw_build/ 2>&1'
58 }
31 59
32after_build: 60after_build:
33 - ps: | 61 - ps: |
34 $GITDATE = $(git show -s --date=short --format='%ad') -replace "-","" 62 $GITDATE = $(git show -s --date=short --format='%ad') -replace "-",""
35 $GITREV = $(git show -s --format='%h') 63 $GITREV = $(git show -s --format='%h')
36 $GIT_LONG_HASH = $(git rev-parse HEAD)
37 # Where are these spaces coming from? Regardless, let's remove them
38 $MSVC_BUILD_NAME = "citra-windows-msvc-$GITDATE-$GITREV.zip" -replace " ", ""
39 $MSVC_BUILD_PDB = "citra-windows-msvc-$GITDATE-$GITREV-debugsymbols.zip" -replace " ", ""
40 $BINTRAY_VERSION = "nightly-$GIT_LONG_HASH" -replace " ", ""
41 64
42 # set the build names as env vars so the artifacts can upload them 65 # Find out which kind of release we are producing by tag name
43 $env:MSVC_BUILD_NAME = $MSVC_BUILD_NAME 66 if ($env:APPVEYOR_REPO_TAG_NAME) {
44 $env:MSVC_BUILD_PDB = $MSVC_BUILD_PDB 67 $RELEASE_DIST, $RELEASE_VERSION = $env:APPVEYOR_REPO_TAG_NAME.split('-')
45 $env:GITREV = $GITREV 68 } else {
69 # There is no repo tag - make assumptions
70 $RELEASE_DIST = "head"
71 }
72
73 if ($env:BUILD_TYPE -eq 'msvc') {
74 # Where are these spaces coming from? Regardless, let's remove them
75 $MSVC_BUILD_ZIP = "citra-windows-msvc-$GITDATE-$GITREV.zip" -replace " ", ""
76 $MSVC_BUILD_PDB = "citra-windows-msvc-$GITDATE-$GITREV-debugsymbols.zip" -replace " ", ""
77 $MSVC_SEVENZIP = "citra-windows-msvc-$GITDATE-$GITREV.7z" -replace " ", ""
78
79 # set the build names as env vars so the artifacts can upload them
80 $env:BUILD_ZIP = $MSVC_BUILD_ZIP
81 $env:BUILD_SYMBOLS = $MSVC_BUILD_PDB
82 $env:BUILD_UPDATE = $MSVC_SEVENZIP
83
84 7z a -tzip $MSVC_BUILD_PDB .\msvc_build\bin\release\*.pdb
85 rm .\msvc_build\bin\release\*.pdb
86
87 mkdir $RELEASE_DIST
88 Copy-Item .\msvc_build\bin\release\* -Destination $RELEASE_DIST -Recurse
89 Copy-Item .\license.txt -Destination $RELEASE_DIST
90 Copy-Item .\README.md -Destination $RELEASE_DIST
91 7z a -tzip $MSVC_BUILD_ZIP $RELEASE_DIST\*
92 7z a $MSVC_SEVENZIP $RELEASE_DIST
93 } else {
94 $MINGW_BUILD_ZIP = "citra-windows-mingw-$GITDATE-$GITREV.zip" -replace " ", ""
95 $MINGW_SEVENZIP = "citra-windows-mingw-$GITDATE-$GITREV.7z" -replace " ", ""
96 # not going to bother adding separate debug symbols for mingw, so just upload a README for it
97 # if someone wants to add them, change mingw to compile with -g and use objdump and strip to separate the symbols from the binary
98 $MINGW_NO_DEBUG_SYMBOLS = "README_No_Debug_Symbols.txt"
99 Set-Content -Path $MINGW_NO_DEBUG_SYMBOLS -Value "This is a workaround for Appveyor since msvc has debug symbols but mingw doesnt" -Force
46 100
47 7z a -tzip $MSVC_BUILD_PDB .\build\bin\release\*.pdb 101 # store the build information in env vars so we can use them as artifacts
48 rm .\build\bin\release\*.pdb 102 $env:BUILD_ZIP = $MINGW_BUILD_ZIP
49 7z a -tzip $MSVC_BUILD_NAME .\build\bin\release\* .\license.txt .\README.md 103 $env:BUILD_SYMBOLS = $MINGW_NO_DEBUG_SYMBOLS
104 $env:BUILD_UPDATE = $MINGW_SEVENZIP
105
106 $CMAKE_SOURCE_DIR = "$env:APPVEYOR_BUILD_FOLDER"
107 $CMAKE_BINARY_DIR = "$CMAKE_SOURCE_DIR/mingw_build"
108 $RELEASE_DIST = $RELEASE_DIST + "-mingw"
109
110 mkdir $RELEASE_DIST
111 mkdir $RELEASE_DIST/platforms
112
113 # copy the compiled binaries and other release files to the release folder
114 Get-ChildItem "$CMAKE_BINARY_DIR" -Recurse -Filter "citra*.exe" | Copy-Item -destination $RELEASE_DIST
115 # copy the libcurl dll
116 Get-ChildItem "$CMAKE_BINARY_DIR" -Recurse -Filter "libcurl.dll" | Copy-Item -destination $RELEASE_DIST
117 Copy-Item -path "$CMAKE_SOURCE_DIR/license.txt" -destination $RELEASE_DIST
118 Copy-Item -path "$CMAKE_SOURCE_DIR/README.md" -destination $RELEASE_DIST
119 # copy all the dll dependencies to the release folder
120 # hardcoded list because we don't build static and determining the list of dlls from the binary is a pain.
121 $MingwDLLs = "Qt5Core.dll","Qt5Widgets.dll","Qt5Gui.dll","Qt5OpenGL.dll",
122 # QT dll dependencies
123 "libbz2-*.dll","libicudt*.dll","libicuin*.dll","libicuuc*.dll","libffi-*.dll",
124 "libfreetype-*.dll","libglib-*.dll","libgobject-*.dll","libgraphite2.dll","libiconv-*.dll",
125 "libharfbuzz-*.dll","libintl-*.dll","libpcre-*.dll","libpcre16-*.dll","libpng16-*.dll",
126 # Runtime/Other dependencies
127 "libgcc_s_seh-*.dll","libstdc++-*.dll","libwinpthread-*.dll","SDL2.dll","zlib1.dll"
128 foreach ($file in $MingwDLLs) {
129 Copy-Item -path "C:/msys64/mingw64/bin/$file" -force -destination "$RELEASE_DIST"
130 }
131 # the above list copies a few extra debug dlls that aren't needed (thanks globbing patterns!)
132 # so we can remove them by hardcoding another list of extra dlls to remove
133 $DebugDLLs = "libicudtd*.dll","libicuind*.dll","libicuucd*.dll"
134 foreach ($file in $DebugDLLs) {
135 Remove-Item -path "$RELEASE_DIST/$file"
136 }
137
138 # copy the qt windows plugin dll to platforms
139 Copy-Item -path "C:/msys64/mingw64/share/qt5/plugins/platforms/qwindows.dll" -force -destination "$RELEASE_DIST/platforms"
140
141 7z a -tzip $MINGW_BUILD_ZIP $RELEASE_DIST\*
142 7z a $MINGW_SEVENZIP $RELEASE_DIST
143 }
50 144
51test_script: 145test_script:
52 - cd build && ctest -VV -C Release && cd .. 146 - cd %BUILD_TYPE%_build
147 - ps: |
148 if ($env:BUILD_TYPE -eq 'msvc') {
149 ctest -VV -C Release
150 } else {
151 C:\msys64\usr\bin\bash.exe -lc "ctest -VV -C Release"
152 }
153 - cd ..
53 154
54artifacts: 155artifacts:
55 - path: $(MSVC_BUILD_NAME) 156 - path: $(BUILD_ZIP)
56 name: msvcbuild 157 name: build
57 type: zip
58 - path: $(MSVC_BUILD_PDB)
59 name: msvcdebug
60 type: zip 158 type: zip
159 - path: $(BUILD_SYMBOLS)
160 name: debugsymbols
161 - path: $(BUILD_UPDATE)
162 name: update
61 163
62deploy: 164deploy:
63 provider: GitHub 165 provider: GitHub
64 release: nightly-$(appveyor_build_number) 166 release: $(appveyor_repo_tag_name)
65 description: |
66 Citra nightly releases. Please choose the correct download for your operating system from the list below.
67
68 Short Commit Hash $(GITREV)
69 auth_token: 167 auth_token:
70 secure: "dbpsMC/MgPKWFNJCXpQl4cR8FYhepkPLjgNp/pRMktZ8oLKTqPYErfreaIxb/4P1" 168 secure: "dbpsMC/MgPKWFNJCXpQl4cR8FYhepkPLjgNp/pRMktZ8oLKTqPYErfreaIxb/4P1"
71 artifact: msvcbuild 169 artifact: update,build
72 draft: false 170 draft: false
73 prerelease: false 171 prerelease: false
74 on: 172 on:
75 branch: master 173 appveyor_repo_tag: true
76 appveyor_repo_name: citra-emu/citra-nightly
diff --git a/dist/citra.icns b/dist/citra.icns
index 9d3dcca83..ef7bf4e6e 100644
--- a/dist/citra.icns
+++ b/dist/citra.icns
Binary files differ
diff --git a/dist/citra.ico b/dist/citra.ico
index 4fef651e2..2c408b935 100644
--- a/dist/citra.ico
+++ b/dist/citra.ico
Binary files differ
diff --git a/dist/citra.manifest b/dist/citra.manifest
new file mode 100644
index 000000000..fd30b656f
--- /dev/null
+++ b/dist/citra.manifest
@@ -0,0 +1,24 @@
1<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
3 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
4 <security>
5 <requestedPrivileges>
6 <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
7 </requestedPrivileges>
8 </security>
9 </trustInfo>
10 <application xmlns="urn:schemas-microsoft-com:asm.v3">
11 <windowsSettings>
12 <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware>
13 <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
14 </windowsSettings>
15 </application>
16 <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
17 <application>
18 <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
19 <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
20 <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
21 <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
22 </application>
23 </compatibility>
24</assembly> \ No newline at end of file
diff --git a/dist/citra.svg b/dist/citra.svg
index 7b299cd89..b6abc1ccf 100644
--- a/dist/citra.svg
+++ b/dist/citra.svg
@@ -1,80 +1,2 @@
1<?xml version="1.0" encoding="UTF-8"?> 1<?xml version="1.0" encoding="UTF-8"?>
2<!-- 2<svg version="1.1" viewBox="0 0 433.93 397.43" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xlink="http://www.w3.org/1999/xlink"><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></metadata><defs><linearGradient id="linearGradient7230"><stop stop-color="#f15a24" offset="0"/><stop stop-color="#f15a24" stop-opacity="0" offset="1"/></linearGradient><radialGradient id="radialGradient4297" cx="0" cy="0" r="1" fx=".33908" fy="-.55275" gradientTransform="matrix(135.72 53.102 32.823 -83.888 479.47 287.23)" gradientUnits="userSpaceOnUse"><stop stop-color="#ffff87" offset="0"/><stop stop-color="#ffff87" offset=".12648"/><stop stop-color="#ffc503" offset=".14449"/><stop stop-color="#ffc503" offset=".21612"/><stop stop-color="#ffc503" offset=".39528"/><stop stop-color="#ffc503" offset=".4406"/><stop stop-color="#ffc003" offset=".49983"/><stop stop-color="#ffc003" offset=".62818"/><stop stop-color="#ffc003" offset=".72864"/><stop stop-color="#ff8904" stop-opacity=".86935" offset=".84938"/><stop stop-color="#ff8904" offset=".98742"/><stop stop-color="#ff8904" offset="1"/></radialGradient><radialGradient id="radialGradient4331" cx="-.042447" cy=".042662" r="1" gradientTransform="matrix(97.003 -81.357 -81.357 -97.003 516.33 432.83)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffba05" offset=".66567"/><stop stop-color="#ffba05" offset="1"/></radialGradient><radialGradient id="radialGradient4351" cx="0" cy="0" r="1" gradientTransform="matrix(-12.353 -91.85 -91.85 12.353 493.83 420.5)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffba05" offset="1"/></radialGradient><radialGradient id="radialGradient4371" cx="0" cy="0" r="1" fx="-.89202" fy="-.452" gradientTransform="matrix(58.797 44.174 44.174 -58.797 591.5 452.83)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffba05" offset="1"/></radialGradient><radialGradient id="radialGradient4391" cx="0" cy="0" r="1" gradientTransform="matrix(-63.936 -51.968 -51.968 63.936 480.5 419.5)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffba05" offset="1"/></radialGradient><radialGradient id="radialGradient4413" cx="-.27681" cy="-.01256" r="1" gradientTransform="matrix(166.21 117.68 75.941 -107.26 545.45 466.23)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffee05" offset=".49699"/><stop stop-color="#ffba05" offset="1"/></radialGradient><radialGradient id="radialGradient4433" cx=".0693" cy=".0013088" r="1" gradientTransform="matrix(92.166 1.56 1.3981 -82.601 484.17 431.17)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffba05" offset="1"/></radialGradient><radialGradient id="radialGradient4453" cx="0" cy="0" r="1" gradientTransform="matrix(112.47 78.731 51.056 -72.937 527.5 460.5)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffba05" offset="1"/></radialGradient><radialGradient id="radialGradient4475" cx=".13237" cy="-.0012055" r="1" fx="-.080444" fy=".038791" gradientTransform="matrix(64.042 -58.572 -66.76 -72.994 505.91 439.83)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffcf05" offset=".62977"/><stop stop-color="#ffcf05" offset="1"/></radialGradient><linearGradient id="linearGradient7248-9" x1="382.8" x2="662.93" y1="393.32" y2="393.32" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient7230"/><clipPath id="clipPath4307-2"><path d="m640.25 512.56c0.366-0.686 1.015-1.901 1.507-3.229 0.237-0.588 0.284-0.774 0.375-1.057 0.174-0.52 0.277-0.819 0.368-1.099 0.09-0.28 0.019-0.115 0.107-0.392 0.087-0.277 0.181-0.577 0.264-0.852 0.082-0.276 0.15-0.659 0.224-0.934 0.076-0.276 0.167-0.604 0.233-0.881 0.066-0.276 0.257-1.337 0.312-1.615 0.316-1.599 0.241-2.12 0.401-3.701 0.16-1.58 0.244-3.151 0.26-4.712 0.016-1.563-0.038-3.115-0.154-4.66-0.117-1.545-0.296-3.081-0.533-4.61-0.237-1.528-0.531-3.049-0.877-4.562-0.345-1.513-0.742-3.02-1.184-4.518-0.442-1.5-0.93-2.992-1.457-4.478-0.527-1.485-1.094-2.964-1.694-4.438-1.181-2.896-2.451-5.732-3.805-8.51-1.353-2.778-2.789-5.5-4.302-8.169-1.512-2.671-3.099-5.288-4.755-7.858-1.656-2.571-3.38-5.093-5.165-7.574-1.785-2.48-3.631-4.918-5.53-7.318-1.9-2.4-3.853-4.762-5.852-7.09s-4.044-4.624-6.129-6.89c-2.084-2.267-4.207-4.506-6.362-6.72-2.218-2.28-4.472-4.518-6.76-6.714-2.287-2.197-4.608-4.353-6.961-6.47s-4.737-4.196-7.152-6.237-4.86-4.046-7.334-6.016c-2.473-1.969-4.975-3.904-7.504-5.806-2.528-1.902-5.084-3.771-7.664-5.609-2.581-1.838-5.187-3.645-7.816-5.423-2.63-1.778-5.282-3.527-7.957-5.247-3.325-2.142-6.677-4.217-10.058-6.225-3.381-2.007-6.792-3.946-10.232-5.813-3.441-1.867-6.912-3.661-10.416-5.38s-7.041-3.362-10.611-4.924c-3.571-1.563-7.177-3.046-10.818-4.446-1.846-0.709-3.702-1.398-5.566-2.064-1.814-0.648-3.636-1.274-5.468-1.88-3.716-1.228-7.47-2.37-11.263-3.42-3.794-1.049-7.627-2.009-11.502-2.872-1.624-0.362-3.249-0.695-4.876-1-1.627-0.304-3.255-0.578-4.886-0.823-1.631-0.244-3.262-0.457-4.896-0.638s-3.269-0.33-4.907-0.445c-1.636-0.116-3.275-0.197-4.915-0.245-1.639-0.046-3.28-0.058-4.923-0.034-1.641 0.024-3.285 0.085-4.929 0.183-1.645 0.097-3.29 0.233-4.937 0.408-1.337 0.142-2.664 0.317-3.979 0.531s-2.617 0.466-3.906 0.759c-1.288 0.294-2.562 0.627-3.819 1.007-1.256 0.38-2.496 0.805-3.717 1.278-1.22 0.475-2.422 0.997-3.602 1.571-1.179 0.575-2.337 1.201-3.471 1.884-1.133 0.683-2.244 1.421-3.326 2.22-1.084 0.798-2.656 1.973-3.685 2.893l-3.143-7.259c-3.143-7.26 1.5-6 3.143-8.5 1.644-2.5 0.357-9 0.217-15s6.64-11.5 9.64-14.5c3-3.001 10-10.5 14.5-11.82 4.5-1.319 23.5-16.18 30-18.181 6.5-1.999 13.5-6.999 22-8.499s19-3 27.5-3 26.5-0.5 38.5 0 27 3 33 4 20 2.5 27.5 4.5 23.5 8 27 11.5 28 13.999 33.5 20c5.5 6 24 39.5 25 45.5s14 47.499 17 53c3 5.5 0 39.499 0 45.5 0 6-10 45-10 45l-13.5 28.5-14 14.5z"/></clipPath><radialGradient id="radialGradient7556" cx="698.21" cy="478.94" r="186.38" gradientTransform="matrix(1.2034 -.41433 .38181 1.1089 -338.27 245.75)" gradientUnits="userSpaceOnUse"><stop stop-color="#f15a24" stop-opacity="0" offset="0"/><stop stop-color="#f15a24" stop-opacity="0" offset=".68534"/><stop stop-color="#f14a24" offset="1"/></radialGradient></defs><g transform="translate(-265.81 -357.85)"><g transform="translate(-206,70)"><path d="m651.83 684.53c-17.986-2.258-43.941-8.1382-59.303-13.436-45.416-15.66-91.627-51.387-112.29-86.813-7.3922-12.675-9.8553-29.065-7.6405-50.846 1.5707-15.448 4.2385-24.955 10.938-38.978 20.81-43.561 55.611-85.05 100.64-119.99 33.898-26.298 69.589-47.881 101.64-61.46 27.534-11.666 61.915-21.532 84.068-24.123 27.343-3.1985 56.096 1.1638 74.647 11.325 18.752 10.271 30.61 25.375 43.922 55.939 12.492 28.684 17.312 55.294 17.291 95.461-0.0151 34.075-4.1728 58.552-14.29 84.174-8.402 21.279-21.718 44.014-36.542 62.391-6.6008 8.1824-26.727 28.053-35.45 35-19.832 15.793-45.654 30.387-66.248 37.441-17.156 5.8765-39.99 11.132-59.144 13.612-9.676 1.253-33.307 1.4198-42.243 0.29802z" fill="#fff" stroke-width=".75166"/><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m508.37 418.38c-1.948-9.873-2.175-19.875-2.148-30.734 0.105-4.803-8e-3 -10.436 0.607-16.082 1.248-11.467 5.143-14.109 15.617-9.51 17.862 7.84 33.696 18.829 47.854 32.241 3.988 3.779 8.185 7.422 11.089 12.202 2.673 4.397 2.097 6.88-2.266 9.608-1.396 0.873-2.949 1.54-4.502 2.103-5.181 1.881-10.542 3.121-15.918 4.281-12.621 2.721-25.222 5.644-38.216 5.823-0.08 1e-3 -0.159 1e-3 -0.239 1e-3 -6.452 0-10.63-3.605-11.878-9.933" fill="url(#radialGradient4331)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m492.04 416.52c-3.243-1.617-5.823-4.156-8.361-6.684-16.977-16.905-32.998-34.704-48.672-52.819-4.26-4.924-8.651-9.823-11.376-15.886-1.919-4.27-0.934-6.454 3.654-7.668 4.725-1.249 9.544-1.787 14.436-1.358 11.696 1.026 22.799 4.32 33.655 8.677 10.044 4.032 16.339 11.18 18.544 21.838 2.891 13.979 3.907 28.175 4.618 42.392 0 2.182 0.021 4.364-0.013 6.545-0.01 0.636-0.15 1.274-0.276 1.902-0.545 2.722-1.447 4.01-3.104 4.01-0.83 0-1.848-0.323-3.105-0.949" fill="url(#radialGradient4351)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m623.43 485.96c-2.879-0.515-5.736-1.318-8.503-2.282-15.719-5.482-30.649-12.847-45.782-19.703-12.92-5.855-25.833-11.785-38.083-19.013-2.413-1.425-5.354-3.1-4.765-6.319 0.504-2.751 3.758-2.789 6.016-3.319 17.339-4.073 35.01-5.712 51.316-7.058 10.474 0.119 18.926 1.786 25.516 8.829 6.88 7.354 12.632 15.489 16.919 24.601 2.691 5.72 4.477 11.786 4.479 18.169 2e-3 4.153-1.835 6.272-5.267 6.272-0.571 0-1.188-0.059-1.846-0.177" fill="url(#radialGradient4371)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m475.92 419.25c-0.367-0.104-0.71-0.292-1.065-0.437-22.555-9.166-44.21-20.249-65.865-31.321-5.464-2.792-10.748-5.939-15.684-9.652-5.297-3.984-8.316-8.98-7.651-15.694 0-0.89-0.035-1.662 5e-3 -2.431 0.397-7.627 4.249-12.981 10.812-16.559 6.098-3.323 11.35-1.172 16.365 2.52 1.236 0.911 2.498 1.799 3.649 2.811 22.843 20.104 43.28 42.565 63.347 65.381 1.264 1.437 3.447 3.141 2.012 5.299-0.613 0.922-1.333 1.232-2.102 1.231-1.232 0-2.589-0.797-3.823-1.148" fill="url(#radialGradient4391)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m589.81 520.12c-2.155-1.598-4.18-3.381-6.195-5.159-14.338-12.647-27.085-26.892-40.259-40.697-5.472-5.734-10.87-11.588-15.617-17.981-0.828-1.116-1.856-2.369-0.83-3.824 0.972-1.379 2.519-1.147 3.87-0.737 1.831 0.556 3.62 1.272 5.386 2.018 23.705 10.024 46.647 21.655 69.496 33.464 6.568 3.394 13.185 6.854 18.588 12.131 2.02 1.974 3.277 4.24 3.342 7.436-0.072 2.307-0.943 4.698-2.221 6.96-4.063 7.191-12.308 11.156-20.705 11.156-5.215 0-10.489-1.53-14.855-4.767" fill="url(#radialGradient4413)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m413.44 432.07c-5.861-6.67-11.407-13.524-15.914-21.172-2.874-4.876-5.175-10.064-6.355-15.632-0.819-3.866 0.412-5.458 3.711-5.517 2.078 0.023 4.038 0.607 5.971 1.3 18.942 6.786 36.964 15.693 55.17 24.173 7.774 3.62 15.486 7.375 22.781 11.914 2.187 1.361 4.634 2.997 4.191 5.914-0.396 2.604-3.356 2.319-5.257 3.169-0.692 0.308-1.469 0.436-2.215 0.612-11.727 2.765-23.679 4.039-35.625 5.305-1.381 0.147-2.734 0.221-4.058 0.221-8.707 0-16.182-3.211-22.4-10.287" fill="url(#radialGradient4433)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m567.31 526.82c-14.169-1.46-27.39-6.06-40.199-12.109-7.73-3.652-12.567-9.493-14.146-17.954-1.793-9.597-3.042-19.253-2.904-29.045 0-2.697-0.068-5.395 0.022-8.089 0.067-1.997-0.399-4.391 1.83-5.503 2.219-1.108 4.351 0.084 6.055 1.392 2.834 2.177 5.567 4.529 8.099 7.054 14.061 14.024 27.283 28.841 40.42 43.726 4.051 4.589 8.321 9.1 10.964 14.772 1.594 3.423 0.812 4.978-2.88 5.7-1.112 0.218-2.231 0.3-3.353 0.3-1.302 0-2.607-0.11-3.908-0.244" fill="url(#radialGradient4453)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m493.43 497.7c-3.943-1.236-7.454-3.334-11.002-5.368-14.602-8.364-28.162-18.128-39.782-30.405-5.392-5.696-4.536-9.429 2.935-11.564 13.892-3.97 27.998-7.036 42.519-7.395 7.646-0.189 11.495 3.378 12.86 10.836 1.395 7.615 1.69 15.275 1.485 25.395-0.22 3.072 0.784 8.645-0.687 14.051-0.943 3.472-2.527 5.026-5.134 5.025-0.929 0-1.988-0.197-3.194-0.575" fill="url(#radialGradient4475)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m641.75 509.34c0.237-0.588 0.284-0.774 0.375-1.057 0.174-0.52 0.277-0.819 0.368-1.099 0.09-0.28 0.019-0.115 0.107-0.392 0.087-0.277 0.181-0.577 0.264-0.852 0.082-0.276 0.15-0.659 0.224-0.934 0.076-0.276 0.167-0.604 0.233-0.881 0.066-0.276 0.257-1.337 0.312-1.615 0.316-1.599 0.241-2.12 0.401-3.701 0.16-1.58 0.244-3.151 0.26-4.712 0.016-1.563-0.038-3.115-0.154-4.66-0.117-1.545-0.296-3.081-0.533-4.61-0.237-1.528-0.531-3.049-0.877-4.562-0.345-1.513-0.742-3.02-1.184-4.518-0.442-1.5-0.93-2.992-1.457-4.478-0.527-1.485-1.094-2.964-1.694-4.438-1.181-2.896-2.451-5.732-3.805-8.51-1.353-2.778-2.789-5.5-4.302-8.169-1.512-2.671-3.099-5.288-4.755-7.858-1.656-2.571-3.38-5.093-5.165-7.574-1.785-2.48-3.631-4.918-5.53-7.318-1.9-2.4-3.853-4.762-5.852-7.09s-4.044-4.624-6.129-6.89c-2.084-2.267-4.207-4.506-6.362-6.72-2.218-2.28-4.472-4.518-6.76-6.714-2.287-2.197-4.608-4.353-6.961-6.47s-4.737-4.196-7.152-6.237-4.86-4.046-7.334-6.016c-2.473-1.969-4.975-3.904-7.504-5.806-2.528-1.902-5.084-3.771-7.664-5.609-2.581-1.838-5.187-3.645-7.816-5.423-2.63-1.778-5.282-3.527-7.957-5.247-3.325-2.142-6.677-4.217-10.058-6.225-3.381-2.007-6.792-3.946-10.232-5.813-3.441-1.867-6.912-3.661-10.416-5.38s-7.041-3.362-10.611-4.924c-3.571-1.563-7.177-3.046-10.818-4.446-1.846-0.709-3.702-1.398-5.566-2.064-1.814-0.648-3.636-1.274-5.468-1.88-3.716-1.228-7.47-2.37-11.263-3.42-3.794-1.049-7.627-2.009-11.502-2.872-1.624-0.362-3.249-0.695-4.876-1-1.627-0.304-3.255-0.578-4.886-0.823-1.631-0.244-3.262-0.457-4.896-0.638s-3.269-0.33-4.907-0.445c-1.636-0.116-3.275-0.197-4.915-0.245-1.639-0.046-3.28-0.058-4.923-0.034-1.641 0.024-3.285 0.085-4.929 0.183-1.645 0.097-3.29 0.233-4.937 0.408-1.337 0.142-2.664 0.317-3.979 0.531s-2.617 0.466-3.906 0.759c-1.288 0.294-2.562 0.627-3.819 1.007-1.256 0.38-2.496 0.805-3.717 1.278-1.22 0.475-2.422 0.997-3.602 1.571-0.749 0.365-1.489 0.751-2.22 1.159-0.522 0.286-1.038 0.583-1.55 0.891-1.134 0.683-2.243 1.421-3.327 2.219-0.744 0.549-1.475 1.125-2.194 1.731-0.282 0.225-0.554 0.448-0.806 0.662 5.18-5.701 10.508-11.008 15.987-15.904 5.538-4.95 11.227-9.48 17.07-13.573 5.843-4.094 11.839-7.751 17.987-10.956 6.148-3.204 12.449-5.954 18.901-8.236 6.453-2.28 13.059-4.091 19.816-5.415 6.758-1.325 13.668-2.162 20.731-2.495s14.278-0.163 21.645 0.528c7.368 0.692 14.887 1.904 22.56 3.654 8.186 1.866 15.978 4.164 23.376 6.884 7.397 2.719 14.401 5.861 21.012 9.414 6.611 3.555 12.828 7.522 18.655 11.891 5.826 4.371 11.261 9.143 16.304 14.311 5.045 5.167 9.698 10.729 13.962 16.675 4.264 5.947 8.14 12.278 11.626 18.985 3.487 6.707 6.586 13.789 9.296 21.238 2.712 7.449 5.037 15.264 6.975 23.436 0.548 2.31 1.025 4.624 1.432 6.944 0.408 2.318 0.747 4.641 1.023 6.968 0.275 2.327 0.486 4.658 0.637 6.991 0.15 2.333 0.241 4.671 0.276 7.01 0.034 2.339 0.013 4.681-0.061 7.024-0.074 2.345-0.2 4.69-0.374 7.037-0.174 2.348-0.396 4.697-0.664 7.046-0.266 2.349-0.577 4.699-0.928 7.049-0.39 2.617-0.912 5.345-1.535 8.125-0.623 2.779-1.346 5.609-2.142 8.427-0.795 2.819-1.66 5.626-2.569 8.359-0.907 2.733-1.855 5.391-2.816 7.915-0.959 2.523-1.931 4.909-2.883 7.098-0.953 2.189-1.888 4.179-2.773 5.909-0.886 1.73-1.723 3.199-2.481 4.346-0.475 0.717-1.25 1.831-1.946 2.775 0.215-0.462 0.433-0.967 0.627-1.49" fill="url(#radialGradient4297)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)" fill="url(#linearGradient7248-9)"><g clip-path="url(#clipPath4307-2)" fill="url(#linearGradient7248-9)"><g transform="translate(382.92 331.6)" fill="url(#linearGradient7248-9)"><path d="m0 0c6.615-7.221 13.678-14.033 21.222-20.267 7.539-6.237 15.577-11.868 24.046-16.747 8.468-4.879 17.397-8.961 26.656-12.07 9.256-3.117 18.837-5.252 28.533-6.374 9.697-1.126 19.503-1.24 29.23-0.453 9.731 0.785 19.379 2.465 28.846 4.853 18.922 4.75 37.215 12.333 53.364 23.285 8.065 5.472 15.569 11.768 22.33 18.787 6.768 7.012 12.789 14.739 18.015 22.967 10.462 16.478 17.733 34.859 22.474 53.789l0.439 1.778 0.209 0.872 0.186 0.899 0.747 3.597 0.373 1.798 0.093 0.45 0.024 0.112c-7e-3 -0.038 7e-3 0.055 0.01 0.076l0.034 0.227 0.134 0.908 0.539 3.634 0.269 1.817c0.077 0.534 0.118 1.199 0.18 1.791l0.338 3.658 0.164 1.796 0.075 1.835 0.15 3.671c0.264 9.752-0.472 19.521-1.882 29.184-1.502 9.646-4.173 19.05-7.353 28.281l-1.228 3.463-0.307 0.865-0.144 0.409-0.173 0.426-0.689 1.702-1.379 3.405-0.685 1.671-0.778 1.664-1.557 3.327-0.371 0.788-0.455 0.798-0.909 1.596-1.8039 3.187c-12.883 30.325-179.5-236.54-259.07-177.56zm-8e-3 8e-3c92.186-40.479 231.35 107.76 257.54 180.96 0.828-0.982 1.523-1.975 2.238-2.986 0.351-0.52 0.707-0.981 1.036-1.569l0.913-1.594 0.912-1.594 0.457-0.797c0.183-0.358 0.275-0.576 0.417-0.871l2.346-4.986c0.271-0.617 0.473-1.148 0.713-1.726l1.387-3.402 0.693-1.701 0.173-0.425 0.164-0.457 0.309-0.865 1.235-3.459c3.22-9.271 5.937-18.782 7.475-28.508 1.444-9.716 2.213-19.555 1.972-29.393l-0.14-3.671-0.069-1.836-0.164-1.863-0.329-3.659c-0.063-0.625-0.09-1.185-0.183-1.864l-0.264-1.818-0.528-3.635-0.132-0.909-0.033-0.227-0.024-0.152-0.023-0.112-0.092-0.45-0.369-1.8-0.736-3.599-0.185-0.9-0.216-0.915-0.436-1.79c-2.367-9.534-5.355-18.932-9.077-28.033-3.717-9.105-8.196-17.911-13.474-26.221-5.276-8.31-11.358-16.118-18.197-23.206-6.832-7.094-14.416-13.459-22.563-18.989-8.15-5.528-16.852-10.229-25.9-14.096-9.054-3.857-18.44-6.901-27.983-9.247-9.54-2.354-19.27-3.997-29.075-4.737-9.804-0.741-19.683-0.576-29.444 0.61-9.761 1.181-19.397 3.381-28.694 6.565-9.3 3.177-18.256 7.329-26.737 12.275-8.488 4.941-16.474 10.71-23.972 17.028-7.497 6.325-14.5 13.22-21.044 20.512z" fill="url(#linearGradient7248-9)"/></g></g></g><path d="m853.83 340.91z" fill="none" stroke="#000" stroke-width="1px"/><path d="m512.59 583.25c24.074 19.047 61.695 18.896 102.99 7.7902 41.299-11.105 86.278-33.164 124.63-62.438 43.462-33.178 74.436-61.06 97.049-98.852 10.211-17.065 16.881-32.679 20.405-47.4 3.5243-14.721 2.1355-27.046-3.4171-40.626 0 0 22.052 31.822 28.025 81.607 2.9864 24.893 1.4477 59.407-11.26 93.337-11.843 31.622-27.743 61.223-54.874 85.55-1.0301 0.92357-12.207 12.478-32.938 24.374-25.596 14.688-46.884 22.5-75.534 27.634-34.926 6.2583-59.469 4.4522-85.833-1.8111-36.815-8.7462-71.794-28.542-110.24-69.041" fill="url(#radialGradient7556)"/></g></g></svg>
3 Copyright 2014 Citra Emulator Project
4 Licensed under GPLv2 or any later version
5 Refer to the license.txt file included.
6-->
7<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 341.071 338.846">
8 <radialGradient id="a" cx="170.5356" cy="167.271" r="170.5332" gradientTransform="matrix(1 0 0 0.9935 0 3.2396)" gradientUnits="userSpaceOnUse">
9 <stop offset="0.5193" stop-color="#FFFFFF" stop-opacity="0.1"/>
10 <stop offset="0.9415" stop-color="#000000" stop-opacity="0.5"/>
11 <stop offset="1" stop-color="#1A1818" stop-opacity="0"/>
12 </radialGradient>
13 <ellipse fill="url(#a)" cx="170.535" cy="169.423" rx="170.535" ry="169.423"/>
14 <circle fill="#D16F17" cx="170.536" cy="167.885" r="161.557"/>
15 <linearGradient id="b" gradientUnits="userSpaceOnUse" x1="234.4458" y1="33.5771" x2="97.5655" y2="321.2358">
16 <stop offset="0" stop-color="#FFF8BD"/>
17 <stop offset="1" stop-color="#F6DCAE"/>
18 </linearGradient>
19 <circle fill="url(#b)" cx="170.536" cy="167.885" r="155.295"/>
20 <g>
21 <linearGradient id="c" gradientUnits="userSpaceOnUse" x1="332.436" y1="91.7446" x2="111.1593" y2="342.0988">
22 <stop offset="0" stop-color="#F7A076"/>
23 <stop offset="0.4455" stop-color="#F3816C"/>
24 <stop offset="1" stop-color="#F06878"/>
25 </linearGradient>
26 <path fill="url(#c)" stroke="#F06564" stroke-miterlimit="10" d="M309.704,123.138
27 c-5.9-7.802-128.517,44.681-128.517,44.681S303.803,221.01,309.704,212.5C322.434,194.142,323.182,140.957,309.704,123.138z"/>
28 <linearGradient id="d" gradientUnits="userSpaceOnUse" x1="285.5845" y1="50.3345" x2="64.3074" y2="300.6891">
29 <stop offset="0" stop-color="#9DC63B"/>
30 <stop offset="1" stop-color="#9BC183"/>
31 </linearGradient>
32 <path fill="url(#d)" stroke="#72AA42" stroke-miterlimit="10" d="M300.518,100.96c-3.98-21.983-41.059-60.12-63.189-63.188
33 c-9.688-1.345-59.28,122.469-59.28,122.469S302.364,111.149,300.518,100.96z"/>
34 <linearGradient id="e" gradientUnits="userSpaceOnUse" x1="229.4995" y1="0.7637" x2="8.2231" y2="251.1176">
35 <stop offset="0" stop-color="#D5DE26"/>
36 <stop offset="1" stop-color="#C5D94B"/>
37 </linearGradient>
38 <path fill="url(#e)" stroke="#BECD30" stroke-miterlimit="10" d="M215.151,28.584c-18.357-12.73-71.543-13.478-89.362,0.001
39 c-7.801,5.899,44.682,128.516,44.682,128.516S223.663,34.484,215.151,28.584z"/>
40 <linearGradient id="f" gradientUnits="userSpaceOnUse" x1="219.3823" y1="-8.1782" x2="-1.8941" y2="242.1756">
41 <stop offset="0" stop-color="#F2D200"/>
42 <stop offset="1" stop-color="#FDEF52"/>
43 </linearGradient>
44 <path fill="url(#f)" stroke="#E1BE29" stroke-miterlimit="10" d="M162.893,160.239c0,0-49.092-124.315-59.281-122.469
45 c-21.982,3.979-60.12,41.058-63.188,63.189C39.078,110.646,162.893,160.239,162.893,160.239z"/>
46 <linearGradient id="g" gradientUnits="userSpaceOnUse" x1="226.0718" y1="-2.2656" x2="4.7951" y2="248.0886">
47 <stop offset="0" stop-color="#FFCD10"/>
48 <stop offset="1" stop-color="#F29634"/>
49 </linearGradient>
50 <path fill="url(#g)" stroke="#F79421" stroke-miterlimit="10" d="M31.236,123.136c-12.73,18.357-13.479,71.543,0,89.362
51 c5.898,7.801,128.516-44.682,128.516-44.682S37.135,114.625,31.236,123.136z"/>
52 <linearGradient id="h" gradientUnits="userSpaceOnUse" x1="272.9214" y1="39.144" x2="51.6446" y2="289.4984">
53 <stop offset="0" stop-color="#F79F1C"/>
54 <stop offset="0.4455" stop-color="#F08021"/>
55 <stop offset="1" stop-color="#ED693C"/>
56 </linearGradient>
57 <path fill="url(#h)" stroke="#F16622" stroke-miterlimit="10" d="M40.422,234.676c3.979,21.982,41.057,60.12,63.188,63.188
58 c9.687,1.346,59.279-122.468,59.279-122.468S38.574,224.487,40.422,234.676z"/>
59 <linearGradient id="i" gradientUnits="userSpaceOnUse" x1="329.0083" y1="88.7129" x2="107.7311" y2="339.0677">
60 <stop offset="0" stop-color="#E47C26"/>
61 <stop offset="0.4455" stop-color="#DF5B27"/>
62 <stop offset="1" stop-color="#DD3A3A"/>
63 </linearGradient>
64 <path fill="url(#i)" stroke="#E03827" stroke-miterlimit="10" d="M125.787,307.051c18.357,12.73,71.543,13.48,89.362,0
65 c7.801-5.898-44.681-128.515-44.681-128.515S117.275,301.153,125.787,307.051z"/>
66 <linearGradient id="j" gradientUnits="userSpaceOnUse" x1="339.1245" y1="97.6562" x2="117.8478" y2="348.0104">
67 <stop offset="0" stop-color="#F3783C"/>
68 <stop offset="0.4455" stop-color="#EF5339"/>
69 <stop offset="1" stop-color="#ED294A"/>
70 </linearGradient>
71 <path fill="url(#j)" stroke="#ED2836" stroke-miterlimit="10" d="M178.047,175.398c0,0,49.09,124.315,59.28,122.467
72 c21.982-3.979,60.121-41.057,63.189-63.188C301.86,224.991,178.047,175.398,178.047,175.398z"/>
73 </g>
74 <linearGradient id="k" gradientUnits="userSpaceOnUse" x1="170.5352" y1="6.3281" x2="170.5351" y2="329.4424">
75 <stop offset="0" stop-color="#FFFFFF" stop-opacity="0.2"/>
76 <stop offset="0.4504" stop-color="#908E8E" stop-opacity="0.05"/>
77 <stop offset="1" stop-color="#030003" stop-opacity="0.2"/>
78 </linearGradient>
79 <circle fill="url(#k)" cx="170.536" cy="167.885" r="161.557"/>
80</svg>
diff --git a/dist/doc-icon.png b/dist/doc-icon.png
index 420b1546f..9b5773214 100644
--- a/dist/doc-icon.png
+++ b/dist/doc-icon.png
Binary files differ
diff --git a/dist/icons/checked.png b/dist/icons/checked.png
new file mode 100644
index 000000000..c277e6b40
--- /dev/null
+++ b/dist/icons/checked.png
Binary files differ
diff --git a/dist/icons/failed.png b/dist/icons/failed.png
new file mode 100644
index 000000000..ac10f174a
--- /dev/null
+++ b/dist/icons/failed.png
Binary files differ
diff --git a/dist/icons/icons.qrc b/dist/icons/icons.qrc
new file mode 100644
index 000000000..f0c44862f
--- /dev/null
+++ b/dist/icons/icons.qrc
@@ -0,0 +1,6 @@
1<RCC>
2 <qresource prefix="icons">
3 <file>checked.png</file>
4 <file>failed.png</file>
5 </qresource>
6</RCC>
diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt
index b809d76d8..8f42f4fdc 100644
--- a/externals/CMakeLists.txt
+++ b/externals/CMakeLists.txt
@@ -1,5 +1,8 @@
1# Definitions for all external bundled libraries 1# Definitions for all external bundled libraries
2 2
3set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMakeModules)
4include(DownloadExternals)
5
3# Catch 6# Catch
4add_library(catch-single-include INTERFACE) 7add_library(catch-single-include INTERFACE)
5target_include_directories(catch-single-include INTERFACE catch/single_include) 8target_include_directories(catch-single-include INTERFACE catch/single_include)
@@ -46,6 +49,10 @@ add_subdirectory(soundtouch)
46# The SoundTouch target doesn't export the necessary include paths as properties by default 49# The SoundTouch target doesn't export the necessary include paths as properties by default
47target_include_directories(SoundTouch INTERFACE ./soundtouch/include) 50target_include_directories(SoundTouch INTERFACE ./soundtouch/include)
48 51
52# Unicorn
53add_library(unicorn-headers INTERFACE)
54target_include_directories(unicorn-headers INTERFACE ./unicorn/include)
55
49# Xbyak 56# Xbyak
50if (ARCHITECTURE_x86_64) 57if (ARCHITECTURE_x86_64)
51 # Defined before "dynarmic" above 58 # Defined before "dynarmic" above
@@ -59,9 +66,21 @@ add_subdirectory(enet)
59target_include_directories(enet INTERFACE ./enet/include) 66target_include_directories(enet INTERFACE ./enet/include)
60 67
61if (ENABLE_WEB_SERVICE) 68if (ENABLE_WEB_SERVICE)
69 # msys installed curl is configured to use openssl, but that isn't portable
70 # since it relies on having the bundled certs install in the home folder for SSL
71 # by default on mingw, download the precompiled curl thats linked against windows native ssl
72 if (MINGW AND CITRA_USE_BUNDLED_CURL)
73 download_bundled_external("curl/" "curl-7_55_1" CURL_PREFIX)
74 set(CURL_PREFIX "${CMAKE_BINARY_DIR}/externals/curl-7_55_1")
75 set(CURL_FOUND YES)
76 set(CURL_INCLUDE_DIR "${CURL_PREFIX}/include" CACHE PATH "Path to curl headers")
77 set(CURL_LIBRARY "${CURL_PREFIX}/lib/libcurldll.a" CACHE PATH "Path to curl library")
78 set(CURL_DLL_DIR "${CURL_PREFIX}/lib/" CACHE PATH "Path to curl.dll")
79 set(USE_SYSTEM_CURL ON CACHE BOOL "")
80 endif()
62 # CPR 81 # CPR
63 option(BUILD_TESTING OFF) 82 set(BUILD_TESTING OFF CACHE BOOL "")
64 option(BUILD_CPR_TESTS OFF) 83 set(BUILD_CPR_TESTS OFF CACHE BOOL "")
65 add_subdirectory(cpr) 84 add_subdirectory(cpr)
66 target_include_directories(cpr INTERFACE ./cpr/include) 85 target_include_directories(cpr INTERFACE ./cpr/include)
67 86
diff --git a/externals/cryptopp/cryptopp b/externals/cryptopp/cryptopp
Subproject 841c37e34765487a2968357369ab74db8b10a62 Subproject 24bc2b85674254fb294e717eb5b47d9f53e786b
diff --git a/externals/dynarmic b/externals/dynarmic
Subproject 8f15e3f70cb96e56705e5de6ba97b5d09423a56 Subproject 69eccf826d657a6cfb1d731b00629939d230ec5
diff --git a/externals/enet b/externals/enet
Subproject a84c120eff13d2fa3eadb41ef7afe0f7819f4d6 Subproject 9d9ba122d4818f7ae1aef2197933ac696edb233
diff --git a/externals/soundtouch b/externals/soundtouch
Subproject 5274ec4dec498bd88ccbcd28862a0f78a3b95ef Subproject 019d2089bbadf70d73ba85aa8ea51490b071262
diff --git a/src/audio_core/codec.cpp b/src/audio_core/codec.cpp
index 7a3bd7eb3..6fba9fdae 100644
--- a/src/audio_core/codec.cpp
+++ b/src/audio_core/codec.cpp
@@ -117,7 +117,9 @@ StereoBuffer16 DecodePCM16(const unsigned num_channels, const u8* const data,
117 ret[i].fill(sample); 117 ret[i].fill(sample);
118 } 118 }
119 } else { 119 } else {
120 std::memcpy(ret.data(), data, sample_count * 2 * sizeof(u16)); 120 for (size_t i = 0; i < sample_count; ++i) {
121 std::memcpy(&ret[i], data + i * sizeof(s16) * 2, 2 * sizeof(s16));
122 }
121 } 123 }
122 124
123 return ret; 125 return ret;
diff --git a/src/audio_core/codec.h b/src/audio_core/codec.h
index 2b0c395e6..877b2202d 100644
--- a/src/audio_core/codec.h
+++ b/src/audio_core/codec.h
@@ -5,13 +5,13 @@
5#pragma once 5#pragma once
6 6
7#include <array> 7#include <array>
8#include <vector> 8#include <deque>
9#include "common/common_types.h" 9#include "common/common_types.h"
10 10
11namespace Codec { 11namespace Codec {
12 12
13/// A variable length buffer of signed PCM16 stereo samples. 13/// A variable length buffer of signed PCM16 stereo samples.
14using StereoBuffer16 = std::vector<std::array<s16, 2>>; 14using StereoBuffer16 = std::deque<std::array<s16, 2>>;
15 15
16/// See: Codec::DecodeADPCM 16/// See: Codec::DecodeADPCM
17struct ADPCMState { 17struct ADPCMState {
diff --git a/src/audio_core/hle/source.cpp b/src/audio_core/hle/source.cpp
index 92484c526..c12287700 100644
--- a/src/audio_core/hle/source.cpp
+++ b/src/audio_core/hle/source.cpp
@@ -244,17 +244,27 @@ void Source::GenerateFrame() {
244 break; 244 break;
245 } 245 }
246 246
247 const size_t size_to_copy = 247 switch (state.interpolation_mode) {
248 std::min(state.current_buffer.size(), current_frame.size() - frame_position); 248 case InterpolationMode::None:
249 249 AudioInterp::None(state.interp_state, state.current_buffer, state.rate_multiplier,
250 std::copy(state.current_buffer.begin(), state.current_buffer.begin() + size_to_copy, 250 current_frame, frame_position);
251 current_frame.begin() + frame_position); 251 break;
252 state.current_buffer.erase(state.current_buffer.begin(), 252 case InterpolationMode::Linear:
253 state.current_buffer.begin() + size_to_copy); 253 AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier,
254 254 current_frame, frame_position);
255 frame_position += size_to_copy; 255 break;
256 state.next_sample_number += static_cast<u32>(size_to_copy); 256 case InterpolationMode::Polyphase:
257 // TODO(merry): Implement polyphase interpolation
258 LOG_DEBUG(Audio_DSP, "Polyphase interpolation unimplemented; falling back to linear");
259 AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier,
260 current_frame, frame_position);
261 break;
262 default:
263 UNIMPLEMENTED();
264 break;
265 }
257 } 266 }
267 state.next_sample_number += static_cast<u32>(frame_position);
258 268
259 state.filters.ProcessFrame(current_frame); 269 state.filters.ProcessFrame(current_frame);
260} 270}
@@ -305,25 +315,6 @@ bool Source::DequeueBuffer() {
305 return true; 315 return true;
306 } 316 }
307 317
308 switch (state.interpolation_mode) {
309 case InterpolationMode::None:
310 state.current_buffer =
311 AudioInterp::None(state.interp_state, state.current_buffer, state.rate_multiplier);
312 break;
313 case InterpolationMode::Linear:
314 state.current_buffer =
315 AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier);
316 break;
317 case InterpolationMode::Polyphase:
318 // TODO(merry): Implement polyphase interpolation
319 state.current_buffer =
320 AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier);
321 break;
322 default:
323 UNIMPLEMENTED();
324 break;
325 }
326
327 // the first playthrough starts at play_position, loops start at the beginning of the buffer 318 // the first playthrough starts at play_position, loops start at the beginning of the buffer
328 state.current_sample_number = (!buf.has_played) ? buf.play_position : 0; 319 state.current_sample_number = (!buf.has_played) ? buf.play_position : 0;
329 state.next_sample_number = state.current_sample_number; 320 state.next_sample_number = state.current_sample_number;
diff --git a/src/audio_core/hle/source.h b/src/audio_core/hle/source.h
index ccb7f064f..c4d2debc2 100644
--- a/src/audio_core/hle/source.h
+++ b/src/audio_core/hle/source.h
@@ -108,7 +108,7 @@ private:
108 108
109 u32 current_sample_number = 0; 109 u32 current_sample_number = 0;
110 u32 next_sample_number = 0; 110 u32 next_sample_number = 0;
111 std::vector<std::array<s16, 2>> current_buffer; 111 AudioInterp::StereoBuffer16 current_buffer;
112 112
113 // buffer_id state 113 // buffer_id state
114 114
diff --git a/src/audio_core/interpolate.cpp b/src/audio_core/interpolate.cpp
index 8a5d4181a..83573d772 100644
--- a/src/audio_core/interpolate.cpp
+++ b/src/audio_core/interpolate.cpp
@@ -13,74 +13,64 @@ namespace AudioInterp {
13constexpr u64 scale_factor = 1 << 24; 13constexpr u64 scale_factor = 1 << 24;
14constexpr u64 scale_mask = scale_factor - 1; 14constexpr u64 scale_mask = scale_factor - 1;
15 15
16/// Here we step over the input in steps of rate_multiplier, until we consume all of the input. 16/// Here we step over the input in steps of rate, until we consume all of the input.
17/// Three adjacent samples are passed to fn each step. 17/// Three adjacent samples are passed to fn each step.
18template <typename Function> 18template <typename Function>
19static StereoBuffer16 StepOverSamples(State& state, const StereoBuffer16& input, 19static void StepOverSamples(State& state, StereoBuffer16& input, float rate,
20 float rate_multiplier, Function fn) { 20 DSP::HLE::StereoFrame16& output, size_t& outputi, Function fn) {
21 ASSERT(rate_multiplier > 0); 21 ASSERT(rate > 0);
22 22
23 if (input.size() < 2) 23 if (input.empty())
24 return {}; 24 return;
25 25
26 StereoBuffer16 output; 26 input.insert(input.begin(), {state.xn2, state.xn1});
27 output.reserve(static_cast<size_t>(input.size() / rate_multiplier));
28 27
29 u64 step_size = static_cast<u64>(rate_multiplier * scale_factor); 28 const u64 step_size = static_cast<u64>(rate * scale_factor);
29 u64 fposition = state.fposition;
30 size_t inputi = 0;
30 31
31 u64 fposition = 0; 32 while (outputi < output.size()) {
32 const u64 max_fposition = input.size() * scale_factor; 33 inputi = static_cast<size_t>(fposition / scale_factor);
33 34
34 while (fposition < 1 * scale_factor) { 35 if (inputi + 2 >= input.size()) {
35 u64 fraction = fposition & scale_mask; 36 inputi = input.size() - 2;
36 37 break;
37 output.push_back(fn(fraction, state.xn2, state.xn1, input[0])); 38 }
38
39 fposition += step_size;
40 }
41
42 while (fposition < 2 * scale_factor) {
43 u64 fraction = fposition & scale_mask;
44
45 output.push_back(fn(fraction, state.xn1, input[0], input[1]));
46
47 fposition += step_size;
48 }
49 39
50 while (fposition < max_fposition) {
51 u64 fraction = fposition & scale_mask; 40 u64 fraction = fposition & scale_mask;
52 41 output[outputi++] = fn(fraction, input[inputi], input[inputi + 1], input[inputi + 2]);
53 size_t index = static_cast<size_t>(fposition / scale_factor);
54 output.push_back(fn(fraction, input[index - 2], input[index - 1], input[index]));
55 42
56 fposition += step_size; 43 fposition += step_size;
57 } 44 }
58 45
59 state.xn2 = input[input.size() - 2]; 46 state.xn2 = input[inputi];
60 state.xn1 = input[input.size() - 1]; 47 state.xn1 = input[inputi + 1];
48 state.fposition = fposition - inputi * scale_factor;
61 49
62 return output; 50 input.erase(input.begin(), std::next(input.begin(), inputi + 2));
63} 51}
64 52
65StereoBuffer16 None(State& state, const StereoBuffer16& input, float rate_multiplier) { 53void None(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output,
66 return StepOverSamples( 54 size_t& outputi) {
67 state, input, rate_multiplier, 55 StepOverSamples(
56 state, input, rate, output, outputi,
68 [](u64 fraction, const auto& x0, const auto& x1, const auto& x2) { return x0; }); 57 [](u64 fraction, const auto& x0, const auto& x1, const auto& x2) { return x0; });
69} 58}
70 59
71StereoBuffer16 Linear(State& state, const StereoBuffer16& input, float rate_multiplier) { 60void Linear(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output,
61 size_t& outputi) {
72 // Note on accuracy: Some values that this produces are +/- 1 from the actual firmware. 62 // Note on accuracy: Some values that this produces are +/- 1 from the actual firmware.
73 return StepOverSamples(state, input, rate_multiplier, 63 StepOverSamples(state, input, rate, output, outputi,
74 [](u64 fraction, const auto& x0, const auto& x1, const auto& x2) { 64 [](u64 fraction, const auto& x0, const auto& x1, const auto& x2) {
75 // This is a saturated subtraction. (Verified by black-box fuzzing.) 65 // This is a saturated subtraction. (Verified by black-box fuzzing.)
76 s64 delta0 = MathUtil::Clamp<s64>(x1[0] - x0[0], -32768, 32767); 66 s64 delta0 = MathUtil::Clamp<s64>(x1[0] - x0[0], -32768, 32767);
77 s64 delta1 = MathUtil::Clamp<s64>(x1[1] - x0[1], -32768, 32767); 67 s64 delta1 = MathUtil::Clamp<s64>(x1[1] - x0[1], -32768, 32767);
78 68
79 return std::array<s16, 2>{ 69 return std::array<s16, 2>{
80 static_cast<s16>(x0[0] + fraction * delta0 / scale_factor), 70 static_cast<s16>(x0[0] + fraction * delta0 / scale_factor),
81 static_cast<s16>(x0[1] + fraction * delta1 / scale_factor), 71 static_cast<s16>(x0[1] + fraction * delta1 / scale_factor),
82 }; 72 };
83 }); 73 });
84} 74}
85 75
86} // namespace AudioInterp 76} // namespace AudioInterp
diff --git a/src/audio_core/interpolate.h b/src/audio_core/interpolate.h
index 19a7b66cb..8dff6111a 100644
--- a/src/audio_core/interpolate.h
+++ b/src/audio_core/interpolate.h
@@ -5,40 +5,45 @@
5#pragma once 5#pragma once
6 6
7#include <array> 7#include <array>
8#include <vector> 8#include <deque>
9#include "audio_core/hle/common.h"
9#include "common/common_types.h" 10#include "common/common_types.h"
10 11
11namespace AudioInterp { 12namespace AudioInterp {
12 13
13/// A variable length buffer of signed PCM16 stereo samples. 14/// A variable length buffer of signed PCM16 stereo samples.
14using StereoBuffer16 = std::vector<std::array<s16, 2>>; 15using StereoBuffer16 = std::deque<std::array<s16, 2>>;
15 16
16struct State { 17struct State {
17 // Two historical samples. 18 /// Two historical samples.
18 std::array<s16, 2> xn1 = {}; ///< x[n-1] 19 std::array<s16, 2> xn1 = {}; ///< x[n-1]
19 std::array<s16, 2> xn2 = {}; ///< x[n-2] 20 std::array<s16, 2> xn2 = {}; ///< x[n-2]
21 /// Current fractional position.
22 u64 fposition = 0;
20}; 23};
21 24
22/** 25/**
23 * No interpolation. This is equivalent to a zero-order hold. There is a two-sample predelay. 26 * No interpolation. This is equivalent to a zero-order hold. There is a two-sample predelay.
24 * @param state Interpolation state. 27 * @param state Interpolation state.
25 * @param input Input buffer. 28 * @param input Input buffer.
26 * @param rate_multiplier Stretch factor. Must be a positive non-zero value. 29 * @param rate Stretch factor. Must be a positive non-zero value.
27 * rate_multiplier > 1.0 performs decimation and rate_multipler < 1.0 30 * rate > 1.0 performs decimation and rate < 1.0 performs upsampling.
28 * performs upsampling. 31 * @param output The resampled audio buffer.
29 * @return The resampled audio buffer. 32 * @param outputi The index of output to start writing to.
30 */ 33 */
31StereoBuffer16 None(State& state, const StereoBuffer16& input, float rate_multiplier); 34void None(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output,
35 size_t& outputi);
32 36
33/** 37/**
34 * Linear interpolation. This is equivalent to a first-order hold. There is a two-sample predelay. 38 * Linear interpolation. This is equivalent to a first-order hold. There is a two-sample predelay.
35 * @param state Interpolation state. 39 * @param state Interpolation state.
36 * @param input Input buffer. 40 * @param input Input buffer.
37 * @param rate_multiplier Stretch factor. Must be a positive non-zero value. 41 * @param rate Stretch factor. Must be a positive non-zero value.
38 * rate_multiplier > 1.0 performs decimation and rate_multipler < 1.0 42 * rate > 1.0 performs decimation and rate < 1.0 performs upsampling.
39 * performs upsampling. 43 * @param output The resampled audio buffer.
40 * @return The resampled audio buffer. 44 * @param outputi The index of output to start writing to.
41 */ 45 */
42StereoBuffer16 Linear(State& state, const StereoBuffer16& input, float rate_multiplier); 46void Linear(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output,
47 size_t& outputi);
43 48
44} // namespace AudioInterp 49} // namespace AudioInterp
diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp
index 14574e56c..e524c5535 100644
--- a/src/citra/citra.cpp
+++ b/src/citra/citra.cpp
@@ -165,6 +165,8 @@ int main(int argc, char** argv) {
165 break; // Expected case 165 break; // Expected case
166 } 166 }
167 167
168 Core::Telemetry().AddField(Telemetry::FieldType::App, "Frontend", "SDL");
169
168 while (emu_window->IsOpen()) { 170 while (emu_window->IsOpen()) {
169 system.RunLoop(); 171 system.RunLoop();
170 } 172 }
diff --git a/src/citra/citra.rc b/src/citra/citra.rc
index fea603004..c490ef302 100644
--- a/src/citra/citra.rc
+++ b/src/citra/citra.rc
@@ -1,3 +1,4 @@
1#include "winresrc.h"
1///////////////////////////////////////////////////////////////////////////// 2/////////////////////////////////////////////////////////////////////////////
2// 3//
3// Icon 4// Icon
@@ -7,3 +8,10 @@
7// remains consistent on all systems. 8// remains consistent on all systems.
8CITRA_ICON ICON "../../dist/citra.ico" 9CITRA_ICON ICON "../../dist/citra.ico"
9 10
11
12/////////////////////////////////////////////////////////////////////////////
13//
14// RT_MANIFEST
15//
16
171 RT_MANIFEST "../../dist/citra.manifest"
diff --git a/src/citra/config.cpp b/src/citra/config.cpp
index 69247b166..45c28ad09 100644
--- a/src/citra/config.cpp
+++ b/src/citra/config.cpp
@@ -76,6 +76,11 @@ void Config::ReadValues() {
76 Settings::values.analogs[i] = default_param; 76 Settings::values.analogs[i] = default_param;
77 } 77 }
78 78
79 Settings::values.motion_device = sdl2_config->Get(
80 "Controls", "motion_device", "engine:motion_emu,update_period:100,sensitivity:0.01");
81 Settings::values.touch_device =
82 sdl2_config->Get("Controls", "touch_device", "engine:emu_window");
83
79 // Core 84 // Core
80 Settings::values.use_cpu_jit = sdl2_config->GetBoolean("Core", "use_cpu_jit", true); 85 Settings::values.use_cpu_jit = sdl2_config->GetBoolean("Core", "use_cpu_jit", true);
81 86
@@ -153,8 +158,14 @@ void Config::ReadValues() {
153 static_cast<u16>(sdl2_config->GetInteger("Debugging", "gdbstub_port", 24689)); 158 static_cast<u16>(sdl2_config->GetInteger("Debugging", "gdbstub_port", 24689));
154 159
155 // Web Service 160 // Web Service
161 Settings::values.enable_telemetry =
162 sdl2_config->GetBoolean("WebService", "enable_telemetry", true);
156 Settings::values.telemetry_endpoint_url = sdl2_config->Get( 163 Settings::values.telemetry_endpoint_url = sdl2_config->Get(
157 "WebService", "telemetry_endpoint_url", "https://services.citra-emu.org/api/telemetry"); 164 "WebService", "telemetry_endpoint_url", "https://services.citra-emu.org/api/telemetry");
165 Settings::values.verify_endpoint_url = sdl2_config->Get(
166 "WebService", "verify_endpoint_url", "https://services.citra-emu.org/api/profile");
167 Settings::values.citra_username = sdl2_config->Get("WebService", "citra_username", "");
168 Settings::values.citra_token = sdl2_config->Get("WebService", "citra_token", "");
158} 169}
159 170
160void Config::Reload() { 171void Config::Reload() {
diff --git a/src/citra/default_ini.h b/src/citra/default_ini.h
index a12498e0f..59faf773f 100644
--- a/src/citra/default_ini.h
+++ b/src/citra/default_ini.h
@@ -12,7 +12,7 @@ const char* sdl2_config_file = R"(
12# It should be in the format of "engine:[engine_name],[param1]:[value1],[param2]:[value2]..." 12# It should be in the format of "engine:[engine_name],[param1]:[value1],[param2]:[value2]..."
13# Escape characters $0 (for ':'), $1 (for ',') and $2 (for '$') can be used in values 13# Escape characters $0 (for ':'), $1 (for ',') and $2 (for '$') can be used in values
14 14
15# for button input, the following devices are avaible: 15# for button input, the following devices are available:
16# - "keyboard" (default) for keyboard input. Required parameters: 16# - "keyboard" (default) for keyboard input. Required parameters:
17# - "code": the code of the key to bind 17# - "code": the code of the key to bind
18# - "sdl" for joystick input using SDL. Required parameters: 18# - "sdl" for joystick input using SDL. Required parameters:
@@ -21,7 +21,7 @@ const char* sdl2_config_file = R"(
21# - "hat"(optional): the index of the hat to bind as direction buttons 21# - "hat"(optional): the index of the hat to bind as direction buttons
22# - "axis"(optional): the index of the axis to bind 22# - "axis"(optional): the index of the axis to bind
23# - "direction"(only used for hat): the direction name of the hat to bind. Can be "up", "down", "left" or "right" 23# - "direction"(only used for hat): the direction name of the hat to bind. Can be "up", "down", "left" or "right"
24# - "threshould"(only used for axis): a float value in (-1.0, 1.0) which the button is 24# - "threshold"(only used for axis): a float value in (-1.0, 1.0) which the button is
25# triggered if the axis value crosses 25# triggered if the axis value crosses
26# - "direction"(only used for axis): "+" means the button is triggered when the axis value 26# - "direction"(only used for axis): "+" means the button is triggered when the axis value
27# is greater than the threshold; "-" means the button is triggered when the axis value 27# is greater than the threshold; "-" means the button is triggered when the axis value
@@ -42,8 +42,8 @@ button_zl=
42button_zr= 42button_zr=
43button_home= 43button_home=
44 44
45# for analog input, the following devices are avaible: 45# for analog input, the following devices are available:
46# - "analog_from_button" (default) for emulating analog input from direction buttons. Required parameters: 46# - "analog_from_button" (default) for emulating analog input from direction buttons. Required parameters:
47# - "up", "down", "left", "right": sub-devices for each direction. 47# - "up", "down", "left", "right": sub-devices for each direction.
48# Should be in the format as a button input devices using escape characters, for example, "engine$0keyboard$1code$00" 48# Should be in the format as a button input devices using escape characters, for example, "engine$0keyboard$1code$00"
49# - "modifier": sub-devices as a modifier. 49# - "modifier": sub-devices as a modifier.
@@ -56,6 +56,16 @@ button_home=
56circle_pad= 56circle_pad=
57c_stick= 57c_stick=
58 58
59# for motion input, the following devices are available:
60# - "motion_emu" (default) for emulating motion input from mouse input. Required parameters:
61# - "update_period": update period in milliseconds (default to 100)
62# - "sensitivity": the coefficient converting mouse movement to tilting angle (default to 0.01)
63motion_device=
64
65# for touch input, the following devices are available:
66# - "emu_window" (default) for emulating touch input from mouse input to the emulation window. No parameters required
67touch_device=
68
59[Core] 69[Core]
60# Whether to use the Just-In-Time (JIT) compiler for CPU emulation 70# Whether to use the Just-In-Time (JIT) compiler for CPU emulation
61# 0: Interpreter (slow), 1 (default): JIT (fast) 71# 0: Interpreter (slow), 1 (default): JIT (fast)
@@ -170,7 +180,16 @@ use_gdbstub=false
170gdbstub_port=24689 180gdbstub_port=24689
171 181
172[WebService] 182[WebService]
183# Whether or not to enable telemetry
184# 0: No, 1 (default): Yes
185enable_telemetry =
173# Endpoint URL for submitting telemetry data 186# Endpoint URL for submitting telemetry data
174telemetry_endpoint_url = 187telemetry_endpoint_url = https://services.citra-emu.org/api/telemetry
188# Endpoint URL to verify the username and token
189verify_endpoint_url = https://services.citra-emu.org/api/profile
190# Username and token for Citra Web Service
191# See https://services.citra-emu.org/ for more info
192citra_username =
193citra_token =
175)"; 194)";
176} 195}
diff --git a/src/citra/emu_window/emu_window_sdl2.cpp b/src/citra/emu_window/emu_window_sdl2.cpp
index b0f808399..25643715a 100644
--- a/src/citra/emu_window/emu_window_sdl2.cpp
+++ b/src/citra/emu_window/emu_window_sdl2.cpp
@@ -16,11 +16,12 @@
16#include "core/settings.h" 16#include "core/settings.h"
17#include "input_common/keyboard.h" 17#include "input_common/keyboard.h"
18#include "input_common/main.h" 18#include "input_common/main.h"
19#include "input_common/motion_emu.h"
19#include "network/network.h" 20#include "network/network.h"
20 21
21void EmuWindow_SDL2::OnMouseMotion(s32 x, s32 y) { 22void EmuWindow_SDL2::OnMouseMotion(s32 x, s32 y) {
22 TouchMoved((unsigned)std::max(x, 0), (unsigned)std::max(y, 0)); 23 TouchMoved((unsigned)std::max(x, 0), (unsigned)std::max(y, 0));
23 motion_emu->Tilt(x, y); 24 InputCommon::GetMotionEmu()->Tilt(x, y);
24} 25}
25 26
26void EmuWindow_SDL2::OnMouseButton(u32 button, u8 state, s32 x, s32 y) { 27void EmuWindow_SDL2::OnMouseButton(u32 button, u8 state, s32 x, s32 y) {
@@ -32,9 +33,9 @@ void EmuWindow_SDL2::OnMouseButton(u32 button, u8 state, s32 x, s32 y) {
32 } 33 }
33 } else if (button == SDL_BUTTON_RIGHT) { 34 } else if (button == SDL_BUTTON_RIGHT) {
34 if (state == SDL_PRESSED) { 35 if (state == SDL_PRESSED) {
35 motion_emu->BeginTilt(x, y); 36 InputCommon::GetMotionEmu()->BeginTilt(x, y);
36 } else { 37 } else {
37 motion_emu->EndTilt(); 38 InputCommon::GetMotionEmu()->EndTilt();
38 } 39 }
39 } 40 }
40} 41}
@@ -61,8 +62,6 @@ EmuWindow_SDL2::EmuWindow_SDL2() {
61 InputCommon::Init(); 62 InputCommon::Init();
62 Network::Init(); 63 Network::Init();
63 64
64 motion_emu = std::make_unique<Motion::MotionEmu>(*this);
65
66 SDL_SetMainReady(); 65 SDL_SetMainReady();
67 66
68 // Initialize the window 67 // Initialize the window
@@ -117,7 +116,6 @@ EmuWindow_SDL2::EmuWindow_SDL2() {
117EmuWindow_SDL2::~EmuWindow_SDL2() { 116EmuWindow_SDL2::~EmuWindow_SDL2() {
118 SDL_GL_DeleteContext(gl_context); 117 SDL_GL_DeleteContext(gl_context);
119 SDL_Quit(); 118 SDL_Quit();
120 motion_emu = nullptr;
121 119
122 Network::Shutdown(); 120 Network::Shutdown();
123 InputCommon::Shutdown(); 121 InputCommon::Shutdown();
diff --git a/src/citra/emu_window/emu_window_sdl2.h b/src/citra/emu_window/emu_window_sdl2.h
index 1ce2991f7..3664d2fbe 100644
--- a/src/citra/emu_window/emu_window_sdl2.h
+++ b/src/citra/emu_window/emu_window_sdl2.h
@@ -7,7 +7,6 @@
7#include <memory> 7#include <memory>
8#include <utility> 8#include <utility>
9#include "core/frontend/emu_window.h" 9#include "core/frontend/emu_window.h"
10#include "core/frontend/motion_emu.h"
11 10
12struct SDL_Window; 11struct SDL_Window;
13 12
@@ -57,7 +56,4 @@ private:
57 using SDL_GLContext = void*; 56 using SDL_GLContext = void*;
58 /// The OpenGL context associated with the window 57 /// The OpenGL context associated with the window
59 SDL_GLContext gl_context; 58 SDL_GLContext gl_context;
60
61 /// Motion sensors emulation
62 std::unique_ptr<Motion::MotionEmu> motion_emu;
63}; 59};
diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt
index f364b2284..add7566c2 100644
--- a/src/citra_qt/CMakeLists.txt
+++ b/src/citra_qt/CMakeLists.txt
@@ -12,6 +12,7 @@ set(SRCS
12 configuration/configure_graphics.cpp 12 configuration/configure_graphics.cpp
13 configuration/configure_input.cpp 13 configuration/configure_input.cpp
14 configuration/configure_system.cpp 14 configuration/configure_system.cpp
15 configuration/configure_web.cpp
15 debugger/graphics/graphics.cpp 16 debugger/graphics/graphics.cpp
16 debugger/graphics/graphics_breakpoint_observer.cpp 17 debugger/graphics/graphics_breakpoint_observer.cpp
17 debugger/graphics/graphics_breakpoints.cpp 18 debugger/graphics/graphics_breakpoints.cpp
@@ -42,6 +43,7 @@ set(HEADERS
42 configuration/configure_graphics.h 43 configuration/configure_graphics.h
43 configuration/configure_input.h 44 configuration/configure_input.h
44 configuration/configure_system.h 45 configuration/configure_system.h
46 configuration/configure_web.h
45 debugger/graphics/graphics.h 47 debugger/graphics/graphics.h
46 debugger/graphics/graphics_breakpoint_observer.h 48 debugger/graphics/graphics_breakpoint_observer.h
47 debugger/graphics/graphics_breakpoints.h 49 debugger/graphics/graphics_breakpoints.h
@@ -71,11 +73,13 @@ set(UIS
71 configuration/configure_graphics.ui 73 configuration/configure_graphics.ui
72 configuration/configure_input.ui 74 configuration/configure_input.ui
73 configuration/configure_system.ui 75 configuration/configure_system.ui
76 configuration/configure_web.ui
74 debugger/registers.ui 77 debugger/registers.ui
75 hotkeys.ui 78 hotkeys.ui
76 main.ui 79 main.ui
77 ) 80 )
78 81
82file(GLOB_RECURSE ICONS ${CMAKE_SOURCE_DIR}/dist/icons/*)
79file(GLOB_RECURSE THEMES ${CMAKE_SOURCE_DIR}/dist/qt_themes/*) 83file(GLOB_RECURSE THEMES ${CMAKE_SOURCE_DIR}/dist/qt_themes/*)
80 84
81create_directory_groups(${SRCS} ${HEADERS} ${UIS}) 85create_directory_groups(${SRCS} ${HEADERS} ${UIS})
@@ -89,10 +93,10 @@ endif()
89if (APPLE) 93if (APPLE)
90 set(MACOSX_ICON "../../dist/citra.icns") 94 set(MACOSX_ICON "../../dist/citra.icns")
91 set_source_files_properties(${MACOSX_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) 95 set_source_files_properties(${MACOSX_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
92 add_executable(citra-qt MACOSX_BUNDLE ${SRCS} ${HEADERS} ${UI_HDRS} ${THEMES} ${MACOSX_ICON}) 96 add_executable(citra-qt MACOSX_BUNDLE ${SRCS} ${HEADERS} ${UI_HDRS} ${ICONS} ${THEMES} ${MACOSX_ICON})
93 set_target_properties(citra-qt PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist) 97 set_target_properties(citra-qt PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
94else() 98else()
95 add_executable(citra-qt ${SRCS} ${HEADERS} ${UI_HDRS} ${THEMES}) 99 add_executable(citra-qt ${SRCS} ${HEADERS} ${UI_HDRS} ${ICONS} ${THEMES})
96endif() 100endif()
97target_link_libraries(citra-qt PRIVATE audio_core common core input_common network video_core) 101target_link_libraries(citra-qt PRIVATE audio_core common core input_common network video_core)
98target_link_libraries(citra-qt PRIVATE Boost::boost glad nihstro-headers Qt5::OpenGL Qt5::Widgets) 102target_link_libraries(citra-qt PRIVATE Boost::boost glad nihstro-headers Qt5::OpenGL Qt5::Widgets)
diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index 30554890f..7107bfc60 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/src/citra_qt/bootmanager.cpp
@@ -17,6 +17,7 @@
17#include "core/settings.h" 17#include "core/settings.h"
18#include "input_common/keyboard.h" 18#include "input_common/keyboard.h"
19#include "input_common/main.h" 19#include "input_common/main.h"
20#include "input_common/motion_emu.h"
20#include "network/network.h" 21#include "network/network.h"
21 22
22EmuThread::EmuThread(GRenderWindow* render_window) 23EmuThread::EmuThread(GRenderWindow* render_window)
@@ -201,7 +202,6 @@ qreal GRenderWindow::windowPixelRatio() {
201} 202}
202 203
203void GRenderWindow::closeEvent(QCloseEvent* event) { 204void GRenderWindow::closeEvent(QCloseEvent* event) {
204 motion_emu = nullptr;
205 emit Closed(); 205 emit Closed();
206 QWidget::closeEvent(event); 206 QWidget::closeEvent(event);
207} 207}
@@ -221,7 +221,7 @@ void GRenderWindow::mousePressEvent(QMouseEvent* event) {
221 this->TouchPressed(static_cast<unsigned>(pos.x() * pixelRatio), 221 this->TouchPressed(static_cast<unsigned>(pos.x() * pixelRatio),
222 static_cast<unsigned>(pos.y() * pixelRatio)); 222 static_cast<unsigned>(pos.y() * pixelRatio));
223 } else if (event->button() == Qt::RightButton) { 223 } else if (event->button() == Qt::RightButton) {
224 motion_emu->BeginTilt(pos.x(), pos.y()); 224 InputCommon::GetMotionEmu()->BeginTilt(pos.x(), pos.y());
225 } 225 }
226} 226}
227 227
@@ -230,14 +230,14 @@ void GRenderWindow::mouseMoveEvent(QMouseEvent* event) {
230 qreal pixelRatio = windowPixelRatio(); 230 qreal pixelRatio = windowPixelRatio();
231 this->TouchMoved(std::max(static_cast<unsigned>(pos.x() * pixelRatio), 0u), 231 this->TouchMoved(std::max(static_cast<unsigned>(pos.x() * pixelRatio), 0u),
232 std::max(static_cast<unsigned>(pos.y() * pixelRatio), 0u)); 232 std::max(static_cast<unsigned>(pos.y() * pixelRatio), 0u));
233 motion_emu->Tilt(pos.x(), pos.y()); 233 InputCommon::GetMotionEmu()->Tilt(pos.x(), pos.y());
234} 234}
235 235
236void GRenderWindow::mouseReleaseEvent(QMouseEvent* event) { 236void GRenderWindow::mouseReleaseEvent(QMouseEvent* event) {
237 if (event->button() == Qt::LeftButton) 237 if (event->button() == Qt::LeftButton)
238 this->TouchReleased(); 238 this->TouchReleased();
239 else if (event->button() == Qt::RightButton) 239 else if (event->button() == Qt::RightButton)
240 motion_emu->EndTilt(); 240 InputCommon::GetMotionEmu()->EndTilt();
241} 241}
242 242
243void GRenderWindow::focusOutEvent(QFocusEvent* event) { 243void GRenderWindow::focusOutEvent(QFocusEvent* event) {
@@ -290,13 +290,11 @@ void GRenderWindow::OnMinimalClientAreaChangeRequest(
290} 290}
291 291
292void GRenderWindow::OnEmulationStarting(EmuThread* emu_thread) { 292void GRenderWindow::OnEmulationStarting(EmuThread* emu_thread) {
293 motion_emu = std::make_unique<Motion::MotionEmu>(*this);
294 this->emu_thread = emu_thread; 293 this->emu_thread = emu_thread;
295 child->DisablePainting(); 294 child->DisablePainting();
296} 295}
297 296
298void GRenderWindow::OnEmulationStopping() { 297void GRenderWindow::OnEmulationStopping() {
299 motion_emu = nullptr;
300 emu_thread = nullptr; 298 emu_thread = nullptr;
301 child->EnablePainting(); 299 child->EnablePainting();
302} 300}
diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h
index 4b3a3b3cc..6974edcbb 100644
--- a/src/citra_qt/bootmanager.h
+++ b/src/citra_qt/bootmanager.h
@@ -12,7 +12,6 @@
12#include "common/thread.h" 12#include "common/thread.h"
13#include "core/core.h" 13#include "core/core.h"
14#include "core/frontend/emu_window.h" 14#include "core/frontend/emu_window.h"
15#include "core/frontend/motion_emu.h"
16 15
17class QKeyEvent; 16class QKeyEvent;
18class QScreen; 17class QScreen;
@@ -158,9 +157,6 @@ private:
158 157
159 EmuThread* emu_thread; 158 EmuThread* emu_thread;
160 159
161 /// Motion sensors emulation
162 std::unique_ptr<Motion::MotionEmu> motion_emu;
163
164protected: 160protected:
165 void showEvent(QShowEvent* event) override; 161 void showEvent(QShowEvent* event) override;
166}; 162};
diff --git a/src/citra_qt/citra-qt.rc b/src/citra_qt/citra-qt.rc
index fea603004..a48a9440d 100644
--- a/src/citra_qt/citra-qt.rc
+++ b/src/citra_qt/citra-qt.rc
@@ -1,3 +1,4 @@
1#include "winresrc.h"
1///////////////////////////////////////////////////////////////////////////// 2/////////////////////////////////////////////////////////////////////////////
2// 3//
3// Icon 4// Icon
@@ -5,5 +6,14 @@
5 6
6// Icon with lowest ID value placed first to ensure application icon 7// Icon with lowest ID value placed first to ensure application icon
7// remains consistent on all systems. 8// remains consistent on all systems.
8CITRA_ICON ICON "../../dist/citra.ico" 9// QT requires that the default application icon is named IDI_ICON1
9 10
11IDI_ICON1 ICON "../../dist/citra.ico"
12
13
14/////////////////////////////////////////////////////////////////////////////
15//
16// RT_MANIFEST
17//
18
191 RT_MANIFEST "../../dist/citra.manifest"
diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp
index 75abb4ce6..5261f4c4c 100644
--- a/src/citra_qt/configuration/config.cpp
+++ b/src/citra_qt/configuration/config.cpp
@@ -57,6 +57,13 @@ void Config::ReadValues() {
57 Settings::values.analogs[i] = default_param; 57 Settings::values.analogs[i] = default_param;
58 } 58 }
59 59
60 Settings::values.motion_device =
61 qt_config->value("motion_device", "engine:motion_emu,update_period:100,sensitivity:0.01")
62 .toString()
63 .toStdString();
64 Settings::values.touch_device =
65 qt_config->value("touch_device", "engine:emu_window").toString().toStdString();
66
60 qt_config->endGroup(); 67 qt_config->endGroup();
61 68
62 qt_config->beginGroup("Core"); 69 qt_config->beginGroup("Core");
@@ -134,10 +141,17 @@ void Config::ReadValues() {
134 qt_config->endGroup(); 141 qt_config->endGroup();
135 142
136 qt_config->beginGroup("WebService"); 143 qt_config->beginGroup("WebService");
144 Settings::values.enable_telemetry = qt_config->value("enable_telemetry", true).toBool();
137 Settings::values.telemetry_endpoint_url = 145 Settings::values.telemetry_endpoint_url =
138 qt_config->value("telemetry_endpoint_url", "https://services.citra-emu.org/api/telemetry") 146 qt_config->value("telemetry_endpoint_url", "https://services.citra-emu.org/api/telemetry")
139 .toString() 147 .toString()
140 .toStdString(); 148 .toStdString();
149 Settings::values.verify_endpoint_url =
150 qt_config->value("verify_endpoint_url", "https://services.citra-emu.org/api/profile")
151 .toString()
152 .toStdString();
153 Settings::values.citra_username = qt_config->value("citra_username").toString().toStdString();
154 Settings::values.citra_token = qt_config->value("citra_token").toString().toStdString();
141 qt_config->endGroup(); 155 qt_config->endGroup();
142 156
143 qt_config->beginGroup("UI"); 157 qt_config->beginGroup("UI");
@@ -189,6 +203,7 @@ void Config::ReadValues() {
189 UISettings::values.show_status_bar = qt_config->value("showStatusBar", true).toBool(); 203 UISettings::values.show_status_bar = qt_config->value("showStatusBar", true).toBool();
190 UISettings::values.confirm_before_closing = qt_config->value("confirmClose", true).toBool(); 204 UISettings::values.confirm_before_closing = qt_config->value("confirmClose", true).toBool();
191 UISettings::values.first_start = qt_config->value("firstStart", true).toBool(); 205 UISettings::values.first_start = qt_config->value("firstStart", true).toBool();
206 UISettings::values.callout_flags = qt_config->value("calloutFlags", 0).toUInt();
192 207
193 qt_config->endGroup(); 208 qt_config->endGroup();
194} 209}
@@ -203,6 +218,8 @@ void Config::SaveValues() {
203 qt_config->setValue(QString::fromStdString(Settings::NativeAnalog::mapping[i]), 218 qt_config->setValue(QString::fromStdString(Settings::NativeAnalog::mapping[i]),
204 QString::fromStdString(Settings::values.analogs[i])); 219 QString::fromStdString(Settings::values.analogs[i]));
205 } 220 }
221 qt_config->setValue("motion_device", QString::fromStdString(Settings::values.motion_device));
222 qt_config->setValue("touch_device", QString::fromStdString(Settings::values.touch_device));
206 qt_config->endGroup(); 223 qt_config->endGroup();
207 224
208 qt_config->beginGroup("Core"); 225 qt_config->beginGroup("Core");
@@ -277,8 +294,13 @@ void Config::SaveValues() {
277 qt_config->endGroup(); 294 qt_config->endGroup();
278 295
279 qt_config->beginGroup("WebService"); 296 qt_config->beginGroup("WebService");
297 qt_config->setValue("enable_telemetry", Settings::values.enable_telemetry);
280 qt_config->setValue("telemetry_endpoint_url", 298 qt_config->setValue("telemetry_endpoint_url",
281 QString::fromStdString(Settings::values.telemetry_endpoint_url)); 299 QString::fromStdString(Settings::values.telemetry_endpoint_url));
300 qt_config->setValue("verify_endpoint_url",
301 QString::fromStdString(Settings::values.verify_endpoint_url));
302 qt_config->setValue("citra_username", QString::fromStdString(Settings::values.citra_username));
303 qt_config->setValue("citra_token", QString::fromStdString(Settings::values.citra_token));
282 qt_config->endGroup(); 304 qt_config->endGroup();
283 305
284 qt_config->beginGroup("UI"); 306 qt_config->beginGroup("UI");
@@ -314,6 +336,7 @@ void Config::SaveValues() {
314 qt_config->setValue("showStatusBar", UISettings::values.show_status_bar); 336 qt_config->setValue("showStatusBar", UISettings::values.show_status_bar);
315 qt_config->setValue("confirmClose", UISettings::values.confirm_before_closing); 337 qt_config->setValue("confirmClose", UISettings::values.confirm_before_closing);
316 qt_config->setValue("firstStart", UISettings::values.first_start); 338 qt_config->setValue("firstStart", UISettings::values.first_start);
339 qt_config->setValue("calloutFlags", UISettings::values.callout_flags);
317 340
318 qt_config->endGroup(); 341 qt_config->endGroup();
319} 342}
diff --git a/src/citra_qt/configuration/configure.ui b/src/citra_qt/configuration/configure.ui
index 85e206e42..6abd1917e 100644
--- a/src/citra_qt/configuration/configure.ui
+++ b/src/citra_qt/configuration/configure.ui
@@ -6,8 +6,8 @@
6 <rect> 6 <rect>
7 <x>0</x> 7 <x>0</x>
8 <y>0</y> 8 <y>0</y>
9 <width>441</width> 9 <width>740</width>
10 <height>501</height> 10 <height>500</height>
11 </rect> 11 </rect>
12 </property> 12 </property>
13 <property name="windowTitle"> 13 <property name="windowTitle">
@@ -49,6 +49,11 @@
49 <string>Debug</string> 49 <string>Debug</string>
50 </attribute> 50 </attribute>
51 </widget> 51 </widget>
52 <widget class="ConfigureWeb" name="webTab">
53 <attribute name="title">
54 <string>Web</string>
55 </attribute>
56 </widget>
52 </widget> 57 </widget>
53 </item> 58 </item>
54 <item> 59 <item>
@@ -97,6 +102,12 @@
97 <header>configuration/configure_graphics.h</header> 102 <header>configuration/configure_graphics.h</header>
98 <container>1</container> 103 <container>1</container>
99 </customwidget> 104 </customwidget>
105 <customwidget>
106 <class>ConfigureWeb</class>
107 <extends>QWidget</extends>
108 <header>configuration/configure_web.h</header>
109 <container>1</container>
110 </customwidget>
100 </customwidgets> 111 </customwidgets>
101 <resources/> 112 <resources/>
102 <connections> 113 <connections>
diff --git a/src/citra_qt/configuration/configure_dialog.cpp b/src/citra_qt/configuration/configure_dialog.cpp
index dfc8c03a7..b87dc0e6c 100644
--- a/src/citra_qt/configuration/configure_dialog.cpp
+++ b/src/citra_qt/configuration/configure_dialog.cpp
@@ -23,5 +23,6 @@ void ConfigureDialog::applyConfiguration() {
23 ui->graphicsTab->applyConfiguration(); 23 ui->graphicsTab->applyConfiguration();
24 ui->audioTab->applyConfiguration(); 24 ui->audioTab->applyConfiguration();
25 ui->debugTab->applyConfiguration(); 25 ui->debugTab->applyConfiguration();
26 ui->webTab->applyConfiguration();
26 Settings::Apply(); 27 Settings::Apply();
27} 28}
diff --git a/src/citra_qt/configuration/configure_graphics.ui b/src/citra_qt/configuration/configure_graphics.ui
index 228f2a869..5667b14b6 100644
--- a/src/citra_qt/configuration/configure_graphics.ui
+++ b/src/citra_qt/configuration/configure_graphics.ui
@@ -63,57 +63,57 @@
63 <widget class="QComboBox" name="resolution_factor_combobox"> 63 <widget class="QComboBox" name="resolution_factor_combobox">
64 <item> 64 <item>
65 <property name="text"> 65 <property name="text">
66 <string notr="true">Auto (Window Size)</string> 66 <string>Auto (Window Size)</string>
67 </property> 67 </property>
68 </item> 68 </item>
69 <item> 69 <item>
70 <property name="text"> 70 <property name="text">
71 <string notr="true">Native (400x240)</string> 71 <string>Native (400x240)</string>
72 </property> 72 </property>
73 </item> 73 </item>
74 <item> 74 <item>
75 <property name="text"> 75 <property name="text">
76 <string notr="true">2x Native (800x480)</string> 76 <string>2x Native (800x480)</string>
77 </property> 77 </property>
78 </item> 78 </item>
79 <item> 79 <item>
80 <property name="text"> 80 <property name="text">
81 <string notr="true">3x Native (1200x720)</string> 81 <string>3x Native (1200x720)</string>
82 </property> 82 </property>
83 </item> 83 </item>
84 <item> 84 <item>
85 <property name="text"> 85 <property name="text">
86 <string notr="true">4x Native (1600x960)</string> 86 <string>4x Native (1600x960)</string>
87 </property> 87 </property>
88 </item> 88 </item>
89 <item> 89 <item>
90 <property name="text"> 90 <property name="text">
91 <string notr="true">5x Native (2000x1200)</string> 91 <string>5x Native (2000x1200)</string>
92 </property> 92 </property>
93 </item> 93 </item>
94 <item> 94 <item>
95 <property name="text"> 95 <property name="text">
96 <string notr="true">6x Native (2400x1440)</string> 96 <string>6x Native (2400x1440)</string>
97 </property> 97 </property>
98 </item> 98 </item>
99 <item> 99 <item>
100 <property name="text"> 100 <property name="text">
101 <string notr="true">7x Native (2800x1680)</string> 101 <string>7x Native (2800x1680)</string>
102 </property> 102 </property>
103 </item> 103 </item>
104 <item> 104 <item>
105 <property name="text"> 105 <property name="text">
106 <string notr="true">8x Native (3200x1920)</string> 106 <string>8x Native (3200x1920)</string>
107 </property> 107 </property>
108 </item> 108 </item>
109 <item> 109 <item>
110 <property name="text"> 110 <property name="text">
111 <string notr="true">9x Native (3600x2160)</string> 111 <string>9x Native (3600x2160)</string>
112 </property> 112 </property>
113 </item> 113 </item>
114 <item> 114 <item>
115 <property name="text"> 115 <property name="text">
116 <string notr="true">10x Native (4000x2400)</string> 116 <string>10x Native (4000x2400)</string>
117 </property> 117 </property>
118 </item> 118 </item>
119 </widget> 119 </widget>
@@ -146,17 +146,22 @@
146 <widget class="QComboBox" name="layout_combobox"> 146 <widget class="QComboBox" name="layout_combobox">
147 <item> 147 <item>
148 <property name="text"> 148 <property name="text">
149 <string notr="true">Default</string> 149 <string>Default</string>
150 </property> 150 </property>
151 </item> 151 </item>
152 <item> 152 <item>
153 <property name="text"> 153 <property name="text">
154 <string notr="true">Single Screen</string> 154 <string>Single Screen</string>
155 </property> 155 </property>
156 </item> 156 </item>
157 <item> 157 <item>
158 <property name="text"> 158 <property name="text">
159 <string notr="true">Large Screen</string> 159 <string>Large Screen</string>
160 </property>
161 </item>
162 <item>
163 <property name="text">
164 <string>Side by Side</string>
160 </property> 165 </property>
161 </item> 166 </item>
162 </widget> 167 </widget>
diff --git a/src/citra_qt/configuration/configure_system.cpp b/src/citra_qt/configuration/configure_system.cpp
index 9b1e6711d..88a067c12 100644
--- a/src/citra_qt/configuration/configure_system.cpp
+++ b/src/citra_qt/configuration/configure_system.cpp
@@ -78,7 +78,8 @@ void ConfigureSystem::ReadSystemSettings() {
78 78
79 // set the console id 79 // set the console id
80 u64 console_id = Service::CFG::GetConsoleUniqueId(); 80 u64 console_id = Service::CFG::GetConsoleUniqueId();
81 ui->label_console_id->setText("Console ID: 0x" + QString::number(console_id, 16).toUpper()); 81 ui->label_console_id->setText(
82 tr("Console ID: 0x%1").arg(QString::number(console_id, 16).toUpper()));
82} 83}
83 84
84void ConfigureSystem::applyConfiguration() { 85void ConfigureSystem::applyConfiguration() {
diff --git a/src/citra_qt/configuration/configure_web.cpp b/src/citra_qt/configuration/configure_web.cpp
new file mode 100644
index 000000000..bf8c21ac7
--- /dev/null
+++ b/src/citra_qt/configuration/configure_web.cpp
@@ -0,0 +1,102 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <QMessageBox>
6#include "citra_qt/configuration/configure_web.h"
7#include "core/settings.h"
8#include "core/telemetry_session.h"
9#include "ui_configure_web.h"
10
11ConfigureWeb::ConfigureWeb(QWidget* parent)
12 : QWidget(parent), ui(std::make_unique<Ui::ConfigureWeb>()) {
13 ui->setupUi(this);
14 connect(ui->button_regenerate_telemetry_id, &QPushButton::clicked, this,
15 &ConfigureWeb::RefreshTelemetryID);
16 connect(ui->button_verify_login, &QPushButton::clicked, this, &ConfigureWeb::VerifyLogin);
17 connect(this, &ConfigureWeb::LoginVerified, this, &ConfigureWeb::OnLoginVerified);
18
19 this->setConfiguration();
20}
21
22ConfigureWeb::~ConfigureWeb() {}
23
24void ConfigureWeb::setConfiguration() {
25 ui->web_credentials_disclaimer->setWordWrap(true);
26 ui->telemetry_learn_more->setOpenExternalLinks(true);
27 ui->telemetry_learn_more->setText(tr("<a "
28 "href='https://citra-emu.org/entry/"
29 "telemetry-and-why-thats-a-good-thing/'>Learn more</a>"));
30
31 ui->web_signup_link->setOpenExternalLinks(true);
32 ui->web_signup_link->setText(tr("<a href='https://services.citra-emu.org/'>Sign up</a>"));
33 ui->web_token_info_link->setOpenExternalLinks(true);
34 ui->web_token_info_link->setText(
35 tr("<a href='https://citra-emu.org/wiki/citra-web-service/'>What is my token?</a>"));
36
37 ui->toggle_telemetry->setChecked(Settings::values.enable_telemetry);
38 ui->edit_username->setText(QString::fromStdString(Settings::values.citra_username));
39 ui->edit_token->setText(QString::fromStdString(Settings::values.citra_token));
40 // Connect after setting the values, to avoid calling OnLoginChanged now
41 connect(ui->edit_token, &QLineEdit::textChanged, this, &ConfigureWeb::OnLoginChanged);
42 connect(ui->edit_username, &QLineEdit::textChanged, this, &ConfigureWeb::OnLoginChanged);
43 ui->label_telemetry_id->setText(
44 tr("Telemetry ID: 0x%1").arg(QString::number(Core::GetTelemetryId(), 16).toUpper()));
45 user_verified = true;
46}
47
48void ConfigureWeb::applyConfiguration() {
49 Settings::values.enable_telemetry = ui->toggle_telemetry->isChecked();
50 if (user_verified) {
51 Settings::values.citra_username = ui->edit_username->text().toStdString();
52 Settings::values.citra_token = ui->edit_token->text().toStdString();
53 } else {
54 QMessageBox::warning(this, tr("Username and token not verfied"),
55 tr("Username and token were not verified. The changes to your "
56 "username and/or token have not been saved."));
57 }
58 Settings::Apply();
59}
60
61void ConfigureWeb::RefreshTelemetryID() {
62 const u64 new_telemetry_id{Core::RegenerateTelemetryId()};
63 ui->label_telemetry_id->setText(
64 tr("Telemetry ID: 0x%1").arg(QString::number(new_telemetry_id, 16).toUpper()));
65}
66
67void ConfigureWeb::OnLoginChanged() {
68 if (ui->edit_username->text().isEmpty() && ui->edit_token->text().isEmpty()) {
69 user_verified = true;
70 ui->label_username_verified->setPixmap(QPixmap(":/icons/checked.png"));
71 ui->label_token_verified->setPixmap(QPixmap(":/icons/checked.png"));
72 } else {
73 user_verified = false;
74 ui->label_username_verified->setPixmap(QPixmap(":/icons/failed.png"));
75 ui->label_token_verified->setPixmap(QPixmap(":/icons/failed.png"));
76 }
77}
78
79void ConfigureWeb::VerifyLogin() {
80 verified =
81 Core::VerifyLogin(ui->edit_username->text().toStdString(),
82 ui->edit_token->text().toStdString(), [&]() { emit LoginVerified(); });
83 ui->button_verify_login->setDisabled(true);
84 ui->button_verify_login->setText(tr("Verifying"));
85}
86
87void ConfigureWeb::OnLoginVerified() {
88 ui->button_verify_login->setEnabled(true);
89 ui->button_verify_login->setText(tr("Verify"));
90 if (verified.get()) {
91 user_verified = true;
92 ui->label_username_verified->setPixmap(QPixmap(":/icons/checked.png"));
93 ui->label_token_verified->setPixmap(QPixmap(":/icons/checked.png"));
94 } else {
95 ui->label_username_verified->setPixmap(QPixmap(":/icons/failed.png"));
96 ui->label_token_verified->setPixmap(QPixmap(":/icons/failed.png"));
97 QMessageBox::critical(
98 this, tr("Verification failed"),
99 tr("Verification failed. Check that you have entered your username and token "
100 "correctly, and that your internet connection is working."));
101 }
102}
diff --git a/src/citra_qt/configuration/configure_web.h b/src/citra_qt/configuration/configure_web.h
new file mode 100644
index 000000000..ad2d58f6e
--- /dev/null
+++ b/src/citra_qt/configuration/configure_web.h
@@ -0,0 +1,40 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <future>
8#include <memory>
9#include <QWidget>
10
11namespace Ui {
12class ConfigureWeb;
13}
14
15class ConfigureWeb : public QWidget {
16 Q_OBJECT
17
18public:
19 explicit ConfigureWeb(QWidget* parent = nullptr);
20 ~ConfigureWeb();
21
22 void applyConfiguration();
23
24public slots:
25 void RefreshTelemetryID();
26 void OnLoginChanged();
27 void VerifyLogin();
28 void OnLoginVerified();
29
30signals:
31 void LoginVerified();
32
33private:
34 void setConfiguration();
35
36 bool user_verified = true;
37 std::future<bool> verified;
38
39 std::unique_ptr<Ui::ConfigureWeb> ui;
40};
diff --git a/src/citra_qt/configuration/configure_web.ui b/src/citra_qt/configuration/configure_web.ui
new file mode 100644
index 000000000..dd996ab62
--- /dev/null
+++ b/src/citra_qt/configuration/configure_web.ui
@@ -0,0 +1,190 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<ui version="4.0">
3 <class>ConfigureWeb</class>
4 <widget class="QWidget" name="ConfigureWeb">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>926</width>
10 <height>561</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>Form</string>
15 </property>
16 <layout class="QVBoxLayout" name="verticalLayout">
17 <item>
18 <layout class="QVBoxLayout" name="verticalLayout_3">
19 <item>
20 <widget class="QGroupBox" name="groupBoxWebConfig">
21 <property name="title">
22 <string>Citra Web Service</string>
23 </property>
24 <layout class="QVBoxLayout" name="verticalLayoutCitraWebService">
25 <item>
26 <widget class="QLabel" name="web_credentials_disclaimer">
27 <property name="text">
28 <string>By providing your username and token, you agree to allow Citra to collect additional usage data, which may include user identifying information.</string>
29 </property>
30 </widget>
31 </item>
32 <item>
33 <layout class="QGridLayout" name="gridLayoutCitraUsername">
34 <item row="2" column="3">
35 <widget class="QPushButton" name="button_verify_login">
36 <property name="sizePolicy">
37 <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
38 <horstretch>0</horstretch>
39 <verstretch>0</verstretch>
40 </sizepolicy>
41 </property>
42 <property name="layoutDirection">
43 <enum>Qt::RightToLeft</enum>
44 </property>
45 <property name="text">
46 <string>Verify</string>
47 </property>
48 </widget>
49 </item>
50 <item row="2" column="0">
51 <widget class="QLabel" name="web_signup_link">
52 <property name="text">
53 <string>Sign up</string>
54 </property>
55 </widget>
56 </item>
57 <item row="0" column="1" colspan="3">
58 <widget class="QLineEdit" name="edit_username">
59 <property name="maxLength">
60 <number>36</number>
61 </property>
62 </widget>
63 </item>
64 <item row="1" column="0">
65 <widget class="QLabel" name="label_token">
66 <property name="text">
67 <string>Token: </string>
68 </property>
69 </widget>
70 </item>
71 <item row="1" column="4">
72 <widget class="QLabel" name="label_token_verified">
73 </widget>
74 </item>
75 <item row="0" column="0">
76 <widget class="QLabel" name="label_username">
77 <property name="text">
78 <string>Username: </string>
79 </property>
80 </widget>
81 </item>
82 <item row="0" column="4">
83 <widget class="QLabel" name="label_username_verified">
84 </widget>
85 </item>
86 <item row="1" column="1" colspan="3">
87 <widget class="QLineEdit" name="edit_token">
88 <property name="maxLength">
89 <number>36</number>
90 </property>
91 <property name="echoMode">
92 <enum>QLineEdit::Password</enum>
93 </property>
94 </widget>
95 </item>
96 <item row="2" column="1">
97 <widget class="QLabel" name="web_token_info_link">
98 <property name="text">
99 <string>What is my token?</string>
100 </property>
101 </widget>
102 </item>
103 <item row="2" column="2">
104 <spacer name="horizontalSpacer">
105 <property name="orientation">
106 <enum>Qt::Horizontal</enum>
107 </property>
108 <property name="sizeHint" stdset="0">
109 <size>
110 <width>40</width>
111 <height>20</height>
112 </size>
113 </property>
114 </spacer>
115 </item>
116 </layout>
117 </item>
118 </layout>
119 </widget>
120 </item>
121 <item>
122 <widget class="QGroupBox" name="groupBox">
123 <property name="title">
124 <string>Telemetry</string>
125 </property>
126 <layout class="QVBoxLayout" name="verticalLayout_2">
127 <item>
128 <widget class="QCheckBox" name="toggle_telemetry">
129 <property name="text">
130 <string>Share anonymous usage data with the Citra team</string>
131 </property>
132 </widget>
133 </item>
134 <item>
135 <widget class="QLabel" name="telemetry_learn_more">
136 <property name="text">
137 <string>Learn more</string>
138 </property>
139 </widget>
140 </item>
141 <item>
142 <layout class="QGridLayout" name="gridLayoutTelemetryId">
143 <item row="0" column="0">
144 <widget class="QLabel" name="label_telemetry_id">
145 <property name="text">
146 <string>Telemetry ID:</string>
147 </property>
148 </widget>
149 </item>
150 <item row="0" column="1">
151 <widget class="QPushButton" name="button_regenerate_telemetry_id">
152 <property name="sizePolicy">
153 <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
154 <horstretch>0</horstretch>
155 <verstretch>0</verstretch>
156 </sizepolicy>
157 </property>
158 <property name="layoutDirection">
159 <enum>Qt::RightToLeft</enum>
160 </property>
161 <property name="text">
162 <string>Regenerate</string>
163 </property>
164 </widget>
165 </item>
166 </layout>
167 </item>
168 </layout>
169 </widget>
170 </item>
171 </layout>
172 </item>
173 <item>
174 <spacer name="verticalSpacer">
175 <property name="orientation">
176 <enum>Qt::Vertical</enum>
177 </property>
178 <property name="sizeHint" stdset="0">
179 <size>
180 <width>20</width>
181 <height>40</height>
182 </size>
183 </property>
184 </spacer>
185 </item>
186 </layout>
187 </widget>
188 <resources/>
189 <connections/>
190</ui>
diff --git a/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp b/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp
index 7d06ec28a..ce2b9fa50 100644
--- a/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp
+++ b/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp
@@ -26,8 +26,8 @@
26namespace { 26namespace {
27QImage LoadTexture(const u8* src, const Pica::Texture::TextureInfo& info) { 27QImage LoadTexture(const u8* src, const Pica::Texture::TextureInfo& info) {
28 QImage decoded_image(info.width, info.height, QImage::Format_ARGB32); 28 QImage decoded_image(info.width, info.height, QImage::Format_ARGB32);
29 for (int y = 0; y < info.height; ++y) { 29 for (u32 y = 0; y < info.height; ++y) {
30 for (int x = 0; x < info.width; ++x) { 30 for (u32 x = 0; x < info.width; ++x) {
31 Math::Vec4<u8> color = Pica::Texture::LookupTexture(src, x, y, info, true); 31 Math::Vec4<u8> color = Pica::Texture::LookupTexture(src, x, y, info, true);
32 decoded_image.setPixel(x, y, qRgba(color.r(), color.g(), color.b(), color.a())); 32 decoded_image.setPixel(x, y, qRgba(color.r(), color.g(), color.b(), color.a()));
33 } 33 }
diff --git a/src/citra_qt/debugger/graphics/graphics_surface.cpp b/src/citra_qt/debugger/graphics/graphics_surface.cpp
index 47d9924e1..c974545ef 100644
--- a/src/citra_qt/debugger/graphics/graphics_surface.cpp
+++ b/src/citra_qt/debugger/graphics/graphics_surface.cpp
@@ -273,7 +273,8 @@ void GraphicsSurfaceWidget::Pick(int x, int y) {
273 surface_picker_x_control->setValue(x); 273 surface_picker_x_control->setValue(x);
274 surface_picker_y_control->setValue(y); 274 surface_picker_y_control->setValue(y);
275 275
276 if (x < 0 || x >= surface_width || y < 0 || y >= surface_height) { 276 if (x < 0 || x >= static_cast<int>(surface_width) || y < 0 ||
277 y >= static_cast<int>(surface_height)) {
277 surface_info_label->setText(tr("Pixel out of bounds")); 278 surface_info_label->setText(tr("Pixel out of bounds"));
278 surface_info_label->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); 279 surface_info_label->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
279 return; 280 return;
diff --git a/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp b/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp
index e3f3194db..7f4ec0c52 100644
--- a/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp
+++ b/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp
@@ -183,23 +183,13 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
183 print_input(output, src1, swizzle.negate_src1, 183 print_input(output, src1, swizzle.negate_src1,
184 SelectorToString(swizzle.src1_selector)); 184 SelectorToString(swizzle.src1_selector));
185 AlignToColumn(kInputOperandColumnWidth); 185 AlignToColumn(kInputOperandColumnWidth);
186 if (src_is_inverted) { 186 print_input(output, src2, swizzle.negate_src2,
187 print_input(output, src2, swizzle.negate_src2, 187 SelectorToString(swizzle.src2_selector), true,
188 SelectorToString(swizzle.src2_selector)); 188 src_is_inverted ? "" : instr.mad.AddressRegisterName());
189 } else {
190 print_input(output, src2, swizzle.negate_src2,
191 SelectorToString(swizzle.src2_selector), true,
192 instr.mad.AddressRegisterName());
193 }
194 AlignToColumn(kInputOperandColumnWidth); 189 AlignToColumn(kInputOperandColumnWidth);
195 if (src_is_inverted) { 190 print_input(output, src3, swizzle.negate_src3,
196 print_input(output, src3, swizzle.negate_src3, 191 SelectorToString(swizzle.src3_selector), true,
197 SelectorToString(swizzle.src3_selector), true, 192 src_is_inverted ? instr.mad.AddressRegisterName() : "");
198 instr.mad.AddressRegisterName());
199 } else {
200 print_input(output, src3, swizzle.negate_src3,
201 SelectorToString(swizzle.src3_selector));
202 }
203 AlignToColumn(kInputOperandColumnWidth); 193 AlignToColumn(kInputOperandColumnWidth);
204 break; 194 break;
205 } 195 }
@@ -222,16 +212,15 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
222 SourceRegister src1 = instr.common.GetSrc1(src_is_inverted); 212 SourceRegister src1 = instr.common.GetSrc1(src_is_inverted);
223 print_input(output, src1, swizzle.negate_src1, 213 print_input(output, src1, swizzle.negate_src1,
224 swizzle.SelectorToString(false), true, 214 swizzle.SelectorToString(false), true,
225 instr.common.AddressRegisterName()); 215 src_is_inverted ? "" : instr.common.AddressRegisterName());
226 AlignToColumn(kInputOperandColumnWidth); 216 AlignToColumn(kInputOperandColumnWidth);
227 } 217 }
228 218
229 // TODO: In some cases, the Address Register is used as an index for SRC2
230 // instead of SRC1
231 if (opcode_info.subtype & OpCode::Info::Src2) { 219 if (opcode_info.subtype & OpCode::Info::Src2) {
232 SourceRegister src2 = instr.common.GetSrc2(src_is_inverted); 220 SourceRegister src2 = instr.common.GetSrc2(src_is_inverted);
233 print_input(output, src2, swizzle.negate_src2, 221 print_input(output, src2, swizzle.negate_src2,
234 swizzle.SelectorToString(true)); 222 swizzle.SelectorToString(true), true,
223 src_is_inverted ? instr.common.AddressRegisterName() : "");
235 AlignToColumn(kInputOperandColumnWidth); 224 AlignToColumn(kInputOperandColumnWidth);
236 } 225 }
237 break; 226 break;
@@ -247,7 +236,9 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
247 236
248 switch (opcode.EffectiveOpCode()) { 237 switch (opcode.EffectiveOpCode()) {
249 case OpCode::Id::LOOP: 238 case OpCode::Id::LOOP:
250 output << "(unknown instruction format)"; 239 output << 'i' << instr.flow_control.int_uniform_id << " (end on 0x"
240 << std::setw(4) << std::right << std::setfill('0') << std::hex
241 << (4 * instr.flow_control.dest_offset) << ")";
251 break; 242 break;
252 243
253 default: 244 default:
@@ -255,7 +246,7 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
255 output << '('; 246 output << '(';
256 247
257 if (instr.flow_control.op != instr.flow_control.JustY) { 248 if (instr.flow_control.op != instr.flow_control.JustY) {
258 if (instr.flow_control.refx) 249 if (!instr.flow_control.refx)
259 output << '!'; 250 output << '!';
260 output << "cc.x"; 251 output << "cc.x";
261 } 252 }
@@ -267,13 +258,17 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
267 } 258 }
268 259
269 if (instr.flow_control.op != instr.flow_control.JustX) { 260 if (instr.flow_control.op != instr.flow_control.JustX) {
270 if (instr.flow_control.refy) 261 if (!instr.flow_control.refy)
271 output << '!'; 262 output << '!';
272 output << "cc.y"; 263 output << "cc.y";
273 } 264 }
274 265
275 output << ") "; 266 output << ") ";
276 } else if (opcode_info.subtype & OpCode::Info::HasUniformIndex) { 267 } else if (opcode_info.subtype & OpCode::Info::HasUniformIndex) {
268 if (opcode.EffectiveOpCode() == OpCode::Id::JMPU &&
269 (instr.flow_control.num_instructions & 1) == 1) {
270 output << '!';
271 }
277 output << 'b' << instr.flow_control.bool_uniform_id << ' '; 272 output << 'b' << instr.flow_control.bool_uniform_id << ' ';
278 } 273 }
279 274
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index 02bfdca3d..8adbcfe86 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -48,6 +48,47 @@
48Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin); 48Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);
49#endif 49#endif
50 50
51/**
52 * "Callouts" are one-time instructional messages shown to the user. In the config settings, there
53 * is a bitfield "callout_flags" options, used to track if a message has already been shown to the
54 * user. This is 32-bits - if we have more than 32 callouts, we should retire and recyle old ones.
55 */
56enum class CalloutFlag : uint32_t {
57 Telemetry = 0x1,
58};
59
60static void ShowCalloutMessage(const QString& message, CalloutFlag flag) {
61 if (UISettings::values.callout_flags & static_cast<uint32_t>(flag)) {
62 return;
63 }
64
65 UISettings::values.callout_flags |= static_cast<uint32_t>(flag);
66
67 QMessageBox msg;
68 msg.setText(message);
69 msg.setStandardButtons(QMessageBox::Ok);
70 msg.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
71 msg.setStyleSheet("QLabel{min-width: 900px;}");
72 msg.exec();
73}
74
75void GMainWindow::ShowCallouts() {
76 static const QString telemetry_message =
77 tr("To help improve Citra, the Citra Team collects anonymous usage data. No private or "
78 "personally identifying information is collected. This data helps us to understand how "
79 "people use Citra and prioritize our efforts. Furthermore, it helps us to more easily "
80 "identify emulation bugs and performance issues. This data includes:<ul><li>Information"
81 " about the version of Citra you are using</li><li>Performance data about the games you "
82 "play</li><li>Your configuration settings</li><li>Information about your computer "
83 "hardware</li><li>Emulation errors and crash information</li></ul>By default, this "
84 "feature is enabled. To disable this feature, click 'Emulation' from the menu and then "
85 "select 'Configure...'. Then, on the 'Web' tab, uncheck 'Share anonymous usage data with"
86 " the Citra team'. <br/><br/>By using this software, you agree to the above terms.<br/>"
87 "<br/><a href='https://citra-emu.org/entry/telemetry-and-why-thats-a-good-thing/'>Learn "
88 "more</a>");
89 ShowCalloutMessage(telemetry_message, CalloutFlag::Telemetry);
90}
91
51GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) { 92GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) {
52 Pica::g_debug_context = Pica::DebugContext::Construct(); 93 Pica::g_debug_context = Pica::DebugContext::Construct();
53 setAcceptDrops(true); 94 setAcceptDrops(true);
@@ -73,6 +114,9 @@ GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) {
73 114
74 UpdateUITheme(); 115 UpdateUITheme();
75 116
117 // Show one-time "callout" messages to the user
118 ShowCallouts();
119
76 QStringList args = QApplication::arguments(); 120 QStringList args = QApplication::arguments();
77 if (args.length() >= 2) { 121 if (args.length() >= 2) {
78 BootGame(args[1]); 122 BootGame(args[1]);
@@ -311,7 +355,7 @@ bool GMainWindow::LoadROM(const QString& filename) {
311 355
312 if (!gladLoadGL()) { 356 if (!gladLoadGL()) {
313 QMessageBox::critical(this, tr("Error while initializing OpenGL 3.3 Core!"), 357 QMessageBox::critical(this, tr("Error while initializing OpenGL 3.3 Core!"),
314 tr("Your GPU may not support OpenGL 3.3, or you do not" 358 tr("Your GPU may not support OpenGL 3.3, or you do not "
315 "have the latest graphics driver.")); 359 "have the latest graphics driver."));
316 return false; 360 return false;
317 } 361 }
@@ -320,6 +364,8 @@ bool GMainWindow::LoadROM(const QString& filename) {
320 364
321 const Core::System::ResultStatus result{system.Load(render_window, filename.toStdString())}; 365 const Core::System::ResultStatus result{system.Load(render_window, filename.toStdString())};
322 366
367 Core::Telemetry().AddField(Telemetry::FieldType::App, "Frontend", "Qt");
368
323 if (result != Core::System::ResultStatus::Success) { 369 if (result != Core::System::ResultStatus::Success) {
324 switch (result) { 370 switch (result) {
325 case Core::System::ResultStatus::ErrorGetLoader: 371 case Core::System::ResultStatus::ErrorGetLoader:
diff --git a/src/citra_qt/main.h b/src/citra_qt/main.h
index 360de2ced..d59a6d67d 100644
--- a/src/citra_qt/main.h
+++ b/src/citra_qt/main.h
@@ -80,6 +80,8 @@ private:
80 void BootGame(const QString& filename); 80 void BootGame(const QString& filename);
81 void ShutdownGame(); 81 void ShutdownGame();
82 82
83 void ShowCallouts();
84
83 /** 85 /**
84 * Stores the filename in the recently loaded files list. 86 * Stores the filename in the recently loaded files list.
85 * The new filename is stored at the beginning of the recently loaded files list. 87 * The new filename is stored at the beginning of the recently loaded files list.
diff --git a/src/citra_qt/ui_settings.h b/src/citra_qt/ui_settings.h
index 025c73f84..d85c92765 100644
--- a/src/citra_qt/ui_settings.h
+++ b/src/citra_qt/ui_settings.h
@@ -48,6 +48,8 @@ struct Values {
48 48
49 // Shortcut name <Shortcut, context> 49 // Shortcut name <Shortcut, context>
50 std::vector<Shortcut> shortcuts; 50 std::vector<Shortcut> shortcuts;
51
52 uint32_t callout_flags;
51}; 53};
52 54
53extern Values values; 55extern Values values;
diff --git a/src/common/common_types.h b/src/common/common_types.h
index e8f7ac6be..844d34965 100644
--- a/src/common/common_types.h
+++ b/src/common/common_types.h
@@ -24,6 +24,7 @@
24 24
25#pragma once 25#pragma once
26 26
27#include <array>
27#include <cstdint> 28#include <cstdint>
28 29
29#ifdef _MSC_VER 30#ifdef _MSC_VER
@@ -50,6 +51,9 @@ typedef double f64; ///< 64-bit floating point
50typedef u64 VAddr; ///< Represents a pointer in the userspace virtual address space. 51typedef u64 VAddr; ///< Represents a pointer in the userspace virtual address space.
51typedef u64 PAddr; ///< Represents a pointer in the ARM11 physical address space. 52typedef u64 PAddr; ///< Represents a pointer in the ARM11 physical address space.
52 53
54using u128 = std::array<std::uint64_t, 2>;
55static_assert(sizeof(u128) == 16, "u128 must be 128 bits wide");
56
53// An inheritable class to disallow the copy constructor and operator= functions 57// An inheritable class to disallow the copy constructor and operator= functions
54class NonCopyable { 58class NonCopyable {
55protected: 59protected:
diff --git a/src/common/quaternion.h b/src/common/quaternion.h
index 84ac82ed3..77f626bcb 100644
--- a/src/common/quaternion.h
+++ b/src/common/quaternion.h
@@ -30,6 +30,11 @@ public:
30 return {xyz * other.w + other.xyz * w + Cross(xyz, other.xyz), 30 return {xyz * other.w + other.xyz * w + Cross(xyz, other.xyz),
31 w * other.w - Dot(xyz, other.xyz)}; 31 w * other.w - Dot(xyz, other.xyz)};
32 } 32 }
33
34 Quaternion<T> Normalized() const {
35 T length = std::sqrt(xyz.Length2() + w * w);
36 return {xyz / length, w / length};
37 }
33}; 38};
34 39
35template <typename T> 40template <typename T>
diff --git a/src/common/scm_rev.cpp.in b/src/common/scm_rev.cpp.in
index 0080db5d5..4083095d5 100644
--- a/src/common/scm_rev.cpp.in
+++ b/src/common/scm_rev.cpp.in
@@ -8,6 +8,7 @@
8#define GIT_BRANCH "@GIT_BRANCH@" 8#define GIT_BRANCH "@GIT_BRANCH@"
9#define GIT_DESC "@GIT_DESC@" 9#define GIT_DESC "@GIT_DESC@"
10#define BUILD_NAME "@REPO_NAME@" 10#define BUILD_NAME "@REPO_NAME@"
11#define BUILD_DATE "@BUILD_DATE@"
11 12
12namespace Common { 13namespace Common {
13 14
@@ -15,6 +16,7 @@ const char g_scm_rev[] = GIT_REV;
15const char g_scm_branch[] = GIT_BRANCH; 16const char g_scm_branch[] = GIT_BRANCH;
16const char g_scm_desc[] = GIT_DESC; 17const char g_scm_desc[] = GIT_DESC;
17const char g_build_name[] = BUILD_NAME; 18const char g_build_name[] = BUILD_NAME;
19const char g_build_date[] = BUILD_DATE;
18 20
19} // namespace 21} // namespace
20 22
diff --git a/src/common/scm_rev.h b/src/common/scm_rev.h
index e22389803..18aaa1735 100644
--- a/src/common/scm_rev.h
+++ b/src/common/scm_rev.h
@@ -10,5 +10,6 @@ extern const char g_scm_rev[];
10extern const char g_scm_branch[]; 10extern const char g_scm_branch[];
11extern const char g_scm_desc[]; 11extern const char g_scm_desc[];
12extern const char g_build_name[]; 12extern const char g_build_name[];
13extern const char g_build_date[];
13 14
14} // namespace 15} // namespace
diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp
index bad311793..6959915fa 100644
--- a/src/common/string_util.cpp
+++ b/src/common/string_util.cpp
@@ -117,7 +117,7 @@ std::string StringFromFormat(const char* format, ...) {
117} 117}
118 118
119// For Debugging. Read out an u8 array. 119// For Debugging. Read out an u8 array.
120std::string ArrayToString(const u8* data, u32 size, int line_len, bool spaces) { 120std::string ArrayToString(const u8* data, size_t size, int line_len, bool spaces) {
121 std::ostringstream oss; 121 std::ostringstream oss;
122 oss << std::setfill('0') << std::hex; 122 oss << std::setfill('0') << std::hex;
123 123
diff --git a/src/common/string_util.h b/src/common/string_util.h
index 075bf4ecb..259360aec 100644
--- a/src/common/string_util.h
+++ b/src/common/string_util.h
@@ -33,7 +33,7 @@ inline void CharArrayFromFormat(char (&out)[Count], const char* format, ...) {
33} 33}
34 34
35// Good 35// Good
36std::string ArrayToString(const u8* data, u32 size, int line_len = 20, bool spaces = true); 36std::string ArrayToString(const u8* data, size_t size, int line_len = 20, bool spaces = true);
37 37
38std::string StripSpaces(const std::string& s); 38std::string StripSpaces(const std::string& s);
39std::string StripQuotes(const std::string& s); 39std::string StripQuotes(const std::string& s);
diff --git a/src/common/vector_math.h b/src/common/vector_math.h
index c7a461a1e..3f0057d9e 100644
--- a/src/common/vector_math.h
+++ b/src/common/vector_math.h
@@ -90,8 +90,9 @@ public:
90 x -= other.x; 90 x -= other.x;
91 y -= other.y; 91 y -= other.y;
92 } 92 }
93 template <typename Q = T, class = typename std::enable_if<std::is_signed<Q>::value>::type> 93
94 Vec2<decltype(-T{})> operator-() const { 94 template <typename U = T>
95 Vec2<std::enable_if_t<std::is_signed<U>::value, U>> operator-() const {
95 return MakeVec(-x, -y); 96 return MakeVec(-x, -y);
96 } 97 }
97 Vec2<decltype(T{} * T{})> operator*(const Vec2& other) const { 98 Vec2<decltype(T{} * T{})> operator*(const Vec2& other) const {
@@ -103,8 +104,7 @@ public:
103 } 104 }
104 template <typename V> 105 template <typename V>
105 void operator*=(const V& f) { 106 void operator*=(const V& f) {
106 x *= f; 107 *this = *this * f;
107 y *= f;
108 } 108 }
109 template <typename V> 109 template <typename V>
110 Vec2<decltype(T{} / V{})> operator/(const V& f) const { 110 Vec2<decltype(T{} / V{})> operator/(const V& f) const {
@@ -247,8 +247,9 @@ public:
247 y -= other.y; 247 y -= other.y;
248 z -= other.z; 248 z -= other.z;
249 } 249 }
250 template <typename Q = T, class = typename std::enable_if<std::is_signed<Q>::value>::type> 250
251 Vec3<decltype(-T{})> operator-() const { 251 template <typename U = T>
252 Vec3<std::enable_if_t<std::is_signed<U>::value, U>> operator-() const {
252 return MakeVec(-x, -y, -z); 253 return MakeVec(-x, -y, -z);
253 } 254 }
254 Vec3<decltype(T{} * T{})> operator*(const Vec3& other) const { 255 Vec3<decltype(T{} * T{})> operator*(const Vec3& other) const {
@@ -260,9 +261,7 @@ public:
260 } 261 }
261 template <typename V> 262 template <typename V>
262 void operator*=(const V& f) { 263 void operator*=(const V& f) {
263 x *= f; 264 *this = *this * f;
264 y *= f;
265 z *= f;
266 } 265 }
267 template <typename V> 266 template <typename V>
268 Vec3<decltype(T{} / V{})> operator/(const V& f) const { 267 Vec3<decltype(T{} / V{})> operator/(const V& f) const {
@@ -462,8 +461,9 @@ public:
462 z -= other.z; 461 z -= other.z;
463 w -= other.w; 462 w -= other.w;
464 } 463 }
465 template <typename Q = T, class = typename std::enable_if<std::is_signed<Q>::value>::type> 464
466 Vec4<decltype(-T{})> operator-() const { 465 template <typename U = T>
466 Vec4<std::enable_if_t<std::is_signed<U>::value, U>> operator-() const {
467 return MakeVec(-x, -y, -z, -w); 467 return MakeVec(-x, -y, -z, -w);
468 } 468 }
469 Vec4<decltype(T{} * T{})> operator*(const Vec4& other) const { 469 Vec4<decltype(T{} * T{})> operator*(const Vec4& other) const {
@@ -475,10 +475,7 @@ public:
475 } 475 }
476 template <typename V> 476 template <typename V>
477 void operator*=(const V& f) { 477 void operator*=(const V& f) {
478 x *= f; 478 *this = *this * f;
479 y *= f;
480 z *= f;
481 w *= f;
482 } 479 }
483 template <typename V> 480 template <typename V>
484 Vec4<decltype(T{} / V{})> operator/(const V& f) const { 481 Vec4<decltype(T{} / V{})> operator/(const V& f) const {
@@ -721,4 +718,4 @@ static inline Vec4<T> MakeVec(const T& x, const Vec3<T>& yzw) {
721 return MakeVec(x, yzw[0], yzw[1], yzw[2]); 718 return MakeVec(x, yzw[0], yzw[1], yzw[2]);
722} 719}
723 720
724} // namespace 721} // namespace Math
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 33ce8dc81..8b25eaf0a 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -6,6 +6,8 @@ set(SRCS
6 arm/dyncom/arm_dyncom_interpreter.cpp 6 arm/dyncom/arm_dyncom_interpreter.cpp
7 arm/dyncom/arm_dyncom_thumb.cpp 7 arm/dyncom/arm_dyncom_thumb.cpp
8 arm/dyncom/arm_dyncom_trans.cpp 8 arm/dyncom/arm_dyncom_trans.cpp
9 arm/unicorn/arm_unicorn.cpp
10 arm/unicorn/unicorn_dynload.c
9 arm/skyeye_common/armstate.cpp 11 arm/skyeye_common/armstate.cpp
10 arm/skyeye_common/armsupp.cpp 12 arm/skyeye_common/armsupp.cpp
11 arm/skyeye_common/vfp/vfp.cpp 13 arm/skyeye_common/vfp/vfp.cpp
@@ -26,14 +28,15 @@ set(SRCS
26 file_sys/archive_systemsavedata.cpp 28 file_sys/archive_systemsavedata.cpp
27 file_sys/disk_archive.cpp 29 file_sys/disk_archive.cpp
28 file_sys/ivfc_archive.cpp 30 file_sys/ivfc_archive.cpp
31 file_sys/ncch_container.cpp
29 file_sys/path_parser.cpp 32 file_sys/path_parser.cpp
30 file_sys/savedata_archive.cpp 33 file_sys/savedata_archive.cpp
34 file_sys/title_metadata.cpp
31 frontend/camera/blank_camera.cpp 35 frontend/camera/blank_camera.cpp
32 frontend/camera/factory.cpp 36 frontend/camera/factory.cpp
33 frontend/camera/interface.cpp 37 frontend/camera/interface.cpp
34 frontend/emu_window.cpp 38 frontend/emu_window.cpp
35 frontend/framebuffer_layout.cpp 39 frontend/framebuffer_layout.cpp
36 frontend/motion_emu.cpp
37 gdbstub/gdbstub.cpp 40 gdbstub/gdbstub.cpp
38 hle/config_mem.cpp 41 hle/config_mem.cpp
39 hle/applets/applet.cpp 42 hle/applets/applet.cpp
@@ -60,6 +63,7 @@ set(SRCS
60 hle/kernel/timer.cpp 63 hle/kernel/timer.cpp
61 hle/kernel/vm_manager.cpp 64 hle/kernel/vm_manager.cpp
62 hle/kernel/wait_object.cpp 65 hle/kernel/wait_object.cpp
66 hle/lock.cpp
63 hle/romfs.cpp 67 hle/romfs.cpp
64 hle/service/ac/ac.cpp 68 hle/service/ac/ac.cpp
65 hle/service/ac/ac_i.cpp 69 hle/service/ac/ac_i.cpp
@@ -135,7 +139,8 @@ set(SRCS
135 hle/service/nim/nim_aoc.cpp 139 hle/service/nim/nim_aoc.cpp
136 hle/service/nim/nim_s.cpp 140 hle/service/nim/nim_s.cpp
137 hle/service/nim/nim_u.cpp 141 hle/service/nim/nim_u.cpp
138 hle/service/ns_s.cpp 142 hle/service/ns/ns.cpp
143 hle/service/ns/ns_s.cpp
139 hle/service/nwm/nwm.cpp 144 hle/service/nwm/nwm.cpp
140 hle/service/nwm/nwm_cec.cpp 145 hle/service/nwm/nwm_cec.cpp
141 hle/service/nwm/nwm_ext.cpp 146 hle/service/nwm/nwm_ext.cpp
@@ -145,6 +150,7 @@ set(SRCS
145 hle/service/nwm/nwm_tst.cpp 150 hle/service/nwm/nwm_tst.cpp
146 hle/service/nwm/nwm_uds.cpp 151 hle/service/nwm/nwm_uds.cpp
147 hle/service/nwm/uds_beacon.cpp 152 hle/service/nwm/uds_beacon.cpp
153 hle/service/nwm/uds_connection.cpp
148 hle/service/nwm/uds_data.cpp 154 hle/service/nwm/uds_data.cpp
149 hle/service/pm_app.cpp 155 hle/service/pm_app.cpp
150 hle/service/ptm/ptm.cpp 156 hle/service/ptm/ptm.cpp
@@ -198,6 +204,8 @@ set(HEADERS
198 arm/dyncom/arm_dyncom_run.h 204 arm/dyncom/arm_dyncom_run.h
199 arm/dyncom/arm_dyncom_thumb.h 205 arm/dyncom/arm_dyncom_thumb.h
200 arm/dyncom/arm_dyncom_trans.h 206 arm/dyncom/arm_dyncom_trans.h
207 arm/unicorn/arm_unicorn.h
208 arm/unicorn/unicorn_dynload.h
201 arm/skyeye_common/arm_regformat.h 209 arm/skyeye_common/arm_regformat.h
202 arm/skyeye_common/armstate.h 210 arm/skyeye_common/armstate.h
203 arm/skyeye_common/armsupp.h 211 arm/skyeye_common/armsupp.h
@@ -229,7 +237,6 @@ set(HEADERS
229 frontend/emu_window.h 237 frontend/emu_window.h
230 frontend/framebuffer_layout.h 238 frontend/framebuffer_layout.h
231 frontend/input.h 239 frontend/input.h
232 frontend/motion_emu.h
233 gdbstub/gdbstub.h 240 gdbstub/gdbstub.h
234 hle/config_mem.h 241 hle/config_mem.h
235 hle/function_wrappers.h 242 hle/function_wrappers.h
@@ -261,6 +268,7 @@ set(HEADERS
261 hle/kernel/timer.h 268 hle/kernel/timer.h
262 hle/kernel/vm_manager.h 269 hle/kernel/vm_manager.h
263 hle/kernel/wait_object.h 270 hle/kernel/wait_object.h
271 hle/lock.h
264 hle/result.h 272 hle/result.h
265 hle/romfs.h 273 hle/romfs.h
266 hle/service/ac/ac.h 274 hle/service/ac/ac.h
@@ -337,7 +345,8 @@ set(HEADERS
337 hle/service/nim/nim_aoc.h 345 hle/service/nim/nim_aoc.h
338 hle/service/nim/nim_s.h 346 hle/service/nim/nim_s.h
339 hle/service/nim/nim_u.h 347 hle/service/nim/nim_u.h
340 hle/service/ns_s.h 348 hle/service/ns/ns.h
349 hle/service/ns/ns_s.h
341 hle/service/nwm/nwm.h 350 hle/service/nwm/nwm.h
342 hle/service/nwm/nwm_cec.h 351 hle/service/nwm/nwm_cec.h
343 hle/service/nwm/nwm_ext.h 352 hle/service/nwm/nwm_ext.h
@@ -347,6 +356,7 @@ set(HEADERS
347 hle/service/nwm/nwm_tst.h 356 hle/service/nwm/nwm_tst.h
348 hle/service/nwm/nwm_uds.h 357 hle/service/nwm/nwm_uds.h
349 hle/service/nwm/uds_beacon.h 358 hle/service/nwm/uds_beacon.h
359 hle/service/nwm/uds_connection.h
350 hle/service/nwm/uds_data.h 360 hle/service/nwm/uds_data.h
351 hle/service/pm_app.h 361 hle/service/pm_app.h
352 hle/service/ptm/ptm.h 362 hle/service/ptm/ptm.h
@@ -394,7 +404,7 @@ set(HEADERS
394 404
395create_directory_groups(${SRCS} ${HEADERS}) 405create_directory_groups(${SRCS} ${HEADERS})
396add_library(core STATIC ${SRCS} ${HEADERS}) 406add_library(core STATIC ${SRCS} ${HEADERS})
397target_link_libraries(core PUBLIC common PRIVATE audio_core video_core) 407target_link_libraries(core PUBLIC common PRIVATE audio_core network video_core)
398target_link_libraries(core PUBLIC Boost::boost PRIVATE cryptopp dynarmic fmt lz4_static) 408target_link_libraries(core PUBLIC Boost::boost PRIVATE cryptopp dynarmic fmt lz4_static)
399if (ENABLE_WEB_SERVICE) 409if (ENABLE_WEB_SERVICE)
400 target_link_libraries(core PUBLIC json-headers web_service) 410 target_link_libraries(core PUBLIC json-headers web_service)
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h
index f613556dd..0b3096347 100644
--- a/src/core/arm/arm_interface.h
+++ b/src/core/arm/arm_interface.h
@@ -5,6 +5,7 @@
5#pragma once 5#pragma once
6 6
7#include "common/common_types.h" 7#include "common/common_types.h"
8#include "core/hle/kernel/vm_manager.h"
8#include "core/arm/skyeye_common/arm_regformat.h" 9#include "core/arm/skyeye_common/arm_regformat.h"
9#include "core/arm/skyeye_common/vfp/asm_vfp.h" 10#include "core/arm/skyeye_common/vfp/asm_vfp.h"
10 11
@@ -19,10 +20,11 @@ public:
19 u64 sp; 20 u64 sp;
20 u64 pc; 21 u64 pc;
21 u64 cpsr; 22 u64 cpsr;
22 u64 fpu_registers[64]; 23 u128 fpu_registers[32];
23 u64 fpscr; 24 u64 fpscr;
24 u64 fpexc; 25 u64 fpexc;
25 26
27
26 // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT 28 // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT
27 VAddr tls_address; 29 VAddr tls_address;
28 }; 30 };
@@ -41,9 +43,14 @@ public:
41 Run(1); 43 Run(1);
42 } 44 }
43 45
46 virtual void MapBackingMemory(VAddr address, size_t size, u8* memory, Kernel::VMAPermission perms) {}
47
44 /// Clear all instruction cache 48 /// Clear all instruction cache
45 virtual void ClearInstructionCache() = 0; 49 virtual void ClearInstructionCache() = 0;
46 50
51 /// Notify CPU emulation that page tables have changed
52 virtual void PageTableChanged() = 0;
53
47 /** 54 /**
48 * Set the Program Counter to an address 55 * Set the Program Counter to an address
49 * @param addr Address to set PC to 56 * @param addr Address to set PC to
@@ -70,6 +77,10 @@ public:
70 */ 77 */
71 virtual void SetReg(int index, u64 value) = 0; 78 virtual void SetReg(int index, u64 value) = 0;
72 79
80 virtual const u128& GetExtReg(int index) const = 0;
81
82 virtual void SetExtReg(int index, u128& value) = 0;
83
73 /** 84 /**
74 * Gets the value of a VFP register 85 * Gets the value of a VFP register
75 * @param index Register index (0-31) 86 * @param index Register index (0-31)
@@ -129,12 +140,6 @@ public:
129 virtual void SetTlsAddress(VAddr address) = 0; 140 virtual void SetTlsAddress(VAddr address) = 0;
130 141
131 /** 142 /**
132 * Advance the CPU core by the specified number of ticks (e.g. to simulate CPU execution time)
133 * @param ticks Number of ticks to advance the CPU core
134 */
135 virtual void AddTicks(u64 ticks) = 0;
136
137 /**
138 * Saves the current CPU context 143 * Saves the current CPU context
139 * @param ctx Thread context to save 144 * @param ctx Thread context to save
140 */ 145 */
@@ -154,9 +159,6 @@ public:
154 return num_instructions; 159 return num_instructions;
155 } 160 }
156 161
157 s64 down_count = 0; ///< A decreasing counter of remaining cycles before the next event,
158 /// decreased by the cpu run loop
159
160protected: 162protected:
161 /** 163 /**
162 * Executes the given number of instructions 164 * Executes the given number of instructions
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp
index 0ea1d76e4..6dcab5bab 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic.cpp
@@ -16,24 +16,6 @@
16 16
17static void InterpreterFallback(u64 pc, Dynarmic::Jit* jit, void* user_arg) { 17static void InterpreterFallback(u64 pc, Dynarmic::Jit* jit, void* user_arg) {
18 UNIMPLEMENTED_MSG("InterpreterFallback for ARM64 JIT does not exist!"); 18 UNIMPLEMENTED_MSG("InterpreterFallback for ARM64 JIT does not exist!");
19 //ARMul_State* state = static_cast<ARMul_State*>(user_arg);
20
21 //state->Reg = jit->Regs();
22 //state->Cpsr = jit->Cpsr();
23 //state->Reg[15] = static_cast<u32>(pc);
24 //state->ExtReg = jit->ExtRegs();
25 //state->VFP[VFP_FPSCR] = jit->Fpscr();
26 //state->NumInstrsToExecute = 1;
27
28 //InterpreterMainLoop(state);
29
30 //bool is_thumb = (state->Cpsr & (1 << 5)) != 0;
31 //state->Reg[15] &= (is_thumb ? 0xFFFFFFFE : 0xFFFFFFFC);
32
33 //jit->Regs() = state->Reg;
34 //jit->Cpsr() = state->Cpsr;
35 //jit->ExtRegs() = state->ExtReg;
36 //jit->SetFpscr(state->VFP[VFP_FPSCR]);
37} 19}
38 20
39static bool IsReadOnlyMemory(u64 vaddr) { 21static bool IsReadOnlyMemory(u64 vaddr) {
@@ -73,11 +55,10 @@ void MemoryWrite64(const u64 addr, const u64 data) {
73 Memory::Write64(static_cast<VAddr>(addr), data); 55 Memory::Write64(static_cast<VAddr>(addr), data);
74} 56}
75 57
76static Dynarmic::UserCallbacks GetUserCallbacks( 58static Dynarmic::UserCallbacks GetUserCallbacks(ARM_Dynarmic* this_) {
77 const std::shared_ptr<ARMul_State>& interpeter_state) {
78 Dynarmic::UserCallbacks user_callbacks{}; 59 Dynarmic::UserCallbacks user_callbacks{};
79 //user_callbacks.InterpreterFallback = &InterpreterFallback; 60 user_callbacks.InterpreterFallback = &InterpreterFallback;
80 //user_callbacks.user_arg = static_cast<void*>(interpeter_state.get()); 61 user_callbacks.user_arg = static_cast<void*>(this_);
81 user_callbacks.CallSVC = &SVC::CallSVC; 62 user_callbacks.CallSVC = &SVC::CallSVC;
82 user_callbacks.memory.IsReadOnlyMemory = &IsReadOnlyMemory; 63 user_callbacks.memory.IsReadOnlyMemory = &IsReadOnlyMemory;
83 user_callbacks.memory.ReadCode = &MemoryRead32; 64 user_callbacks.memory.ReadCode = &MemoryRead32;
@@ -90,13 +71,13 @@ static Dynarmic::UserCallbacks GetUserCallbacks(
90 user_callbacks.memory.Write32 = &MemoryWrite32; 71 user_callbacks.memory.Write32 = &MemoryWrite32;
91 user_callbacks.memory.Write64 = &MemoryWrite64; 72 user_callbacks.memory.Write64 = &MemoryWrite64;
92 //user_callbacks.page_table = Memory::GetCurrentPageTablePointers(); 73 //user_callbacks.page_table = Memory::GetCurrentPageTablePointers();
93 user_callbacks.coprocessors[15] = std::make_shared<DynarmicCP15>(interpeter_state);
94 return user_callbacks; 74 return user_callbacks;
95} 75}
96 76
97ARM_Dynarmic::ARM_Dynarmic(PrivilegeMode initial_mode) { 77ARM_Dynarmic::ARM_Dynarmic(PrivilegeMode initial_mode) {
98 interpreter_state = std::make_shared<ARMul_State>(initial_mode); 78}
99 jit = std::make_unique<Dynarmic::Jit>(GetUserCallbacks(interpreter_state), Dynarmic::Arch::ARM64); 79
80void ARM_Dynarmic::MapBackingMemory(VAddr address, size_t size, u8* memory, Kernel::VMAPermission perms) {
100} 81}
101 82
102void ARM_Dynarmic::SetPC(u64 pc) { 83void ARM_Dynarmic::SetPC(u64 pc) {
@@ -115,30 +96,26 @@ void ARM_Dynarmic::SetReg(int index, u64 value) {
115 jit->Regs64()[index] = value; 96 jit->Regs64()[index] = value;
116} 97}
117 98
99const u128& ARM_Dynarmic::GetExtReg(int index) const {
100 return jit->ExtRegs64()[index];
101}
102
103void ARM_Dynarmic::SetExtReg(int index, u128& value) {
104 jit->ExtRegs64()[index] = value;
105}
106
118u32 ARM_Dynarmic::GetVFPReg(int index) const { 107u32 ARM_Dynarmic::GetVFPReg(int index) const {
119 return jit->ExtRegs()[index]; 108 return {};
120} 109}
121 110
122void ARM_Dynarmic::SetVFPReg(int index, u32 value) { 111void ARM_Dynarmic::SetVFPReg(int index, u32 value) {
123 jit->ExtRegs()[index] = value;
124} 112}
125 113
126u32 ARM_Dynarmic::GetVFPSystemReg(VFPSystemRegister reg) const { 114u32 ARM_Dynarmic::GetVFPSystemReg(VFPSystemRegister reg) const {
127 if (reg == VFP_FPSCR) { 115 return {};
128 return jit->Fpscr();
129 }
130
131 // Dynarmic does not implement and/or expose other VFP registers, fallback to interpreter state
132 return interpreter_state->VFP[reg];
133} 116}
134 117
135void ARM_Dynarmic::SetVFPSystemReg(VFPSystemRegister reg, u32 value) { 118void ARM_Dynarmic::SetVFPSystemReg(VFPSystemRegister reg, u32 value) {
136 if (reg == VFP_FPSCR) {
137 jit->SetFpscr(value);
138 }
139
140 // Dynarmic does not implement and/or expose other VFP registers, fallback to interpreter state
141 interpreter_state->VFP[reg] = value;
142} 119}
143 120
144u32 ARM_Dynarmic::GetCPSR() const { 121u32 ARM_Dynarmic::GetCPSR() const {
@@ -150,11 +127,10 @@ void ARM_Dynarmic::SetCPSR(u32 cpsr) {
150} 127}
151 128
152u32 ARM_Dynarmic::GetCP15Register(CP15Register reg) { 129u32 ARM_Dynarmic::GetCP15Register(CP15Register reg) {
153 return interpreter_state->CP15[reg]; 130 return {};
154} 131}
155 132
156void ARM_Dynarmic::SetCP15Register(CP15Register reg, u32 value) { 133void ARM_Dynarmic::SetCP15Register(CP15Register reg, u32 value) {
157 interpreter_state->CP15[reg] = value;
158} 134}
159 135
160VAddr ARM_Dynarmic::GetTlsAddress() const { 136VAddr ARM_Dynarmic::GetTlsAddress() const {
@@ -165,51 +141,39 @@ void ARM_Dynarmic::SetTlsAddress(VAddr address) {
165 jit->TlsAddr() = address; 141 jit->TlsAddr() = address;
166} 142}
167 143
168void ARM_Dynarmic::AddTicks(u64 ticks) {
169 down_count -= ticks;
170 if (down_count < 0) {
171 CoreTiming::Advance();
172 }
173}
174
175MICROPROFILE_DEFINE(ARM_Jit, "ARM JIT", "ARM JIT", MP_RGB(255, 64, 64)); 144MICROPROFILE_DEFINE(ARM_Jit, "ARM JIT", "ARM JIT", MP_RGB(255, 64, 64));
176 145
177void ARM_Dynarmic::ExecuteInstructions(int num_instructions) { 146void ARM_Dynarmic::ExecuteInstructions(int num_instructions) {
147 ASSERT(Memory::GetCurrentPageTable() == current_page_table);
178 MICROPROFILE_SCOPE(ARM_Jit); 148 MICROPROFILE_SCOPE(ARM_Jit);
179 149
180 unsigned ticks_executed = jit->Run(1 /*static_cast<unsigned>(num_instructions)*/); 150 std::size_t ticks_executed = jit->Run(static_cast<unsigned>(num_instructions));
181 151
182 AddTicks(ticks_executed); 152 CoreTiming::AddTicks(ticks_executed);
183} 153}
184 154
185void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) { 155void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) {
186 memcpy(ctx.cpu_registers, jit->Regs64().data(), sizeof(ctx.cpu_registers)); 156 memcpy(ctx.cpu_registers, jit->Regs64().data(), sizeof(ctx.cpu_registers));
187 //memcpy(ctx.fpu_registers, jit->ExtRegs().data(), sizeof(ctx.fpu_registers)); 157 memcpy(ctx.fpu_registers, jit->ExtRegs64().data(), sizeof(ctx.fpu_registers));
188 158
189 ctx.lr = jit->Regs64()[30]; 159 ctx.lr = jit->Regs64()[30];
190 ctx.sp = jit->Regs64()[31]; 160 ctx.sp = jit->Regs64()[31];
191 ctx.pc = jit->Regs64()[32]; 161 ctx.pc = jit->Regs64()[32];
192 ctx.cpsr = jit->Cpsr(); 162 ctx.cpsr = jit->Cpsr();
193 163
194 ctx.fpscr = jit->Fpscr();
195 ctx.fpexc = interpreter_state->VFP[VFP_FPEXC];
196
197 // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT 164 // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT
198 ctx.tls_address = jit->TlsAddr(); 165 ctx.tls_address = jit->TlsAddr();
199} 166}
200 167
201void ARM_Dynarmic::LoadContext(const ARM_Interface::ThreadContext& ctx) { 168void ARM_Dynarmic::LoadContext(const ARM_Interface::ThreadContext& ctx) {
202 memcpy(jit->Regs64().data(), ctx.cpu_registers, sizeof(ctx.cpu_registers)); 169 memcpy(jit->Regs64().data(), ctx.cpu_registers, sizeof(ctx.cpu_registers));
203 //memcpy(jit->ExtRegs().data(), ctx.fpu_registers, sizeof(ctx.fpu_registers)); 170 memcpy(jit->ExtRegs64().data(), ctx.fpu_registers, sizeof(ctx.fpu_registers));
204 171
205 jit->Regs64()[30] = ctx.lr; 172 jit->Regs64()[30] = ctx.lr;
206 jit->Regs64()[31] = ctx.sp; 173 jit->Regs64()[31] = ctx.sp;
207 jit->Regs64()[32] = ctx.pc; 174 jit->Regs64()[32] = ctx.pc;
208 jit->Cpsr() = ctx.cpsr; 175 jit->Cpsr() = ctx.cpsr;
209 176
210 jit->SetFpscr(ctx.fpscr);
211 interpreter_state->VFP[VFP_FPEXC] = ctx.fpexc;
212
213 // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT 177 // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT
214 jit->TlsAddr() = ctx.tls_address; 178 jit->TlsAddr() = ctx.tls_address;
215} 179}
@@ -223,3 +187,16 @@ void ARM_Dynarmic::PrepareReschedule() {
223void ARM_Dynarmic::ClearInstructionCache() { 187void ARM_Dynarmic::ClearInstructionCache() {
224 jit->ClearCache(); 188 jit->ClearCache();
225} 189}
190
191void ARM_Dynarmic::PageTableChanged() {
192 current_page_table = Memory::GetCurrentPageTable();
193
194 auto iter = jits.find(current_page_table);
195 if (iter != jits.end()) {
196 jit = iter->second.get();
197 return;
198 }
199
200 jit = new Dynarmic::Jit(GetUserCallbacks(this), Dynarmic::Arch::ARM64);
201 jits.emplace(current_page_table, std::unique_ptr<Dynarmic::Jit>(jit));
202}
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h
index fcdc1c0e0..6567359b0 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.h
+++ b/src/core/arm/dynarmic/arm_dynarmic.h
@@ -4,20 +4,29 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <map>
7#include <memory> 8#include <memory>
8#include <dynarmic/dynarmic.h> 9#include <dynarmic/dynarmic.h>
9#include "common/common_types.h" 10#include "common/common_types.h"
10#include "core/arm/arm_interface.h" 11#include "core/arm/arm_interface.h"
11#include "core/arm/skyeye_common/armstate.h" 12#include "core/arm/skyeye_common/armstate.h"
12 13
14namespace Memory {
15struct PageTable;
16} // namespace Memory
17
13class ARM_Dynarmic final : public ARM_Interface { 18class ARM_Dynarmic final : public ARM_Interface {
14public: 19public:
15 ARM_Dynarmic(PrivilegeMode initial_mode); 20 ARM_Dynarmic(PrivilegeMode initial_mode);
16 21
22 void MapBackingMemory(VAddr address, size_t size, u8* memory, Kernel::VMAPermission perms) override;
23
17 void SetPC(u64 pc) override; 24 void SetPC(u64 pc) override;
18 u64 GetPC() const override; 25 u64 GetPC() const override;
19 u64 GetReg(int index) const override; 26 u64 GetReg(int index) const override;
20 void SetReg(int index, u64 value) override; 27 void SetReg(int index, u64 value) override;
28 const u128& GetExtReg(int index) const override;
29 void SetExtReg(int index, u128& value) override;
21 u32 GetVFPReg(int index) const override; 30 u32 GetVFPReg(int index) const override;
22 void SetVFPReg(int index, u32 value) override; 31 void SetVFPReg(int index, u32 value) override;
23 u32 GetVFPSystemReg(VFPSystemRegister reg) const override; 32 u32 GetVFPSystemReg(VFPSystemRegister reg) const override;
@@ -29,8 +38,6 @@ public:
29 VAddr GetTlsAddress() const override; 38 VAddr GetTlsAddress() const override;
30 void SetTlsAddress(VAddr address) override; 39 void SetTlsAddress(VAddr address) override;
31 40
32 void AddTicks(u64 ticks) override;
33
34 void SaveContext(ThreadContext& ctx) override; 41 void SaveContext(ThreadContext& ctx) override;
35 void LoadContext(const ThreadContext& ctx) override; 42 void LoadContext(const ThreadContext& ctx) override;
36 43
@@ -38,8 +45,10 @@ public:
38 void ExecuteInstructions(int num_instructions) override; 45 void ExecuteInstructions(int num_instructions) override;
39 46
40 void ClearInstructionCache() override; 47 void ClearInstructionCache() override;
48 void PageTableChanged() override;
41 49
42private: 50private:
43 std::unique_ptr<Dynarmic::Jit> jit; 51 Dynarmic::Jit* jit = nullptr;
44 std::shared_ptr<ARMul_State> interpreter_state; 52 Memory::PageTable* current_page_table = nullptr;
53 std::map<Memory::PageTable*, std::unique_ptr<Dynarmic::Jit>> jits;
45}; 54};
diff --git a/src/core/arm/dyncom/arm_dyncom.cpp b/src/core/arm/dyncom/arm_dyncom.cpp
index 99758fc2a..5ebf7a2f1 100644
--- a/src/core/arm/dyncom/arm_dyncom.cpp
+++ b/src/core/arm/dyncom/arm_dyncom.cpp
@@ -29,6 +29,10 @@ void ARM_DynCom::SetPC(u64 pc) {
29 state->Reg[15] = pc; 29 state->Reg[15] = pc;
30} 30}
31 31
32void ARM_DynCom::PageTableChanged() {
33 ClearInstructionCache();
34}
35
32u64 ARM_DynCom::GetPC() const { 36u64 ARM_DynCom::GetPC() const {
33 return state->Reg[15]; 37 return state->Reg[15];
34} 38}
@@ -41,6 +45,13 @@ void ARM_DynCom::SetReg(int index, u64 value) {
41 state->Reg[index] = value; 45 state->Reg[index] = value;
42} 46}
43 47
48const u128& ARM_DynCom::GetExtReg(int index) const {
49 return {};
50}
51
52void ARM_DynCom::SetExtReg(int index, u128& value) {
53}
54
44u32 ARM_DynCom::GetVFPReg(int index) const { 55u32 ARM_DynCom::GetVFPReg(int index) const {
45 return state->ExtReg[index]; 56 return state->ExtReg[index];
46} 57}
@@ -80,12 +91,6 @@ VAddr ARM_DynCom::GetTlsAddress() const {
80void ARM_DynCom::SetTlsAddress(VAddr /*address*/) { 91void ARM_DynCom::SetTlsAddress(VAddr /*address*/) {
81} 92}
82 93
83void ARM_DynCom::AddTicks(u64 ticks) {
84 down_count -= ticks;
85 if (down_count < 0)
86 CoreTiming::Advance();
87}
88
89void ARM_DynCom::ExecuteInstructions(int num_instructions) { 94void ARM_DynCom::ExecuteInstructions(int num_instructions) {
90 state->NumInstrsToExecute = num_instructions; 95 state->NumInstrsToExecute = num_instructions;
91 96
@@ -93,7 +98,7 @@ void ARM_DynCom::ExecuteInstructions(int num_instructions) {
93 // executing one instruction at a time. Otherwise, if a block is being executed, more 98 // executing one instruction at a time. Otherwise, if a block is being executed, more
94 // instructions may actually be executed than specified. 99 // instructions may actually be executed than specified.
95 unsigned ticks_executed = InterpreterMainLoop(state.get()); 100 unsigned ticks_executed = InterpreterMainLoop(state.get());
96 AddTicks(ticks_executed); 101 CoreTiming::AddTicks(ticks_executed);
97} 102}
98 103
99void ARM_DynCom::SaveContext(ThreadContext& ctx) { 104void ARM_DynCom::SaveContext(ThreadContext& ctx) {
diff --git a/src/core/arm/dyncom/arm_dyncom.h b/src/core/arm/dyncom/arm_dyncom.h
index 44e674ae2..cc3c0f3da 100644
--- a/src/core/arm/dyncom/arm_dyncom.h
+++ b/src/core/arm/dyncom/arm_dyncom.h
@@ -16,11 +16,14 @@ public:
16 ~ARM_DynCom(); 16 ~ARM_DynCom();
17 17
18 void ClearInstructionCache() override; 18 void ClearInstructionCache() override;
19 void PageTableChanged() override;
19 20
20 void SetPC(u64 pc) override; 21 void SetPC(u64 pc) override;
21 u64 GetPC() const override; 22 u64 GetPC() const override;
22 u64 GetReg(int index) const override; 23 u64 GetReg(int index) const override;
23 void SetReg(int index, u64 value) override; 24 void SetReg(int index, u64 value) override;
25 const u128& GetExtReg(int index) const override;
26 void SetExtReg(int index, u128& value) override;
24 u32 GetVFPReg(int index) const override; 27 u32 GetVFPReg(int index) const override;
25 void SetVFPReg(int index, u32 value) override; 28 void SetVFPReg(int index, u32 value) override;
26 u32 GetVFPSystemReg(VFPSystemRegister reg) const override; 29 u32 GetVFPSystemReg(VFPSystemRegister reg) const override;
@@ -32,8 +35,6 @@ public:
32 VAddr GetTlsAddress() const override; 35 VAddr GetTlsAddress() const override;
33 void SetTlsAddress(VAddr address) override; 36 void SetTlsAddress(VAddr address) override;
34 37
35 void AddTicks(u64 ticks) override;
36
37 void SaveContext(ThreadContext& ctx) override; 38 void SaveContext(ThreadContext& ctx) override;
38 void LoadContext(const ThreadContext& ctx) override; 39 void LoadContext(const ThreadContext& ctx) override;
39 40
diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
index f4fbb8d04..3522d1e82 100644
--- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
+++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
@@ -759,7 +759,7 @@ static ThumbDecodeStatus DecodeThumbInstruction(u32 inst, u32 addr, u32* arm_ins
759 ThumbDecodeStatus ret = TranslateThumbInstruction(addr, inst, arm_inst, inst_size); 759 ThumbDecodeStatus ret = TranslateThumbInstruction(addr, inst, arm_inst, inst_size);
760 if (ret == ThumbDecodeStatus::BRANCH) { 760 if (ret == ThumbDecodeStatus::BRANCH) {
761 int inst_index; 761 int inst_index;
762 int table_length = arm_instruction_trans_len; 762 int table_length = static_cast<int>(arm_instruction_trans_len);
763 u32 tinstr = GetThumbInstruction(inst, addr); 763 u32 tinstr = GetThumbInstruction(inst, addr);
764 764
765 switch ((tinstr & 0xF800) >> 11) { 765 switch ((tinstr & 0xF800) >> 11) {
@@ -838,7 +838,7 @@ static unsigned int InterpreterTranslateInstruction(const ARMul_State* cpu, cons
838 return inst_size; 838 return inst_size;
839} 839}
840 840
841static int InterpreterTranslateBlock(ARMul_State* cpu, int& bb_start, u32 addr) { 841static int InterpreterTranslateBlock(ARMul_State* cpu, std::size_t& bb_start, u32 addr) {
842 MICROPROFILE_SCOPE(DynCom_Decode); 842 MICROPROFILE_SCOPE(DynCom_Decode);
843 843
844 // Decode instruction, get index 844 // Decode instruction, get index
@@ -871,7 +871,7 @@ static int InterpreterTranslateBlock(ARMul_State* cpu, int& bb_start, u32 addr)
871 return KEEP_GOING; 871 return KEEP_GOING;
872} 872}
873 873
874static int InterpreterTranslateSingle(ARMul_State* cpu, int& bb_start, u32 addr) { 874static int InterpreterTranslateSingle(ARMul_State* cpu, std::size_t& bb_start, u32 addr) {
875 MICROPROFILE_SCOPE(DynCom_Decode); 875 MICROPROFILE_SCOPE(DynCom_Decode);
876 876
877 ARM_INST_PTR inst_base = nullptr; 877 ARM_INST_PTR inst_base = nullptr;
@@ -1620,7 +1620,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) {
1620 unsigned int addr; 1620 unsigned int addr;
1621 unsigned int num_instrs = 0; 1621 unsigned int num_instrs = 0;
1622 1622
1623 int ptr; 1623 std::size_t ptr;
1624 1624
1625 LOAD_NZCVT; 1625 LOAD_NZCVT;
1626DISPATCH : { 1626DISPATCH : {
diff --git a/src/core/arm/skyeye_common/armstate.h b/src/core/arm/skyeye_common/armstate.h
index 1a707ff7e..893877797 100644
--- a/src/core/arm/skyeye_common/armstate.h
+++ b/src/core/arm/skyeye_common/armstate.h
@@ -230,7 +230,7 @@ public:
230 230
231 // TODO(bunnei): Move this cache to a better place - it should be per codeset (likely per 231 // TODO(bunnei): Move this cache to a better place - it should be per codeset (likely per
232 // process for our purposes), not per ARMul_State (which tracks CPU core state). 232 // process for our purposes), not per ARMul_State (which tracks CPU core state).
233 std::unordered_map<u32, int> instruction_cache; 233 std::unordered_map<u32, std::size_t> instruction_cache;
234 234
235private: 235private:
236 void ResetMPCoreCP15Registers(); 236 void ResetMPCoreCP15Registers();
diff --git a/src/core/core.cpp b/src/core/core.cpp
index d08f18623..c5448630f 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -9,16 +9,19 @@
9#include "core/arm/arm_interface.h" 9#include "core/arm/arm_interface.h"
10#include "core/arm/dynarmic/arm_dynarmic.h" 10#include "core/arm/dynarmic/arm_dynarmic.h"
11#include "core/arm/dyncom/arm_dyncom.h" 11#include "core/arm/dyncom/arm_dyncom.h"
12#include "core/arm/unicorn/arm_unicorn.h"
12#include "core/core.h" 13#include "core/core.h"
13#include "core/core_timing.h" 14#include "core/core_timing.h"
14#include "core/gdbstub/gdbstub.h" 15#include "core/gdbstub/gdbstub.h"
15#include "core/hle/kernel/kernel.h" 16#include "core/hle/kernel/kernel.h"
17#include "core/hle/kernel/process.h"
16#include "core/hle/kernel/thread.h" 18#include "core/hle/kernel/thread.h"
17#include "core/hle/service/service.h" 19#include "core/hle/service/service.h"
18#include "core/hw/hw.h" 20#include "core/hw/hw.h"
19#include "core/loader/loader.h" 21#include "core/loader/loader.h"
20#include "core/memory_setup.h" 22#include "core/memory_setup.h"
21#include "core/settings.h" 23#include "core/settings.h"
24#include "network/network.h"
22#include "video_core/video_core.h" 25#include "video_core/video_core.h"
23 26
24namespace Core { 27namespace Core {
@@ -99,7 +102,7 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file
99 return init_result; 102 return init_result;
100 } 103 }
101 104
102 const Loader::ResultStatus load_result{app_loader->Load()}; 105 const Loader::ResultStatus load_result{app_loader->Load(Kernel::g_current_process)};
103 if (Loader::ResultStatus::Success != load_result) { 106 if (Loader::ResultStatus::Success != load_result) {
104 LOG_CRITICAL(Core, "Failed to load ROM (Error %i)!", load_result); 107 LOG_CRITICAL(Core, "Failed to load ROM (Error %i)!", load_result);
105 System::Shutdown(); 108 System::Shutdown();
@@ -136,7 +139,6 @@ void System::Reschedule() {
136} 139}
137 140
138System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { 141System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) {
139 Memory::InitMemoryMap();
140 LOG_DEBUG(HW_Memory, "initialized OK"); 142 LOG_DEBUG(HW_Memory, "initialized OK");
141 143
142 if (Settings::values.use_cpu_jit) { 144 if (Settings::values.use_cpu_jit) {
@@ -188,8 +190,12 @@ void System::Shutdown() {
188 cpu_core = nullptr; 190 cpu_core = nullptr;
189 app_loader = nullptr; 191 app_loader = nullptr;
190 telemetry_session = nullptr; 192 telemetry_session = nullptr;
193 if (auto room_member = Network::GetRoomMember().lock()) {
194 Network::GameInfo game_info{};
195 room_member->SendGameInfo(game_info);
196 }
191 197
192 LOG_DEBUG(Core, "Shutdown OK"); 198 LOG_DEBUG(Core, "Shutdown OK");
193} 199}
194 200
195} // namespace 201} // namespace Core
diff --git a/src/core/core.h b/src/core/core.h
index 4e3b6b409..9805cc694 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -7,6 +7,7 @@
7#include <memory> 7#include <memory>
8#include <string> 8#include <string>
9#include "common/common_types.h" 9#include "common/common_types.h"
10#include "core/loader/loader.h"
10#include "core/memory.h" 11#include "core/memory.h"
11#include "core/perf_stats.h" 12#include "core/perf_stats.h"
12#include "core/telemetry_session.h" 13#include "core/telemetry_session.h"
@@ -14,10 +15,6 @@
14class EmuWindow; 15class EmuWindow;
15class ARM_Interface; 16class ARM_Interface;
16 17
17namespace Loader {
18class AppLoader;
19}
20
21namespace Core { 18namespace Core {
22 19
23class System { 20class System {
@@ -119,6 +116,10 @@ public:
119 return status_details; 116 return status_details;
120 } 117 }
121 118
119 Loader::AppLoader& GetAppLoader() const {
120 return *app_loader;
121 }
122
122private: 123private:
123 /** 124 /**
124 * Initialize the emulated system. 125 * Initialize the emulated system.
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp
index 276ecfdf6..5e2a5d00f 100644
--- a/src/core/core_timing.cpp
+++ b/src/core/core_timing.cpp
@@ -57,6 +57,9 @@ static s64 idled_cycles;
57static s64 last_global_time_ticks; 57static s64 last_global_time_ticks;
58static s64 last_global_time_us; 58static s64 last_global_time_us;
59 59
60static s64 down_count = 0; ///< A decreasing counter of remaining cycles before the next event,
61 /// decreased by the cpu run loop
62
60static std::recursive_mutex external_event_section; 63static std::recursive_mutex external_event_section;
61 64
62// Warning: not included in save state. 65// Warning: not included in save state.
@@ -146,7 +149,7 @@ void UnregisterAllEvents() {
146} 149}
147 150
148void Init() { 151void Init() {
149 Core::CPU().down_count = INITIAL_SLICE_LENGTH; 152 down_count = INITIAL_SLICE_LENGTH;
150 g_slice_length = INITIAL_SLICE_LENGTH; 153 g_slice_length = INITIAL_SLICE_LENGTH;
151 global_timer = 0; 154 global_timer = 0;
152 idled_cycles = 0; 155 idled_cycles = 0;
@@ -185,8 +188,15 @@ void Shutdown() {
185 } 188 }
186} 189}
187 190
191void AddTicks(u64 ticks) {
192 down_count -= ticks;
193 if (down_count < 0) {
194 Advance();
195 }
196}
197
188u64 GetTicks() { 198u64 GetTicks() {
189 return (u64)global_timer + g_slice_length - Core::CPU().down_count; 199 return (u64)global_timer + g_slice_length - down_count;
190} 200}
191 201
192u64 GetIdleTicks() { 202u64 GetIdleTicks() {
@@ -460,18 +470,18 @@ void MoveEvents() {
460} 470}
461 471
462void ForceCheck() { 472void ForceCheck() {
463 s64 cycles_executed = g_slice_length - Core::CPU().down_count; 473 s64 cycles_executed = g_slice_length - down_count;
464 global_timer += cycles_executed; 474 global_timer += cycles_executed;
465 // This will cause us to check for new events immediately. 475 // This will cause us to check for new events immediately.
466 Core::CPU().down_count = 0; 476 down_count = 0;
467 // But let's not eat a bunch more time in Advance() because of this. 477 // But let's not eat a bunch more time in Advance() because of this.
468 g_slice_length = 0; 478 g_slice_length = 0;
469} 479}
470 480
471void Advance() { 481void Advance() {
472 s64 cycles_executed = g_slice_length - Core::CPU().down_count; 482 s64 cycles_executed = g_slice_length - down_count;
473 global_timer += cycles_executed; 483 global_timer += cycles_executed;
474 Core::CPU().down_count = g_slice_length; 484 down_count = g_slice_length;
475 485
476 if (has_ts_events) 486 if (has_ts_events)
477 MoveEvents(); 487 MoveEvents();
@@ -480,7 +490,7 @@ void Advance() {
480 if (!first) { 490 if (!first) {
481 if (g_slice_length < 10000) { 491 if (g_slice_length < 10000) {
482 g_slice_length += 10000; 492 g_slice_length += 10000;
483 Core::CPU().down_count += g_slice_length; 493 down_count += g_slice_length;
484 } 494 }
485 } else { 495 } else {
486 // Note that events can eat cycles as well. 496 // Note that events can eat cycles as well.
@@ -490,7 +500,7 @@ void Advance() {
490 500
491 const int diff = target - g_slice_length; 501 const int diff = target - g_slice_length;
492 g_slice_length += diff; 502 g_slice_length += diff;
493 Core::CPU().down_count += diff; 503 down_count += diff;
494 } 504 }
495 if (advance_callback) 505 if (advance_callback)
496 advance_callback(static_cast<int>(cycles_executed)); 506 advance_callback(static_cast<int>(cycles_executed));
@@ -506,12 +516,12 @@ void LogPendingEvents() {
506} 516}
507 517
508void Idle(int max_idle) { 518void Idle(int max_idle) {
509 s64 cycles_down = Core::CPU().down_count; 519 s64 cycles_down = down_count;
510 if (max_idle != 0 && cycles_down > max_idle) 520 if (max_idle != 0 && cycles_down > max_idle)
511 cycles_down = max_idle; 521 cycles_down = max_idle;
512 522
513 if (first && cycles_down > 0) { 523 if (first && cycles_down > 0) {
514 s64 cycles_executed = g_slice_length - Core::CPU().down_count; 524 s64 cycles_executed = g_slice_length - down_count;
515 s64 cycles_next_event = first->time - global_timer; 525 s64 cycles_next_event = first->time - global_timer;
516 526
517 if (cycles_next_event < cycles_executed + cycles_down) { 527 if (cycles_next_event < cycles_executed + cycles_down) {
@@ -526,9 +536,9 @@ void Idle(int max_idle) {
526 cycles_down / (float)(g_clock_rate_arm11 * 0.001f)); 536 cycles_down / (float)(g_clock_rate_arm11 * 0.001f));
527 537
528 idled_cycles += cycles_down; 538 idled_cycles += cycles_down;
529 Core::CPU().down_count -= cycles_down; 539 down_count -= cycles_down;
530 if (Core::CPU().down_count == 0) 540 if (down_count == 0)
531 Core::CPU().down_count = -1; 541 down_count = -1;
532} 542}
533 543
534std::string GetScheduledEventsSummary() { 544std::string GetScheduledEventsSummary() {
diff --git a/src/core/core_timing.h b/src/core/core_timing.h
index d2f85cd4d..897350801 100644
--- a/src/core/core_timing.h
+++ b/src/core/core_timing.h
@@ -67,6 +67,12 @@ void Shutdown();
67typedef void (*MHzChangeCallback)(); 67typedef void (*MHzChangeCallback)();
68typedef std::function<void(u64 userdata, int cycles_late)> TimedCallback; 68typedef std::function<void(u64 userdata, int cycles_late)> TimedCallback;
69 69
70/**
71* Advance the CPU core by the specified number of ticks (e.g. to simulate CPU execution time)
72* @param ticks Number of ticks to advance the CPU core
73*/
74void AddTicks(u64 ticks);
75
70u64 GetTicks(); 76u64 GetTicks();
71u64 GetIdleTicks(); 77u64 GetIdleTicks();
72u64 GetGlobalTimeUs(); 78u64 GetGlobalTimeUs();
diff --git a/src/core/file_sys/archive_backend.cpp b/src/core/file_sys/archive_backend.cpp
index 1fae0ede0..87a240d7a 100644
--- a/src/core/file_sys/archive_backend.cpp
+++ b/src/core/file_sys/archive_backend.cpp
@@ -90,6 +90,8 @@ std::u16string Path::AsU16Str() const {
90 LOG_ERROR(Service_FS, "LowPathType cannot be converted to u16string!"); 90 LOG_ERROR(Service_FS, "LowPathType cannot be converted to u16string!");
91 return {}; 91 return {};
92 } 92 }
93
94 UNREACHABLE();
93} 95}
94 96
95std::vector<u8> Path::AsBinary() const { 97std::vector<u8> Path::AsBinary() const {
diff --git a/src/core/file_sys/archive_ncch.cpp b/src/core/file_sys/archive_ncch.cpp
index 6d9007731..e8c5be983 100644
--- a/src/core/file_sys/archive_ncch.cpp
+++ b/src/core/file_sys/archive_ncch.cpp
@@ -13,7 +13,10 @@
13#include "core/file_sys/archive_ncch.h" 13#include "core/file_sys/archive_ncch.h"
14#include "core/file_sys/errors.h" 14#include "core/file_sys/errors.h"
15#include "core/file_sys/ivfc_archive.h" 15#include "core/file_sys/ivfc_archive.h"
16#include "core/file_sys/ncch_container.h"
17#include "core/file_sys/title_metadata.h"
16#include "core/hle/service/fs/archive.h" 18#include "core/hle/service/fs/archive.h"
19#include "core/loader/loader.h"
17 20
18//////////////////////////////////////////////////////////////////////////////////////////////////// 21////////////////////////////////////////////////////////////////////////////////////////////////////
19// FileSys namespace 22// FileSys namespace
@@ -25,8 +28,18 @@ static std::string GetNCCHContainerPath(const std::string& nand_directory) {
25} 28}
26 29
27static std::string GetNCCHPath(const std::string& mount_point, u32 high, u32 low) { 30static std::string GetNCCHPath(const std::string& mount_point, u32 high, u32 low) {
28 return Common::StringFromFormat("%s%08x/%08x/content/00000000.app.romfs", mount_point.c_str(), 31 u32 content_id = 0;
29 high, low); 32
33 // TODO(shinyquagsire23): Title database should be doing this path lookup
34 std::string content_path =
35 Common::StringFromFormat("%s%08x/%08x/content/", mount_point.c_str(), high, low);
36 std::string tmd_path = content_path + "00000000.tmd";
37 TitleMetadata tmd(tmd_path);
38 if (tmd.Load() == Loader::ResultStatus::Success) {
39 content_id = tmd.GetBootContentID();
40 }
41
42 return Common::StringFromFormat("%s%08x.app", content_path.c_str(), content_id);
30} 43}
31 44
32ArchiveFactory_NCCH::ArchiveFactory_NCCH(const std::string& nand_directory) 45ArchiveFactory_NCCH::ArchiveFactory_NCCH(const std::string& nand_directory)
@@ -38,9 +51,14 @@ ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_NCCH::Open(const Path&
38 u32 high = data[1]; 51 u32 high = data[1];
39 u32 low = data[0]; 52 u32 low = data[0];
40 std::string file_path = GetNCCHPath(mount_point, high, low); 53 std::string file_path = GetNCCHPath(mount_point, high, low);
41 auto file = std::make_shared<FileUtil::IOFile>(file_path, "rb");
42 54
43 if (!file->IsOpen()) { 55 std::shared_ptr<FileUtil::IOFile> romfs_file;
56 u64 romfs_offset = 0;
57 u64 romfs_size = 0;
58 auto ncch_container = NCCHContainer(file_path);
59
60 if (ncch_container.ReadRomFS(romfs_file, romfs_offset, romfs_size) !=
61 Loader::ResultStatus::Success) {
44 // High Title ID of the archive: The category (https://3dbrew.org/wiki/Title_list). 62 // High Title ID of the archive: The category (https://3dbrew.org/wiki/Title_list).
45 constexpr u32 shared_data_archive = 0x0004009B; 63 constexpr u32 shared_data_archive = 0x0004009B;
46 constexpr u32 system_data_archive = 0x000400DB; 64 constexpr u32 system_data_archive = 0x000400DB;
@@ -74,9 +92,8 @@ ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_NCCH::Open(const Path&
74 } 92 }
75 return ERROR_NOT_FOUND; 93 return ERROR_NOT_FOUND;
76 } 94 }
77 auto size = file->GetSize();
78 95
79 auto archive = std::make_unique<IVFCArchive>(file, 0, size); 96 auto archive = std::make_unique<IVFCArchive>(romfs_file, romfs_offset, romfs_size);
80 return MakeResult<std::unique_ptr<ArchiveBackend>>(std::move(archive)); 97 return MakeResult<std::unique_ptr<ArchiveBackend>>(std::move(archive));
81} 98}
82 99
diff --git a/src/core/file_sys/archive_sdmc.cpp b/src/core/file_sys/archive_sdmc.cpp
index 679909d06..fe3dce5d4 100644
--- a/src/core/file_sys/archive_sdmc.cpp
+++ b/src/core/file_sys/archive_sdmc.cpp
@@ -121,7 +121,25 @@ ResultCode SDMCArchive::DeleteFile(const Path& path) const {
121} 121}
122 122
123ResultCode SDMCArchive::RenameFile(const Path& src_path, const Path& dest_path) const { 123ResultCode SDMCArchive::RenameFile(const Path& src_path, const Path& dest_path) const {
124 if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString())) { 124 const PathParser path_parser_src(src_path);
125
126 // TODO: Verify these return codes with HW
127 if (!path_parser_src.IsValid()) {
128 LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str());
129 return ERROR_INVALID_PATH;
130 }
131
132 const PathParser path_parser_dest(dest_path);
133
134 if (!path_parser_dest.IsValid()) {
135 LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str());
136 return ERROR_INVALID_PATH;
137 }
138
139 const auto src_path_full = path_parser_src.BuildHostPath(mount_point);
140 const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point);
141
142 if (FileUtil::Rename(src_path_full, dest_path_full)) {
125 return RESULT_SUCCESS; 143 return RESULT_SUCCESS;
126 } 144 }
127 145
@@ -260,8 +278,27 @@ ResultCode SDMCArchive::CreateDirectory(const Path& path) const {
260} 278}
261 279
262ResultCode SDMCArchive::RenameDirectory(const Path& src_path, const Path& dest_path) const { 280ResultCode SDMCArchive::RenameDirectory(const Path& src_path, const Path& dest_path) const {
263 if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString())) 281 const PathParser path_parser_src(src_path);
282
283 // TODO: Verify these return codes with HW
284 if (!path_parser_src.IsValid()) {
285 LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str());
286 return ERROR_INVALID_PATH;
287 }
288
289 const PathParser path_parser_dest(dest_path);
290
291 if (!path_parser_dest.IsValid()) {
292 LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str());
293 return ERROR_INVALID_PATH;
294 }
295
296 const auto src_path_full = path_parser_src.BuildHostPath(mount_point);
297 const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point);
298
299 if (FileUtil::Rename(src_path_full, dest_path_full)) {
264 return RESULT_SUCCESS; 300 return RESULT_SUCCESS;
301 }
265 302
266 // TODO(yuriks): This code probably isn't right, it'll return a Status even if the file didn't 303 // TODO(yuriks): This code probably isn't right, it'll return a Status even if the file didn't
267 // exist or similar. Verify. 304 // exist or similar. Verify.
diff --git a/src/core/file_sys/archive_selfncch.cpp b/src/core/file_sys/archive_selfncch.cpp
index 298a37a44..3222000cf 100644
--- a/src/core/file_sys/archive_selfncch.cpp
+++ b/src/core/file_sys/archive_selfncch.cpp
@@ -3,12 +3,14 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <array> 5#include <array>
6#include <cinttypes>
6#include "common/common_types.h" 7#include "common/common_types.h"
7#include "common/logging/log.h" 8#include "common/logging/log.h"
8#include "common/swap.h" 9#include "common/swap.h"
9#include "core/file_sys/archive_selfncch.h" 10#include "core/file_sys/archive_selfncch.h"
10#include "core/file_sys/errors.h" 11#include "core/file_sys/errors.h"
11#include "core/file_sys/ivfc_archive.h" 12#include "core/file_sys/ivfc_archive.h"
13#include "core/hle/kernel/process.h"
12 14
13//////////////////////////////////////////////////////////////////////////////////////////////////// 15////////////////////////////////////////////////////////////////////////////////////////////////////
14// FileSys namespace 16// FileSys namespace
@@ -102,8 +104,7 @@ public:
102 104
103 switch (static_cast<SelfNCCHFilePathType>(file_path.type)) { 105 switch (static_cast<SelfNCCHFilePathType>(file_path.type)) {
104 case SelfNCCHFilePathType::UpdateRomFS: 106 case SelfNCCHFilePathType::UpdateRomFS:
105 LOG_WARNING(Service_FS, "(STUBBED) open update RomFS"); 107 return OpenUpdateRomFS();
106 return OpenRomFS();
107 108
108 case SelfNCCHFilePathType::RomFS: 109 case SelfNCCHFilePathType::RomFS:
109 return OpenRomFS(); 110 return OpenRomFS();
@@ -179,6 +180,17 @@ private:
179 } 180 }
180 } 181 }
181 182
183 ResultVal<std::unique_ptr<FileBackend>> OpenUpdateRomFS() const {
184 if (ncch_data.update_romfs_file) {
185 return MakeResult<std::unique_ptr<FileBackend>>(std::make_unique<IVFCFile>(
186 ncch_data.update_romfs_file, ncch_data.update_romfs_offset,
187 ncch_data.update_romfs_size));
188 } else {
189 LOG_INFO(Service_FS, "Unable to read update RomFS");
190 return ERROR_ROMFS_NOT_FOUND;
191 }
192 }
193
182 ResultVal<std::unique_ptr<FileBackend>> OpenExeFS(const std::string& filename) const { 194 ResultVal<std::unique_ptr<FileBackend>> OpenExeFS(const std::string& filename) const {
183 if (filename == "icon") { 195 if (filename == "icon") {
184 if (ncch_data.icon) { 196 if (ncch_data.icon) {
@@ -217,31 +229,59 @@ private:
217 NCCHData ncch_data; 229 NCCHData ncch_data;
218}; 230};
219 231
220ArchiveFactory_SelfNCCH::ArchiveFactory_SelfNCCH(Loader::AppLoader& app_loader) { 232void ArchiveFactory_SelfNCCH::Register(Loader::AppLoader& app_loader) {
233 u64 program_id = 0;
234 if (app_loader.ReadProgramId(program_id) != Loader::ResultStatus::Success) {
235 LOG_WARNING(
236 Service_FS,
237 "Could not read program id when registering with SelfNCCH, this might be a 3dsx file");
238 }
239
240 LOG_DEBUG(Service_FS, "Registering program %016" PRIX64 " with the SelfNCCH archive factory",
241 program_id);
242
243 if (ncch_data.find(program_id) != ncch_data.end()) {
244 LOG_WARNING(Service_FS, "Registering program %016" PRIX64
245 " with SelfNCCH will override existing mapping",
246 program_id);
247 }
248
249 NCCHData& data = ncch_data[program_id];
250
221 std::shared_ptr<FileUtil::IOFile> romfs_file_; 251 std::shared_ptr<FileUtil::IOFile> romfs_file_;
222 if (Loader::ResultStatus::Success == 252 if (Loader::ResultStatus::Success ==
223 app_loader.ReadRomFS(romfs_file_, ncch_data.romfs_offset, ncch_data.romfs_size)) { 253 app_loader.ReadRomFS(romfs_file_, data.romfs_offset, data.romfs_size)) {
254
255 data.romfs_file = std::move(romfs_file_);
256 }
257
258 std::shared_ptr<FileUtil::IOFile> update_romfs_file;
259 if (Loader::ResultStatus::Success ==
260 app_loader.ReadUpdateRomFS(update_romfs_file, data.update_romfs_offset,
261 data.update_romfs_size)) {
224 262
225 ncch_data.romfs_file = std::move(romfs_file_); 263 data.update_romfs_file = std::move(update_romfs_file);
226 } 264 }
227 265
228 std::vector<u8> buffer; 266 std::vector<u8> buffer;
229 267
230 if (Loader::ResultStatus::Success == app_loader.ReadIcon(buffer)) 268 if (Loader::ResultStatus::Success == app_loader.ReadIcon(buffer))
231 ncch_data.icon = std::make_shared<std::vector<u8>>(std::move(buffer)); 269 data.icon = std::make_shared<std::vector<u8>>(std::move(buffer));
232 270
233 buffer.clear(); 271 buffer.clear();
234 if (Loader::ResultStatus::Success == app_loader.ReadLogo(buffer)) 272 if (Loader::ResultStatus::Success == app_loader.ReadLogo(buffer))
235 ncch_data.logo = std::make_shared<std::vector<u8>>(std::move(buffer)); 273 data.logo = std::make_shared<std::vector<u8>>(std::move(buffer));
236 274
237 buffer.clear(); 275 buffer.clear();
238 if (Loader::ResultStatus::Success == app_loader.ReadBanner(buffer)) 276 if (Loader::ResultStatus::Success == app_loader.ReadBanner(buffer))
239 ncch_data.banner = std::make_shared<std::vector<u8>>(std::move(buffer)); 277 data.banner = std::make_shared<std::vector<u8>>(std::move(buffer));
240} 278}
241 279
242ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_SelfNCCH::Open(const Path& path) { 280ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_SelfNCCH::Open(const Path& path) {
243 auto archive = std::make_unique<SelfNCCHArchive>(ncch_data); 281 //auto archive = std::make_unique<SelfNCCHArchive>(
244 return MakeResult<std::unique_ptr<ArchiveBackend>>(std::move(archive)); 282 // ncch_data[Kernel::g_current_process->codeset->program_id]);
283 //return MakeResult<std::unique_ptr<ArchiveBackend>>(std::move(archive));
284 return {};
245} 285}
246 286
247ResultCode ArchiveFactory_SelfNCCH::Format(const Path&, const FileSys::ArchiveFormatInfo&) { 287ResultCode ArchiveFactory_SelfNCCH::Format(const Path&, const FileSys::ArchiveFormatInfo&) {
diff --git a/src/core/file_sys/archive_selfncch.h b/src/core/file_sys/archive_selfncch.h
index f1b971296..0d6d6766e 100644
--- a/src/core/file_sys/archive_selfncch.h
+++ b/src/core/file_sys/archive_selfncch.h
@@ -6,6 +6,7 @@
6 6
7#include <memory> 7#include <memory>
8#include <string> 8#include <string>
9#include <unordered_map>
9#include <vector> 10#include <vector>
10#include "common/common_types.h" 11#include "common/common_types.h"
11#include "core/file_sys/archive_backend.h" 12#include "core/file_sys/archive_backend.h"
@@ -24,12 +25,19 @@ struct NCCHData {
24 std::shared_ptr<FileUtil::IOFile> romfs_file; 25 std::shared_ptr<FileUtil::IOFile> romfs_file;
25 u64 romfs_offset = 0; 26 u64 romfs_offset = 0;
26 u64 romfs_size = 0; 27 u64 romfs_size = 0;
28
29 std::shared_ptr<FileUtil::IOFile> update_romfs_file;
30 u64 update_romfs_offset = 0;
31 u64 update_romfs_size = 0;
27}; 32};
28 33
29/// File system interface to the SelfNCCH archive 34/// File system interface to the SelfNCCH archive
30class ArchiveFactory_SelfNCCH final : public ArchiveFactory { 35class ArchiveFactory_SelfNCCH final : public ArchiveFactory {
31public: 36public:
32 explicit ArchiveFactory_SelfNCCH(Loader::AppLoader& app_loader); 37 ArchiveFactory_SelfNCCH() = default;
38
39 /// Registers a loaded application so that we can open its SelfNCCH archive when requested.
40 void Register(Loader::AppLoader& app_loader);
33 41
34 std::string GetName() const override { 42 std::string GetName() const override {
35 return "SelfNCCH"; 43 return "SelfNCCH";
@@ -39,7 +47,8 @@ public:
39 ResultVal<ArchiveFormatInfo> GetFormatInfo(const Path& path) const override; 47 ResultVal<ArchiveFormatInfo> GetFormatInfo(const Path& path) const override;
40 48
41private: 49private:
42 NCCHData ncch_data; 50 /// Mapping of ProgramId -> NCCHData
51 std::unordered_map<u64, NCCHData> ncch_data;
43}; 52};
44 53
45} // namespace FileSys 54} // namespace FileSys
diff --git a/src/core/file_sys/ncch_container.cpp b/src/core/file_sys/ncch_container.cpp
new file mode 100644
index 000000000..b9fb940c7
--- /dev/null
+++ b/src/core/file_sys/ncch_container.cpp
@@ -0,0 +1,423 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <cinttypes>
6#include <cstring>
7#include <memory>
8#include "common/common_types.h"
9#include "common/logging/log.h"
10#include "core/core.h"
11#include "core/file_sys/ncch_container.h"
12#include "core/loader/loader.h"
13
14////////////////////////////////////////////////////////////////////////////////////////////////////
15// FileSys namespace
16
17namespace FileSys {
18
19static const int kMaxSections = 8; ///< Maximum number of sections (files) in an ExeFs
20static const int kBlockSize = 0x200; ///< Size of ExeFS blocks (in bytes)
21
22/**
23 * Get the decompressed size of an LZSS compressed ExeFS file
24 * @param buffer Buffer of compressed file
25 * @param size Size of compressed buffer
26 * @return Size of decompressed buffer
27 */
28static u32 LZSS_GetDecompressedSize(const u8* buffer, u32 size) {
29 u32 offset_size = *(u32*)(buffer + size - 4);
30 return offset_size + size;
31}
32
33/**
34 * Decompress ExeFS file (compressed with LZSS)
35 * @param compressed Compressed buffer
36 * @param compressed_size Size of compressed buffer
37 * @param decompressed Decompressed buffer
38 * @param decompressed_size Size of decompressed buffer
39 * @return True on success, otherwise false
40 */
41static bool LZSS_Decompress(const u8* compressed, u32 compressed_size, u8* decompressed,
42 u32 decompressed_size) {
43 const u8* footer = compressed + compressed_size - 8;
44 u32 buffer_top_and_bottom = *reinterpret_cast<const u32*>(footer);
45 u32 out = decompressed_size;
46 u32 index = compressed_size - ((buffer_top_and_bottom >> 24) & 0xFF);
47 u32 stop_index = compressed_size - (buffer_top_and_bottom & 0xFFFFFF);
48
49 memset(decompressed, 0, decompressed_size);
50 memcpy(decompressed, compressed, compressed_size);
51
52 while (index > stop_index) {
53 u8 control = compressed[--index];
54
55 for (unsigned i = 0; i < 8; i++) {
56 if (index <= stop_index)
57 break;
58 if (index <= 0)
59 break;
60 if (out <= 0)
61 break;
62
63 if (control & 0x80) {
64 // Check if compression is out of bounds
65 if (index < 2)
66 return false;
67 index -= 2;
68
69 u32 segment_offset = compressed[index] | (compressed[index + 1] << 8);
70 u32 segment_size = ((segment_offset >> 12) & 15) + 3;
71 segment_offset &= 0x0FFF;
72 segment_offset += 2;
73
74 // Check if compression is out of bounds
75 if (out < segment_size)
76 return false;
77
78 for (unsigned j = 0; j < segment_size; j++) {
79 // Check if compression is out of bounds
80 if (out + segment_offset >= decompressed_size)
81 return false;
82
83 u8 data = decompressed[out + segment_offset];
84 decompressed[--out] = data;
85 }
86 } else {
87 // Check if compression is out of bounds
88 if (out < 1)
89 return false;
90 decompressed[--out] = compressed[--index];
91 }
92 control <<= 1;
93 }
94 }
95 return true;
96}
97
98NCCHContainer::NCCHContainer(const std::string& filepath) : filepath(filepath) {
99 file = FileUtil::IOFile(filepath, "rb");
100}
101
102Loader::ResultStatus NCCHContainer::OpenFile(const std::string& filepath) {
103 this->filepath = filepath;
104 file = FileUtil::IOFile(filepath, "rb");
105
106 if (!file.IsOpen()) {
107 LOG_WARNING(Service_FS, "Failed to open %s", filepath.c_str());
108 return Loader::ResultStatus::Error;
109 }
110
111 LOG_DEBUG(Service_FS, "Opened %s", filepath.c_str());
112 return Loader::ResultStatus::Success;
113}
114
115Loader::ResultStatus NCCHContainer::Load() {
116 if (is_loaded)
117 return Loader::ResultStatus::Success;
118
119 if (file.IsOpen()) {
120 // Reset read pointer in case this file has been read before.
121 file.Seek(0, SEEK_SET);
122
123 if (file.ReadBytes(&ncch_header, sizeof(NCCH_Header)) != sizeof(NCCH_Header))
124 return Loader::ResultStatus::Error;
125
126 // Skip NCSD header and load first NCCH (NCSD is just a container of NCCH files)...
127 if (Loader::MakeMagic('N', 'C', 'S', 'D') == ncch_header.magic) {
128 LOG_DEBUG(Service_FS, "Only loading the first (bootable) NCCH within the NCSD file!");
129 ncch_offset = 0x4000;
130 file.Seek(ncch_offset, SEEK_SET);
131 file.ReadBytes(&ncch_header, sizeof(NCCH_Header));
132 }
133
134 // Verify we are loading the correct file type...
135 if (Loader::MakeMagic('N', 'C', 'C', 'H') != ncch_header.magic)
136 return Loader::ResultStatus::ErrorInvalidFormat;
137
138 has_header = true;
139
140 // System archives and DLC don't have an extended header but have RomFS
141 if (ncch_header.extended_header_size) {
142 if (file.ReadBytes(&exheader_header, sizeof(ExHeader_Header)) !=
143 sizeof(ExHeader_Header))
144 return Loader::ResultStatus::Error;
145
146 is_compressed = (exheader_header.codeset_info.flags.flag & 1) == 1;
147 u32 entry_point = exheader_header.codeset_info.text.address;
148 u32 code_size = exheader_header.codeset_info.text.code_size;
149 u32 stack_size = exheader_header.codeset_info.stack_size;
150 u32 bss_size = exheader_header.codeset_info.bss_size;
151 u32 core_version = exheader_header.arm11_system_local_caps.core_version;
152 u8 priority = exheader_header.arm11_system_local_caps.priority;
153 u8 resource_limit_category =
154 exheader_header.arm11_system_local_caps.resource_limit_category;
155
156 LOG_DEBUG(Service_FS, "Name: %s",
157 exheader_header.codeset_info.name);
158 LOG_DEBUG(Service_FS, "Program ID: %016" PRIX64,
159 ncch_header.program_id);
160 LOG_DEBUG(Service_FS, "Code compressed: %s", is_compressed ? "yes" : "no");
161 LOG_DEBUG(Service_FS, "Entry point: 0x%08X", entry_point);
162 LOG_DEBUG(Service_FS, "Code size: 0x%08X", code_size);
163 LOG_DEBUG(Service_FS, "Stack size: 0x%08X", stack_size);
164 LOG_DEBUG(Service_FS, "Bss size: 0x%08X", bss_size);
165 LOG_DEBUG(Service_FS, "Core version: %d", core_version);
166 LOG_DEBUG(Service_FS, "Thread priority: 0x%X", priority);
167 LOG_DEBUG(Service_FS, "Resource limit category: %d", resource_limit_category);
168 LOG_DEBUG(Service_FS, "System Mode: %d",
169 static_cast<int>(exheader_header.arm11_system_local_caps.system_mode));
170
171 if (exheader_header.system_info.jump_id != ncch_header.program_id) {
172 LOG_ERROR(Service_FS,
173 "ExHeader Program ID mismatch: the ROM is probably encrypted.");
174 return Loader::ResultStatus::ErrorEncrypted;
175 }
176
177 has_exheader = true;
178 }
179
180 // DLC can have an ExeFS and a RomFS but no extended header
181 if (ncch_header.exefs_size) {
182 exefs_offset = ncch_header.exefs_offset * kBlockSize;
183 u32 exefs_size = ncch_header.exefs_size * kBlockSize;
184
185 LOG_DEBUG(Service_FS, "ExeFS offset: 0x%08X", exefs_offset);
186 LOG_DEBUG(Service_FS, "ExeFS size: 0x%08X", exefs_size);
187
188 file.Seek(exefs_offset + ncch_offset, SEEK_SET);
189 if (file.ReadBytes(&exefs_header, sizeof(ExeFs_Header)) != sizeof(ExeFs_Header))
190 return Loader::ResultStatus::Error;
191
192 exefs_file = FileUtil::IOFile(filepath, "rb");
193 has_exefs = true;
194 }
195
196 if (ncch_header.romfs_offset != 0 && ncch_header.romfs_size != 0)
197 has_romfs = true;
198 }
199
200 LoadOverrides();
201
202 // We need at least one of these or overrides, practically
203 if (!(has_exefs || has_romfs || is_tainted))
204 return Loader::ResultStatus::Error;
205
206 is_loaded = true;
207 return Loader::ResultStatus::Success;
208}
209
210Loader::ResultStatus NCCHContainer::LoadOverrides() {
211 // Check for split-off files, mark the archive as tainted if we will use them
212 std::string romfs_override = filepath + ".romfs";
213 if (FileUtil::Exists(romfs_override)) {
214 is_tainted = true;
215 }
216
217 // If we have a split-off exefs file/folder, it takes priority
218 std::string exefs_override = filepath + ".exefs";
219 std::string exefsdir_override = filepath + ".exefsdir/";
220 if (FileUtil::Exists(exefs_override)) {
221 exefs_file = FileUtil::IOFile(exefs_override, "rb");
222
223 if (exefs_file.ReadBytes(&exefs_header, sizeof(ExeFs_Header)) == sizeof(ExeFs_Header)) {
224 LOG_DEBUG(Service_FS, "Loading ExeFS section from %s", exefs_override.c_str());
225 exefs_offset = 0;
226 is_tainted = true;
227 has_exefs = true;
228 } else {
229 exefs_file = FileUtil::IOFile(filepath, "rb");
230 }
231 } else if (FileUtil::Exists(exefsdir_override) && FileUtil::IsDirectory(exefsdir_override)) {
232 is_tainted = true;
233 }
234
235 if (is_tainted)
236 LOG_WARNING(Service_FS,
237 "Loaded NCCH %s is tainted, application behavior may not be as expected!",
238 filepath.c_str());
239
240 return Loader::ResultStatus::Success;
241}
242
243Loader::ResultStatus NCCHContainer::LoadSectionExeFS(const char* name, std::vector<u8>& buffer) {
244 Loader::ResultStatus result = Load();
245 if (result != Loader::ResultStatus::Success)
246 return result;
247
248 // Check if we have files that can drop-in and replace
249 result = LoadOverrideExeFSSection(name, buffer);
250 if (result == Loader::ResultStatus::Success || !has_exefs)
251 return result;
252
253 // If we don't have any separate files, we'll need a full ExeFS
254 if (!exefs_file.IsOpen())
255 return Loader::ResultStatus::Error;
256
257 LOG_DEBUG(Service_FS, "%d sections:", kMaxSections);
258 // Iterate through the ExeFs archive until we find a section with the specified name...
259 for (unsigned section_number = 0; section_number < kMaxSections; section_number++) {
260 const auto& section = exefs_header.section[section_number];
261
262 // Load the specified section...
263 if (strcmp(section.name, name) == 0) {
264 LOG_DEBUG(Service_FS, "%d - offset: 0x%08X, size: 0x%08X, name: %s", section_number,
265 section.offset, section.size, section.name);
266
267 s64 section_offset =
268 (section.offset + exefs_offset + sizeof(ExeFs_Header) + ncch_offset);
269 exefs_file.Seek(section_offset, SEEK_SET);
270
271 if (strcmp(section.name, ".code") == 0 && is_compressed) {
272 // Section is compressed, read compressed .code section...
273 std::unique_ptr<u8[]> temp_buffer;
274 try {
275 temp_buffer.reset(new u8[section.size]);
276 } catch (std::bad_alloc&) {
277 return Loader::ResultStatus::ErrorMemoryAllocationFailed;
278 }
279
280 if (exefs_file.ReadBytes(&temp_buffer[0], section.size) != section.size)
281 return Loader::ResultStatus::Error;
282
283 // Decompress .code section...
284 u32 decompressed_size = LZSS_GetDecompressedSize(&temp_buffer[0], section.size);
285 buffer.resize(decompressed_size);
286 if (!LZSS_Decompress(&temp_buffer[0], section.size, &buffer[0], decompressed_size))
287 return Loader::ResultStatus::ErrorInvalidFormat;
288 } else {
289 // Section is uncompressed...
290 buffer.resize(section.size);
291 if (exefs_file.ReadBytes(&buffer[0], section.size) != section.size)
292 return Loader::ResultStatus::Error;
293 }
294 return Loader::ResultStatus::Success;
295 }
296 }
297 return Loader::ResultStatus::ErrorNotUsed;
298}
299
300Loader::ResultStatus NCCHContainer::LoadOverrideExeFSSection(const char* name,
301 std::vector<u8>& buffer) {
302 std::string override_name;
303
304 // Map our section name to the extracted equivalent
305 if (!strcmp(name, ".code"))
306 override_name = "code.bin";
307 else if (!strcmp(name, "icon"))
308 override_name = "code.bin";
309 else if (!strcmp(name, "banner"))
310 override_name = "banner.bnr";
311 else if (!strcmp(name, "logo"))
312 override_name = "logo.bcma.lz";
313 else
314 return Loader::ResultStatus::Error;
315
316 std::string section_override = filepath + ".exefsdir/" + override_name;
317 FileUtil::IOFile section_file(section_override, "rb");
318
319 if (section_file.IsOpen()) {
320 auto section_size = section_file.GetSize();
321 buffer.resize(section_size);
322
323 section_file.Seek(0, SEEK_SET);
324 if (section_file.ReadBytes(&buffer[0], section_size) == section_size) {
325 LOG_WARNING(Service_FS, "File %s overriding built-in ExeFS file",
326 section_override.c_str());
327 return Loader::ResultStatus::Success;
328 }
329 }
330 return Loader::ResultStatus::ErrorNotUsed;
331}
332
333Loader::ResultStatus NCCHContainer::ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file,
334 u64& offset, u64& size) {
335 Loader::ResultStatus result = Load();
336 if (result != Loader::ResultStatus::Success)
337 return result;
338
339 if (ReadOverrideRomFS(romfs_file, offset, size) == Loader::ResultStatus::Success)
340 return Loader::ResultStatus::Success;
341
342 if (!has_romfs) {
343 LOG_DEBUG(Service_FS, "RomFS requested from NCCH which has no RomFS");
344 return Loader::ResultStatus::ErrorNotUsed;
345 }
346
347 if (!file.IsOpen())
348 return Loader::ResultStatus::Error;
349
350 u32 romfs_offset = ncch_offset + (ncch_header.romfs_offset * kBlockSize) + 0x1000;
351 u32 romfs_size = (ncch_header.romfs_size * kBlockSize) - 0x1000;
352
353 LOG_DEBUG(Service_FS, "RomFS offset: 0x%08X", romfs_offset);
354 LOG_DEBUG(Service_FS, "RomFS size: 0x%08X", romfs_size);
355
356 if (file.GetSize() < romfs_offset + romfs_size)
357 return Loader::ResultStatus::Error;
358
359 // We reopen the file, to allow its position to be independent from file's
360 romfs_file = std::make_shared<FileUtil::IOFile>(filepath, "rb");
361 if (!romfs_file->IsOpen())
362 return Loader::ResultStatus::Error;
363
364 offset = romfs_offset;
365 size = romfs_size;
366
367 return Loader::ResultStatus::Success;
368}
369
370Loader::ResultStatus NCCHContainer::ReadOverrideRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file,
371 u64& offset, u64& size) {
372 // Check for RomFS overrides
373 std::string split_filepath = filepath + ".romfs";
374 if (FileUtil::Exists(split_filepath)) {
375 romfs_file = std::make_shared<FileUtil::IOFile>(split_filepath, "rb");
376 if (romfs_file->IsOpen()) {
377 LOG_WARNING(Service_FS, "File %s overriding built-in RomFS", split_filepath.c_str());
378 offset = 0;
379 size = romfs_file->GetSize();
380 return Loader::ResultStatus::Success;
381 }
382 }
383
384 return Loader::ResultStatus::ErrorNotUsed;
385}
386
387Loader::ResultStatus NCCHContainer::ReadProgramId(u64_le& program_id) {
388 Loader::ResultStatus result = Load();
389 if (result != Loader::ResultStatus::Success)
390 return result;
391
392 if (!has_header)
393 return Loader::ResultStatus::ErrorNotUsed;
394
395 program_id = ncch_header.program_id;
396 return Loader::ResultStatus::Success;
397}
398
399bool NCCHContainer::HasExeFS() {
400 Loader::ResultStatus result = Load();
401 if (result != Loader::ResultStatus::Success)
402 return false;
403
404 return has_exefs;
405}
406
407bool NCCHContainer::HasRomFS() {
408 Loader::ResultStatus result = Load();
409 if (result != Loader::ResultStatus::Success)
410 return false;
411
412 return has_romfs;
413}
414
415bool NCCHContainer::HasExHeader() {
416 Loader::ResultStatus result = Load();
417 if (result != Loader::ResultStatus::Success)
418 return false;
419
420 return has_exheader;
421}
422
423} // namespace FileSys
diff --git a/src/core/file_sys/ncch_container.h b/src/core/file_sys/ncch_container.h
new file mode 100644
index 000000000..2cc9d13dc
--- /dev/null
+++ b/src/core/file_sys/ncch_container.h
@@ -0,0 +1,274 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <cstddef>
8#include <memory>
9#include <string>
10#include <vector>
11#include "common/bit_field.h"
12#include "common/common_types.h"
13#include "common/file_util.h"
14#include "common/swap.h"
15#include "core/core.h"
16
17////////////////////////////////////////////////////////////////////////////////////////////////////
18/// NCCH header (Note: "NCCH" appears to be a publicly unknown acronym)
19
20struct NCCH_Header {
21 u8 signature[0x100];
22 u32_le magic;
23 u32_le content_size;
24 u8 partition_id[8];
25 u16_le maker_code;
26 u16_le version;
27 u8 reserved_0[4];
28 u64_le program_id;
29 u8 reserved_1[0x10];
30 u8 logo_region_hash[0x20];
31 u8 product_code[0x10];
32 u8 extended_header_hash[0x20];
33 u32_le extended_header_size;
34 u8 reserved_2[4];
35 u8 flags[8];
36 u32_le plain_region_offset;
37 u32_le plain_region_size;
38 u32_le logo_region_offset;
39 u32_le logo_region_size;
40 u32_le exefs_offset;
41 u32_le exefs_size;
42 u32_le exefs_hash_region_size;
43 u8 reserved_3[4];
44 u32_le romfs_offset;
45 u32_le romfs_size;
46 u32_le romfs_hash_region_size;
47 u8 reserved_4[4];
48 u8 exefs_super_block_hash[0x20];
49 u8 romfs_super_block_hash[0x20];
50};
51
52static_assert(sizeof(NCCH_Header) == 0x200, "NCCH header structure size is wrong");
53
54////////////////////////////////////////////////////////////////////////////////////////////////////
55// ExeFS (executable file system) headers
56
57struct ExeFs_SectionHeader {
58 char name[8];
59 u32 offset;
60 u32 size;
61};
62
63struct ExeFs_Header {
64 ExeFs_SectionHeader section[8];
65 u8 reserved[0x80];
66 u8 hashes[8][0x20];
67};
68
69////////////////////////////////////////////////////////////////////////////////////////////////////
70// ExHeader (executable file system header) headers
71
72struct ExHeader_SystemInfoFlags {
73 u8 reserved[5];
74 u8 flag;
75 u8 remaster_version[2];
76};
77
78struct ExHeader_CodeSegmentInfo {
79 u32 address;
80 u32 num_max_pages;
81 u32 code_size;
82};
83
84struct ExHeader_CodeSetInfo {
85 u8 name[8];
86 ExHeader_SystemInfoFlags flags;
87 ExHeader_CodeSegmentInfo text;
88 u32 stack_size;
89 ExHeader_CodeSegmentInfo ro;
90 u8 reserved[4];
91 ExHeader_CodeSegmentInfo data;
92 u32 bss_size;
93};
94
95struct ExHeader_DependencyList {
96 u8 program_id[0x30][8];
97};
98
99struct ExHeader_SystemInfo {
100 u64 save_data_size;
101 u64_le jump_id;
102 u8 reserved_2[0x30];
103};
104
105struct ExHeader_StorageInfo {
106 u8 ext_save_data_id[8];
107 u8 system_save_data_id[8];
108 u8 reserved[8];
109 u8 access_info[7];
110 u8 other_attributes;
111};
112
113struct ExHeader_ARM11_SystemLocalCaps {
114 u64_le program_id;
115 u32_le core_version;
116 u8 reserved_flags[2];
117 union {
118 u8 flags0;
119 BitField<0, 2, u8> ideal_processor;
120 BitField<2, 2, u8> affinity_mask;
121 BitField<4, 4, u8> system_mode;
122 };
123 u8 priority;
124 u8 resource_limit_descriptor[0x10][2];
125 ExHeader_StorageInfo storage_info;
126 u8 service_access_control[0x20][8];
127 u8 ex_service_access_control[0x2][8];
128 u8 reserved[0xf];
129 u8 resource_limit_category;
130};
131
132struct ExHeader_ARM11_KernelCaps {
133 u32_le descriptors[28];
134 u8 reserved[0x10];
135};
136
137struct ExHeader_ARM9_AccessControl {
138 u8 descriptors[15];
139 u8 descversion;
140};
141
142struct ExHeader_Header {
143 ExHeader_CodeSetInfo codeset_info;
144 ExHeader_DependencyList dependency_list;
145 ExHeader_SystemInfo system_info;
146 ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps;
147 ExHeader_ARM11_KernelCaps arm11_kernel_caps;
148 ExHeader_ARM9_AccessControl arm9_access_control;
149 struct {
150 u8 signature[0x100];
151 u8 ncch_public_key_modulus[0x100];
152 ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps;
153 ExHeader_ARM11_KernelCaps arm11_kernel_caps;
154 ExHeader_ARM9_AccessControl arm9_access_control;
155 } access_desc;
156};
157
158static_assert(sizeof(ExHeader_Header) == 0x800, "ExHeader structure size is wrong");
159
160////////////////////////////////////////////////////////////////////////////////////////////////////
161// FileSys namespace
162
163namespace FileSys {
164
165/**
166 * Helper which implements an interface to deal with NCCH containers which can
167 * contain ExeFS archives or RomFS archives for games or other applications.
168 */
169class NCCHContainer {
170public:
171 NCCHContainer(const std::string& filepath);
172 NCCHContainer() {}
173
174 Loader::ResultStatus OpenFile(const std::string& filepath);
175
176 /**
177 * Ensure ExeFS and exheader is loaded and ready for reading sections
178 * @return ResultStatus result of function
179 */
180 Loader::ResultStatus Load();
181
182 /**
183 * Attempt to find overridden sections for the NCCH and mark the container as tainted
184 * if any are found.
185 * @return ResultStatus result of function
186 */
187 Loader::ResultStatus LoadOverrides();
188
189 /**
190 * Reads an application ExeFS section of an NCCH file (e.g. .code, .logo, etc.)
191 * @param name Name of section to read out of NCCH file
192 * @param buffer Vector to read data into
193 * @return ResultStatus result of function
194 */
195 Loader::ResultStatus LoadSectionExeFS(const char* name, std::vector<u8>& buffer);
196
197 /**
198 * Reads an application ExeFS section from external files instead of an NCCH file,
199 * (e.g. code.bin, logo.bcma.lz, icon.icn, banner.bnr)
200 * @param name Name of section to read from external files
201 * @param buffer Vector to read data into
202 * @return ResultStatus result of function
203 */
204 Loader::ResultStatus LoadOverrideExeFSSection(const char* name, std::vector<u8>& buffer);
205
206 /**
207 * Get the RomFS of the NCCH container
208 * Since the RomFS can be huge, we return a file reference instead of copying to a buffer
209 * @param romfs_file The file containing the RomFS
210 * @param offset The offset the romfs begins on
211 * @param size The size of the romfs
212 * @return ResultStatus result of function
213 */
214 Loader::ResultStatus ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
215 u64& size);
216
217 /**
218 * Get the override RomFS of the NCCH container
219 * Since the RomFS can be huge, we return a file reference instead of copying to a buffer
220 * @param romfs_file The file containing the RomFS
221 * @param offset The offset the romfs begins on
222 * @param size The size of the romfs
223 * @return ResultStatus result of function
224 */
225 Loader::ResultStatus ReadOverrideRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file,
226 u64& offset, u64& size);
227
228 /**
229 * Get the Program ID of the NCCH container
230 * @return ResultStatus result of function
231 */
232 Loader::ResultStatus ReadProgramId(u64_le& program_id);
233
234 /**
235 * Checks whether the NCCH container contains an ExeFS
236 * @return bool check result
237 */
238 bool HasExeFS();
239
240 /**
241 * Checks whether the NCCH container contains a RomFS
242 * @return bool check result
243 */
244 bool HasRomFS();
245
246 /**
247 * Checks whether the NCCH container contains an ExHeader
248 * @return bool check result
249 */
250 bool HasExHeader();
251
252 NCCH_Header ncch_header;
253 ExeFs_Header exefs_header;
254 ExHeader_Header exheader_header;
255
256private:
257 bool has_header = false;
258 bool has_exheader = false;
259 bool has_exefs = false;
260 bool has_romfs = false;
261
262 bool is_tainted = false; // Are there parts of this container being overridden?
263 bool is_loaded = false;
264 bool is_compressed = false;
265
266 u32 ncch_offset = 0; // Offset to NCCH header, can be 0 or after NCSD header
267 u32 exefs_offset = 0;
268
269 std::string filepath;
270 FileUtil::IOFile file;
271 FileUtil::IOFile exefs_file;
272};
273
274} // namespace FileSys
diff --git a/src/core/file_sys/savedata_archive.cpp b/src/core/file_sys/savedata_archive.cpp
index f540c4a93..f8f811ba0 100644
--- a/src/core/file_sys/savedata_archive.cpp
+++ b/src/core/file_sys/savedata_archive.cpp
@@ -106,7 +106,25 @@ ResultCode SaveDataArchive::DeleteFile(const Path& path) const {
106} 106}
107 107
108ResultCode SaveDataArchive::RenameFile(const Path& src_path, const Path& dest_path) const { 108ResultCode SaveDataArchive::RenameFile(const Path& src_path, const Path& dest_path) const {
109 if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString())) { 109 const PathParser path_parser_src(src_path);
110
111 // TODO: Verify these return codes with HW
112 if (!path_parser_src.IsValid()) {
113 LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str());
114 return ERROR_INVALID_PATH;
115 }
116
117 const PathParser path_parser_dest(dest_path);
118
119 if (!path_parser_dest.IsValid()) {
120 LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str());
121 return ERROR_INVALID_PATH;
122 }
123
124 const auto src_path_full = path_parser_src.BuildHostPath(mount_point);
125 const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point);
126
127 if (FileUtil::Rename(src_path_full, dest_path_full)) {
110 return RESULT_SUCCESS; 128 return RESULT_SUCCESS;
111 } 129 }
112 130
@@ -247,8 +265,27 @@ ResultCode SaveDataArchive::CreateDirectory(const Path& path) const {
247} 265}
248 266
249ResultCode SaveDataArchive::RenameDirectory(const Path& src_path, const Path& dest_path) const { 267ResultCode SaveDataArchive::RenameDirectory(const Path& src_path, const Path& dest_path) const {
250 if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString())) 268 const PathParser path_parser_src(src_path);
269
270 // TODO: Verify these return codes with HW
271 if (!path_parser_src.IsValid()) {
272 LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str());
273 return ERROR_INVALID_PATH;
274 }
275
276 const PathParser path_parser_dest(dest_path);
277
278 if (!path_parser_dest.IsValid()) {
279 LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str());
280 return ERROR_INVALID_PATH;
281 }
282
283 const auto src_path_full = path_parser_src.BuildHostPath(mount_point);
284 const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point);
285
286 if (FileUtil::Rename(src_path_full, dest_path_full)) {
251 return RESULT_SUCCESS; 287 return RESULT_SUCCESS;
288 }
252 289
253 // TODO(yuriks): This code probably isn't right, it'll return a Status even if the file didn't 290 // TODO(yuriks): This code probably isn't right, it'll return a Status even if the file didn't
254 // exist or similar. Verify. 291 // exist or similar. Verify.
diff --git a/src/core/file_sys/title_metadata.cpp b/src/core/file_sys/title_metadata.cpp
new file mode 100644
index 000000000..1ef8840a0
--- /dev/null
+++ b/src/core/file_sys/title_metadata.cpp
@@ -0,0 +1,212 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <cinttypes>
6#include <cryptopp/sha.h>
7#include "common/alignment.h"
8#include "common/file_util.h"
9#include "common/logging/log.h"
10#include "core/file_sys/title_metadata.h"
11#include "core/loader/loader.h"
12
13////////////////////////////////////////////////////////////////////////////////////////////////////
14// FileSys namespace
15
16namespace FileSys {
17
18static u32 GetSignatureSize(u32 signature_type) {
19 switch (signature_type) {
20 case Rsa4096Sha1:
21 case Rsa4096Sha256:
22 return 0x200;
23
24 case Rsa2048Sha1:
25 case Rsa2048Sha256:
26 return 0x100;
27
28 case EllipticSha1:
29 case EcdsaSha256:
30 return 0x3C;
31 }
32}
33
34Loader::ResultStatus TitleMetadata::Load() {
35 FileUtil::IOFile file(filepath, "rb");
36 if (!file.IsOpen())
37 return Loader::ResultStatus::Error;
38
39 if (!file.ReadBytes(&signature_type, sizeof(u32_be)))
40 return Loader::ResultStatus::Error;
41
42 // Signature lengths are variable, and the body follows the signature
43 u32 signature_size = GetSignatureSize(signature_type);
44
45 tmd_signature.resize(signature_size);
46 if (!file.ReadBytes(&tmd_signature[0], signature_size))
47 return Loader::ResultStatus::Error;
48
49 // The TMD body start position is rounded to the nearest 0x40 after the signature
50 size_t body_start = Common::AlignUp(signature_size + sizeof(u32), 0x40);
51 file.Seek(body_start, SEEK_SET);
52
53 // Read our TMD body, then load the amount of ContentChunks specified
54 if (file.ReadBytes(&tmd_body, sizeof(TitleMetadata::Body)) != sizeof(TitleMetadata::Body))
55 return Loader::ResultStatus::Error;
56
57 for (u16 i = 0; i < tmd_body.content_count; i++) {
58 ContentChunk chunk;
59 if (file.ReadBytes(&chunk, sizeof(ContentChunk)) == sizeof(ContentChunk)) {
60 tmd_chunks.push_back(chunk);
61 } else {
62 LOG_ERROR(Service_FS, "Malformed TMD %s, failed to load content chunk index %u!",
63 filepath.c_str(), i);
64 return Loader::ResultStatus::ErrorInvalidFormat;
65 }
66 }
67
68 return Loader::ResultStatus::Success;
69}
70
71Loader::ResultStatus TitleMetadata::Save() {
72 FileUtil::IOFile file(filepath, "wb");
73 if (!file.IsOpen())
74 return Loader::ResultStatus::Error;
75
76 if (!file.WriteBytes(&signature_type, sizeof(u32_be)))
77 return Loader::ResultStatus::Error;
78
79 // Signature lengths are variable, and the body follows the signature
80 u32 signature_size = GetSignatureSize(signature_type);
81
82 if (!file.WriteBytes(tmd_signature.data(), signature_size))
83 return Loader::ResultStatus::Error;
84
85 // The TMD body start position is rounded to the nearest 0x40 after the signature
86 size_t body_start = Common::AlignUp(signature_size + sizeof(u32), 0x40);
87 file.Seek(body_start, SEEK_SET);
88
89 // Update our TMD body values and hashes
90 tmd_body.content_count = static_cast<u16>(tmd_chunks.size());
91
92 // TODO(shinyquagsire23): Do TMDs with more than one contentinfo exist?
93 // For now we'll just adjust the first index to hold all content chunks
94 // and ensure that no further content info data exists.
95 tmd_body.contentinfo = {};
96 tmd_body.contentinfo[0].index = 0;
97 tmd_body.contentinfo[0].command_count = static_cast<u16>(tmd_chunks.size());
98
99 CryptoPP::SHA256 chunk_hash;
100 for (u16 i = 0; i < tmd_body.content_count; i++) {
101 chunk_hash.Update(reinterpret_cast<u8*>(&tmd_chunks[i]), sizeof(ContentChunk));
102 }
103 chunk_hash.Final(tmd_body.contentinfo[0].hash.data());
104
105 CryptoPP::SHA256 contentinfo_hash;
106 for (size_t i = 0; i < tmd_body.contentinfo.size(); i++) {
107 chunk_hash.Update(reinterpret_cast<u8*>(&tmd_body.contentinfo[i]), sizeof(ContentInfo));
108 }
109 chunk_hash.Final(tmd_body.contentinfo_hash.data());
110
111 // Write our TMD body, then write each of our ContentChunks
112 if (file.WriteBytes(&tmd_body, sizeof(TitleMetadata::Body)) != sizeof(TitleMetadata::Body))
113 return Loader::ResultStatus::Error;
114
115 for (u16 i = 0; i < tmd_body.content_count; i++) {
116 ContentChunk chunk = tmd_chunks[i];
117 if (file.WriteBytes(&chunk, sizeof(ContentChunk)) != sizeof(ContentChunk))
118 return Loader::ResultStatus::Error;
119 }
120
121 return Loader::ResultStatus::Success;
122}
123
124u64 TitleMetadata::GetTitleID() const {
125 return tmd_body.title_id;
126}
127
128u32 TitleMetadata::GetTitleType() const {
129 return tmd_body.title_type;
130}
131
132u16 TitleMetadata::GetTitleVersion() const {
133 return tmd_body.title_version;
134}
135
136u64 TitleMetadata::GetSystemVersion() const {
137 return tmd_body.system_version;
138}
139
140size_t TitleMetadata::GetContentCount() const {
141 return tmd_chunks.size();
142}
143
144u32 TitleMetadata::GetBootContentID() const {
145 return tmd_chunks[TMDContentIndex::Main].id;
146}
147
148u32 TitleMetadata::GetManualContentID() const {
149 return tmd_chunks[TMDContentIndex::Manual].id;
150}
151
152u32 TitleMetadata::GetDLPContentID() const {
153 return tmd_chunks[TMDContentIndex::DLP].id;
154}
155
156void TitleMetadata::SetTitleID(u64 title_id) {
157 tmd_body.title_id = title_id;
158}
159
160void TitleMetadata::SetTitleType(u32 type) {
161 tmd_body.title_type = type;
162}
163
164void TitleMetadata::SetTitleVersion(u16 version) {
165 tmd_body.title_version = version;
166}
167
168void TitleMetadata::SetSystemVersion(u64 version) {
169 tmd_body.system_version = version;
170}
171
172void TitleMetadata::AddContentChunk(const ContentChunk& chunk) {
173 tmd_chunks.push_back(chunk);
174}
175
176void TitleMetadata::Print() const {
177 LOG_DEBUG(Service_FS, "%s - %u chunks", filepath.c_str(),
178 static_cast<u32>(tmd_body.content_count));
179
180 // Content info describes ranges of content chunks
181 LOG_DEBUG(Service_FS, "Content info:");
182 for (size_t i = 0; i < tmd_body.contentinfo.size(); i++) {
183 if (tmd_body.contentinfo[i].command_count == 0)
184 break;
185
186 LOG_DEBUG(Service_FS, " Index %04X, Command Count %04X",
187 static_cast<u32>(tmd_body.contentinfo[i].index),
188 static_cast<u32>(tmd_body.contentinfo[i].command_count));
189 }
190
191 // For each content info, print their content chunk range
192 for (size_t i = 0; i < tmd_body.contentinfo.size(); i++) {
193 u16 index = static_cast<u16>(tmd_body.contentinfo[i].index);
194 u16 count = static_cast<u16>(tmd_body.contentinfo[i].command_count);
195
196 if (count == 0)
197 continue;
198
199 LOG_DEBUG(Service_FS, "Content chunks for content info index %zu:", i);
200 for (u16 j = index; j < index + count; j++) {
201 // Don't attempt to print content we don't have
202 if (j > tmd_body.content_count)
203 break;
204
205 const ContentChunk& chunk = tmd_chunks[j];
206 LOG_DEBUG(Service_FS, " ID %08X, Index %04X, Type %04x, Size %016" PRIX64,
207 static_cast<u32>(chunk.id), static_cast<u32>(chunk.index),
208 static_cast<u32>(chunk.type), static_cast<u64>(chunk.size));
209 }
210 }
211}
212} // namespace FileSys
diff --git a/src/core/file_sys/title_metadata.h b/src/core/file_sys/title_metadata.h
new file mode 100644
index 000000000..1fc157bf3
--- /dev/null
+++ b/src/core/file_sys/title_metadata.h
@@ -0,0 +1,125 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <string>
8#include <vector>
9#include "common/common_types.h"
10#include "common/swap.h"
11
12namespace Loader {
13enum class ResultStatus;
14}
15
16////////////////////////////////////////////////////////////////////////////////////////////////////
17// FileSys namespace
18
19namespace FileSys {
20
21enum TMDSignatureType : u32 {
22 Rsa4096Sha1 = 0x10000,
23 Rsa2048Sha1 = 0x10001,
24 EllipticSha1 = 0x10002,
25 Rsa4096Sha256 = 0x10003,
26 Rsa2048Sha256 = 0x10004,
27 EcdsaSha256 = 0x10005
28};
29
30enum TMDContentTypeFlag : u16 {
31 Encrypted = 1 << 1,
32 Disc = 1 << 2,
33 CFM = 1 << 3,
34 Optional = 1 << 14,
35 Shared = 1 << 15
36};
37
38/**
39 * Helper which implements an interface to read and write Title Metadata (TMD) files.
40 * If a file path is provided and the file exists, it can be parsed and used, otherwise
41 * it must be created. The TMD file can then be interpreted, modified and/or saved.
42 */
43class TitleMetadata {
44public:
45 struct ContentChunk {
46 u32_be id;
47 u16_be index;
48 u16_be type;
49 u64_be size;
50 std::array<u8, 0x20> hash;
51 };
52
53 static_assert(sizeof(ContentChunk) == 0x30, "TMD ContentChunk structure size is wrong");
54
55 struct ContentInfo {
56 u16_be index;
57 u16_be command_count;
58 std::array<u8, 0x20> hash;
59 };
60
61 static_assert(sizeof(ContentInfo) == 0x24, "TMD ContentInfo structure size is wrong");
62
63#pragma pack(push, 1)
64
65 struct Body {
66 std::array<u8, 0x40> issuer;
67 u8 version;
68 u8 ca_crl_version;
69 u8 signer_crl_version;
70 u8 reserved;
71 u64_be system_version;
72 u64_be title_id;
73 u32_be title_type;
74 u16_be group_id;
75 u32_be savedata_size;
76 u32_be srl_private_savedata_size;
77 std::array<u8, 4> reserved_2;
78 u8 srl_flag;
79 std::array<u8, 0x31> reserved_3;
80 u32_be access_rights;
81 u16_be title_version;
82 u16_be content_count;
83 u16_be boot_content;
84 std::array<u8, 2> reserved_4;
85 std::array<u8, 0x20> contentinfo_hash;
86 std::array<ContentInfo, 64> contentinfo;
87 };
88
89 static_assert(sizeof(Body) == 0x9C4, "TMD body structure size is wrong");
90
91#pragma pack(pop)
92
93 explicit TitleMetadata(std::string& path) : filepath(std::move(path)) {}
94 Loader::ResultStatus Load();
95 Loader::ResultStatus Save();
96
97 u64 GetTitleID() const;
98 u32 GetTitleType() const;
99 u16 GetTitleVersion() const;
100 u64 GetSystemVersion() const;
101 size_t GetContentCount() const;
102 u32 GetBootContentID() const;
103 u32 GetManualContentID() const;
104 u32 GetDLPContentID() const;
105
106 void SetTitleID(u64 title_id);
107 void SetTitleType(u32 type);
108 void SetTitleVersion(u16 version);
109 void SetSystemVersion(u64 version);
110 void AddContentChunk(const ContentChunk& chunk);
111
112 void Print() const;
113
114private:
115 enum TMDContentIndex { Main = 0, Manual = 1, DLP = 2 };
116
117 Body tmd_body;
118 u32_be signature_type;
119 std::vector<u8> tmd_signature;
120 std::vector<ContentChunk> tmd_chunks;
121
122 std::string filepath;
123};
124
125} // namespace FileSys
diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp
index 4f7d54a33..e67394177 100644
--- a/src/core/frontend/emu_window.cpp
+++ b/src/core/frontend/emu_window.cpp
@@ -2,14 +2,55 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <algorithm>
6#include <cmath> 5#include <cmath>
7#include "common/assert.h" 6#include <mutex>
8#include "core/3ds.h"
9#include "core/core.h"
10#include "core/frontend/emu_window.h" 7#include "core/frontend/emu_window.h"
8#include "core/frontend/input.h"
11#include "core/settings.h" 9#include "core/settings.h"
12 10
11class EmuWindow::TouchState : public Input::Factory<Input::TouchDevice>,
12 public std::enable_shared_from_this<TouchState> {
13public:
14 std::unique_ptr<Input::TouchDevice> Create(const Common::ParamPackage&) override {
15 return std::make_unique<Device>(shared_from_this());
16 }
17
18 std::mutex mutex;
19
20 bool touch_pressed = false; ///< True if touchpad area is currently pressed, otherwise false
21
22 float touch_x = 0.0f; ///< Touchpad X-position
23 float touch_y = 0.0f; ///< Touchpad Y-position
24
25private:
26 class Device : public Input::TouchDevice {
27 public:
28 explicit Device(std::weak_ptr<TouchState>&& touch_state) : touch_state(touch_state) {}
29 std::tuple<float, float, bool> GetStatus() const override {
30 if (auto state = touch_state.lock()) {
31 std::lock_guard<std::mutex> guard(state->mutex);
32 return std::make_tuple(state->touch_x, state->touch_y, state->touch_pressed);
33 }
34 return std::make_tuple(0.0f, 0.0f, false);
35 }
36
37 private:
38 std::weak_ptr<TouchState> touch_state;
39 };
40};
41
42EmuWindow::EmuWindow() {
43 // TODO: Find a better place to set this.
44 config.min_client_area_size = std::make_pair(400u, 480u);
45 active_config = config;
46 touch_state = std::make_shared<TouchState>();
47 Input::RegisterFactory<Input::TouchDevice>("emu_window", touch_state);
48}
49
50EmuWindow::~EmuWindow() {
51 Input::UnregisterFactory<Input::TouchDevice>("emu_window");
52}
53
13/** 54/**
14 * Check if the given x/y coordinates are within the touchpad specified by the framebuffer layout 55 * Check if the given x/y coordinates are within the touchpad specified by the framebuffer layout
15 * @param layout FramebufferLayout object describing the framebuffer size and screen positions 56 * @param layout FramebufferLayout object describing the framebuffer size and screen positions
@@ -38,22 +79,26 @@ void EmuWindow::TouchPressed(unsigned framebuffer_x, unsigned framebuffer_y) {
38 if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) 79 if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y))
39 return; 80 return;
40 81
41 touch_x = Core::kScreenBottomWidth * (framebuffer_x - framebuffer_layout.bottom_screen.left) / 82 std::lock_guard<std::mutex> guard(touch_state->mutex);
42 (framebuffer_layout.bottom_screen.right - framebuffer_layout.bottom_screen.left); 83 touch_state->touch_x =
43 touch_y = Core::kScreenBottomHeight * (framebuffer_y - framebuffer_layout.bottom_screen.top) / 84 static_cast<float>(framebuffer_x - framebuffer_layout.bottom_screen.left) /
44 (framebuffer_layout.bottom_screen.bottom - framebuffer_layout.bottom_screen.top); 85 (framebuffer_layout.bottom_screen.right - framebuffer_layout.bottom_screen.left);
86 touch_state->touch_y =
87 static_cast<float>(framebuffer_y - framebuffer_layout.bottom_screen.top) /
88 (framebuffer_layout.bottom_screen.bottom - framebuffer_layout.bottom_screen.top);
45 89
46 touch_pressed = true; 90 touch_state->touch_pressed = true;
47} 91}
48 92
49void EmuWindow::TouchReleased() { 93void EmuWindow::TouchReleased() {
50 touch_pressed = false; 94 std::lock_guard<std::mutex> guard(touch_state->mutex);
51 touch_x = 0; 95 touch_state->touch_pressed = false;
52 touch_y = 0; 96 touch_state->touch_x = 0;
97 touch_state->touch_y = 0;
53} 98}
54 99
55void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) { 100void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) {
56 if (!touch_pressed) 101 if (!touch_state->touch_pressed)
57 return; 102 return;
58 103
59 if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) 104 if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y))
@@ -62,29 +107,6 @@ void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) {
62 TouchPressed(framebuffer_x, framebuffer_y); 107 TouchPressed(framebuffer_x, framebuffer_y);
63} 108}
64 109
65void EmuWindow::AccelerometerChanged(float x, float y, float z) {
66 constexpr float coef = 512;
67
68 std::lock_guard<std::mutex> lock(accel_mutex);
69
70 // TODO(wwylele): do a time stretch as it in GyroscopeChanged
71 // The time stretch formula should be like
72 // stretched_vector = (raw_vector - gravity) * stretch_ratio + gravity
73 accel_x = static_cast<s16>(x * coef);
74 accel_y = static_cast<s16>(y * coef);
75 accel_z = static_cast<s16>(z * coef);
76}
77
78void EmuWindow::GyroscopeChanged(float x, float y, float z) {
79 constexpr float FULL_FPS = 60;
80 float coef = GetGyroscopeRawToDpsCoefficient();
81 float stretch = Core::System::GetInstance().perf_stats.GetLastFrameTimeScale();
82 std::lock_guard<std::mutex> lock(gyro_mutex);
83 gyro_x = static_cast<s16>(x * coef * stretch);
84 gyro_y = static_cast<s16>(y * coef * stretch);
85 gyro_z = static_cast<s16>(z * coef * stretch);
86}
87
88void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) { 110void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) {
89 Layout::FramebufferLayout layout; 111 Layout::FramebufferLayout layout;
90 if (Settings::values.custom_layout == true) { 112 if (Settings::values.custom_layout == true) {
@@ -97,6 +119,9 @@ void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height)
97 case Settings::LayoutOption::LargeScreen: 119 case Settings::LayoutOption::LargeScreen:
98 layout = Layout::LargeFrameLayout(width, height, Settings::values.swap_screen); 120 layout = Layout::LargeFrameLayout(width, height, Settings::values.swap_screen);
99 break; 121 break;
122 case Settings::LayoutOption::SideScreen:
123 layout = Layout::SideFrameLayout(width, height, Settings::values.swap_screen);
124 break;
100 case Settings::LayoutOption::Default: 125 case Settings::LayoutOption::Default:
101 default: 126 default:
102 layout = Layout::DefaultFrameLayout(width, height, Settings::values.swap_screen); 127 layout = Layout::DefaultFrameLayout(width, height, Settings::values.swap_screen);
diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h
index 9414123a4..c10dee51b 100644
--- a/src/core/frontend/emu_window.h
+++ b/src/core/frontend/emu_window.h
@@ -4,11 +4,10 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <mutex> 7#include <memory>
8#include <tuple> 8#include <tuple>
9#include <utility> 9#include <utility>
10#include "common/common_types.h" 10#include "common/common_types.h"
11#include "common/math_util.h"
12#include "core/frontend/framebuffer_layout.h" 11#include "core/frontend/framebuffer_layout.h"
13 12
14/** 13/**
@@ -69,84 +68,6 @@ public:
69 void TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y); 68 void TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y);
70 69
71 /** 70 /**
72 * Signal accelerometer state has changed.
73 * @param x X-axis accelerometer value
74 * @param y Y-axis accelerometer value
75 * @param z Z-axis accelerometer value
76 * @note all values are in unit of g (gravitational acceleration).
77 * e.g. x = 1.0 means 9.8m/s^2 in x direction.
78 * @see GetAccelerometerState for axis explanation.
79 */
80 void AccelerometerChanged(float x, float y, float z);
81
82 /**
83 * Signal gyroscope state has changed.
84 * @param x X-axis accelerometer value
85 * @param y Y-axis accelerometer value
86 * @param z Z-axis accelerometer value
87 * @note all values are in deg/sec.
88 * @see GetGyroscopeState for axis explanation.
89 */
90 void GyroscopeChanged(float x, float y, float z);
91
92 /**
93 * Gets the current touch screen state (touch X/Y coordinates and whether or not it is pressed).
94 * @note This should be called by the core emu thread to get a state set by the window thread.
95 * @todo Fix this function to be thread-safe.
96 * @return std::tuple of (x, y, pressed) where `x` and `y` are the touch coordinates and
97 * `pressed` is true if the touch screen is currently being pressed
98 */
99 std::tuple<u16, u16, bool> GetTouchState() const {
100 return std::make_tuple(touch_x, touch_y, touch_pressed);
101 }
102
103 /**
104 * Gets the current accelerometer state (acceleration along each three axis).
105 * Axis explained:
106 * +x is the same direction as LEFT on D-pad.
107 * +y is normal to the touch screen, pointing outward.
108 * +z is the same direction as UP on D-pad.
109 * Units:
110 * 1 unit of return value = 1/512 g (measured by hw test),
111 * where g is the gravitational acceleration (9.8 m/sec2).
112 * @note This should be called by the core emu thread to get a state set by the window thread.
113 * @return std::tuple of (x, y, z)
114 */
115 std::tuple<s16, s16, s16> GetAccelerometerState() {
116 std::lock_guard<std::mutex> lock(accel_mutex);
117 return std::make_tuple(accel_x, accel_y, accel_z);
118 }
119
120 /**
121 * Gets the current gyroscope state (angular rates about each three axis).
122 * Axis explained:
123 * +x is the same direction as LEFT on D-pad.
124 * +y is normal to the touch screen, pointing outward.
125 * +z is the same direction as UP on D-pad.
126 * Orientation is determined by right-hand rule.
127 * Units:
128 * 1 unit of return value = (1/coef) deg/sec,
129 * where coef is the return value of GetGyroscopeRawToDpsCoefficient().
130 * @note This should be called by the core emu thread to get a state set by the window thread.
131 * @return std::tuple of (x, y, z)
132 */
133 std::tuple<s16, s16, s16> GetGyroscopeState() {
134 std::lock_guard<std::mutex> lock(gyro_mutex);
135 return std::make_tuple(gyro_x, gyro_y, gyro_z);
136 }
137
138 /**
139 * Gets the coefficient for units conversion of gyroscope state.
140 * The conversion formula is r = coefficient * v,
141 * where v is angular rate in deg/sec,
142 * and r is the gyroscope state.
143 * @return float-type coefficient
144 */
145 f32 GetGyroscopeRawToDpsCoefficient() const {
146 return 14.375f; // taken from hw test, and gyroscope's document
147 }
148
149 /**
150 * Returns currently active configuration. 71 * Returns currently active configuration.
151 * @note Accesses to the returned object need not be consistent because it may be modified in 72 * @note Accesses to the returned object need not be consistent because it may be modified in
152 * another thread 73 * another thread
@@ -180,21 +101,8 @@ public:
180 void UpdateCurrentFramebufferLayout(unsigned width, unsigned height); 101 void UpdateCurrentFramebufferLayout(unsigned width, unsigned height);
181 102
182protected: 103protected:
183 EmuWindow() { 104 EmuWindow();
184 // TODO: Find a better place to set this. 105 virtual ~EmuWindow();
185 config.min_client_area_size = std::make_pair(400u, 480u);
186 active_config = config;
187 touch_x = 0;
188 touch_y = 0;
189 touch_pressed = false;
190 accel_x = 0;
191 accel_y = -512;
192 accel_z = 0;
193 gyro_x = 0;
194 gyro_y = 0;
195 gyro_z = 0;
196 }
197 virtual ~EmuWindow() {}
198 106
199 /** 107 /**
200 * Processes any pending configuration changes from the last SetConfig call. 108 * Processes any pending configuration changes from the last SetConfig call.
@@ -250,20 +158,8 @@ private:
250 /// ProcessConfigurationChanges) 158 /// ProcessConfigurationChanges)
251 WindowConfig active_config; ///< Internal active configuration 159 WindowConfig active_config; ///< Internal active configuration
252 160
253 bool touch_pressed; ///< True if touchpad area is currently pressed, otherwise false 161 class TouchState;
254 162 std::shared_ptr<TouchState> touch_state;
255 u16 touch_x; ///< Touchpad X-position in native 3DS pixel coordinates (0-320)
256 u16 touch_y; ///< Touchpad Y-position in native 3DS pixel coordinates (0-240)
257
258 std::mutex accel_mutex;
259 s16 accel_x; ///< Accelerometer X-axis value in native 3DS units
260 s16 accel_y; ///< Accelerometer Y-axis value in native 3DS units
261 s16 accel_z; ///< Accelerometer Z-axis value in native 3DS units
262
263 std::mutex gyro_mutex;
264 s16 gyro_x; ///< Gyroscope X-axis value in native 3DS units
265 s16 gyro_y; ///< Gyroscope Y-axis value in native 3DS units
266 s16 gyro_z; ///< Gyroscope Z-axis value in native 3DS units
267 163
268 /** 164 /**
269 * Clip the provided coordinates to be inside the touchscreen area. 165 * Clip the provided coordinates to be inside the touchscreen area.
diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp
index d2d02f9ff..e9f778fcb 100644
--- a/src/core/frontend/framebuffer_layout.cpp
+++ b/src/core/frontend/framebuffer_layout.cpp
@@ -141,6 +141,40 @@ FramebufferLayout LargeFrameLayout(unsigned width, unsigned height, bool swapped
141 return res; 141 return res;
142} 142}
143 143
144FramebufferLayout SideFrameLayout(unsigned width, unsigned height, bool swapped) {
145 ASSERT(width > 0);
146 ASSERT(height > 0);
147
148 FramebufferLayout res{width, height, true, true, {}, {}};
149 // Aspect ratio of both screens side by side
150 const float emulation_aspect_ratio = static_cast<float>(Core::kScreenTopHeight) /
151 (Core::kScreenTopWidth + Core::kScreenBottomWidth);
152 float window_aspect_ratio = static_cast<float>(height) / width;
153 MathUtil::Rectangle<unsigned> screen_window_area{0, 0, width, height};
154 // Find largest Rectangle that can fit in the window size with the given aspect ratio
155 MathUtil::Rectangle<unsigned> screen_rect =
156 maxRectangle(screen_window_area, emulation_aspect_ratio);
157 // Find sizes of top and bottom screen
158 MathUtil::Rectangle<unsigned> top_screen = maxRectangle(screen_rect, TOP_SCREEN_ASPECT_RATIO);
159 MathUtil::Rectangle<unsigned> bot_screen = maxRectangle(screen_rect, BOT_SCREEN_ASPECT_RATIO);
160
161 if (window_aspect_ratio < emulation_aspect_ratio) {
162 // Apply borders to the left and right sides of the window.
163 u32 shift_horizontal = (screen_window_area.GetWidth() - screen_rect.GetWidth()) / 2;
164 top_screen = top_screen.TranslateX(shift_horizontal);
165 bot_screen = bot_screen.TranslateX(shift_horizontal);
166 } else {
167 // Window is narrower than the emulation content => apply borders to the top and bottom
168 u32 shift_vertical = (screen_window_area.GetHeight() - screen_rect.GetHeight()) / 2;
169 top_screen = top_screen.TranslateY(shift_vertical);
170 bot_screen = bot_screen.TranslateY(shift_vertical);
171 }
172 // Move the top screen to the right if we are swapped.
173 res.top_screen = swapped ? top_screen.TranslateX(bot_screen.GetWidth()) : top_screen;
174 res.bottom_screen = swapped ? bot_screen : bot_screen.TranslateX(top_screen.GetWidth());
175 return res;
176}
177
144FramebufferLayout CustomFrameLayout(unsigned width, unsigned height) { 178FramebufferLayout CustomFrameLayout(unsigned width, unsigned height) {
145 ASSERT(width > 0); 179 ASSERT(width > 0);
146 ASSERT(height > 0); 180 ASSERT(height > 0);
@@ -158,4 +192,4 @@ FramebufferLayout CustomFrameLayout(unsigned width, unsigned height) {
158 res.bottom_screen = bot_screen; 192 res.bottom_screen = bot_screen;
159 return res; 193 return res;
160} 194}
161} 195} // namespace Layout
diff --git a/src/core/frontend/framebuffer_layout.h b/src/core/frontend/framebuffer_layout.h
index 9a7738969..4983cf103 100644
--- a/src/core/frontend/framebuffer_layout.h
+++ b/src/core/frontend/framebuffer_layout.h
@@ -54,6 +54,17 @@ FramebufferLayout SingleFrameLayout(unsigned width, unsigned height, bool is_swa
54FramebufferLayout LargeFrameLayout(unsigned width, unsigned height, bool is_swapped); 54FramebufferLayout LargeFrameLayout(unsigned width, unsigned height, bool is_swapped);
55 55
56/** 56/**
57* Factory method for constructing a Frame with the Top screen and bottom
58* screen side by side
59* This is useful for devices with small screens, like the GPDWin
60* @param width Window framebuffer width in pixels
61* @param height Window framebuffer height in pixels
62* @param is_swapped if true, the bottom screen will be the left display
63* @return Newly created FramebufferLayout object with default screen regions initialized
64*/
65FramebufferLayout SideFrameLayout(unsigned width, unsigned height, bool is_swapped);
66
67/**
57 * Factory method for constructing a custom FramebufferLayout 68 * Factory method for constructing a custom FramebufferLayout
58 * @param width Window framebuffer width in pixels 69 * @param width Window framebuffer width in pixels
59 * @param height Window framebuffer height in pixels 70 * @param height Window framebuffer height in pixels
diff --git a/src/core/frontend/input.h b/src/core/frontend/input.h
index 0a5713dc0..8c256beb5 100644
--- a/src/core/frontend/input.h
+++ b/src/core/frontend/input.h
@@ -11,6 +11,7 @@
11#include <utility> 11#include <utility>
12#include "common/logging/log.h" 12#include "common/logging/log.h"
13#include "common/param_package.h" 13#include "common/param_package.h"
14#include "common/vector_math.h"
14 15
15namespace Input { 16namespace Input {
16 17
@@ -107,4 +108,28 @@ using ButtonDevice = InputDevice<bool>;
107 */ 108 */
108using AnalogDevice = InputDevice<std::tuple<float, float>>; 109using AnalogDevice = InputDevice<std::tuple<float, float>>;
109 110
111/**
112 * A motion device is an input device that returns a tuple of accelerometer state vector and
113 * gyroscope state vector.
114 *
115 * For both vectors:
116 * x+ is the same direction as LEFT on D-pad.
117 * y+ is normal to the touch screen, pointing outward.
118 * z+ is the same direction as UP on D-pad.
119 *
120 * For accelerometer state vector
121 * Units: g (gravitational acceleration)
122 *
123 * For gyroscope state vector:
124 * Orientation is determined by right-hand rule.
125 * Units: deg/sec
126 */
127using MotionDevice = InputDevice<std::tuple<Math::Vec3<float>, Math::Vec3<float>>>;
128
129/**
130 * A touch device is an input device that returns a tuple of two floats and a bool. The floats are
131 * x and y coordinates in the range 0.0 - 1.0, and the bool indicates whether it is pressed.
132 */
133using TouchDevice = InputDevice<std::tuple<float, float, bool>>;
134
110} // namespace Input 135} // namespace Input
diff --git a/src/core/frontend/motion_emu.cpp b/src/core/frontend/motion_emu.cpp
deleted file mode 100644
index 9a5b3185d..000000000
--- a/src/core/frontend/motion_emu.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
1// Copyright 2016 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "common/math_util.h"
6#include "common/quaternion.h"
7#include "core/frontend/emu_window.h"
8#include "core/frontend/motion_emu.h"
9
10namespace Motion {
11
12static constexpr int update_millisecond = 100;
13static constexpr auto update_duration =
14 std::chrono::duration_cast<std::chrono::steady_clock::duration>(
15 std::chrono::milliseconds(update_millisecond));
16
17MotionEmu::MotionEmu(EmuWindow& emu_window)
18 : motion_emu_thread(&MotionEmu::MotionEmuThread, this, std::ref(emu_window)) {}
19
20MotionEmu::~MotionEmu() {
21 if (motion_emu_thread.joinable()) {
22 shutdown_event.Set();
23 motion_emu_thread.join();
24 }
25}
26
27void MotionEmu::MotionEmuThread(EmuWindow& emu_window) {
28 auto update_time = std::chrono::steady_clock::now();
29 Math::Quaternion<float> q = MakeQuaternion(Math::Vec3<float>(), 0);
30 Math::Quaternion<float> old_q;
31
32 while (!shutdown_event.WaitUntil(update_time)) {
33 update_time += update_duration;
34 old_q = q;
35
36 {
37 std::lock_guard<std::mutex> guard(tilt_mutex);
38
39 // Find the quaternion describing current 3DS tilting
40 q = MakeQuaternion(Math::MakeVec(-tilt_direction.y, 0.0f, tilt_direction.x),
41 tilt_angle);
42 }
43
44 auto inv_q = q.Inverse();
45
46 // Set the gravity vector in world space
47 auto gravity = Math::MakeVec(0.0f, -1.0f, 0.0f);
48
49 // Find the angular rate vector in world space
50 auto angular_rate = ((q - old_q) * inv_q).xyz * 2;
51 angular_rate *= 1000 / update_millisecond / MathUtil::PI * 180;
52
53 // Transform the two vectors from world space to 3DS space
54 gravity = QuaternionRotate(inv_q, gravity);
55 angular_rate = QuaternionRotate(inv_q, angular_rate);
56
57 // Update the sensor state
58 emu_window.AccelerometerChanged(gravity.x, gravity.y, gravity.z);
59 emu_window.GyroscopeChanged(angular_rate.x, angular_rate.y, angular_rate.z);
60 }
61}
62
63void MotionEmu::BeginTilt(int x, int y) {
64 mouse_origin = Math::MakeVec(x, y);
65 is_tilting = true;
66}
67
68void MotionEmu::Tilt(int x, int y) {
69 constexpr float SENSITIVITY = 0.01f;
70 auto mouse_move = Math::MakeVec(x, y) - mouse_origin;
71 if (is_tilting) {
72 std::lock_guard<std::mutex> guard(tilt_mutex);
73 if (mouse_move.x == 0 && mouse_move.y == 0) {
74 tilt_angle = 0;
75 } else {
76 tilt_direction = mouse_move.Cast<float>();
77 tilt_angle = MathUtil::Clamp(tilt_direction.Normalize() * SENSITIVITY, 0.0f,
78 MathUtil::PI * 0.5f);
79 }
80 }
81}
82
83void MotionEmu::EndTilt() {
84 std::lock_guard<std::mutex> guard(tilt_mutex);
85 tilt_angle = 0;
86 is_tilting = false;
87}
88
89} // namespace Motion
diff --git a/src/core/frontend/motion_emu.h b/src/core/frontend/motion_emu.h
deleted file mode 100644
index 99d41a726..000000000
--- a/src/core/frontend/motion_emu.h
+++ /dev/null
@@ -1,52 +0,0 @@
1// Copyright 2016 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6#include "common/thread.h"
7#include "common/vector_math.h"
8
9class EmuWindow;
10
11namespace Motion {
12
13class MotionEmu final {
14public:
15 MotionEmu(EmuWindow& emu_window);
16 ~MotionEmu();
17
18 /**
19 * Signals that a motion sensor tilt has begun.
20 * @param x the x-coordinate of the cursor
21 * @param y the y-coordinate of the cursor
22 */
23 void BeginTilt(int x, int y);
24
25 /**
26 * Signals that a motion sensor tilt is occurring.
27 * @param x the x-coordinate of the cursor
28 * @param y the y-coordinate of the cursor
29 */
30 void Tilt(int x, int y);
31
32 /**
33 * Signals that a motion sensor tilt has ended.
34 */
35 void EndTilt();
36
37private:
38 Math::Vec2<int> mouse_origin;
39
40 std::mutex tilt_mutex;
41 Math::Vec2<float> tilt_direction;
42 float tilt_angle = 0;
43
44 bool is_tilting = false;
45
46 Common::Event shutdown_event;
47 std::thread motion_emu_thread;
48
49 void MotionEmuThread(EmuWindow& emu_window);
50};
51
52} // namespace Motion
diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp
index 123fe7cd4..d6be16ef6 100644
--- a/src/core/gdbstub/gdbstub.cpp
+++ b/src/core/gdbstub/gdbstub.cpp
@@ -644,7 +644,7 @@ static void ReadMemory() {
644 644
645 auto start_offset = command_buffer + 1; 645 auto start_offset = command_buffer + 1;
646 auto addr_pos = std::find(start_offset, command_buffer + command_length, ','); 646 auto addr_pos = std::find(start_offset, command_buffer + command_length, ',');
647 PAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset)); 647 VAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset));
648 648
649 start_offset = addr_pos + 1; 649 start_offset = addr_pos + 1;
650 u32 len = 650 u32 len =
@@ -656,12 +656,14 @@ static void ReadMemory() {
656 SendReply("E01"); 656 SendReply("E01");
657 } 657 }
658 658
659 const u8* data = Memory::GetPointer(addr); 659 if (!Memory::IsValidVirtualAddress(addr)) {
660 if (!data) {
661 return SendReply("E00"); 660 return SendReply("E00");
662 } 661 }
663 662
664 MemToGdbHex(reply, data, len); 663 std::vector<u8> data(len);
664 Memory::ReadBlock(addr, data.data(), len);
665
666 MemToGdbHex(reply, data.data(), len);
665 reply[len * 2] = '\0'; 667 reply[len * 2] = '\0';
666 SendReply(reinterpret_cast<char*>(reply)); 668 SendReply(reinterpret_cast<char*>(reply));
667} 669}
@@ -670,18 +672,20 @@ static void ReadMemory() {
670static void WriteMemory() { 672static void WriteMemory() {
671 auto start_offset = command_buffer + 1; 673 auto start_offset = command_buffer + 1;
672 auto addr_pos = std::find(start_offset, command_buffer + command_length, ','); 674 auto addr_pos = std::find(start_offset, command_buffer + command_length, ',');
673 PAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset)); 675 VAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset));
674 676
675 start_offset = addr_pos + 1; 677 start_offset = addr_pos + 1;
676 auto len_pos = std::find(start_offset, command_buffer + command_length, ':'); 678 auto len_pos = std::find(start_offset, command_buffer + command_length, ':');
677 u32 len = HexToInt(start_offset, static_cast<u32>(len_pos - start_offset)); 679 u32 len = HexToInt(start_offset, static_cast<u32>(len_pos - start_offset));
678 680
679 u8* dst = Memory::GetPointer(addr); 681 if (!Memory::IsValidVirtualAddress(addr)) {
680 if (!dst) {
681 return SendReply("E00"); 682 return SendReply("E00");
682 } 683 }
683 684
684 GdbHexToMem(dst, len_pos + 1, len); 685 std::vector<u8> data(len);
686
687 GdbHexToMem(data.data(), len_pos + 1, len);
688 Memory::WriteBlock(addr, data.data(), len);
685 SendReply("OK"); 689 SendReply("OK");
686} 690}
687 691
@@ -946,7 +950,7 @@ static void Init(u16 port) {
946 WSAStartup(MAKEWORD(2, 2), &InitData); 950 WSAStartup(MAKEWORD(2, 2), &InitData);
947#endif 951#endif
948 952
949 int tmpsock = socket(PF_INET, SOCK_STREAM, 0); 953 int tmpsock = static_cast<int>(socket(PF_INET, SOCK_STREAM, 0));
950 if (tmpsock == -1) { 954 if (tmpsock == -1) {
951 LOG_ERROR(Debug_GDBStub, "Failed to create gdb socket"); 955 LOG_ERROR(Debug_GDBStub, "Failed to create gdb socket");
952 } 956 }
@@ -973,7 +977,7 @@ static void Init(u16 port) {
973 sockaddr_in saddr_client; 977 sockaddr_in saddr_client;
974 sockaddr* client_addr = reinterpret_cast<sockaddr*>(&saddr_client); 978 sockaddr* client_addr = reinterpret_cast<sockaddr*>(&saddr_client);
975 socklen_t client_addrlen = sizeof(saddr_client); 979 socklen_t client_addrlen = sizeof(saddr_client);
976 gdbserver_socket = accept(tmpsock, client_addr, &client_addrlen); 980 gdbserver_socket = static_cast<int>(accept(tmpsock, client_addr, &client_addrlen));
977 if (gdbserver_socket < 0) { 981 if (gdbserver_socket < 0) {
978 // In the case that we couldn't start the server for whatever reason, just start CPU 982 // In the case that we couldn't start the server for whatever reason, just start CPU
979 // execution like normal. 983 // execution like normal.
diff --git a/src/core/hle/applets/erreula.cpp b/src/core/hle/applets/erreula.cpp
index 75d7fd9fc..518f371f5 100644
--- a/src/core/hle/applets/erreula.cpp
+++ b/src/core/hle/applets/erreula.cpp
@@ -31,8 +31,8 @@ ResultCode ErrEula::ReceiveParameter(const Service::APT::MessageParameter& param
31 heap_memory = std::make_shared<std::vector<u8>>(capture_info.size); 31 heap_memory = std::make_shared<std::vector<u8>>(capture_info.size);
32 // Create a SharedMemory that directly points to this heap block. 32 // Create a SharedMemory that directly points to this heap block.
33 framebuffer_memory = Kernel::SharedMemory::CreateForApplet( 33 framebuffer_memory = Kernel::SharedMemory::CreateForApplet(
34 heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite, 34 heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite,
35 MemoryPermission::ReadWrite, "ErrEula Memory"); 35 "ErrEula Memory");
36 36
37 // Send the response message with the newly created SharedMemory 37 // Send the response message with the newly created SharedMemory
38 Service::APT::MessageParameter result; 38 Service::APT::MessageParameter result;
diff --git a/src/core/hle/applets/mii_selector.cpp b/src/core/hle/applets/mii_selector.cpp
index 89f08daa2..f225c23a5 100644
--- a/src/core/hle/applets/mii_selector.cpp
+++ b/src/core/hle/applets/mii_selector.cpp
@@ -38,8 +38,8 @@ ResultCode MiiSelector::ReceiveParameter(const Service::APT::MessageParameter& p
38 heap_memory = std::make_shared<std::vector<u8>>(capture_info.size); 38 heap_memory = std::make_shared<std::vector<u8>>(capture_info.size);
39 // Create a SharedMemory that directly points to this heap block. 39 // Create a SharedMemory that directly points to this heap block.
40 framebuffer_memory = Kernel::SharedMemory::CreateForApplet( 40 framebuffer_memory = Kernel::SharedMemory::CreateForApplet(
41 heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite, 41 heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite,
42 MemoryPermission::ReadWrite, "MiiSelector Memory"); 42 "MiiSelector Memory");
43 43
44 // Send the response message with the newly created SharedMemory 44 // Send the response message with the newly created SharedMemory
45 Service::APT::MessageParameter result; 45 Service::APT::MessageParameter result;
@@ -66,7 +66,7 @@ ResultCode MiiSelector::StartImpl(const Service::APT::AppletStartupParameter& pa
66 // continue. 66 // continue.
67 MiiResult result; 67 MiiResult result;
68 memset(&result, 0, sizeof(result)); 68 memset(&result, 0, sizeof(result));
69 result.result_code = 0; 69 result.return_code = 0;
70 70
71 // Let the application know that we're closing 71 // Let the application know that we're closing
72 Service::APT::MessageParameter message; 72 Service::APT::MessageParameter message;
@@ -82,5 +82,5 @@ ResultCode MiiSelector::StartImpl(const Service::APT::AppletStartupParameter& pa
82} 82}
83 83
84void MiiSelector::Update() {} 84void MiiSelector::Update() {}
85} 85} // namespace Applets
86} // namespace 86} // namespace HLE
diff --git a/src/core/hle/applets/mii_selector.h b/src/core/hle/applets/mii_selector.h
index ec00e29d2..136ce8948 100644
--- a/src/core/hle/applets/mii_selector.h
+++ b/src/core/hle/applets/mii_selector.h
@@ -16,51 +16,46 @@ namespace HLE {
16namespace Applets { 16namespace Applets {
17 17
18struct MiiConfig { 18struct MiiConfig {
19 u8 unk_000; 19 u8 enable_cancel_button;
20 u8 unk_001; 20 u8 enable_guest_mii;
21 u8 unk_002; 21 u8 show_on_top_screen;
22 u8 unk_003; 22 INSERT_PADDING_BYTES(5);
23 u8 unk_004; 23 u16 title[0x40];
24 INSERT_PADDING_BYTES(4);
25 u8 show_guest_miis;
24 INSERT_PADDING_BYTES(3); 26 INSERT_PADDING_BYTES(3);
25 u16 unk_008; 27 u32 initially_selected_mii_index;
26 INSERT_PADDING_BYTES(0x82); 28 u8 guest_mii_whitelist[6];
27 u8 unk_08C; 29 u8 user_mii_whitelist[0x64];
28 INSERT_PADDING_BYTES(3);
29 u16 unk_090;
30 INSERT_PADDING_BYTES(2); 30 INSERT_PADDING_BYTES(2);
31 u32 unk_094; 31 u32 magic_value;
32 u16 unk_098;
33 u8 unk_09A[0x64];
34 u8 unk_0FE;
35 u8 unk_0FF;
36 u32 unk_100;
37}; 32};
38
39static_assert(sizeof(MiiConfig) == 0x104, "MiiConfig structure has incorrect size"); 33static_assert(sizeof(MiiConfig) == 0x104, "MiiConfig structure has incorrect size");
40#define ASSERT_REG_POSITION(field_name, position) \ 34#define ASSERT_REG_POSITION(field_name, position) \
41 static_assert(offsetof(MiiConfig, field_name) == position, \ 35 static_assert(offsetof(MiiConfig, field_name) == position, \
42 "Field " #field_name " has invalid position") 36 "Field " #field_name " has invalid position")
43ASSERT_REG_POSITION(unk_008, 0x08); 37ASSERT_REG_POSITION(title, 0x08);
44ASSERT_REG_POSITION(unk_08C, 0x8C); 38ASSERT_REG_POSITION(show_guest_miis, 0x8C);
45ASSERT_REG_POSITION(unk_090, 0x90); 39ASSERT_REG_POSITION(initially_selected_mii_index, 0x90);
46ASSERT_REG_POSITION(unk_094, 0x94); 40ASSERT_REG_POSITION(guest_mii_whitelist, 0x94);
47ASSERT_REG_POSITION(unk_0FE, 0xFE);
48#undef ASSERT_REG_POSITION 41#undef ASSERT_REG_POSITION
49 42
50struct MiiResult { 43struct MiiResult {
51 u32 result_code; 44 u32 return_code;
52 u8 unk_04; 45 u32 is_guest_mii_selected;
53 INSERT_PADDING_BYTES(7); 46 u32 selected_guest_mii_index;
54 u8 unk_0C[0x60]; 47 // TODO(mailwl): expand to Mii Format structure: https://www.3dbrew.org/wiki/Mii
55 u8 unk_6C[0x16]; 48 u8 selected_mii_data[0x5C];
56 INSERT_PADDING_BYTES(2); 49 INSERT_PADDING_BYTES(2);
50 u16 mii_data_checksum;
51 u16 guest_mii_name[0xC];
57}; 52};
58static_assert(sizeof(MiiResult) == 0x84, "MiiResult structure has incorrect size"); 53static_assert(sizeof(MiiResult) == 0x84, "MiiResult structure has incorrect size");
59#define ASSERT_REG_POSITION(field_name, position) \ 54#define ASSERT_REG_POSITION(field_name, position) \
60 static_assert(offsetof(MiiResult, field_name) == position, \ 55 static_assert(offsetof(MiiResult, field_name) == position, \
61 "Field " #field_name " has invalid position") 56 "Field " #field_name " has invalid position")
62ASSERT_REG_POSITION(unk_0C, 0x0C); 57ASSERT_REG_POSITION(selected_mii_data, 0x0C);
63ASSERT_REG_POSITION(unk_6C, 0x6C); 58ASSERT_REG_POSITION(guest_mii_name, 0x6C);
64#undef ASSERT_REG_POSITION 59#undef ASSERT_REG_POSITION
65 60
66class MiiSelector final : public Applet { 61class MiiSelector final : public Applet {
@@ -79,5 +74,5 @@ private:
79 74
80 MiiConfig config; 75 MiiConfig config;
81}; 76};
82} 77} // namespace Applets
83} // namespace 78} // namespace HLE
diff --git a/src/core/hle/applets/mint.cpp b/src/core/hle/applets/mint.cpp
index 31a79ea17..50d79190b 100644
--- a/src/core/hle/applets/mint.cpp
+++ b/src/core/hle/applets/mint.cpp
@@ -31,8 +31,8 @@ ResultCode Mint::ReceiveParameter(const Service::APT::MessageParameter& paramete
31 heap_memory = std::make_shared<std::vector<u8>>(capture_info.size); 31 heap_memory = std::make_shared<std::vector<u8>>(capture_info.size);
32 // Create a SharedMemory that directly points to this heap block. 32 // Create a SharedMemory that directly points to this heap block.
33 framebuffer_memory = Kernel::SharedMemory::CreateForApplet( 33 framebuffer_memory = Kernel::SharedMemory::CreateForApplet(
34 heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite, 34 heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite,
35 MemoryPermission::ReadWrite, "Mint Memory"); 35 "Mint Memory");
36 36
37 // Send the response message with the newly created SharedMemory 37 // Send the response message with the newly created SharedMemory
38 Service::APT::MessageParameter result; 38 Service::APT::MessageParameter result;
diff --git a/src/core/hle/applets/swkbd.cpp b/src/core/hle/applets/swkbd.cpp
index fdf8807b0..0bc471a3a 100644
--- a/src/core/hle/applets/swkbd.cpp
+++ b/src/core/hle/applets/swkbd.cpp
@@ -41,8 +41,8 @@ ResultCode SoftwareKeyboard::ReceiveParameter(Service::APT::MessageParameter con
41 heap_memory = std::make_shared<std::vector<u8>>(capture_info.size); 41 heap_memory = std::make_shared<std::vector<u8>>(capture_info.size);
42 // Create a SharedMemory that directly points to this heap block. 42 // Create a SharedMemory that directly points to this heap block.
43 framebuffer_memory = Kernel::SharedMemory::CreateForApplet( 43 framebuffer_memory = Kernel::SharedMemory::CreateForApplet(
44 heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite, 44 heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite,
45 MemoryPermission::ReadWrite, "SoftwareKeyboard Memory"); 45 "SoftwareKeyboard Memory");
46 46
47 // Send the response message with the newly created SharedMemory 47 // Send the response message with the newly created SharedMemory
48 Service::APT::MessageParameter result; 48 Service::APT::MessageParameter result;
diff --git a/src/core/hle/function_wrappers.h b/src/core/hle/function_wrappers.h
index bc81c06b4..31fda6db3 100644
--- a/src/core/hle/function_wrappers.h
+++ b/src/core/hle/function_wrappers.h
@@ -24,19 +24,37 @@ static inline void FuncReturn(u64 res) {
24 Core::CPU().SetReg(0, res); 24 Core::CPU().SetReg(0, res);
25} 25}
26 26
27/**
28 * HLE a function return (64-bit) from the current ARM11 userland process
29 * @param res Result to return (64-bit)
30 * @todo Verify that this function is correct
31 */
32static inline void FuncReturn64(u64 res) {
33 Core::CPU().SetReg(0, (u32)(res & 0xFFFFFFFF));
34 Core::CPU().SetReg(1, (u32)((res >> 32) & 0xFFFFFFFF));
35}
36
37//////////////////////////////////////////////////////////////////////////////////////////////////// 27////////////////////////////////////////////////////////////////////////////////////////////////////
38// Function wrappers that return type ResultCode 28// Function wrappers that return type ResultCode
39 29
30template <ResultCode func(u64)>
31void Wrap() {
32 FuncReturn(func(PARAM(0)).raw);
33}
34
35template <ResultCode func(u32, u64, u32)>
36void Wrap() {
37 FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw);
38}
39
40template <ResultCode func(u64, u32)>
41void Wrap() {
42 FuncReturn(func(PARAM(0), PARAM(1)).raw);
43}
44
45template <ResultCode func(u64, u64, u64)>
46void Wrap() {
47 FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw);
48}
49
50template <ResultCode func(u64*, u64, u64, u64)>
51void Wrap() {
52 u64 param_1 = 0;
53 u32 retval = func(&param_1, PARAM(1), PARAM(2), PARAM(3)).raw;
54 Core::CPU().SetReg(1, param_1);
55 FuncReturn(retval);
56}
57
40template <ResultCode func(u32, u32, u32, u32)> 58template <ResultCode func(u32, u32, u32, u32)>
41void Wrap() { 59void Wrap() {
42 FuncReturn(func(PARAM(0), PARAM(1), PARAM(2), PARAM(3)).raw); 60 FuncReturn(func(PARAM(0), PARAM(1), PARAM(2), PARAM(3)).raw);
@@ -58,22 +76,21 @@ void Wrap() {
58 FuncReturn(retval); 76 FuncReturn(retval);
59} 77}
60 78
61template <ResultCode func(s32*, u32*, s32, bool, s64)> 79template <ResultCode func(s32*, VAddr, s32, bool, s64)>
62void Wrap() { 80void Wrap() {
63 s32 param_1 = 0; 81 s32 param_1 = 0;
64 s32 retval = func(&param_1, (Kernel::Handle*)Memory::GetPointer(PARAM(1)), (s32)PARAM(2), 82 s32 retval =
65 (PARAM(3) != 0), (((s64)PARAM(4) << 32) | PARAM(0))) 83 func(&param_1, PARAM(1), (s32)PARAM(2), (PARAM(3) != 0), (((s64)PARAM(4) << 32) | PARAM(0)))
66 .raw; 84 .raw;
67 85
68 Core::CPU().SetReg(1, (u32)param_1); 86 Core::CPU().SetReg(1, (u32)param_1);
69 FuncReturn(retval); 87 FuncReturn(retval);
70} 88}
71 89
72template <ResultCode func(s32*, u32*, s32, u32)> 90template <ResultCode func(s32*, VAddr, s32, u32)>
73void Wrap() { 91void Wrap() {
74 s32 param_1 = 0; 92 s32 param_1 = 0;
75 u32 retval = 93 u32 retval = func(&param_1, PARAM(1), (s32)PARAM(2), PARAM(3)).raw;
76 func(&param_1, (Kernel::Handle*)Memory::GetPointer(PARAM(1)), (s32)PARAM(2), PARAM(3)).raw;
77 94
78 Core::CPU().SetReg(1, (u32)param_1); 95 Core::CPU().SetReg(1, (u32)param_1);
79 FuncReturn(retval); 96 FuncReturn(retval);
@@ -85,6 +102,14 @@ void Wrap() {
85 func(PARAM(0), PARAM(1), PARAM(2), PARAM(3), (((s64)PARAM(5) << 32) | PARAM(4))).raw); 102 func(PARAM(0), PARAM(1), PARAM(2), PARAM(3), (((s64)PARAM(5) << 32) | PARAM(4))).raw);
86} 103}
87 104
105template <ResultCode func(u32, u64*)>
106void Wrap() {
107 u64 param_1 = 0;
108 u32 retval = func(PARAM(0), &param_1).raw;
109 Core::CPU().SetReg(1, param_1);
110 FuncReturn(retval);
111}
112
88template <ResultCode func(u32*)> 113template <ResultCode func(u32*)>
89void Wrap() { 114void Wrap() {
90 u32 param_1 = 0; 115 u32 param_1 = 0;
@@ -100,16 +125,17 @@ void Wrap() {
100 FuncReturn(retval); 125 FuncReturn(retval);
101} 126}
102 127
103template <ResultCode func(MemoryInfo*, PageInfo*, u32)> 128template <ResultCode func(MemoryInfo*, PageInfo*, u64)>
104void Wrap() { 129void Wrap() {
105 MemoryInfo memory_info = {}; 130 MemoryInfo memory_info = {};
106 PageInfo page_info = {}; 131 PageInfo page_info = {};
107 u32 retval = func(&memory_info, &page_info, PARAM(2)).raw; 132 u32 retval = func(&memory_info, &page_info, PARAM(2)).raw;
108 Core::CPU().SetReg(1, memory_info.base_address); 133
109 Core::CPU().SetReg(2, memory_info.size); 134 Memory::Write64(PARAM(0), memory_info.base_address);
110 Core::CPU().SetReg(3, memory_info.permission); 135 Memory::Write64(PARAM(0) + 8, memory_info.size);
111 Core::CPU().SetReg(4, memory_info.state); 136 Memory::Write64(PARAM(0) + 16, memory_info.permission);
112 Core::CPU().SetReg(5, page_info.flags); 137 Memory::Write64(PARAM(0) + 24, memory_info.state);
138
113 FuncReturn(retval); 139 FuncReturn(retval);
114} 140}
115 141
@@ -139,7 +165,7 @@ void Wrap() {
139 FuncReturn(func(PARAM(0), (s32)PARAM(1)).raw); 165 FuncReturn(func(PARAM(0), (s32)PARAM(1)).raw);
140} 166}
141 167
142template <ResultCode func(u32*, u32)> 168template <ResultCode func(u32*, u64)>
143void Wrap() { 169void Wrap() {
144 u32 param_1 = 0; 170 u32 param_1 = 0;
145 u32 retval = func(&param_1, PARAM(1)).raw; 171 u32 retval = func(&param_1, PARAM(1)).raw;
@@ -152,21 +178,6 @@ void Wrap() {
152 FuncReturn(func(PARAM(0)).raw); 178 FuncReturn(func(PARAM(0)).raw);
153} 179}
154 180
155template <ResultCode func(s64*, u32, u32*, u32)>
156void Wrap() {
157 FuncReturn(func((s64*)Memory::GetPointer(PARAM(0)), PARAM(1),
158 (u32*)Memory::GetPointer(PARAM(2)), (s32)PARAM(3))
159 .raw);
160}
161
162template <ResultCode func(u32*, const char*)>
163void Wrap() {
164 u32 param_1 = 0;
165 u32 retval = func(&param_1, (char*)Memory::GetPointer(PARAM(1))).raw;
166 Core::CPU().SetReg(1, param_1);
167 FuncReturn(retval);
168}
169
170template <ResultCode func(u32*, s32, s32)> 181template <ResultCode func(u32*, s32, s32)>
171void Wrap() { 182void Wrap() {
172 u32 param_1 = 0; 183 u32 param_1 = 0;
@@ -222,13 +233,11 @@ void Wrap() {
222 FuncReturn(func(PARAM(0), PARAM(1)).raw); 233 FuncReturn(func(PARAM(0), PARAM(1)).raw);
223} 234}
224 235
225template <ResultCode func(Kernel::Handle*, Kernel::Handle*, const char*, u32)> 236template <ResultCode func(Kernel::Handle*, Kernel::Handle*, VAddr, u32)>
226void Wrap() { 237void Wrap() {
227 Kernel::Handle param_1 = 0; 238 Kernel::Handle param_1 = 0;
228 Kernel::Handle param_2 = 0; 239 Kernel::Handle param_2 = 0;
229 u32 retval = func(&param_1, &param_2, 240 u32 retval = func(&param_1, &param_2, PARAM(2), PARAM(3)).raw;
230 reinterpret_cast<const char*>(Memory::GetPointer(PARAM(2))), PARAM(3))
231 .raw;
232 Core::CPU().SetReg(1, param_1); 241 Core::CPU().SetReg(1, param_1);
233 Core::CPU().SetReg(2, param_2); 242 Core::CPU().SetReg(2, param_2);
234 FuncReturn(retval); 243 FuncReturn(retval);
@@ -244,6 +253,11 @@ void Wrap() {
244 FuncReturn(retval); 253 FuncReturn(retval);
245} 254}
246 255
256template <ResultCode func(u32, u32, u32)>
257void Wrap() {
258 FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw);
259}
260
247//////////////////////////////////////////////////////////////////////////////////////////////////// 261////////////////////////////////////////////////////////////////////////////////////////////////////
248// Function wrappers that return type u32 262// Function wrappers that return type u32
249 263
@@ -268,14 +282,14 @@ void Wrap() {
268 func(((s64)PARAM(1) << 32) | PARAM(0)); 282 func(((s64)PARAM(1) << 32) | PARAM(0));
269} 283}
270 284
271template <void func(const char*, int len)> 285template <void func(VAddr, int len)>
272void Wrap() { 286void Wrap() {
273 func((char*)Memory::GetPointer(PARAM(0)), PARAM(1)); 287 func(PARAM(0), PARAM(1));
274} 288}
275 289
276template <void func(u8)> 290template <void func(u64, u64, u64)>
277void Wrap() { 291void Wrap() {
278 func((u8)PARAM(0)); 292 func(PARAM(0), PARAM(1), PARAM(2));
279} 293}
280 294
281#undef PARAM 295#undef PARAM
diff --git a/src/core/hle/ipc.h b/src/core/hle/ipc.h
index f7f96125a..87ed85df6 100644
--- a/src/core/hle/ipc.h
+++ b/src/core/hle/ipc.h
@@ -122,11 +122,11 @@ union StaticBufferDescInfo {
122 BitField<14, 18, u32> size; 122 BitField<14, 18, u32> size;
123}; 123};
124 124
125inline u32 StaticBufferDesc(u32 size, u8 buffer_id) { 125inline u32 StaticBufferDesc(size_t size, u8 buffer_id) {
126 StaticBufferDescInfo info{}; 126 StaticBufferDescInfo info{};
127 info.descriptor_type.Assign(StaticBuffer); 127 info.descriptor_type.Assign(StaticBuffer);
128 info.buffer_id.Assign(buffer_id); 128 info.buffer_id.Assign(buffer_id);
129 info.size.Assign(size); 129 info.size.Assign(static_cast<u32>(size));
130 return info.raw; 130 return info.raw;
131} 131}
132 132
@@ -160,11 +160,11 @@ union MappedBufferDescInfo {
160 BitField<4, 28, u32> size; 160 BitField<4, 28, u32> size;
161}; 161};
162 162
163inline u32 MappedBufferDesc(u32 size, MappedBufferPermissions perms) { 163inline u32 MappedBufferDesc(size_t size, MappedBufferPermissions perms) {
164 MappedBufferDescInfo info{}; 164 MappedBufferDescInfo info{};
165 info.flags.Assign(MappedBuffer); 165 info.flags.Assign(MappedBuffer);
166 info.perms.Assign(perms); 166 info.perms.Assign(perms);
167 info.size.Assign(size); 167 info.size.Assign(static_cast<u32>(size));
168 return info.raw; 168 return info.raw;
169} 169}
170 170
diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h
index f0d89cffe..7cb95cbac 100644
--- a/src/core/hle/ipc_helpers.h
+++ b/src/core/hle/ipc_helpers.h
@@ -117,9 +117,9 @@ public:
117 117
118 void PushCurrentPIDHandle(); 118 void PushCurrentPIDHandle();
119 119
120 void PushStaticBuffer(VAddr buffer_vaddr, u32 size, u8 buffer_id); 120 void PushStaticBuffer(VAddr buffer_vaddr, size_t size, u8 buffer_id);
121 121
122 void PushMappedBuffer(VAddr buffer_vaddr, u32 size, MappedBufferPermissions perms); 122 void PushMappedBuffer(VAddr buffer_vaddr, size_t size, MappedBufferPermissions perms);
123}; 123};
124 124
125/// Push /// 125/// Push ///
@@ -190,12 +190,12 @@ inline void RequestBuilder::PushCurrentPIDHandle() {
190 Push(u32(0)); 190 Push(u32(0));
191} 191}
192 192
193inline void RequestBuilder::PushStaticBuffer(VAddr buffer_vaddr, u32 size, u8 buffer_id) { 193inline void RequestBuilder::PushStaticBuffer(VAddr buffer_vaddr, size_t size, u8 buffer_id) {
194 Push(StaticBufferDesc(size, buffer_id)); 194 Push(StaticBufferDesc(size, buffer_id));
195 Push(buffer_vaddr); 195 Push(buffer_vaddr);
196} 196}
197 197
198inline void RequestBuilder::PushMappedBuffer(VAddr buffer_vaddr, u32 size, 198inline void RequestBuilder::PushMappedBuffer(VAddr buffer_vaddr, size_t size,
199 MappedBufferPermissions perms) { 199 MappedBufferPermissions perms) {
200 Push(MappedBufferDesc(size, perms)); 200 Push(MappedBufferDesc(size, perms));
201 Push(buffer_vaddr); 201 Push(buffer_vaddr);
@@ -227,8 +227,8 @@ public:
227 bool validateHeader = true) { 227 bool validateHeader = true) {
228 if (validateHeader) 228 if (validateHeader)
229 ValidateHeader(); 229 ValidateHeader();
230 Header builderHeader{ 230 Header builderHeader{MakeHeader(static_cast<u16>(header.command_id), normal_params_size,
231 MakeHeader(header.command_id, normal_params_size, translate_params_size)}; 231 translate_params_size)};
232 if (context != nullptr) 232 if (context != nullptr)
233 return {*context, builderHeader}; 233 return {*context, builderHeader};
234 else 234 else
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index 5ebe2eca4..6020e9764 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -37,7 +37,7 @@ SharedPtr<Object> HLERequestContext::GetIncomingHandle(u32 id_from_cmdbuf) const
37 37
38u32 HLERequestContext::AddOutgoingHandle(SharedPtr<Object> object) { 38u32 HLERequestContext::AddOutgoingHandle(SharedPtr<Object> object) {
39 request_handles.push_back(std::move(object)); 39 request_handles.push_back(std::move(object));
40 return request_handles.size() - 1; 40 return static_cast<u32>(request_handles.size() - 1);
41} 41}
42 42
43void HLERequestContext::ClearIncomingObjects() { 43void HLERequestContext::ClearIncomingObjects() {
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index 9cf288b08..73fab3981 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -8,6 +8,7 @@
8#include <string> 8#include <string>
9#include <utility> 9#include <utility>
10#include <boost/smart_ptr/intrusive_ptr.hpp> 10#include <boost/smart_ptr/intrusive_ptr.hpp>
11#include "common/assert.h"
11#include "common/common_types.h" 12#include "common/common_types.h"
12 13
13namespace Kernel { 14namespace Kernel {
@@ -84,6 +85,8 @@ public:
84 case HandleType::ClientSession: 85 case HandleType::ClientSession:
85 return false; 86 return false;
86 } 87 }
88
89 UNREACHABLE();
87 } 90 }
88 91
89public: 92public:
@@ -129,4 +132,4 @@ void Init(u32 system_mode);
129/// Shutdown the kernel 132/// Shutdown the kernel
130void Shutdown(); 133void Shutdown();
131 134
132} // namespace 135} // namespace Kernel
diff --git a/src/core/hle/kernel/memory.cpp b/src/core/hle/kernel/memory.cpp
index 496d07cb5..7f27e9655 100644
--- a/src/core/hle/kernel/memory.cpp
+++ b/src/core/hle/kernel/memory.cpp
@@ -8,7 +8,6 @@
8#include <memory> 8#include <memory>
9#include <utility> 9#include <utility>
10#include <vector> 10#include <vector>
11#include "audio_core/audio_core.h"
12#include "common/assert.h" 11#include "common/assert.h"
13#include "common/common_types.h" 12#include "common/common_types.h"
14#include "common/logging/log.h" 13#include "common/logging/log.h"
@@ -24,7 +23,7 @@
24 23
25namespace Kernel { 24namespace Kernel {
26 25
27static MemoryRegionInfo memory_regions[3]; 26MemoryRegionInfo memory_regions[3];
28 27
29/// Size of the APPLICATION, SYSTEM and BASE memory regions (respectively) for each system 28/// Size of the APPLICATION, SYSTEM and BASE memory regions (respectively) for each system
30/// memory configuration type. 29/// memory configuration type.
@@ -96,9 +95,6 @@ MemoryRegionInfo* GetMemoryRegion(MemoryRegion region) {
96 } 95 }
97} 96}
98 97
99std::array<u8, Memory::VRAM_SIZE> vram;
100std::array<u8, Memory::N3DS_EXTRA_RAM_SIZE> n3ds_extra_ram;
101
102void HandleSpecialMapping(VMManager& address_space, const AddressMapping& mapping) { 98void HandleSpecialMapping(VMManager& address_space, const AddressMapping& mapping) {
103 using namespace Memory; 99 using namespace Memory;
104 100
@@ -143,30 +139,14 @@ void HandleSpecialMapping(VMManager& address_space, const AddressMapping& mappin
143 return; 139 return;
144 } 140 }
145 141
146 // TODO(yuriks): Use GetPhysicalPointer when that becomes independent of the virtual 142 u8* target_pointer = Memory::GetPhysicalPointer(area->paddr_base + offset_into_region);
147 // mappings.
148 u8* target_pointer = nullptr;
149 switch (area->paddr_base) {
150 case VRAM_PADDR:
151 target_pointer = vram.data();
152 break;
153 case DSP_RAM_PADDR:
154 target_pointer = AudioCore::GetDspMemory().data();
155 break;
156 case N3DS_EXTRA_RAM_PADDR:
157 target_pointer = n3ds_extra_ram.data();
158 break;
159 default:
160 UNREACHABLE();
161 }
162 143
163 // TODO(yuriks): This flag seems to have some other effect, but it's unknown what 144 // TODO(yuriks): This flag seems to have some other effect, but it's unknown what
164 MemoryState memory_state = mapping.unk_flag ? MemoryState::Static : MemoryState::IO; 145 MemoryState memory_state = mapping.unk_flag ? MemoryState::Static : MemoryState::IO;
165 146
166 auto vma = address_space 147 auto vma =
167 .MapBackingMemory(mapping.address, target_pointer + offset_into_region, 148 address_space.MapBackingMemory(mapping.address, target_pointer, mapping.size, memory_state)
168 mapping.size, memory_state) 149 .Unwrap();
169 .Unwrap();
170 address_space.Reprotect(vma, 150 address_space.Reprotect(vma,
171 mapping.read_only ? VMAPermission::Read : VMAPermission::ReadWrite); 151 mapping.read_only ? VMAPermission::Read : VMAPermission::ReadWrite);
172} 152}
diff --git a/src/core/hle/kernel/memory.h b/src/core/hle/kernel/memory.h
index 08c1a9989..da6bb3563 100644
--- a/src/core/hle/kernel/memory.h
+++ b/src/core/hle/kernel/memory.h
@@ -26,4 +26,6 @@ MemoryRegionInfo* GetMemoryRegion(MemoryRegion region);
26 26
27void HandleSpecialMapping(VMManager& address_space, const AddressMapping& mapping); 27void HandleSpecialMapping(VMManager& address_space, const AddressMapping& mapping);
28void MapSharedPages(VMManager& address_space); 28void MapSharedPages(VMManager& address_space);
29
30extern MemoryRegionInfo memory_regions[3];
29} // namespace Kernel 31} // namespace Kernel
diff --git a/src/core/hle/kernel/mutex.cpp b/src/core/hle/kernel/mutex.cpp
index cef961289..30dade552 100644
--- a/src/core/hle/kernel/mutex.cpp
+++ b/src/core/hle/kernel/mutex.cpp
@@ -25,10 +25,11 @@ void ReleaseThreadMutexes(Thread* thread) {
25Mutex::Mutex() {} 25Mutex::Mutex() {}
26Mutex::~Mutex() {} 26Mutex::~Mutex() {}
27 27
28SharedPtr<Mutex> Mutex::Create(bool initial_locked, std::string name) { 28SharedPtr<Mutex> Mutex::Create(bool initial_locked, VAddr addr, std::string name) {
29 SharedPtr<Mutex> mutex(new Mutex); 29 SharedPtr<Mutex> mutex(new Mutex);
30 30
31 mutex->lock_count = 0; 31 mutex->lock_count = 0;
32 mutex->addr = addr;
32 mutex->name = std::move(name); 33 mutex->name = std::move(name);
33 mutex->holding_thread = nullptr; 34 mutex->holding_thread = nullptr;
34 35
@@ -90,7 +91,7 @@ void Mutex::UpdatePriority() {
90 if (!holding_thread) 91 if (!holding_thread)
91 return; 92 return;
92 93
93 s32 best_priority = THREADPRIO_LOWEST; 94 u32 best_priority = THREADPRIO_LOWEST;
94 for (auto& waiter : GetWaitingThreads()) { 95 for (auto& waiter : GetWaitingThreads()) {
95 if (waiter->current_priority < best_priority) 96 if (waiter->current_priority < best_priority)
96 best_priority = waiter->current_priority; 97 best_priority = waiter->current_priority;
diff --git a/src/core/hle/kernel/mutex.h b/src/core/hle/kernel/mutex.h
index bacacd690..503d3ee75 100644
--- a/src/core/hle/kernel/mutex.h
+++ b/src/core/hle/kernel/mutex.h
@@ -21,7 +21,7 @@ public:
21 * @param name Optional name of mutex 21 * @param name Optional name of mutex
22 * @return Pointer to new Mutex object 22 * @return Pointer to new Mutex object
23 */ 23 */
24 static SharedPtr<Mutex> Create(bool initial_locked, std::string name = "Unknown"); 24 static SharedPtr<Mutex> Create(bool initial_locked, VAddr addr, std::string name = "Unknown");
25 25
26 std::string GetTypeName() const override { 26 std::string GetTypeName() const override {
27 return "Mutex"; 27 return "Mutex";
@@ -39,6 +39,7 @@ public:
39 u32 priority; ///< The priority of the mutex, used for priority inheritance. 39 u32 priority; ///< The priority of the mutex, used for priority inheritance.
40 std::string name; ///< Name of mutex (optional) 40 std::string name; ///< Name of mutex (optional)
41 SharedPtr<Thread> holding_thread; ///< Thread that has acquired the mutex 41 SharedPtr<Thread> holding_thread; ///< Thread that has acquired the mutex
42 VAddr addr;
42 43
43 /** 44 /**
44 * Elevate the mutex priority to the best priority 45 * Elevate the mutex priority to the best priority
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp
index 84ebdbc58..9e145866f 100644
--- a/src/core/hle/kernel/process.cpp
+++ b/src/core/hle/kernel/process.cpp
@@ -129,7 +129,8 @@ void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) {
129 } 129 }
130 130
131 vm_manager.LogLayout(Log::Level::Debug); 131 vm_manager.LogLayout(Log::Level::Debug);
132 Kernel::SetupMainThread(entry_point, main_thread_priority); 132
133 Kernel::SetupMainThread(entry_point, main_thread_priority, this);
133} 134}
134 135
135void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) { 136void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) {
diff --git a/src/core/hle/kernel/resource_limit.cpp b/src/core/hle/kernel/resource_limit.cpp
index a8f10a3ee..517dc47a8 100644
--- a/src/core/hle/kernel/resource_limit.cpp
+++ b/src/core/hle/kernel/resource_limit.cpp
@@ -61,7 +61,7 @@ s32 ResourceLimit::GetCurrentResourceValue(u32 resource) const {
61 } 61 }
62} 62}
63 63
64s32 ResourceLimit::GetMaxResourceValue(u32 resource) const { 64u32 ResourceLimit::GetMaxResourceValue(u32 resource) const {
65 switch (resource) { 65 switch (resource) {
66 case PRIORITY: 66 case PRIORITY:
67 return max_priority; 67 return max_priority;
diff --git a/src/core/hle/kernel/resource_limit.h b/src/core/hle/kernel/resource_limit.h
index 6cdfbcf8d..42874eb8d 100644
--- a/src/core/hle/kernel/resource_limit.h
+++ b/src/core/hle/kernel/resource_limit.h
@@ -67,7 +67,7 @@ public:
67 * @param resource Requested resource type 67 * @param resource Requested resource type
68 * @returns The max value of the resource type 68 * @returns The max value of the resource type
69 */ 69 */
70 s32 GetMaxResourceValue(u32 resource) const; 70 u32 GetMaxResourceValue(u32 resource) const;
71 71
72 /// Name of resource limit object. 72 /// Name of resource limit object.
73 std::string name; 73 std::string name;
diff --git a/src/core/hle/kernel/semaphore.cpp b/src/core/hle/kernel/semaphore.cpp
index fcf586728..2605b2595 100644
--- a/src/core/hle/kernel/semaphore.cpp
+++ b/src/core/hle/kernel/semaphore.cpp
@@ -13,7 +13,7 @@ namespace Kernel {
13Semaphore::Semaphore() {} 13Semaphore::Semaphore() {}
14Semaphore::~Semaphore() {} 14Semaphore::~Semaphore() {}
15 15
16ResultVal<SharedPtr<Semaphore>> Semaphore::Create(s32 initial_count, s32 max_count, 16ResultVal<SharedPtr<Semaphore>> Semaphore::Create(s32 initial_count, s32 max_count, VAddr address,
17 std::string name) { 17 std::string name) {
18 18
19 if (initial_count > max_count) 19 if (initial_count > max_count)
@@ -25,6 +25,7 @@ ResultVal<SharedPtr<Semaphore>> Semaphore::Create(s32 initial_count, s32 max_cou
25 // and the rest is reserved for the caller thread 25 // and the rest is reserved for the caller thread
26 semaphore->max_count = max_count; 26 semaphore->max_count = max_count;
27 semaphore->available_count = initial_count; 27 semaphore->available_count = initial_count;
28 semaphore->address = address;
28 semaphore->name = std::move(name); 29 semaphore->name = std::move(name);
29 30
30 return MakeResult<SharedPtr<Semaphore>>(std::move(semaphore)); 31 return MakeResult<SharedPtr<Semaphore>>(std::move(semaphore));
diff --git a/src/core/hle/kernel/semaphore.h b/src/core/hle/kernel/semaphore.h
index 7b0cacf2e..77c491a24 100644
--- a/src/core/hle/kernel/semaphore.h
+++ b/src/core/hle/kernel/semaphore.h
@@ -22,7 +22,7 @@ public:
22 * @param name Optional name of semaphore 22 * @param name Optional name of semaphore
23 * @return The created semaphore 23 * @return The created semaphore
24 */ 24 */
25 static ResultVal<SharedPtr<Semaphore>> Create(s32 initial_count, s32 max_count, 25 static ResultVal<SharedPtr<Semaphore>> Create(s32 initial_count, s32 max_count, VAddr address,
26 std::string name = "Unknown"); 26 std::string name = "Unknown");
27 27
28 std::string GetTypeName() const override { 28 std::string GetTypeName() const override {
@@ -39,6 +39,7 @@ public:
39 39
40 s32 max_count; ///< Maximum number of simultaneous holders the semaphore can have 40 s32 max_count; ///< Maximum number of simultaneous holders the semaphore can have
41 s32 available_count; ///< Number of free slots left in the semaphore 41 s32 available_count; ///< Number of free slots left in the semaphore
42 VAddr address;
42 std::string name; ///< Name of semaphore (optional) 43 std::string name; ///< Name of semaphore (optional)
43 44
44 bool ShouldWait(Thread* thread) const override; 45 bool ShouldWait(Thread* thread) const override;
diff --git a/src/core/hle/kernel/shared_memory.cpp b/src/core/hle/kernel/shared_memory.cpp
index a7b66142f..d45daca35 100644
--- a/src/core/hle/kernel/shared_memory.cpp
+++ b/src/core/hle/kernel/shared_memory.cpp
@@ -42,7 +42,8 @@ SharedPtr<SharedMemory> SharedMemory::Create(SharedPtr<Process> owner_process, u
42 memory_region->used += size; 42 memory_region->used += size;
43 43
44 shared_memory->linear_heap_phys_address = 44 shared_memory->linear_heap_phys_address =
45 Memory::FCRAM_PADDR + memory_region->base + shared_memory->backing_block_offset; 45 Memory::FCRAM_PADDR + memory_region->base +
46 static_cast<PAddr>(shared_memory->backing_block_offset);
46 47
47 // Increase the amount of used linear heap memory for the owner process. 48 // Increase the amount of used linear heap memory for the owner process.
48 if (shared_memory->owner_process != nullptr) { 49 if (shared_memory->owner_process != nullptr) {
@@ -54,22 +55,19 @@ SharedPtr<SharedMemory> SharedMemory::Create(SharedPtr<Process> owner_process, u
54 Kernel::g_current_process->vm_manager.RefreshMemoryBlockMappings(linheap_memory.get()); 55 Kernel::g_current_process->vm_manager.RefreshMemoryBlockMappings(linheap_memory.get());
55 } 56 }
56 } else { 57 } else {
57 // TODO(Subv): What happens if an application tries to create multiple memory blocks
58 // pointing to the same address?
59 auto& vm_manager = shared_memory->owner_process->vm_manager; 58 auto& vm_manager = shared_memory->owner_process->vm_manager;
60 // The memory is already available and mapped in the owner process. 59 // The memory is already available and mapped in the owner process.
61 auto vma = vm_manager.FindVMA(address)->second; 60 auto vma = vm_manager.FindVMA(address);
62 // Copy it over to our own storage 61 ASSERT_MSG(vma != vm_manager.vma_map.end(), "Invalid memory address");
63 shared_memory->backing_block = std::make_shared<std::vector<u8>>( 62 ASSERT_MSG(vma->second.backing_block, "Backing block doesn't exist for address");
64 vma.backing_block->data() + vma.offset, vma.backing_block->data() + vma.offset + size); 63
65 shared_memory->backing_block_offset = 0; 64 // The returned VMA might be a bigger one encompassing the desired address.
66 // Unmap the existing pages 65 auto vma_offset = address - vma->first;
67 vm_manager.UnmapRange(address, size); 66 ASSERT_MSG(vma_offset + size <= vma->second.size,
68 // Map our own block into the address space 67 "Shared memory exceeds bounds of mapped block");
69 vm_manager.MapMemoryBlock(address, shared_memory->backing_block, 0, size, 68
70 MemoryState::Shared); 69 shared_memory->backing_block = vma->second.backing_block;
71 // Reprotect the block with the new permissions 70 shared_memory->backing_block_offset = vma->second.offset + vma_offset;
72 vm_manager.ReprotectRange(address, size, ConvertPermissions(permissions));
73 } 71 }
74 72
75 shared_memory->base_address = address; 73 shared_memory->base_address = address;
@@ -183,4 +181,4 @@ u8* SharedMemory::GetPointer(u32 offset) {
183 return backing_block->data() + backing_block_offset + offset; 181 return backing_block->data() + backing_block_offset + offset;
184} 182}
185 183
186} // namespace 184} // namespace Kernel
diff --git a/src/core/hle/kernel/shared_memory.h b/src/core/hle/kernel/shared_memory.h
index 94b335ed1..93a6f2182 100644
--- a/src/core/hle/kernel/shared_memory.h
+++ b/src/core/hle/kernel/shared_memory.h
@@ -114,7 +114,7 @@ public:
114 /// Backing memory for this shared memory block. 114 /// Backing memory for this shared memory block.
115 std::shared_ptr<std::vector<u8>> backing_block; 115 std::shared_ptr<std::vector<u8>> backing_block;
116 /// Offset into the backing block for this shared memory. 116 /// Offset into the backing block for this shared memory.
117 u32 backing_block_offset; 117 size_t backing_block_offset;
118 /// Size of the memory block. Page-aligned. 118 /// Size of the memory block. Page-aligned.
119 u32 size; 119 u32 size;
120 /// Permission restrictions applied to the process which created the block. 120 /// Permission restrictions applied to the process which created the block.
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index c01d08ebb..75df49ac2 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -111,7 +111,7 @@ void Thread::Stop() {
111 111
112Thread* ArbitrateHighestPriorityThread(u32 address) { 112Thread* ArbitrateHighestPriorityThread(u32 address) {
113 Thread* highest_priority_thread = nullptr; 113 Thread* highest_priority_thread = nullptr;
114 s32 priority = THREADPRIO_LOWEST; 114 u32 priority = THREADPRIO_LOWEST;
115 115
116 // Iterate through threads, find highest priority thread that is waiting to be arbitrated... 116 // Iterate through threads, find highest priority thread that is waiting to be arbitrated...
117 for (auto& thread : thread_list) { 117 for (auto& thread : thread_list) {
@@ -171,15 +171,24 @@ static void SwitchContext(Thread* new_thread) {
171 // Cancel any outstanding wakeup events for this thread 171 // Cancel any outstanding wakeup events for this thread
172 CoreTiming::UnscheduleEvent(ThreadWakeupEventType, new_thread->callback_handle); 172 CoreTiming::UnscheduleEvent(ThreadWakeupEventType, new_thread->callback_handle);
173 173
174 auto previous_process = Kernel::g_current_process;
175
174 current_thread = new_thread; 176 current_thread = new_thread;
175 177
176 ready_queue.remove(new_thread->current_priority, new_thread); 178 ready_queue.remove(new_thread->current_priority, new_thread);
177 new_thread->status = THREADSTATUS_RUNNING; 179 new_thread->status = THREADSTATUS_RUNNING;
178 180
181 if (previous_process != current_thread->owner_process) {
182 Kernel::g_current_process = current_thread->owner_process;
183 SetCurrentPageTable(&Kernel::g_current_process->vm_manager.page_table);
184 }
185
179 Core::CPU().LoadContext(new_thread->context); 186 Core::CPU().LoadContext(new_thread->context);
180 Core::CPU().SetCP15Register(CP15_THREAD_URO, new_thread->GetTLSAddress()); 187 Core::CPU().SetCP15Register(CP15_THREAD_URO, new_thread->GetTLSAddress());
181 } else { 188 } else {
182 current_thread = nullptr; 189 current_thread = nullptr;
190 // Note: We do not reset the current process and current page table when idling because
191 // technically we haven't changed processes, our threads are just paused.
183 } 192 }
184} 193}
185 194
@@ -238,12 +247,15 @@ static void ThreadWakeupCallback(u64 thread_handle, int cycles_late) {
238 247
239 if (thread->status == THREADSTATUS_WAIT_SYNCH_ANY || 248 if (thread->status == THREADSTATUS_WAIT_SYNCH_ANY ||
240 thread->status == THREADSTATUS_WAIT_SYNCH_ALL || thread->status == THREADSTATUS_WAIT_ARB) { 249 thread->status == THREADSTATUS_WAIT_SYNCH_ALL || thread->status == THREADSTATUS_WAIT_ARB) {
241 thread->wait_set_output = false; 250
251 // Invoke the wakeup callback before clearing the wait objects
252 if (thread->wakeup_callback)
253 thread->wakeup_callback(ThreadWakeupReason::Timeout, thread, nullptr);
254
242 // Remove the thread from each of its waiting objects' waitlists 255 // Remove the thread from each of its waiting objects' waitlists
243 for (auto& object : thread->wait_objects) 256 for (auto& object : thread->wait_objects)
244 object->RemoveWaitingThread(thread.get()); 257 object->RemoveWaitingThread(thread.get());
245 thread->wait_objects.clear(); 258 thread->wait_objects.clear();
246 thread->SetWaitSynchronizationResult(RESULT_TIMEOUT);
247 } 259 }
248 260
249 thread->ResumeFromWait(); 261 thread->ResumeFromWait();
@@ -269,6 +281,9 @@ void Thread::ResumeFromWait() {
269 break; 281 break;
270 282
271 case THREADSTATUS_READY: 283 case THREADSTATUS_READY:
284 // The thread's wakeup callback must have already been cleared when the thread was first
285 // awoken.
286 ASSERT(wakeup_callback == nullptr);
272 // If the thread is waiting on multiple wait objects, it might be awoken more than once 287 // If the thread is waiting on multiple wait objects, it might be awoken more than once
273 // before actually resuming. We can ignore subsequent wakeups if the thread status has 288 // before actually resuming. We can ignore subsequent wakeups if the thread status has
274 // already been set to THREADSTATUS_READY. 289 // already been set to THREADSTATUS_READY.
@@ -284,6 +299,8 @@ void Thread::ResumeFromWait() {
284 return; 299 return;
285 } 300 }
286 301
302 wakeup_callback = nullptr;
303
287 ready_queue.push_back(current_priority, this); 304 ready_queue.push_back(current_priority, this);
288 status = THREADSTATUS_READY; 305 status = THREADSTATUS_READY;
289 Core::System::GetInstance().PrepareReschedule(); 306 Core::System::GetInstance().PrepareReschedule();
@@ -302,7 +319,7 @@ static void DebugThreadQueue() {
302 } 319 }
303 320
304 for (auto& t : thread_list) { 321 for (auto& t : thread_list) {
305 s32 priority = ready_queue.contains(t.get()); 322 u32 priority = ready_queue.contains(t.get());
306 if (priority != -1) { 323 if (priority != -1) {
307 LOG_DEBUG(Kernel, "0x%02X %u", priority, t->GetObjectId()); 324 LOG_DEBUG(Kernel, "0x%02X %u", priority, t->GetObjectId());
308 } 325 }
@@ -352,7 +369,8 @@ static void ResetThreadContext(ARM_Interface::ThreadContext& context, VAddr stac
352} 369}
353 370
354ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, u32 priority, 371ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, u32 priority,
355 u32 arg, s32 processor_id, VAddr stack_top) { 372 u32 arg, s32 processor_id, VAddr stack_top,
373 SharedPtr<Process> owner_process) {
356 // Check if priority is in ranged. Lowest priority -> highest priority id. 374 // Check if priority is in ranged. Lowest priority -> highest priority id.
357 if (priority > THREADPRIO_LOWEST) { 375 if (priority > THREADPRIO_LOWEST) {
358 LOG_ERROR(Kernel_SVC, "Invalid thread priority: %d", priority); 376 LOG_ERROR(Kernel_SVC, "Invalid thread priority: %d", priority);
@@ -366,7 +384,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
366 384
367 // TODO(yuriks): Other checks, returning 0xD9001BEA 385 // TODO(yuriks): Other checks, returning 0xD9001BEA
368 386
369 if (!Memory::IsValidVirtualAddress(entry_point)) { 387 if (!Memory::IsValidVirtualAddress(*owner_process, entry_point)) {
370 LOG_ERROR(Kernel_SVC, "(name=%s): invalid entry %08x", name.c_str(), entry_point); 388 LOG_ERROR(Kernel_SVC, "(name=%s): invalid entry %08x", name.c_str(), entry_point);
371 // TODO: Verify error 389 // TODO: Verify error
372 return ResultCode(ErrorDescription::InvalidAddress, ErrorModule::Kernel, 390 return ResultCode(ErrorDescription::InvalidAddress, ErrorModule::Kernel,
@@ -385,15 +403,14 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
385 thread->nominal_priority = thread->current_priority = priority; 403 thread->nominal_priority = thread->current_priority = priority;
386 thread->last_running_ticks = CoreTiming::GetTicks(); 404 thread->last_running_ticks = CoreTiming::GetTicks();
387 thread->processor_id = processor_id; 405 thread->processor_id = processor_id;
388 thread->wait_set_output = false;
389 thread->wait_objects.clear(); 406 thread->wait_objects.clear();
390 thread->wait_address = 0; 407 thread->wait_address = 0;
391 thread->name = std::move(name); 408 thread->name = std::move(name);
392 thread->callback_handle = wakeup_callback_handle_table.Create(thread).Unwrap(); 409 thread->callback_handle = wakeup_callback_handle_table.Create(thread).Unwrap();
393 thread->owner_process = g_current_process; 410 thread->owner_process = owner_process;
394 411
395 // Find the next available TLS index, and mark it as used 412 // Find the next available TLS index, and mark it as used
396 auto& tls_slots = Kernel::g_current_process->tls_slots; 413 auto& tls_slots = owner_process->tls_slots;
397 bool needs_allocation = true; 414 bool needs_allocation = true;
398 u32 available_page; // Which allocated page has free space 415 u32 available_page; // Which allocated page has free space
399 u32 available_slot; // Which slot within the page is free 416 u32 available_slot; // Which slot within the page is free
@@ -412,18 +429,18 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
412 return ERR_OUT_OF_MEMORY; 429 return ERR_OUT_OF_MEMORY;
413 } 430 }
414 431
415 u32 offset = linheap_memory->size(); 432 size_t offset = linheap_memory->size();
416 433
417 // Allocate some memory from the end of the linear heap for this region. 434 // Allocate some memory from the end of the linear heap for this region.
418 linheap_memory->insert(linheap_memory->end(), Memory::PAGE_SIZE, 0); 435 linheap_memory->insert(linheap_memory->end(), Memory::PAGE_SIZE, 0);
419 memory_region->used += Memory::PAGE_SIZE; 436 memory_region->used += Memory::PAGE_SIZE;
420 Kernel::g_current_process->linear_heap_used += Memory::PAGE_SIZE; 437 owner_process->linear_heap_used += Memory::PAGE_SIZE;
421 438
422 tls_slots.emplace_back(0); // The page is completely available at the start 439 tls_slots.emplace_back(0); // The page is completely available at the start
423 available_page = tls_slots.size() - 1; 440 available_page = static_cast<u32>(tls_slots.size() - 1);
424 available_slot = 0; // Use the first slot in the new page 441 available_slot = 0; // Use the first slot in the new page
425 442
426 auto& vm_manager = Kernel::g_current_process->vm_manager; 443 auto& vm_manager = owner_process->vm_manager;
427 vm_manager.RefreshMemoryBlockMappings(linheap_memory.get()); 444 vm_manager.RefreshMemoryBlockMappings(linheap_memory.get());
428 445
429 // Map the page to the current process' address space. 446 // Map the page to the current process' address space.
@@ -447,7 +464,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
447 return MakeResult<SharedPtr<Thread>>(std::move(thread)); 464 return MakeResult<SharedPtr<Thread>>(std::move(thread));
448} 465}
449 466
450void Thread::SetPriority(s32 priority) { 467void Thread::SetPriority(u32 priority) {
451 ASSERT_MSG(priority <= THREADPRIO_LOWEST && priority >= THREADPRIO_HIGHEST, 468 ASSERT_MSG(priority <= THREADPRIO_LOWEST && priority >= THREADPRIO_HIGHEST,
452 "Invalid priority value."); 469 "Invalid priority value.");
453 // If thread was ready, adjust queues 470 // If thread was ready, adjust queues
@@ -460,7 +477,7 @@ void Thread::SetPriority(s32 priority) {
460} 477}
461 478
462void Thread::UpdatePriority() { 479void Thread::UpdatePriority() {
463 s32 best_priority = nominal_priority; 480 u32 best_priority = nominal_priority;
464 for (auto& mutex : held_mutexes) { 481 for (auto& mutex : held_mutexes) {
465 if (mutex->priority < best_priority) 482 if (mutex->priority < best_priority)
466 best_priority = mutex->priority; 483 best_priority = mutex->priority;
@@ -468,7 +485,7 @@ void Thread::UpdatePriority() {
468 BoostPriority(best_priority); 485 BoostPriority(best_priority);
469} 486}
470 487
471void Thread::BoostPriority(s32 priority) { 488void Thread::BoostPriority(u32 priority) {
472 // If thread was ready, adjust queues 489 // If thread was ready, adjust queues
473 if (status == THREADSTATUS_READY) 490 if (status == THREADSTATUS_READY)
474 ready_queue.move(this, current_priority, priority); 491 ready_queue.move(this, current_priority, priority);
@@ -477,21 +494,20 @@ void Thread::BoostPriority(s32 priority) {
477 current_priority = priority; 494 current_priority = priority;
478} 495}
479 496
480SharedPtr<Thread> SetupMainThread(VAddr entry_point, s32 priority) { 497SharedPtr<Thread> SetupMainThread(u32 entry_point, u32 priority, SharedPtr<Process> owner_process) {
481 DEBUG_ASSERT(!GetCurrentThread()); 498 // Setup page table so we can write to memory
499 SetCurrentPageTable(&Kernel::g_current_process->vm_manager.page_table);
482 500
483 // Initialize new "main" thread 501 // Initialize new "main" thread
484 auto thread_res = Thread::Create("main", entry_point, priority, 0, THREADPROCESSORID_0, 502 auto thread_res = Thread::Create("main", entry_point, priority, 0, THREADPROCESSORID_0,
485 Memory::HEAP_VADDR_END); 503 Memory::HEAP_VADDR_END, owner_process);
486 504
487 SharedPtr<Thread> thread = std::move(thread_res).Unwrap(); 505 SharedPtr<Thread> thread = std::move(thread_res).Unwrap();
488 506
489 thread->context.fpscr = 507 thread->context.fpscr =
490 FPSCR_DEFAULT_NAN | FPSCR_FLUSH_TO_ZERO | FPSCR_ROUND_TOZERO | FPSCR_IXC; // 0x03C00010 508 FPSCR_DEFAULT_NAN | FPSCR_FLUSH_TO_ZERO | FPSCR_ROUND_TOZERO | FPSCR_IXC; // 0x03C00010
491 509
492 // Run new "main" thread 510 // Note: The newly created thread will be run when the scheduler fires.
493 SwitchContext(thread.get());
494
495 return thread; 511 return thread;
496} 512}
497 513
@@ -525,7 +541,13 @@ void Thread::SetWaitSynchronizationOutput(s32 output) {
525s32 Thread::GetWaitObjectIndex(WaitObject* object) const { 541s32 Thread::GetWaitObjectIndex(WaitObject* object) const {
526 ASSERT_MSG(!wait_objects.empty(), "Thread is not waiting for anything"); 542 ASSERT_MSG(!wait_objects.empty(), "Thread is not waiting for anything");
527 auto match = std::find(wait_objects.rbegin(), wait_objects.rend(), object); 543 auto match = std::find(wait_objects.rbegin(), wait_objects.rend(), object);
528 return std::distance(match, wait_objects.rend()) - 1; 544 return static_cast<s32>(std::distance(match, wait_objects.rend()) - 1);
545}
546
547VAddr Thread::GetCommandBufferAddress() const {
548 // Offset from the start of TLS at which the IPC command buffer begins.
549 static constexpr int CommandHeaderOffset = 0x80;
550 return GetTLSAddress() + CommandHeaderOffset;
529} 551}
530 552
531//////////////////////////////////////////////////////////////////////////////////////////////////// 553////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h
index 2cadb91db..fafcab156 100644
--- a/src/core/hle/kernel/thread.h
+++ b/src/core/hle/kernel/thread.h
@@ -15,7 +15,7 @@
15#include "core/hle/kernel/wait_object.h" 15#include "core/hle/kernel/wait_object.h"
16#include "core/hle/result.h" 16#include "core/hle/result.h"
17 17
18enum ThreadPriority : s32 { 18enum ThreadPriority : u32 {
19 THREADPRIO_HIGHEST = 0, ///< Highest thread priority 19 THREADPRIO_HIGHEST = 0, ///< Highest thread priority
20 THREADPRIO_USERLAND_MAX = 24, ///< Highest thread priority for userland apps 20 THREADPRIO_USERLAND_MAX = 24, ///< Highest thread priority for userland apps
21 THREADPRIO_DEFAULT = 48, ///< Default thread priority for userland apps 21 THREADPRIO_DEFAULT = 48, ///< Default thread priority for userland apps
@@ -41,6 +41,11 @@ enum ThreadStatus {
41 THREADSTATUS_DEAD ///< Run to completion, or forcefully terminated 41 THREADSTATUS_DEAD ///< Run to completion, or forcefully terminated
42}; 42};
43 43
44enum class ThreadWakeupReason {
45 Signal, // The thread was woken up by WakeupAllWaitingThreads due to an object signal.
46 Timeout // The thread was woken up due to a wait timeout.
47};
48
44namespace Kernel { 49namespace Kernel {
45 50
46class Mutex; 51class Mutex;
@@ -56,10 +61,12 @@ public:
56 * @param arg User data to pass to the thread 61 * @param arg User data to pass to the thread
57 * @param processor_id The ID(s) of the processors on which the thread is desired to be run 62 * @param processor_id The ID(s) of the processors on which the thread is desired to be run
58 * @param stack_top The address of the thread's stack top 63 * @param stack_top The address of the thread's stack top
64 * @param owner_process The parent process for the thread
59 * @return A shared pointer to the newly created thread 65 * @return A shared pointer to the newly created thread
60 */ 66 */
61 static ResultVal<SharedPtr<Thread>> Create(std::string name, VAddr entry_point, u32 priority, 67 static ResultVal<SharedPtr<Thread>> Create(std::string name, VAddr entry_point, u32 priority,
62 u32 arg, s32 processor_id, VAddr stack_top); 68 u32 arg, s32 processor_id, VAddr stack_top,
69 SharedPtr<Process> owner_process);
63 70
64 std::string GetName() const override { 71 std::string GetName() const override {
65 return name; 72 return name;
@@ -80,7 +87,7 @@ public:
80 * Gets the thread's current priority 87 * Gets the thread's current priority
81 * @return The current thread's priority 88 * @return The current thread's priority
82 */ 89 */
83 s32 GetPriority() const { 90 u32 GetPriority() const {
84 return current_priority; 91 return current_priority;
85 } 92 }
86 93
@@ -88,7 +95,7 @@ public:
88 * Sets the thread's current priority 95 * Sets the thread's current priority
89 * @param priority The new priority 96 * @param priority The new priority
90 */ 97 */
91 void SetPriority(s32 priority); 98 void SetPriority(u32 priority);
92 99
93 /** 100 /**
94 * Boost's a thread's priority to the best priority among the thread's held mutexes. 101 * Boost's a thread's priority to the best priority among the thread's held mutexes.
@@ -100,7 +107,7 @@ public:
100 * Temporarily boosts the thread's priority until the next time it is scheduled 107 * Temporarily boosts the thread's priority until the next time it is scheduled
101 * @param priority The new priority 108 * @param priority The new priority
102 */ 109 */
103 void BoostPriority(s32 priority); 110 void BoostPriority(u32 priority);
104 111
105 /** 112 /**
106 * Gets the thread's thread ID 113 * Gets the thread's thread ID
@@ -116,9 +123,9 @@ public:
116 void ResumeFromWait(); 123 void ResumeFromWait();
117 124
118 /** 125 /**
119 * Schedules an event to wake up the specified thread after the specified delay 126 * Schedules an event to wake up the specified thread after the specified delay
120 * @param nanoseconds The time this thread will be allowed to sleep for 127 * @param nanoseconds The time this thread will be allowed to sleep for
121 */ 128 */
122 void WakeAfterDelay(s64 nanoseconds); 129 void WakeAfterDelay(s64 nanoseconds);
123 130
124 /** 131 /**
@@ -157,6 +164,12 @@ public:
157 return tls_address; 164 return tls_address;
158 } 165 }
159 166
167 /*
168 * Returns the address of the current thread's command buffer, located in the TLS.
169 * @returns VAddr of the thread's command buffer.
170 */
171 VAddr GetCommandBufferAddress() const;
172
160 /** 173 /**
161 * Returns whether this thread is waiting for all the objects in 174 * Returns whether this thread is waiting for all the objects in
162 * its wait list to become ready, as a result of a WaitSynchronizationN call 175 * its wait list to become ready, as a result of a WaitSynchronizationN call
@@ -174,8 +187,8 @@ public:
174 VAddr entry_point; 187 VAddr entry_point;
175 VAddr stack_top; 188 VAddr stack_top;
176 189
177 s32 nominal_priority; ///< Nominal thread priority, as set by the emulated application 190 u32 nominal_priority; ///< Nominal thread priority, as set by the emulated application
178 s32 current_priority; ///< Current thread priority, can be temporarily changed 191 u32 current_priority; ///< Current thread priority, can be temporarily changed
179 192
180 u64 last_running_ticks; ///< CPU tick when thread was last running 193 u64 last_running_ticks; ///< CPU tick when thread was last running
181 194
@@ -197,14 +210,18 @@ public:
197 210
198 VAddr wait_address; ///< If waiting on an AddressArbiter, this is the arbitration address 211 VAddr wait_address; ///< If waiting on an AddressArbiter, this is the arbitration address
199 212
200 /// True if the WaitSynchronizationN output parameter should be set on thread wakeup.
201 bool wait_set_output;
202
203 std::string name; 213 std::string name;
204 214
205 /// Handle used as userdata to reference this object when inserting into the CoreTiming queue. 215 /// Handle used as userdata to reference this object when inserting into the CoreTiming queue.
206 Handle callback_handle; 216 Handle callback_handle;
207 217
218 using WakeupCallback = void(ThreadWakeupReason reason, SharedPtr<Thread> thread,
219 SharedPtr<WaitObject> object);
220 // Callback that will be invoked when the thread is resumed from a waiting state. If the thread
221 // was waiting via WaitSynchronizationN then the object will be the last object that became
222 // available. In case of a timeout, the object will be nullptr.
223 std::function<WakeupCallback> wakeup_callback;
224
208private: 225private:
209 Thread(); 226 Thread();
210 ~Thread() override; 227 ~Thread() override;
@@ -214,9 +231,10 @@ private:
214 * Sets up the primary application thread 231 * Sets up the primary application thread
215 * @param entry_point The address at which the thread should start execution 232 * @param entry_point The address at which the thread should start execution
216 * @param priority The priority to give the main thread 233 * @param priority The priority to give the main thread
234 * @param owner_process The parent process for the main thread
217 * @return A shared pointer to the main thread 235 * @return A shared pointer to the main thread
218 */ 236 */
219SharedPtr<Thread> SetupMainThread(VAddr entry_point, s32 priority); 237SharedPtr<Thread> SetupMainThread(u32 entry_point, u32 priority, SharedPtr<Process> owner_process);
220 238
221/** 239/**
222 * Returns whether there are any threads that are ready to run. 240 * Returns whether there are any threads that are ready to run.
@@ -276,4 +294,4 @@ void ThreadingShutdown();
276 */ 294 */
277const std::vector<SharedPtr<Thread>>& GetThreadList(); 295const std::vector<SharedPtr<Thread>>& GetThreadList();
278 296
279} // namespace 297} // namespace Kernel
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp
index f70c32501..9762ef535 100644
--- a/src/core/hle/kernel/vm_manager.cpp
+++ b/src/core/hle/kernel/vm_manager.cpp
@@ -4,8 +4,10 @@
4 4
5#include <iterator> 5#include <iterator>
6#include "common/assert.h" 6#include "common/assert.h"
7#include "core/arm/arm_interface.h"
7#include "core/hle/kernel/errors.h" 8#include "core/hle/kernel/errors.h"
8#include "core/hle/kernel/vm_manager.h" 9#include "core/hle/kernel/vm_manager.h"
10#include "core/core.h"
9#include "core/memory.h" 11#include "core/memory.h"
10#include "core/memory_setup.h" 12#include "core/memory_setup.h"
11#include "core/mmio.h" 13#include "core/mmio.h"
@@ -56,6 +58,10 @@ void VMManager::Reset() {
56 initial_vma.size = MAX_ADDRESS; 58 initial_vma.size = MAX_ADDRESS;
57 vma_map.emplace(initial_vma.base, initial_vma); 59 vma_map.emplace(initial_vma.base, initial_vma);
58 60
61 page_table.pointers.fill(nullptr);
62 page_table.attributes.fill(Memory::PageType::Unmapped);
63 page_table.cached_res_count.fill(0);
64
59 //UpdatePageTableForVMA(initial_vma); 65 //UpdatePageTableForVMA(initial_vma);
60} 66}
61 67
@@ -79,6 +85,8 @@ ResultVal<VMManager::VMAHandle> VMManager::MapMemoryBlock(VAddr target,
79 VirtualMemoryArea& final_vma = vma_handle->second; 85 VirtualMemoryArea& final_vma = vma_handle->second;
80 ASSERT(final_vma.size == size); 86 ASSERT(final_vma.size == size);
81 87
88 Core::CPU().MapBackingMemory(target, size, block->data() + offset, VMAPermission::ReadWriteExecute);
89
82 final_vma.type = VMAType::AllocatedMemoryBlock; 90 final_vma.type = VMAType::AllocatedMemoryBlock;
83 final_vma.permissions = VMAPermission::ReadWrite; 91 final_vma.permissions = VMAPermission::ReadWrite;
84 final_vma.meminfo_state = state; 92 final_vma.meminfo_state = state;
@@ -98,6 +106,8 @@ ResultVal<VMManager::VMAHandle> VMManager::MapBackingMemory(VAddr target, u8* me
98 VirtualMemoryArea& final_vma = vma_handle->second; 106 VirtualMemoryArea& final_vma = vma_handle->second;
99 ASSERT(final_vma.size == size); 107 ASSERT(final_vma.size == size);
100 108
109 Core::CPU().MapBackingMemory(target, size, memory, VMAPermission::ReadWriteExecute);
110
101 final_vma.type = VMAType::BackingMemory; 111 final_vma.type = VMAType::BackingMemory;
102 final_vma.permissions = VMAPermission::ReadWrite; 112 final_vma.permissions = VMAPermission::ReadWrite;
103 final_vma.meminfo_state = state; 113 final_vma.meminfo_state = state;
@@ -328,16 +338,17 @@ VMManager::VMAIter VMManager::MergeAdjacent(VMAIter iter) {
328void VMManager::UpdatePageTableForVMA(const VirtualMemoryArea& vma) { 338void VMManager::UpdatePageTableForVMA(const VirtualMemoryArea& vma) {
329 switch (vma.type) { 339 switch (vma.type) {
330 case VMAType::Free: 340 case VMAType::Free:
331 Memory::UnmapRegion(vma.base, vma.size); 341 Memory::UnmapRegion(page_table, vma.base, vma.size);
332 break; 342 break;
333 case VMAType::AllocatedMemoryBlock: 343 case VMAType::AllocatedMemoryBlock:
334 Memory::MapMemoryRegion(vma.base, vma.size, vma.backing_block->data() + vma.offset); 344 Memory::MapMemoryRegion(page_table, vma.base, vma.size,
345 vma.backing_block->data() + vma.offset);
335 break; 346 break;
336 case VMAType::BackingMemory: 347 case VMAType::BackingMemory:
337 Memory::MapMemoryRegion(vma.base, vma.size, vma.backing_memory); 348 Memory::MapMemoryRegion(page_table, vma.base, vma.size, vma.backing_memory);
338 break; 349 break;
339 case VMAType::MMIO: 350 case VMAType::MMIO:
340 Memory::MapIoRegion(vma.base, vma.size, vma.mmio_handler); 351 Memory::MapIoRegion(page_table, vma.base, vma.size, vma.mmio_handler);
341 break; 352 break;
342 } 353 }
343} 354}
diff --git a/src/core/hle/kernel/vm_manager.h b/src/core/hle/kernel/vm_manager.h
index aa2265ce6..cb5bb8243 100644
--- a/src/core/hle/kernel/vm_manager.h
+++ b/src/core/hle/kernel/vm_manager.h
@@ -9,6 +9,7 @@
9#include <vector> 9#include <vector>
10#include "common/common_types.h" 10#include "common/common_types.h"
11#include "core/hle/result.h" 11#include "core/hle/result.h"
12#include "core/memory.h"
12#include "core/mmio.h" 13#include "core/mmio.h"
13 14
14namespace Kernel { 15namespace Kernel {
@@ -102,7 +103,6 @@ struct VirtualMemoryArea {
102 * - http://duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files/ 103 * - http://duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files/
103 */ 104 */
104class VMManager final { 105class VMManager final {
105 // TODO(yuriks): Make page tables switchable to support multiple VMManagers
106public: 106public:
107 /** 107 /**
108 * The maximum amount of address space managed by the kernel. Addresses above this are never 108 * The maximum amount of address space managed by the kernel. Addresses above this are never
@@ -184,6 +184,10 @@ public:
184 /// Dumps the address space layout to the log, for debugging 184 /// Dumps the address space layout to the log, for debugging
185 void LogLayout(Log::Level log_level) const; 185 void LogLayout(Log::Level log_level) const;
186 186
187 /// Each VMManager has its own page table, which is set as the main one when the owning process
188 /// is scheduled.
189 Memory::PageTable page_table;
190
187private: 191private:
188 using VMAIter = decltype(vma_map)::iterator; 192 using VMAIter = decltype(vma_map)::iterator;
189 193
diff --git a/src/core/hle/kernel/wait_object.cpp b/src/core/hle/kernel/wait_object.cpp
index f245eda6c..469554908 100644
--- a/src/core/hle/kernel/wait_object.cpp
+++ b/src/core/hle/kernel/wait_object.cpp
@@ -34,7 +34,7 @@ void WaitObject::RemoveWaitingThread(Thread* thread) {
34 34
35SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() { 35SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() {
36 Thread* candidate = nullptr; 36 Thread* candidate = nullptr;
37 s32 candidate_priority = THREADPRIO_LOWEST + 1; 37 u32 candidate_priority = THREADPRIO_LOWEST + 1;
38 38
39 for (const auto& thread : waiting_threads) { 39 for (const auto& thread : waiting_threads) {
40 // The list of waiting threads must not contain threads that are not waiting to be awakened. 40 // The list of waiting threads must not contain threads that are not waiting to be awakened.
@@ -71,23 +71,20 @@ void WaitObject::WakeupAllWaitingThreads() {
71 while (auto thread = GetHighestPriorityReadyThread()) { 71 while (auto thread = GetHighestPriorityReadyThread()) {
72 if (!thread->IsSleepingOnWaitAll()) { 72 if (!thread->IsSleepingOnWaitAll()) {
73 Acquire(thread.get()); 73 Acquire(thread.get());
74 // Set the output index of the WaitSynchronizationN call to the index of this object.
75 if (thread->wait_set_output) {
76 thread->SetWaitSynchronizationOutput(thread->GetWaitObjectIndex(this));
77 thread->wait_set_output = false;
78 }
79 } else { 74 } else {
80 for (auto& object : thread->wait_objects) { 75 for (auto& object : thread->wait_objects) {
81 object->Acquire(thread.get()); 76 object->Acquire(thread.get());
82 } 77 }
83 // Note: This case doesn't update the output index of WaitSynchronizationN.
84 } 78 }
85 79
80 // Invoke the wakeup callback before clearing the wait objects
81 if (thread->wakeup_callback)
82 thread->wakeup_callback(ThreadWakeupReason::Signal, thread, this);
83
86 for (auto& object : thread->wait_objects) 84 for (auto& object : thread->wait_objects)
87 object->RemoveWaitingThread(thread.get()); 85 object->RemoveWaitingThread(thread.get());
88 thread->wait_objects.clear(); 86 thread->wait_objects.clear();
89 87
90 thread->SetWaitSynchronizationResult(RESULT_SUCCESS);
91 thread->ResumeFromWait(); 88 thread->ResumeFromWait();
92 } 89 }
93} 90}
diff --git a/src/core/hle/lock.cpp b/src/core/hle/lock.cpp
new file mode 100644
index 000000000..1c24c7ce9
--- /dev/null
+++ b/src/core/hle/lock.cpp
@@ -0,0 +1,11 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <core/hle/lock.h>
8
9namespace HLE {
10std::recursive_mutex g_hle_lock;
11}
diff --git a/src/core/hle/lock.h b/src/core/hle/lock.h
new file mode 100644
index 000000000..5c99fe996
--- /dev/null
+++ b/src/core/hle/lock.h
@@ -0,0 +1,18 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <mutex>
8
9namespace HLE {
10/*
11 * Synchronizes access to the internal HLE kernel structures, it is acquired when a guest
12 * application thread performs a syscall. It should be acquired by any host threads that read or
13 * modify the HLE kernel state. Note: Any operation that directly or indirectly reads from or writes
14 * to the emulated memory is not protected by this mutex, and should be avoided in any threads other
15 * than the CPU thread.
16 */
17extern std::recursive_mutex g_hle_lock;
18} // namespace HLE
diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp
index 5c44b43bb..912ab550d 100644
--- a/src/core/hle/service/apt/apt.cpp
+++ b/src/core/hle/service/apt/apt.cpp
@@ -2,6 +2,7 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <boost/optional.hpp>
5#include "common/common_paths.h" 6#include "common/common_paths.h"
6#include "common/file_util.h" 7#include "common/file_util.h"
7#include "common/logging/log.h" 8#include "common/logging/log.h"
@@ -18,6 +19,7 @@
18#include "core/hle/service/apt/apt_s.h" 19#include "core/hle/service/apt/apt_s.h"
19#include "core/hle/service/apt/apt_u.h" 20#include "core/hle/service/apt/apt_u.h"
20#include "core/hle/service/apt/bcfnt/bcfnt.h" 21#include "core/hle/service/apt/bcfnt/bcfnt.h"
22#include "core/hle/service/cfg/cfg.h"
21#include "core/hle/service/fs/archive.h" 23#include "core/hle/service/fs/archive.h"
22#include "core/hle/service/ptm/ptm.h" 24#include "core/hle/service/ptm/ptm.h"
23#include "core/hle/service/service.h" 25#include "core/hle/service/service.h"
@@ -33,8 +35,6 @@ static bool shared_font_loaded = false;
33static bool shared_font_relocated = false; 35static bool shared_font_relocated = false;
34 36
35static Kernel::SharedPtr<Kernel::Mutex> lock; 37static Kernel::SharedPtr<Kernel::Mutex> lock;
36static Kernel::SharedPtr<Kernel::Event> notification_event; ///< APT notification event
37static Kernel::SharedPtr<Kernel::Event> parameter_event; ///< APT parameter event
38 38
39static u32 cpu_percent; ///< CPU time available to the running application 39static u32 cpu_percent; ///< CPU time available to the running application
40 40
@@ -43,43 +43,344 @@ static u8 unknown_ns_state_field;
43 43
44static ScreencapPostPermission screen_capture_post_permission; 44static ScreencapPostPermission screen_capture_post_permission;
45 45
46/// Parameter data to be returned in the next call to Glance/ReceiveParameter 46/// Parameter data to be returned in the next call to Glance/ReceiveParameter.
47static MessageParameter next_parameter; 47/// TODO(Subv): Use std::optional once we migrate to C++17.
48static boost::optional<MessageParameter> next_parameter;
49
50enum class AppletPos { Application = 0, Library = 1, System = 2, SysLibrary = 3, Resident = 4 };
51
52static constexpr size_t NumAppletSlot = 4;
53
54enum class AppletSlot : u8 {
55 Application,
56 SystemApplet,
57 HomeMenu,
58 LibraryApplet,
59
60 // An invalid tag
61 Error,
62};
63
64union AppletAttributes {
65 u32 raw;
66
67 BitField<0, 3, u32> applet_pos;
68 BitField<29, 1, u32> is_home_menu;
69
70 AppletAttributes() : raw(0) {}
71 AppletAttributes(u32 attributes) : raw(attributes) {}
72};
73
74struct AppletSlotData {
75 AppletId applet_id;
76 AppletSlot slot;
77 bool registered;
78 AppletAttributes attributes;
79 Kernel::SharedPtr<Kernel::Event> notification_event;
80 Kernel::SharedPtr<Kernel::Event> parameter_event;
81};
82
83// Holds data about the concurrently running applets in the system.
84static std::array<AppletSlotData, NumAppletSlot> applet_slots = {};
85
86// This overload returns nullptr if no applet with the specified id has been started.
87static AppletSlotData* GetAppletSlotData(AppletId id) {
88 auto GetSlot = [](AppletSlot slot) -> AppletSlotData* {
89 return &applet_slots[static_cast<size_t>(slot)];
90 };
91
92 if (id == AppletId::Application) {
93 auto* slot = GetSlot(AppletSlot::Application);
94 if (slot->applet_id != AppletId::None)
95 return slot;
96
97 return nullptr;
98 }
99
100 if (id == AppletId::AnySystemApplet) {
101 auto* system_slot = GetSlot(AppletSlot::SystemApplet);
102 if (system_slot->applet_id != AppletId::None)
103 return system_slot;
104
105 // The Home Menu is also a system applet, but it lives in its own slot to be able to run
106 // concurrently with other system applets.
107 auto* home_slot = GetSlot(AppletSlot::HomeMenu);
108 if (home_slot->applet_id != AppletId::None)
109 return home_slot;
110
111 return nullptr;
112 }
113
114 if (id == AppletId::AnyLibraryApplet || id == AppletId::AnySysLibraryApplet) {
115 auto* slot = GetSlot(AppletSlot::LibraryApplet);
116 if (slot->applet_id == AppletId::None)
117 return nullptr;
118
119 u32 applet_pos = slot->attributes.applet_pos;
120
121 if (id == AppletId::AnyLibraryApplet && applet_pos == static_cast<u32>(AppletPos::Library))
122 return slot;
123
124 if (id == AppletId::AnySysLibraryApplet &&
125 applet_pos == static_cast<u32>(AppletPos::SysLibrary))
126 return slot;
127
128 return nullptr;
129 }
130
131 if (id == AppletId::HomeMenu || id == AppletId::AlternateMenu) {
132 auto* slot = GetSlot(AppletSlot::HomeMenu);
133 if (slot->applet_id != AppletId::None)
134 return slot;
135
136 return nullptr;
137 }
138
139 for (auto& slot : applet_slots) {
140 if (slot.applet_id == id)
141 return &slot;
142 }
143
144 return nullptr;
145}
146
147static AppletSlotData* GetAppletSlotData(AppletAttributes attributes) {
148 // Mapping from AppletPos to AppletSlot
149 static constexpr std::array<AppletSlot, 6> applet_position_slots = {
150 AppletSlot::Application, AppletSlot::LibraryApplet, AppletSlot::SystemApplet,
151 AppletSlot::LibraryApplet, AppletSlot::Error, AppletSlot::LibraryApplet};
152
153 u32 applet_pos = attributes.applet_pos;
154 if (applet_pos >= applet_position_slots.size())
155 return nullptr;
156
157 AppletSlot slot = applet_position_slots[applet_pos];
158
159 if (slot == AppletSlot::Error)
160 return nullptr;
161
162 // The Home Menu is a system applet, however, it has its own applet slot so that it can run
163 // concurrently with other system applets.
164 if (slot == AppletSlot::SystemApplet && attributes.is_home_menu)
165 return &applet_slots[static_cast<size_t>(AppletSlot::HomeMenu)];
166
167 return &applet_slots[static_cast<size_t>(slot)];
168}
48 169
49void SendParameter(const MessageParameter& parameter) { 170void SendParameter(const MessageParameter& parameter) {
50 next_parameter = parameter; 171 next_parameter = parameter;
51 // Signal the event to let the application know that a new parameter is ready to be read 172 // Signal the event to let the receiver know that a new parameter is ready to be read
52 parameter_event->Signal(); 173 auto* const slot_data = GetAppletSlotData(static_cast<AppletId>(parameter.destination_id));
174 if (slot_data == nullptr) {
175 LOG_DEBUG(Service_APT, "No applet was registered with the id %03X",
176 parameter.destination_id);
177 return;
178 }
179
180 slot_data->parameter_event->Signal();
53} 181}
54 182
55void Initialize(Service::Interface* self) { 183void Initialize(Service::Interface* self) {
56 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x2, 2, 0); // 0x20080 184 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x2, 2, 0); // 0x20080
57 u32 app_id = rp.Pop<u32>(); 185 u32 app_id = rp.Pop<u32>();
58 u32 flags = rp.Pop<u32>(); 186 u32 attributes = rp.Pop<u32>();
187
188 LOG_DEBUG(Service_APT, "called app_id=0x%08X, attributes=0x%08X", app_id, attributes);
189
190 auto* const slot_data = GetAppletSlotData(attributes);
191
192 // Note: The real NS service does not check if the attributes value is valid before accessing
193 // the data in the array
194 ASSERT_MSG(slot_data, "Invalid application attributes");
195
196 if (slot_data->registered) {
197 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
198 rb.Push(ResultCode(ErrorDescription::AlreadyExists, ErrorModule::Applet,
199 ErrorSummary::InvalidState, ErrorLevel::Status));
200 return;
201 }
202
203 slot_data->applet_id = static_cast<AppletId>(app_id);
204 slot_data->attributes.raw = attributes;
205
59 IPC::RequestBuilder rb = rp.MakeBuilder(1, 3); 206 IPC::RequestBuilder rb = rp.MakeBuilder(1, 3);
60 rb.Push(RESULT_SUCCESS); 207 rb.Push(RESULT_SUCCESS);
61 rb.PushCopyHandles(Kernel::g_handle_table.Create(notification_event).Unwrap(), 208 rb.PushCopyHandles(Kernel::g_handle_table.Create(slot_data->notification_event).Unwrap(),
62 Kernel::g_handle_table.Create(parameter_event).Unwrap()); 209 Kernel::g_handle_table.Create(slot_data->parameter_event).Unwrap());
210
211 if (slot_data->applet_id == AppletId::Application ||
212 slot_data->applet_id == AppletId::HomeMenu) {
213 // Initialize the APT parameter to wake up the application.
214 next_parameter.emplace();
215 next_parameter->signal = static_cast<u32>(SignalType::Wakeup);
216 next_parameter->sender_id = static_cast<u32>(AppletId::None);
217 next_parameter->destination_id = app_id;
218 // Not signaling the parameter event will cause the application (or Home Menu) to hang
219 // during startup. In the real console, it is usually the Kernel and Home Menu who cause NS
220 // to signal the HomeMenu and Application parameter events, respectively.
221 slot_data->parameter_event->Signal();
222 }
223}
63 224
64 // TODO(bunnei): Check if these events are cleared every time Initialize is called. 225static u32 DecompressLZ11(const u8* in, u8* out) {
65 notification_event->Clear(); 226 u32_le decompressed_size;
66 parameter_event->Clear(); 227 memcpy(&decompressed_size, in, sizeof(u32));
228 in += 4;
229
230 u8 type = decompressed_size & 0xFF;
231 ASSERT(type == 0x11);
232 decompressed_size >>= 8;
67 233
68 ASSERT_MSG((nullptr != lock), "Cannot initialize without lock"); 234 u32 current_out_size = 0;
69 lock->Release(); 235 u8 flags = 0, mask = 1;
236 while (current_out_size < decompressed_size) {
237 if (mask == 1) {
238 flags = *(in++);
239 mask = 0x80;
240 } else {
241 mask >>= 1;
242 }
70 243
71 LOG_DEBUG(Service_APT, "called app_id=0x%08X, flags=0x%08X", app_id, flags); 244 if (flags & mask) {
245 u8 byte1 = *(in++);
246 u32 length = byte1 >> 4;
247 u32 offset;
248 if (length == 0) {
249 u8 byte2 = *(in++);
250 u8 byte3 = *(in++);
251 length = (((byte1 & 0x0F) << 4) | (byte2 >> 4)) + 0x11;
252 offset = (((byte2 & 0x0F) << 8) | byte3) + 0x1;
253 } else if (length == 1) {
254 u8 byte2 = *(in++);
255 u8 byte3 = *(in++);
256 u8 byte4 = *(in++);
257 length = (((byte1 & 0x0F) << 12) | (byte2 << 4) | (byte3 >> 4)) + 0x111;
258 offset = (((byte3 & 0x0F) << 8) | byte4) + 0x1;
259 } else {
260 u8 byte2 = *(in++);
261 length = (byte1 >> 4) + 0x1;
262 offset = (((byte1 & 0x0F) << 8) | byte2) + 0x1;
263 }
264
265 for (u32 i = 0; i < length; i++) {
266 *out = *(out - offset);
267 ++out;
268 }
269
270 current_out_size += length;
271 } else {
272 *(out++) = *(in++);
273 current_out_size++;
274 }
275 }
276 return decompressed_size;
277}
278
279static bool LoadSharedFont() {
280 u8 font_region_code;
281 switch (CFG::GetRegionValue()) {
282 case 4: // CHN
283 font_region_code = 2;
284 break;
285 case 5: // KOR
286 font_region_code = 3;
287 break;
288 case 6: // TWN
289 font_region_code = 4;
290 break;
291 default: // JPN/EUR/USA
292 font_region_code = 1;
293 break;
294 }
295
296 const u64_le shared_font_archive_id_low = 0x0004009b00014002 | ((font_region_code - 1) << 8);
297 const u64_le shared_font_archive_id_high = 0x00000001ffffff00;
298 std::vector<u8> shared_font_archive_id(16);
299 std::memcpy(&shared_font_archive_id[0], &shared_font_archive_id_low, sizeof(u64));
300 std::memcpy(&shared_font_archive_id[8], &shared_font_archive_id_high, sizeof(u64));
301 FileSys::Path archive_path(shared_font_archive_id);
302 auto archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::NCCH, archive_path);
303 if (archive_result.Failed())
304 return false;
305
306 std::vector<u8> romfs_path(20, 0); // 20-byte all zero path for opening RomFS
307 FileSys::Path file_path(romfs_path);
308 FileSys::Mode open_mode = {};
309 open_mode.read_flag.Assign(1);
310 auto file_result = Service::FS::OpenFileFromArchive(*archive_result, file_path, open_mode);
311 if (file_result.Failed())
312 return false;
313
314 auto romfs = std::move(file_result).Unwrap();
315 std::vector<u8> romfs_buffer(romfs->backend->GetSize());
316 romfs->backend->Read(0, romfs_buffer.size(), romfs_buffer.data());
317 romfs->backend->Close();
318
319 const char16_t* file_name[4] = {u"cbf_std.bcfnt.lz", u"cbf_zh-Hans-CN.bcfnt.lz",
320 u"cbf_ko-Hang-KR.bcfnt.lz", u"cbf_zh-Hant-TW.bcfnt.lz"};
321 const u8* font_file =
322 RomFS::GetFilePointer(romfs_buffer.data(), {file_name[font_region_code - 1]});
323 if (font_file == nullptr)
324 return false;
325
326 struct {
327 u32_le status;
328 u32_le region;
329 u32_le decompressed_size;
330 INSERT_PADDING_WORDS(0x1D);
331 } shared_font_header{};
332 static_assert(sizeof(shared_font_header) == 0x80, "shared_font_header has incorrect size");
333
334 shared_font_header.status = 2; // successfully loaded
335 shared_font_header.region = font_region_code;
336 shared_font_header.decompressed_size =
337 DecompressLZ11(font_file, shared_font_mem->GetPointer(0x80));
338 std::memcpy(shared_font_mem->GetPointer(), &shared_font_header, sizeof(shared_font_header));
339 *shared_font_mem->GetPointer(0x83) = 'U'; // Change the magic from "CFNT" to "CFNU"
340
341 return true;
342}
343
344static bool LoadLegacySharedFont() {
345 // This is the legacy method to load shared font.
346 // The expected format is a decrypted, uncompressed BCFNT file with the 0x80 byte header
347 // generated by the APT:U service. The best way to get is by dumping it from RAM. We've provided
348 // a homebrew app to do this: https://github.com/citra-emu/3dsutils. Put the resulting file
349 // "shared_font.bin" in the Citra "sysdata" directory.
350 std::string filepath = FileUtil::GetUserPath(D_SYSDATA_IDX) + SHARED_FONT;
351
352 FileUtil::CreateFullPath(filepath); // Create path if not already created
353 FileUtil::IOFile file(filepath, "rb");
354 if (file.IsOpen()) {
355 file.ReadBytes(shared_font_mem->GetPointer(), file.GetSize());
356 return true;
357 }
358
359 return false;
72} 360}
73 361
74void GetSharedFont(Service::Interface* self) { 362void GetSharedFont(Service::Interface* self) {
75 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x44, 0, 0); // 0x00440000 363 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x44, 0, 0); // 0x00440000
76 IPC::RequestBuilder rb = rp.MakeBuilder(2, 2); 364 IPC::RequestBuilder rb = rp.MakeBuilder(2, 2);
365
366 // Log in telemetry if the game uses the shared font
367 Core::Telemetry().AddField(Telemetry::FieldType::Session, "RequiresSharedFont", true);
368
77 if (!shared_font_loaded) { 369 if (!shared_font_loaded) {
78 LOG_ERROR(Service_APT, "shared font file missing - go dump it from your 3ds"); 370 // On real 3DS, font loading happens on booting. However, we load it on demand to coordinate
79 rb.Push<u32>(-1); // TODO: Find the right error code 371 // with CFG region auto configuration, which happens later than APT initialization.
80 rb.Skip(1 + 2, true); 372 if (LoadSharedFont()) {
81 Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSharedFont); 373 shared_font_loaded = true;
82 return; 374 } else if (LoadLegacySharedFont()) {
375 LOG_WARNING(Service_APT, "Loaded shared font by legacy method");
376 shared_font_loaded = true;
377 } else {
378 LOG_ERROR(Service_APT, "shared font file missing - go dump it from your 3ds");
379 rb.Push<u32>(-1); // TODO: Find the right error code
380 rb.Skip(1 + 2, true);
381 Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSharedFont);
382 return;
383 }
83 } 384 }
84 385
85 // The shared font has to be relocated to the new address before being passed to the 386 // The shared font has to be relocated to the new address before being passed to the
@@ -115,7 +416,12 @@ void GetLockHandle(Service::Interface* self) {
115 // this will cause the app to wait until parameter_event is signaled. 416 // this will cause the app to wait until parameter_event is signaled.
116 u32 applet_attributes = rp.Pop<u32>(); 417 u32 applet_attributes = rp.Pop<u32>();
117 IPC::RequestBuilder rb = rp.MakeBuilder(3, 2); 418 IPC::RequestBuilder rb = rp.MakeBuilder(3, 2);
118 rb.Push(RESULT_SUCCESS); // No error 419 rb.Push(RESULT_SUCCESS); // No error
420
421 // TODO(Subv): The output attributes should have an AppletPos of either Library or System |
422 // Library (depending on the type of the last launched applet) if the input attributes'
423 // AppletPos has the Library bit set.
424
119 rb.Push(applet_attributes); // Applet Attributes, this value is passed to Enable. 425 rb.Push(applet_attributes); // Applet Attributes, this value is passed to Enable.
120 rb.Push<u32>(0); // Least significant bit = power button state 426 rb.Push<u32>(0); // Least significant bit = power button state
121 Kernel::Handle handle_copy = Kernel::g_handle_table.Create(lock).Unwrap(); 427 Kernel::Handle handle_copy = Kernel::g_handle_table.Create(lock).Unwrap();
@@ -128,10 +434,22 @@ void GetLockHandle(Service::Interface* self) {
128void Enable(Service::Interface* self) { 434void Enable(Service::Interface* self) {
129 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x3, 1, 0); // 0x30040 435 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x3, 1, 0); // 0x30040
130 u32 attributes = rp.Pop<u32>(); 436 u32 attributes = rp.Pop<u32>();
437
438 LOG_DEBUG(Service_APT, "called attributes=0x%08X", attributes);
439
131 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); 440 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
132 rb.Push(RESULT_SUCCESS); // No error 441
133 parameter_event->Signal(); // Let the application know that it has been started 442 auto* const slot_data = GetAppletSlotData(attributes);
134 LOG_WARNING(Service_APT, "(STUBBED) called attributes=0x%08X", attributes); 443
444 if (!slot_data) {
445 rb.Push(ResultCode(ErrCodes::InvalidAppletSlot, ErrorModule::Applet,
446 ErrorSummary::InvalidState, ErrorLevel::Status));
447 return;
448 }
449
450 slot_data->registered = true;
451
452 rb.Push(RESULT_SUCCESS);
135} 453}
136 454
137void GetAppletManInfo(Service::Interface* self) { 455void GetAppletManInfo(Service::Interface* self) {
@@ -149,22 +467,27 @@ void GetAppletManInfo(Service::Interface* self) {
149 467
150void IsRegistered(Service::Interface* self) { 468void IsRegistered(Service::Interface* self) {
151 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x9, 1, 0); // 0x90040 469 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x9, 1, 0); // 0x90040
152 u32 app_id = rp.Pop<u32>(); 470 AppletId app_id = static_cast<AppletId>(rp.Pop<u32>());
153 IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); 471 IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
154 rb.Push(RESULT_SUCCESS); // No error 472 rb.Push(RESULT_SUCCESS); // No error
155 473
156 // TODO(Subv): An application is considered "registered" if it has already called APT::Enable 474 auto* const slot_data = GetAppletSlotData(app_id);
157 // handle this properly once we implement multiprocess support. 475
158 bool is_registered = false; // Set to not registered by default 476 // Check if an LLE applet was registered first, then fallback to HLE applets
477 bool is_registered = slot_data && slot_data->registered;
159 478
160 if (app_id == static_cast<u32>(AppletId::AnyLibraryApplet)) { 479 if (!is_registered) {
161 is_registered = HLE::Applets::IsLibraryAppletRunning(); 480 if (app_id == AppletId::AnyLibraryApplet) {
162 } else if (auto applet = HLE::Applets::Applet::Get(static_cast<AppletId>(app_id))) { 481 is_registered = HLE::Applets::IsLibraryAppletRunning();
163 is_registered = true; // Set to registered 482 } else if (auto applet = HLE::Applets::Applet::Get(app_id)) {
483 // The applet exists, set it as registered.
484 is_registered = true;
485 }
164 } 486 }
487
165 rb.Push(is_registered); 488 rb.Push(is_registered);
166 489
167 LOG_WARNING(Service_APT, "(STUBBED) called app_id=0x%08X", app_id); 490 LOG_DEBUG(Service_APT, "called app_id=0x%08X", static_cast<u32>(app_id));
168} 491}
169 492
170void InquireNotification(Service::Interface* self) { 493void InquireNotification(Service::Interface* self) {
@@ -186,14 +509,17 @@ void SendParameter(Service::Interface* self) {
186 size_t size; 509 size_t size;
187 VAddr buffer = rp.PopStaticBuffer(&size); 510 VAddr buffer = rp.PopStaticBuffer(&size);
188 511
189 std::shared_ptr<HLE::Applets::Applet> dest_applet = 512 LOG_DEBUG(Service_APT,
190 HLE::Applets::Applet::Get(static_cast<AppletId>(dst_app_id)); 513 "called src_app_id=0x%08X, dst_app_id=0x%08X, signal_type=0x%08X,"
514 "buffer_size=0x%08X, handle=0x%08X, size=0x%08zX, in_param_buffer_ptr=0x%08X",
515 src_app_id, dst_app_id, signal_type, buffer_size, handle, size, buffer);
191 516
192 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); 517 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
193 518
194 if (dest_applet == nullptr) { 519 // A new parameter can not be sent if the previous one hasn't been consumed yet
195 LOG_ERROR(Service_APT, "Unknown applet id=0x%08X", dst_app_id); 520 if (next_parameter) {
196 rb.Push<u32>(-1); // TODO(Subv): Find the right error code 521 rb.Push(ResultCode(ErrCodes::ParameterPresent, ErrorModule::Applet,
522 ErrorSummary::InvalidState, ErrorLevel::Status));
197 return; 523 return;
198 } 524 }
199 525
@@ -205,12 +531,14 @@ void SendParameter(Service::Interface* self) {
205 param.buffer.resize(buffer_size); 531 param.buffer.resize(buffer_size);
206 Memory::ReadBlock(buffer, param.buffer.data(), param.buffer.size()); 532 Memory::ReadBlock(buffer, param.buffer.data(), param.buffer.size());
207 533
208 rb.Push(dest_applet->ReceiveParameter(param)); 534 SendParameter(param);
209 535
210 LOG_WARNING(Service_APT, 536 // If the applet is running in HLE mode, use the HLE interface to communicate with it.
211 "(STUBBED) called src_app_id=0x%08X, dst_app_id=0x%08X, signal_type=0x%08X," 537 if (auto dest_applet = HLE::Applets::Applet::Get(static_cast<AppletId>(dst_app_id))) {
212 "buffer_size=0x%08X, handle=0x%08X, size=0x%08zX, in_param_buffer_ptr=0x%08X", 538 rb.Push(dest_applet->ReceiveParameter(param));
213 src_app_id, dst_app_id, signal_type, buffer_size, handle, size, buffer); 539 } else {
540 rb.Push(RESULT_SUCCESS);
541 }
214} 542}
215 543
216void ReceiveParameter(Service::Interface* self) { 544void ReceiveParameter(Service::Interface* self) {
@@ -226,21 +554,40 @@ void ReceiveParameter(Service::Interface* self) {
226 "buffer_size is bigger than the size in the buffer descriptor (0x%08X > 0x%08zX)", 554 "buffer_size is bigger than the size in the buffer descriptor (0x%08X > 0x%08zX)",
227 buffer_size, static_buff_size); 555 buffer_size, static_buff_size);
228 556
557 LOG_DEBUG(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size);
558
559 if (!next_parameter) {
560 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
561 rb.Push(ResultCode(ErrorDescription::NoData, ErrorModule::Applet,
562 ErrorSummary::InvalidState, ErrorLevel::Status));
563 return;
564 }
565
566 if (next_parameter->destination_id != app_id) {
567 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
568 rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::Applet, ErrorSummary::NotFound,
569 ErrorLevel::Status));
570 return;
571 }
572
229 IPC::RequestBuilder rb = rp.MakeBuilder(4, 4); 573 IPC::RequestBuilder rb = rp.MakeBuilder(4, 4);
574
230 rb.Push(RESULT_SUCCESS); // No error 575 rb.Push(RESULT_SUCCESS); // No error
231 rb.Push(next_parameter.sender_id); 576 rb.Push(next_parameter->sender_id);
232 rb.Push(next_parameter.signal); // Signal type 577 rb.Push(next_parameter->signal); // Signal type
233 ASSERT_MSG(next_parameter.buffer.size() <= buffer_size, "Input static buffer is too small !"); 578 ASSERT_MSG(next_parameter->buffer.size() <= buffer_size, "Input static buffer is too small !");
234 rb.Push(static_cast<u32>(next_parameter.buffer.size())); // Parameter buffer size 579 rb.Push(static_cast<u32>(next_parameter->buffer.size())); // Parameter buffer size
235 580
236 rb.PushMoveHandles((next_parameter.object != nullptr) 581 rb.PushMoveHandles((next_parameter->object != nullptr)
237 ? Kernel::g_handle_table.Create(next_parameter.object).Unwrap() 582 ? Kernel::g_handle_table.Create(next_parameter->object).Unwrap()
238 : 0); 583 : 0);
239 rb.PushStaticBuffer(buffer, static_cast<u32>(next_parameter.buffer.size()), 0);
240 584
241 Memory::WriteBlock(buffer, next_parameter.buffer.data(), next_parameter.buffer.size()); 585 rb.PushStaticBuffer(buffer, next_parameter->buffer.size(), 0);
586
587 Memory::WriteBlock(buffer, next_parameter->buffer.data(), next_parameter->buffer.size());
242 588
243 LOG_WARNING(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size); 589 // Clear the parameter
590 next_parameter = boost::none;
244} 591}
245 592
246void GlanceParameter(Service::Interface* self) { 593void GlanceParameter(Service::Interface* self) {
@@ -256,37 +603,74 @@ void GlanceParameter(Service::Interface* self) {
256 "buffer_size is bigger than the size in the buffer descriptor (0x%08X > 0x%08zX)", 603 "buffer_size is bigger than the size in the buffer descriptor (0x%08X > 0x%08zX)",
257 buffer_size, static_buff_size); 604 buffer_size, static_buff_size);
258 605
606 LOG_DEBUG(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size);
607
608 if (!next_parameter) {
609 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
610 rb.Push(ResultCode(ErrorDescription::NoData, ErrorModule::Applet,
611 ErrorSummary::InvalidState, ErrorLevel::Status));
612 return;
613 }
614
615 if (next_parameter->destination_id != app_id) {
616 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
617 rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::Applet, ErrorSummary::NotFound,
618 ErrorLevel::Status));
619 return;
620 }
621
259 IPC::RequestBuilder rb = rp.MakeBuilder(4, 4); 622 IPC::RequestBuilder rb = rp.MakeBuilder(4, 4);
260 rb.Push(RESULT_SUCCESS); // No error 623 rb.Push(RESULT_SUCCESS); // No error
261 rb.Push(next_parameter.sender_id); 624 rb.Push(next_parameter->sender_id);
262 rb.Push(next_parameter.signal); // Signal type 625 rb.Push(next_parameter->signal); // Signal type
263 ASSERT_MSG(next_parameter.buffer.size() <= buffer_size, "Input static buffer is too small !"); 626 ASSERT_MSG(next_parameter->buffer.size() <= buffer_size, "Input static buffer is too small !");
264 rb.Push(static_cast<u32>(next_parameter.buffer.size())); // Parameter buffer size 627 rb.Push(static_cast<u32>(next_parameter->buffer.size())); // Parameter buffer size
265 628
266 rb.PushCopyHandles((next_parameter.object != nullptr) 629 rb.PushMoveHandles((next_parameter->object != nullptr)
267 ? Kernel::g_handle_table.Create(next_parameter.object).Unwrap() 630 ? Kernel::g_handle_table.Create(next_parameter->object).Unwrap()
268 : 0); 631 : 0);
269 rb.PushStaticBuffer(buffer, static_cast<u32>(next_parameter.buffer.size()), 0);
270 632
271 Memory::WriteBlock(buffer, next_parameter.buffer.data(), next_parameter.buffer.size()); 633 rb.PushStaticBuffer(buffer, next_parameter->buffer.size(), 0);
634
635 Memory::WriteBlock(buffer, next_parameter->buffer.data(), next_parameter->buffer.size());
272 636
273 LOG_WARNING(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size); 637 // Note: The NS module always clears the DSPSleep and DSPWakeup signals even in GlanceParameter.
638 if (next_parameter->signal == static_cast<u32>(SignalType::DspSleep) ||
639 next_parameter->signal == static_cast<u32>(SignalType::DspWakeup))
640 next_parameter = boost::none;
274} 641}
275 642
276void CancelParameter(Service::Interface* self) { 643void CancelParameter(Service::Interface* self) {
277 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0xF, 4, 0); // 0xF0100 644 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0xF, 4, 0); // 0xF0100
278 645
279 u32 check_sender = rp.Pop<u32>(); 646 bool check_sender = rp.Pop<bool>();
280 u32 sender_appid = rp.Pop<u32>(); 647 u32 sender_appid = rp.Pop<u32>();
281 u32 check_receiver = rp.Pop<u32>(); 648 bool check_receiver = rp.Pop<bool>();
282 u32 receiver_appid = rp.Pop<u32>(); 649 u32 receiver_appid = rp.Pop<u32>();
650
651 bool cancellation_success = true;
652
653 if (!next_parameter) {
654 cancellation_success = false;
655 } else {
656 if (check_sender && next_parameter->sender_id != sender_appid)
657 cancellation_success = false;
658
659 if (check_receiver && next_parameter->destination_id != receiver_appid)
660 cancellation_success = false;
661 }
662
663 if (cancellation_success)
664 next_parameter = boost::none;
665
283 IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); 666 IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
667
284 rb.Push(RESULT_SUCCESS); // No error 668 rb.Push(RESULT_SUCCESS); // No error
285 rb.Push(true); // Set to Success 669 rb.Push(cancellation_success);
286 670
287 LOG_WARNING(Service_APT, "(STUBBED) called check_sender=0x%08X, sender_appid=0x%08X, " 671 LOG_DEBUG(Service_APT, "called check_sender=%u, sender_appid=0x%08X, "
288 "check_receiver=0x%08X, receiver_appid=0x%08X", 672 "check_receiver=%u, receiver_appid=0x%08X",
289 check_sender, sender_appid, check_receiver, receiver_appid); 673 check_sender, sender_appid, check_receiver, receiver_appid);
290} 674}
291 675
292void PrepareToStartApplication(Service::Interface* self) { 676void PrepareToStartApplication(Service::Interface* self) {
@@ -383,7 +767,12 @@ void PrepareToStartLibraryApplet(Service::Interface* self) {
383 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x18, 1, 0); // 0x180040 767 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x18, 1, 0); // 0x180040
384 AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>()); 768 AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>());
385 769
770 LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
771
386 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); 772 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
773
774 // TODO(Subv): Launch the requested applet application.
775
387 auto applet = HLE::Applets::Applet::Get(applet_id); 776 auto applet = HLE::Applets::Applet::Get(applet_id);
388 if (applet) { 777 if (applet) {
389 LOG_WARNING(Service_APT, "applet has already been started id=%08X", applet_id); 778 LOG_WARNING(Service_APT, "applet has already been started id=%08X", applet_id);
@@ -391,14 +780,32 @@ void PrepareToStartLibraryApplet(Service::Interface* self) {
391 } else { 780 } else {
392 rb.Push(HLE::Applets::Applet::Create(applet_id)); 781 rb.Push(HLE::Applets::Applet::Create(applet_id));
393 } 782 }
394 LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id); 783}
784
785void PrepareToStartNewestHomeMenu(Service::Interface* self) {
786 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1A, 0, 0); // 0x1A0000
787 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
788
789 // TODO(Subv): This command can only be called by a System Applet (return 0xC8A0CC04 otherwise).
790
791 // This command must return an error when called, otherwise the Home Menu will try to reboot the
792 // system.
793 rb.Push(ResultCode(ErrorDescription::AlreadyExists, ErrorModule::Applet,
794 ErrorSummary::InvalidState, ErrorLevel::Status));
795
796 LOG_DEBUG(Service_APT, "called");
395} 797}
396 798
397void PreloadLibraryApplet(Service::Interface* self) { 799void PreloadLibraryApplet(Service::Interface* self) {
398 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x16, 1, 0); // 0x160040 800 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x16, 1, 0); // 0x160040
399 AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>()); 801 AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>());
400 802
803 LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
804
401 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); 805 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
806
807 // TODO(Subv): Launch the requested applet application.
808
402 auto applet = HLE::Applets::Applet::Get(applet_id); 809 auto applet = HLE::Applets::Applet::Get(applet_id);
403 if (applet) { 810 if (applet) {
404 LOG_WARNING(Service_APT, "applet has already been started id=%08X", applet_id); 811 LOG_WARNING(Service_APT, "applet has already been started id=%08X", applet_id);
@@ -406,34 +813,40 @@ void PreloadLibraryApplet(Service::Interface* self) {
406 } else { 813 } else {
407 rb.Push(HLE::Applets::Applet::Create(applet_id)); 814 rb.Push(HLE::Applets::Applet::Create(applet_id));
408 } 815 }
409 LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
410} 816}
411 817
412void StartLibraryApplet(Service::Interface* self) { 818void StartLibraryApplet(Service::Interface* self) {
413 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1E, 2, 4); // 0x1E0084 819 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1E, 2, 4); // 0x1E0084
414 AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>()); 820 AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>());
415 std::shared_ptr<HLE::Applets::Applet> applet = HLE::Applets::Applet::Get(applet_id);
416
417 LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
418
419 if (applet == nullptr) {
420 LOG_ERROR(Service_APT, "unknown applet id=%08X", applet_id);
421 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0, false);
422 rb.Push<u32>(-1); // TODO(Subv): Find the right error code
423 return;
424 }
425 821
426 size_t buffer_size = rp.Pop<u32>(); 822 size_t buffer_size = rp.Pop<u32>();
427 Kernel::Handle handle = rp.PopHandle(); 823 Kernel::Handle handle = rp.PopHandle();
428 VAddr buffer_addr = rp.PopStaticBuffer(); 824 VAddr buffer_addr = rp.PopStaticBuffer();
429 825
430 AppletStartupParameter parameter; 826 LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
431 parameter.object = Kernel::g_handle_table.GetGeneric(handle);
432 parameter.buffer.resize(buffer_size);
433 Memory::ReadBlock(buffer_addr, parameter.buffer.data(), parameter.buffer.size());
434 827
435 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); 828 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
436 rb.Push(applet->Start(parameter)); 829
830 // Send the Wakeup signal to the applet
831 MessageParameter param;
832 param.destination_id = static_cast<u32>(applet_id);
833 param.sender_id = static_cast<u32>(AppletId::Application);
834 param.object = Kernel::g_handle_table.GetGeneric(handle);
835 param.signal = static_cast<u32>(SignalType::Wakeup);
836 param.buffer.resize(buffer_size);
837 Memory::ReadBlock(buffer_addr, param.buffer.data(), param.buffer.size());
838 SendParameter(param);
839
840 // In case the applet is being HLEd, attempt to communicate with it.
841 if (auto applet = HLE::Applets::Applet::Get(applet_id)) {
842 AppletStartupParameter parameter;
843 parameter.object = Kernel::g_handle_table.GetGeneric(handle);
844 parameter.buffer.resize(buffer_size);
845 Memory::ReadBlock(buffer_addr, parameter.buffer.data(), parameter.buffer.size());
846 rb.Push(applet->Start(parameter));
847 } else {
848 rb.Push(RESULT_SUCCESS);
849 }
437} 850}
438 851
439void CancelLibraryApplet(Service::Interface* self) { 852void CancelLibraryApplet(Service::Interface* self) {
@@ -647,125 +1060,6 @@ void CheckNew3DS(Service::Interface* self) {
647 LOG_WARNING(Service_APT, "(STUBBED) called"); 1060 LOG_WARNING(Service_APT, "(STUBBED) called");
648} 1061}
649 1062
650static u32 DecompressLZ11(const u8* in, u8* out) {
651 u32_le decompressed_size;
652 memcpy(&decompressed_size, in, sizeof(u32));
653 in += 4;
654
655 u8 type = decompressed_size & 0xFF;
656 ASSERT(type == 0x11);
657 decompressed_size >>= 8;
658
659 u32 current_out_size = 0;
660 u8 flags = 0, mask = 1;
661 while (current_out_size < decompressed_size) {
662 if (mask == 1) {
663 flags = *(in++);
664 mask = 0x80;
665 } else {
666 mask >>= 1;
667 }
668
669 if (flags & mask) {
670 u8 byte1 = *(in++);
671 u32 length = byte1 >> 4;
672 u32 offset;
673 if (length == 0) {
674 u8 byte2 = *(in++);
675 u8 byte3 = *(in++);
676 length = (((byte1 & 0x0F) << 4) | (byte2 >> 4)) + 0x11;
677 offset = (((byte2 & 0x0F) << 8) | byte3) + 0x1;
678 } else if (length == 1) {
679 u8 byte2 = *(in++);
680 u8 byte3 = *(in++);
681 u8 byte4 = *(in++);
682 length = (((byte1 & 0x0F) << 12) | (byte2 << 4) | (byte3 >> 4)) + 0x111;
683 offset = (((byte3 & 0x0F) << 8) | byte4) + 0x1;
684 } else {
685 u8 byte2 = *(in++);
686 length = (byte1 >> 4) + 0x1;
687 offset = (((byte1 & 0x0F) << 8) | byte2) + 0x1;
688 }
689
690 for (u32 i = 0; i < length; i++) {
691 *out = *(out - offset);
692 ++out;
693 }
694
695 current_out_size += length;
696 } else {
697 *(out++) = *(in++);
698 current_out_size++;
699 }
700 }
701 return decompressed_size;
702}
703
704static bool LoadSharedFont() {
705 // TODO (wwylele): load different font archive for region CHN/KOR/TWN
706 const u64_le shared_font_archive_id_low = 0x0004009b00014002;
707 const u64_le shared_font_archive_id_high = 0x00000001ffffff00;
708 std::vector<u8> shared_font_archive_id(16);
709 std::memcpy(&shared_font_archive_id[0], &shared_font_archive_id_low, sizeof(u64));
710 std::memcpy(&shared_font_archive_id[8], &shared_font_archive_id_high, sizeof(u64));
711 FileSys::Path archive_path(shared_font_archive_id);
712 auto archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::NCCH, archive_path);
713 if (archive_result.Failed())
714 return false;
715
716 std::vector<u8> romfs_path(20, 0); // 20-byte all zero path for opening RomFS
717 FileSys::Path file_path(romfs_path);
718 FileSys::Mode open_mode = {};
719 open_mode.read_flag.Assign(1);
720 auto file_result = Service::FS::OpenFileFromArchive(*archive_result, file_path, open_mode);
721 if (file_result.Failed())
722 return false;
723
724 auto romfs = std::move(file_result).Unwrap();
725 std::vector<u8> romfs_buffer(romfs->backend->GetSize());
726 romfs->backend->Read(0, romfs_buffer.size(), romfs_buffer.data());
727 romfs->backend->Close();
728
729 const u8* font_file = RomFS::GetFilePointer(romfs_buffer.data(), {u"cbf_std.bcfnt.lz"});
730 if (font_file == nullptr)
731 return false;
732
733 struct {
734 u32_le status;
735 u32_le region;
736 u32_le decompressed_size;
737 INSERT_PADDING_WORDS(0x1D);
738 } shared_font_header{};
739 static_assert(sizeof(shared_font_header) == 0x80, "shared_font_header has incorrect size");
740
741 shared_font_header.status = 2; // successfully loaded
742 shared_font_header.region = 1; // region JPN/EUR/USA
743 shared_font_header.decompressed_size =
744 DecompressLZ11(font_file, shared_font_mem->GetPointer(0x80));
745 std::memcpy(shared_font_mem->GetPointer(), &shared_font_header, sizeof(shared_font_header));
746 *shared_font_mem->GetPointer(0x83) = 'U'; // Change the magic from "CFNT" to "CFNU"
747
748 return true;
749}
750
751static bool LoadLegacySharedFont() {
752 // This is the legacy method to load shared font.
753 // The expected format is a decrypted, uncompressed BCFNT file with the 0x80 byte header
754 // generated by the APT:U service. The best way to get is by dumping it from RAM. We've provided
755 // a homebrew app to do this: https://github.com/citra-emu/3dsutils. Put the resulting file
756 // "shared_font.bin" in the Citra "sysdata" directory.
757 std::string filepath = FileUtil::GetUserPath(D_SYSDATA_IDX) + SHARED_FONT;
758
759 FileUtil::CreateFullPath(filepath); // Create path if not already created
760 FileUtil::IOFile file(filepath, "rb");
761 if (file.IsOpen()) {
762 file.ReadBytes(shared_font_mem->GetPointer(), file.GetSize());
763 return true;
764 }
765
766 return false;
767}
768
769void Init() { 1063void Init() {
770 AddService(new APT_A_Interface); 1064 AddService(new APT_A_Interface);
771 AddService(new APT_S_Interface); 1065 AddService(new APT_S_Interface);
@@ -789,19 +1083,24 @@ void Init() {
789 shared_font_loaded = false; 1083 shared_font_loaded = false;
790 } 1084 }
791 1085
792 lock = Kernel::Mutex::Create(false, "APT_U:Lock"); 1086 lock = Kernel::Mutex::Create(false, 0, "APT_U:Lock");
793 1087
794 cpu_percent = 0; 1088 cpu_percent = 0;
795 unknown_ns_state_field = 0; 1089 unknown_ns_state_field = 0;
796 screen_capture_post_permission = 1090 screen_capture_post_permission =
797 ScreencapPostPermission::CleanThePermission; // TODO(JamePeng): verify the initial value 1091 ScreencapPostPermission::CleanThePermission; // TODO(JamePeng): verify the initial value
798 1092
799 // TODO(bunnei): Check if these are created in Initialize or on APT process startup. 1093 for (size_t slot = 0; slot < applet_slots.size(); ++slot) {
800 notification_event = Kernel::Event::Create(Kernel::ResetType::OneShot, "APT_U:Notification"); 1094 auto& slot_data = applet_slots[slot];
801 parameter_event = Kernel::Event::Create(Kernel::ResetType::OneShot, "APT_U:Start"); 1095 slot_data.slot = static_cast<AppletSlot>(slot);
802 1096 slot_data.applet_id = AppletId::None;
803 next_parameter.signal = static_cast<u32>(SignalType::Wakeup); 1097 slot_data.attributes.raw = 0;
804 next_parameter.destination_id = 0x300; 1098 slot_data.registered = false;
1099 slot_data.notification_event =
1100 Kernel::Event::Create(Kernel::ResetType::OneShot, "APT:Notification");
1101 slot_data.parameter_event =
1102 Kernel::Event::Create(Kernel::ResetType::OneShot, "APT:Parameter");
1103 }
805} 1104}
806 1105
807void Shutdown() { 1106void Shutdown() {
@@ -809,10 +1108,14 @@ void Shutdown() {
809 shared_font_loaded = false; 1108 shared_font_loaded = false;
810 shared_font_relocated = false; 1109 shared_font_relocated = false;
811 lock = nullptr; 1110 lock = nullptr;
812 notification_event = nullptr;
813 parameter_event = nullptr;
814 1111
815 next_parameter.object = nullptr; 1112 for (auto& slot : applet_slots) {
1113 slot.registered = false;
1114 slot.notification_event = nullptr;
1115 slot.parameter_event = nullptr;
1116 }
1117
1118 next_parameter = boost::none;
816 1119
817 HLE::Applets::Shutdown(); 1120 HLE::Applets::Shutdown();
818} 1121}
diff --git a/src/core/hle/service/apt/apt.h b/src/core/hle/service/apt/apt.h
index ee80926d2..7b79e1f3e 100644
--- a/src/core/hle/service/apt/apt.h
+++ b/src/core/hle/service/apt/apt.h
@@ -72,6 +72,8 @@ enum class SignalType : u32 {
72 72
73/// App Id's used by APT functions 73/// App Id's used by APT functions
74enum class AppletId : u32 { 74enum class AppletId : u32 {
75 None = 0,
76 AnySystemApplet = 0x100,
75 HomeMenu = 0x101, 77 HomeMenu = 0x101,
76 AlternateMenu = 0x103, 78 AlternateMenu = 0x103,
77 Camera = 0x110, 79 Camera = 0x110,
@@ -83,6 +85,7 @@ enum class AppletId : u32 {
83 Miiverse = 0x117, 85 Miiverse = 0x117,
84 MiiversePost = 0x118, 86 MiiversePost = 0x118,
85 AmiiboSettings = 0x119, 87 AmiiboSettings = 0x119,
88 AnySysLibraryApplet = 0x200,
86 SoftwareKeyboard1 = 0x201, 89 SoftwareKeyboard1 = 0x201,
87 Ed1 = 0x202, 90 Ed1 = 0x202,
88 PnoteApp = 0x204, 91 PnoteApp = 0x204,
@@ -116,6 +119,13 @@ enum class ScreencapPostPermission : u32 {
116 DisableScreenshotPostingToMiiverse = 3 119 DisableScreenshotPostingToMiiverse = 3
117}; 120};
118 121
122namespace ErrCodes {
123enum {
124 ParameterPresent = 2,
125 InvalidAppletSlot = 4,
126};
127} // namespace ErrCodes
128
119/// Send a parameter to the currently-running application, which will read it via ReceiveParameter 129/// Send a parameter to the currently-running application, which will read it via ReceiveParameter
120void SendParameter(const MessageParameter& parameter); 130void SendParameter(const MessageParameter& parameter);
121 131
@@ -410,6 +420,16 @@ void GetAppCpuTimeLimit(Service::Interface* self);
410void PrepareToStartLibraryApplet(Service::Interface* self); 420void PrepareToStartLibraryApplet(Service::Interface* self);
411 421
412/** 422/**
423 * APT::PrepareToStartNewestHomeMenu service function
424 * Inputs:
425 * 0 : Command header [0x001A0000]
426 * Outputs:
427 * 0 : Return header
428 * 1 : Result of function
429 */
430void PrepareToStartNewestHomeMenu(Service::Interface* self);
431
432/**
413 * APT::PreloadLibraryApplet service function 433 * APT::PreloadLibraryApplet service function
414 * Inputs: 434 * Inputs:
415 * 0 : Command header [0x00160040] 435 * 0 : Command header [0x00160040]
diff --git a/src/core/hle/service/apt/apt_s.cpp b/src/core/hle/service/apt/apt_s.cpp
index ec5668d05..bb78ee7d7 100644
--- a/src/core/hle/service/apt/apt_s.cpp
+++ b/src/core/hle/service/apt/apt_s.cpp
@@ -17,10 +17,10 @@ const Interface::FunctionInfo FunctionTable[] = {
17 {0x00060040, GetAppletInfo, "GetAppletInfo"}, 17 {0x00060040, GetAppletInfo, "GetAppletInfo"},
18 {0x00070000, nullptr, "GetLastSignaledAppletId"}, 18 {0x00070000, nullptr, "GetLastSignaledAppletId"},
19 {0x00080000, nullptr, "CountRegisteredApplet"}, 19 {0x00080000, nullptr, "CountRegisteredApplet"},
20 {0x00090040, nullptr, "IsRegistered"}, 20 {0x00090040, IsRegistered, "IsRegistered"},
21 {0x000A0040, nullptr, "GetAttribute"}, 21 {0x000A0040, nullptr, "GetAttribute"},
22 {0x000B0040, InquireNotification, "InquireNotification"}, 22 {0x000B0040, InquireNotification, "InquireNotification"},
23 {0x000C0104, nullptr, "SendParameter"}, 23 {0x000C0104, SendParameter, "SendParameter"},
24 {0x000D0080, ReceiveParameter, "ReceiveParameter"}, 24 {0x000D0080, ReceiveParameter, "ReceiveParameter"},
25 {0x000E0080, GlanceParameter, "GlanceParameter"}, 25 {0x000E0080, GlanceParameter, "GlanceParameter"},
26 {0x000F0100, nullptr, "CancelParameter"}, 26 {0x000F0100, nullptr, "CancelParameter"},
@@ -34,11 +34,11 @@ const Interface::FunctionInfo FunctionTable[] = {
34 {0x00170040, nullptr, "FinishPreloadingLibraryApplet"}, 34 {0x00170040, nullptr, "FinishPreloadingLibraryApplet"},
35 {0x00180040, PrepareToStartLibraryApplet, "PrepareToStartLibraryApplet"}, 35 {0x00180040, PrepareToStartLibraryApplet, "PrepareToStartLibraryApplet"},
36 {0x00190040, nullptr, "PrepareToStartSystemApplet"}, 36 {0x00190040, nullptr, "PrepareToStartSystemApplet"},
37 {0x001A0000, nullptr, "PrepareToStartNewestHomeMenu"}, 37 {0x001A0000, PrepareToStartNewestHomeMenu, "PrepareToStartNewestHomeMenu"},
38 {0x001B00C4, nullptr, "StartApplication"}, 38 {0x001B00C4, nullptr, "StartApplication"},
39 {0x001C0000, nullptr, "WakeupApplication"}, 39 {0x001C0000, nullptr, "WakeupApplication"},
40 {0x001D0000, nullptr, "CancelApplication"}, 40 {0x001D0000, nullptr, "CancelApplication"},
41 {0x001E0084, nullptr, "StartLibraryApplet"}, 41 {0x001E0084, StartLibraryApplet, "StartLibraryApplet"},
42 {0x001F0084, nullptr, "StartSystemApplet"}, 42 {0x001F0084, nullptr, "StartSystemApplet"},
43 {0x00200044, nullptr, "StartNewestHomeMenu"}, 43 {0x00200044, nullptr, "StartNewestHomeMenu"},
44 {0x00210000, nullptr, "OrderToCloseApplication"}, 44 {0x00210000, nullptr, "OrderToCloseApplication"},
diff --git a/src/core/hle/service/cam/cam.cpp b/src/core/hle/service/cam/cam.cpp
index c9f9e9d95..8172edae8 100644
--- a/src/core/hle/service/cam/cam.cpp
+++ b/src/core/hle/service/cam/cam.cpp
@@ -177,7 +177,7 @@ void CompletionEventCallBack(u64 port_id, int) {
177 LOG_ERROR(Service_CAM, "The destination size (%u) doesn't match the source (%zu)!", 177 LOG_ERROR(Service_CAM, "The destination size (%u) doesn't match the source (%zu)!",
178 port.dest_size, buffer_size); 178 port.dest_size, buffer_size);
179 } 179 }
180 Memory::WriteBlock(port.dest, buffer.data(), std::min<u32>(port.dest_size, buffer_size)); 180 Memory::WriteBlock(port.dest, buffer.data(), std::min<size_t>(port.dest_size, buffer_size));
181 } 181 }
182 182
183 port.is_receiving = false; 183 port.is_receiving = false;
diff --git a/src/core/hle/service/cfg/cfg.cpp b/src/core/hle/service/cfg/cfg.cpp
index 6624f1711..f78c25fb2 100644
--- a/src/core/hle/service/cfg/cfg.cpp
+++ b/src/core/hle/service/cfg/cfg.cpp
@@ -141,7 +141,7 @@ void GetCountryCodeString(Service::Interface* self) {
141 141
142void GetCountryCodeID(Service::Interface* self) { 142void GetCountryCodeID(Service::Interface* self) {
143 u32* cmd_buff = Kernel::GetCommandBuffer(); 143 u32* cmd_buff = Kernel::GetCommandBuffer();
144 u16 country_code = cmd_buff[1]; 144 u16 country_code = static_cast<u16>(cmd_buff[1]);
145 u16 country_code_id = 0; 145 u16 country_code_id = 0;
146 146
147 // The following algorithm will fail if the first country code isn't 0. 147 // The following algorithm will fail if the first country code isn't 0.
@@ -168,7 +168,7 @@ void GetCountryCodeID(Service::Interface* self) {
168 cmd_buff[2] = country_code_id; 168 cmd_buff[2] = country_code_id;
169} 169}
170 170
171static u32 GetRegionValue() { 171u32 GetRegionValue() {
172 if (Settings::values.region_value == Settings::REGION_VALUE_AUTO_SELECT) 172 if (Settings::values.region_value == Settings::REGION_VALUE_AUTO_SELECT)
173 return preferred_region_code; 173 return preferred_region_code;
174 174
@@ -681,7 +681,7 @@ void GenerateConsoleUniqueId(u32& random_number, u64& console_id) {
681 CryptoPP::AutoSeededRandomPool rng; 681 CryptoPP::AutoSeededRandomPool rng;
682 random_number = rng.GenerateWord32(0, 0xFFFF); 682 random_number = rng.GenerateWord32(0, 0xFFFF);
683 u64_le local_friend_code_seed; 683 u64_le local_friend_code_seed;
684 rng.GenerateBlock(reinterpret_cast<byte*>(&local_friend_code_seed), 684 rng.GenerateBlock(reinterpret_cast<CryptoPP::byte*>(&local_friend_code_seed),
685 sizeof(local_friend_code_seed)); 685 sizeof(local_friend_code_seed));
686 console_id = (local_friend_code_seed & 0x3FFFFFFFF) | (static_cast<u64>(random_number) << 48); 686 console_id = (local_friend_code_seed & 0x3FFFFFFFF) | (static_cast<u64>(random_number) << 48);
687} 687}
diff --git a/src/core/hle/service/cfg/cfg.h b/src/core/hle/service/cfg/cfg.h
index 1659ebf32..282b6936b 100644
--- a/src/core/hle/service/cfg/cfg.h
+++ b/src/core/hle/service/cfg/cfg.h
@@ -101,6 +101,8 @@ void GetCountryCodeString(Service::Interface* self);
101 */ 101 */
102void GetCountryCodeID(Service::Interface* self); 102void GetCountryCodeID(Service::Interface* self);
103 103
104u32 GetRegionValue();
105
104/** 106/**
105 * CFG::SecureInfoGetRegion service function 107 * CFG::SecureInfoGetRegion service function
106 * Inputs: 108 * Inputs:
diff --git a/src/core/hle/service/csnd_snd.cpp b/src/core/hle/service/csnd_snd.cpp
index 9471ec1ef..aac903ccb 100644
--- a/src/core/hle/service/csnd_snd.cpp
+++ b/src/core/hle/service/csnd_snd.cpp
@@ -47,7 +47,7 @@ static void Initialize(Interface* self) {
47 MemoryPermission::ReadWrite, 0, 47 MemoryPermission::ReadWrite, 0,
48 Kernel::MemoryRegion::BASE, "CSND:SharedMemory"); 48 Kernel::MemoryRegion::BASE, "CSND:SharedMemory");
49 49
50 mutex = Kernel::Mutex::Create(false, "CSND:mutex"); 50 mutex = Kernel::Mutex::Create(false, 0, "CSND:mutex");
51 51
52 cmd_buff[1] = RESULT_SUCCESS.raw; 52 cmd_buff[1] = RESULT_SUCCESS.raw;
53 cmd_buff[2] = IPC::CopyHandleDesc(2); 53 cmd_buff[2] = IPC::CopyHandleDesc(2);
diff --git a/src/core/hle/service/dlp/dlp_clnt.cpp b/src/core/hle/service/dlp/dlp_clnt.cpp
index 56f934b3f..6f2bf2061 100644
--- a/src/core/hle/service/dlp/dlp_clnt.cpp
+++ b/src/core/hle/service/dlp/dlp_clnt.cpp
@@ -8,7 +8,26 @@ namespace Service {
8namespace DLP { 8namespace DLP {
9 9
10const Interface::FunctionInfo FunctionTable[] = { 10const Interface::FunctionInfo FunctionTable[] = {
11 {0x000100C3, nullptr, "Initialize"}, {0x00110000, nullptr, "GetWirelessRebootPassphrase"}, 11 {0x000100C3, nullptr, "Initialize"},
12 {0x00020000, nullptr, "Finalize"},
13 {0x00030000, nullptr, "GetEventDesc"},
14 {0x00040000, nullptr, "GetChannel"},
15 {0x00050180, nullptr, "StartScan"},
16 {0x00060000, nullptr, "StopScan"},
17 {0x00070080, nullptr, "GetServerInfo"},
18 {0x00080100, nullptr, "GetTitleInfo"},
19 {0x00090040, nullptr, "GetTitleInfoInOrder"},
20 {0x000A0080, nullptr, "DeleteScanInfo"},
21 {0x000B0100, nullptr, "PrepareForSystemDownload"},
22 {0x000C0000, nullptr, "StartSystemDownload"},
23 {0x000D0100, nullptr, "StartTitleDownload"},
24 {0x000E0000, nullptr, "GetMyStatus"},
25 {0x000F0040, nullptr, "GetConnectingNodes"},
26 {0x00100040, nullptr, "GetNodeInfo"},
27 {0x00110000, nullptr, "GetWirelessRebootPassphrase"},
28 {0x00120000, nullptr, "StopSession"},
29 {0x00130100, nullptr, "GetCupVersion"},
30 {0x00140100, nullptr, "GetDupAvailability"},
12}; 31};
13 32
14DLP_CLNT_Interface::DLP_CLNT_Interface() { 33DLP_CLNT_Interface::DLP_CLNT_Interface() {
diff --git a/src/core/hle/service/dlp/dlp_fkcl.cpp b/src/core/hle/service/dlp/dlp_fkcl.cpp
index 29b9d52e0..fe6be7d32 100644
--- a/src/core/hle/service/dlp/dlp_fkcl.cpp
+++ b/src/core/hle/service/dlp/dlp_fkcl.cpp
@@ -8,7 +8,23 @@ namespace Service {
8namespace DLP { 8namespace DLP {
9 9
10const Interface::FunctionInfo FunctionTable[] = { 10const Interface::FunctionInfo FunctionTable[] = {
11 {0x00010083, nullptr, "Initialize"}, {0x000F0000, nullptr, "GetWirelessRebootPassphrase"}, 11 {0x00010083, nullptr, "Initialize"},
12 {0x00020000, nullptr, "Finalize"},
13 {0x00030000, nullptr, "GetEventDesc"},
14 {0x00040000, nullptr, "GetChannels"},
15 {0x00050180, nullptr, "StartScan"},
16 {0x00060000, nullptr, "StopScan"},
17 {0x00070080, nullptr, "GetServerInfo"},
18 {0x00080100, nullptr, "GetTitleInfo"},
19 {0x00090040, nullptr, "GetTitleInfoInOrder"},
20 {0x000A0080, nullptr, "DeleteScanInfo"},
21 {0x000B0100, nullptr, "StartFakeSession"},
22 {0x000C0000, nullptr, "GetMyStatus"},
23 {0x000D0040, nullptr, "GetConnectingNodes"},
24 {0x000E0040, nullptr, "GetNodeInfo"},
25 {0x000F0000, nullptr, "GetWirelessRebootPassphrase"},
26 {0x00100000, nullptr, "StopSession"},
27 {0x00110203, nullptr, "Initialize2"},
12}; 28};
13 29
14DLP_FKCL_Interface::DLP_FKCL_Interface() { 30DLP_FKCL_Interface::DLP_FKCL_Interface() {
diff --git a/src/core/hle/service/dlp/dlp_srvr.cpp b/src/core/hle/service/dlp/dlp_srvr.cpp
index 32cfa2c44..1bcea43d3 100644
--- a/src/core/hle/service/dlp/dlp_srvr.cpp
+++ b/src/core/hle/service/dlp/dlp_srvr.cpp
@@ -11,7 +11,7 @@
11namespace Service { 11namespace Service {
12namespace DLP { 12namespace DLP {
13 13
14static void unk_0x000E0040(Interface* self) { 14static void IsChild(Interface* self) {
15 u32* cmd_buff = Kernel::GetCommandBuffer(); 15 u32* cmd_buff = Kernel::GetCommandBuffer();
16 16
17 cmd_buff[1] = RESULT_SUCCESS.raw; 17 cmd_buff[1] = RESULT_SUCCESS.raw;
@@ -24,14 +24,19 @@ const Interface::FunctionInfo FunctionTable[] = {
24 {0x00010183, nullptr, "Initialize"}, 24 {0x00010183, nullptr, "Initialize"},
25 {0x00020000, nullptr, "Finalize"}, 25 {0x00020000, nullptr, "Finalize"},
26 {0x00030000, nullptr, "GetServerState"}, 26 {0x00030000, nullptr, "GetServerState"},
27 {0x00040000, nullptr, "GetEventDescription"},
27 {0x00050080, nullptr, "StartAccepting"}, 28 {0x00050080, nullptr, "StartAccepting"},
29 {0x00060000, nullptr, "EndAccepting"},
28 {0x00070000, nullptr, "StartDistribution"}, 30 {0x00070000, nullptr, "StartDistribution"},
29 {0x000800C0, nullptr, "SendWirelessRebootPassphrase"}, 31 {0x000800C0, nullptr, "SendWirelessRebootPassphrase"},
30 {0x00090040, nullptr, "AcceptClient"}, 32 {0x00090040, nullptr, "AcceptClient"},
33 {0x000A0040, nullptr, "DisconnectClient"},
31 {0x000B0042, nullptr, "GetConnectingClients"}, 34 {0x000B0042, nullptr, "GetConnectingClients"},
32 {0x000C0040, nullptr, "GetClientInfo"}, 35 {0x000C0040, nullptr, "GetClientInfo"},
33 {0x000D0040, nullptr, "GetClientState"}, 36 {0x000D0040, nullptr, "GetClientState"},
34 {0x000E0040, unk_0x000E0040, "unk_0x000E0040"}, 37 {0x000E0040, IsChild, "IsChild"},
38 {0x000F0303, nullptr, "InitializeWithName"},
39 {0x00100000, nullptr, "GetDupNoticeNeed"},
35}; 40};
36 41
37DLP_SRVR_Interface::DLP_SRVR_Interface() { 42DLP_SRVR_Interface::DLP_SRVR_Interface() {
diff --git a/src/core/hle/service/dsp_dsp.cpp b/src/core/hle/service/dsp_dsp.cpp
index 7d746054f..42f8950f9 100644
--- a/src/core/hle/service/dsp_dsp.cpp
+++ b/src/core/hle/service/dsp_dsp.cpp
@@ -147,9 +147,10 @@ static void LoadComponent(Service::Interface* self) {
147 LOG_INFO(Service_DSP, "Firmware hash: %#" PRIx64, 147 LOG_INFO(Service_DSP, "Firmware hash: %#" PRIx64,
148 Common::ComputeHash64(component_data.data(), component_data.size())); 148 Common::ComputeHash64(component_data.data(), component_data.size()));
149 // Some versions of the firmware have the location of DSP structures listed here. 149 // Some versions of the firmware have the location of DSP structures listed here.
150 ASSERT(size > 0x37C); 150 if (size > 0x37C) {
151 LOG_INFO(Service_DSP, "Structures hash: %#" PRIx64, 151 LOG_INFO(Service_DSP, "Structures hash: %#" PRIx64,
152 Common::ComputeHash64(component_data.data() + 0x340, 60)); 152 Common::ComputeHash64(component_data.data() + 0x340, 60));
153 }
153 154
154 LOG_WARNING(Service_DSP, 155 LOG_WARNING(Service_DSP,
155 "(STUBBED) called size=0x%X, prog_mask=0x%08X, data_mask=0x%08X, buffer=0x%08X", 156 "(STUBBED) called size=0x%X, prog_mask=0x%08X, data_mask=0x%08X, buffer=0x%08X",
diff --git a/src/core/hle/service/fs/archive.cpp b/src/core/hle/service/fs/archive.cpp
index 033fbc9aa..4ee7df73c 100644
--- a/src/core/hle/service/fs/archive.cpp
+++ b/src/core/hle/service/fs/archive.cpp
@@ -20,6 +20,7 @@
20#include "core/file_sys/archive_savedata.h" 20#include "core/file_sys/archive_savedata.h"
21#include "core/file_sys/archive_sdmc.h" 21#include "core/file_sys/archive_sdmc.h"
22#include "core/file_sys/archive_sdmcwriteonly.h" 22#include "core/file_sys/archive_sdmcwriteonly.h"
23#include "core/file_sys/archive_selfncch.h"
23#include "core/file_sys/archive_systemsavedata.h" 24#include "core/file_sys/archive_systemsavedata.h"
24#include "core/file_sys/directory_backend.h" 25#include "core/file_sys/directory_backend.h"
25#include "core/file_sys/errors.h" 26#include "core/file_sys/errors.h"
@@ -48,7 +49,7 @@ struct hash<Service::FS::ArchiveIdCode> {
48 return std::hash<Type>()(static_cast<Type>(id_code)); 49 return std::hash<Type>()(static_cast<Type>(id_code));
49 } 50 }
50}; 51};
51} 52} // namespace std
52 53
53static constexpr Kernel::Handle INVALID_HANDLE{}; 54static constexpr Kernel::Handle INVALID_HANDLE{};
54 55
@@ -216,7 +217,7 @@ void Directory::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> serve
216 LOG_TRACE(Service_FS, "Read %s: count=%d", GetName().c_str(), count); 217 LOG_TRACE(Service_FS, "Read %s: count=%d", GetName().c_str(), count);
217 218
218 // Number of entries actually read 219 // Number of entries actually read
219 u32 read = backend->Read(entries.size(), entries.data()); 220 u32 read = backend->Read(static_cast<u32>(entries.size()), entries.data());
220 cmd_buff[2] = read; 221 cmd_buff[2] = read;
221 Memory::WriteBlock(address, entries.data(), read * sizeof(FileSys::Entry)); 222 Memory::WriteBlock(address, entries.data(), read * sizeof(FileSys::Entry));
222 break; 223 break;
@@ -564,6 +565,21 @@ void RegisterArchiveTypes() {
564 auto systemsavedata_factory = 565 auto systemsavedata_factory =
565 std::make_unique<FileSys::ArchiveFactory_SystemSaveData>(nand_directory); 566 std::make_unique<FileSys::ArchiveFactory_SystemSaveData>(nand_directory);
566 RegisterArchiveType(std::move(systemsavedata_factory), ArchiveIdCode::SystemSaveData); 567 RegisterArchiveType(std::move(systemsavedata_factory), ArchiveIdCode::SystemSaveData);
568
569 auto selfncch_factory = std::make_unique<FileSys::ArchiveFactory_SelfNCCH>();
570 RegisterArchiveType(std::move(selfncch_factory), ArchiveIdCode::SelfNCCH);
571}
572
573void RegisterSelfNCCH(Loader::AppLoader& app_loader) {
574 auto itr = id_code_map.find(ArchiveIdCode::SelfNCCH);
575 if (itr == id_code_map.end()) {
576 LOG_ERROR(Service_FS,
577 "Could not register a new NCCH because the SelfNCCH archive hasn't been created");
578 return;
579 }
580
581 auto* factory = static_cast<FileSys::ArchiveFactory_SelfNCCH*>(itr->second.get());
582 factory->Register(app_loader);
567} 583}
568 584
569void UnregisterArchiveTypes() { 585void UnregisterArchiveTypes() {
diff --git a/src/core/hle/service/fs/archive.h b/src/core/hle/service/fs/archive.h
index 3a3371c88..e3c8fc2ef 100644
--- a/src/core/hle/service/fs/archive.h
+++ b/src/core/hle/service/fs/archive.h
@@ -21,6 +21,10 @@ static constexpr char SYSTEM_ID[]{"00000000000000000000000000000000"};
21/// The scrambled SD card CID, also known as ID1 21/// The scrambled SD card CID, also known as ID1
22static constexpr char SDCARD_ID[]{"00000000000000000000000000000000"}; 22static constexpr char SDCARD_ID[]{"00000000000000000000000000000000"};
23 23
24namespace Loader {
25class AppLoader;
26}
27
24namespace Service { 28namespace Service {
25namespace FS { 29namespace FS {
26 30
@@ -259,6 +263,9 @@ void ArchiveInit();
259/// Shutdown archives 263/// Shutdown archives
260void ArchiveShutdown(); 264void ArchiveShutdown();
261 265
266/// Registers a new NCCH file with the SelfNCCH archive factory
267void RegisterSelfNCCH(Loader::AppLoader& app_loader);
268
262/// Register all archive types 269/// Register all archive types
263void RegisterArchiveTypes(); 270void RegisterArchiveTypes();
264 271
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 2014b8461..379fbd71c 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -7,8 +7,9 @@
7#include <cmath> 7#include <cmath>
8#include <memory> 8#include <memory>
9#include "common/logging/log.h" 9#include "common/logging/log.h"
10#include "core/3ds.h"
11#include "core/core.h"
10#include "core/core_timing.h" 12#include "core/core_timing.h"
11#include "core/frontend/emu_window.h"
12#include "core/frontend/input.h" 13#include "core/frontend/input.h"
13#include "core/hle/ipc.h" 14#include "core/hle/ipc.h"
14#include "core/hle/kernel/event.h" 15#include "core/hle/kernel/event.h"
@@ -18,7 +19,6 @@
18#include "core/hle/service/hid/hid_spvr.h" 19#include "core/hle/service/hid/hid_spvr.h"
19#include "core/hle/service/hid/hid_user.h" 20#include "core/hle/service/hid/hid_user.h"
20#include "core/hle/service/service.h" 21#include "core/hle/service/service.h"
21#include "video_core/video_core.h"
22 22
23namespace Service { 23namespace Service {
24namespace HID { 24namespace HID {
@@ -50,10 +50,15 @@ constexpr u64 pad_update_ticks = BASE_CLOCK_RATE_ARM11 / 234;
50constexpr u64 accelerometer_update_ticks = BASE_CLOCK_RATE_ARM11 / 104; 50constexpr u64 accelerometer_update_ticks = BASE_CLOCK_RATE_ARM11 / 104;
51constexpr u64 gyroscope_update_ticks = BASE_CLOCK_RATE_ARM11 / 101; 51constexpr u64 gyroscope_update_ticks = BASE_CLOCK_RATE_ARM11 / 101;
52 52
53constexpr float accelerometer_coef = 512.0f; // measured from hw test result
54constexpr float gyroscope_coef = 14.375f; // got from hwtest GetGyroscopeLowRawToDpsCoefficient call
55
53static std::atomic<bool> is_device_reload_pending; 56static std::atomic<bool> is_device_reload_pending;
54static std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID> 57static std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID>
55 buttons; 58 buttons;
56static std::unique_ptr<Input::AnalogDevice> circle_pad; 59static std::unique_ptr<Input::AnalogDevice> circle_pad;
60static std::unique_ptr<Input::MotionDevice> motion_device;
61static std::unique_ptr<Input::TouchDevice> touch_device;
57 62
58DirectionState GetStickDirectionState(s16 circle_pad_x, s16 circle_pad_y) { 63DirectionState GetStickDirectionState(s16 circle_pad_x, s16 circle_pad_y) {
59 // 30 degree and 60 degree are angular thresholds for directions 64 // 30 degree and 60 degree are angular thresholds for directions
@@ -90,6 +95,8 @@ static void LoadInputDevices() {
90 buttons.begin(), Input::CreateDevice<Input::ButtonDevice>); 95 buttons.begin(), Input::CreateDevice<Input::ButtonDevice>);
91 circle_pad = Input::CreateDevice<Input::AnalogDevice>( 96 circle_pad = Input::CreateDevice<Input::AnalogDevice>(
92 Settings::values.analogs[Settings::NativeAnalog::CirclePad]); 97 Settings::values.analogs[Settings::NativeAnalog::CirclePad]);
98 motion_device = Input::CreateDevice<Input::MotionDevice>(Settings::values.motion_device);
99 touch_device = Input::CreateDevice<Input::TouchDevice>(Settings::values.touch_device);
93} 100}
94 101
95static void UnloadInputDevices() { 102static void UnloadInputDevices() {
@@ -97,6 +104,8 @@ static void UnloadInputDevices() {
97 button.reset(); 104 button.reset();
98 } 105 }
99 circle_pad.reset(); 106 circle_pad.reset();
107 motion_device.reset();
108 touch_device.reset();
100} 109}
101 110
102static void UpdatePadCallback(u64 userdata, int cycles_late) { 111static void UpdatePadCallback(u64 userdata, int cycles_late) {
@@ -165,8 +174,10 @@ static void UpdatePadCallback(u64 userdata, int cycles_late) {
165 // Get the current touch entry 174 // Get the current touch entry
166 TouchDataEntry& touch_entry = mem->touch.entries[mem->touch.index]; 175 TouchDataEntry& touch_entry = mem->touch.entries[mem->touch.index];
167 bool pressed = false; 176 bool pressed = false;
168 177 float x, y;
169 std::tie(touch_entry.x, touch_entry.y, pressed) = VideoCore::g_emu_window->GetTouchState(); 178 std::tie(x, y, pressed) = touch_device->GetStatus();
179 touch_entry.x = static_cast<u16>(x * Core::kScreenBottomWidth);
180 touch_entry.y = static_cast<u16>(y * Core::kScreenBottomHeight);
170 touch_entry.valid.Assign(pressed ? 1 : 0); 181 touch_entry.valid.Assign(pressed ? 1 : 0);
171 182
172 // TODO(bunnei): We're not doing anything with offset 0xA8 + 0x18 of HID SharedMemory, which 183 // TODO(bunnei): We're not doing anything with offset 0xA8 + 0x18 of HID SharedMemory, which
@@ -193,10 +204,19 @@ static void UpdateAccelerometerCallback(u64 userdata, int cycles_late) {
193 mem->accelerometer.index = next_accelerometer_index; 204 mem->accelerometer.index = next_accelerometer_index;
194 next_accelerometer_index = (next_accelerometer_index + 1) % mem->accelerometer.entries.size(); 205 next_accelerometer_index = (next_accelerometer_index + 1) % mem->accelerometer.entries.size();
195 206
207 Math::Vec3<float> accel;
208 std::tie(accel, std::ignore) = motion_device->GetStatus();
209 accel *= accelerometer_coef;
210 // TODO(wwylele): do a time stretch like the one in UpdateGyroscopeCallback
211 // The time stretch formula should be like
212 // stretched_vector = (raw_vector - gravity) * stretch_ratio + gravity
213
196 AccelerometerDataEntry& accelerometer_entry = 214 AccelerometerDataEntry& accelerometer_entry =
197 mem->accelerometer.entries[mem->accelerometer.index]; 215 mem->accelerometer.entries[mem->accelerometer.index];
198 std::tie(accelerometer_entry.x, accelerometer_entry.y, accelerometer_entry.z) = 216
199 VideoCore::g_emu_window->GetAccelerometerState(); 217 accelerometer_entry.x = static_cast<s16>(accel.x);
218 accelerometer_entry.y = static_cast<s16>(accel.y);
219 accelerometer_entry.z = static_cast<s16>(accel.z);
200 220
201 // Make up "raw" entry 221 // Make up "raw" entry
202 // TODO(wwylele): 222 // TODO(wwylele):
@@ -227,8 +247,14 @@ static void UpdateGyroscopeCallback(u64 userdata, int cycles_late) {
227 next_gyroscope_index = (next_gyroscope_index + 1) % mem->gyroscope.entries.size(); 247 next_gyroscope_index = (next_gyroscope_index + 1) % mem->gyroscope.entries.size();
228 248
229 GyroscopeDataEntry& gyroscope_entry = mem->gyroscope.entries[mem->gyroscope.index]; 249 GyroscopeDataEntry& gyroscope_entry = mem->gyroscope.entries[mem->gyroscope.index];
230 std::tie(gyroscope_entry.x, gyroscope_entry.y, gyroscope_entry.z) = 250
231 VideoCore::g_emu_window->GetGyroscopeState(); 251 Math::Vec3<float> gyro;
252 std::tie(std::ignore, gyro) = motion_device->GetStatus();
253 double stretch = Core::System::GetInstance().perf_stats.GetLastFrameTimeScale();
254 gyro *= gyroscope_coef * static_cast<float>(stretch);
255 gyroscope_entry.x = static_cast<s16>(gyro.x);
256 gyroscope_entry.y = static_cast<s16>(gyro.y);
257 gyroscope_entry.z = static_cast<s16>(gyro.z);
232 258
233 // Make up "raw" entry 259 // Make up "raw" entry
234 mem->gyroscope.raw_entry.x = gyroscope_entry.x; 260 mem->gyroscope.raw_entry.x = gyroscope_entry.x;
@@ -326,7 +352,7 @@ void GetGyroscopeLowRawToDpsCoefficient(Service::Interface* self) {
326 352
327 cmd_buff[1] = RESULT_SUCCESS.raw; 353 cmd_buff[1] = RESULT_SUCCESS.raw;
328 354
329 f32 coef = VideoCore::g_emu_window->GetGyroscopeRawToDpsCoefficient(); 355 f32 coef = gyroscope_coef;
330 memcpy(&cmd_buff[2], &coef, 4); 356 memcpy(&cmd_buff[2], &coef, 4);
331} 357}
332 358
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index 1ef972e70..ef25926b5 100644
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -24,7 +24,7 @@ namespace HID {
24 */ 24 */
25struct PadState { 25struct PadState {
26 union { 26 union {
27 u32 hex; 27 u32 hex{};
28 28
29 BitField<0, 1, u32> a; 29 BitField<0, 1, u32> a;
30 BitField<1, 1, u32> b; 30 BitField<1, 1, u32> b;
diff --git a/src/core/hle/service/ir/ir_rst.cpp b/src/core/hle/service/ir/ir_rst.cpp
index 837413f93..0912d5756 100644
--- a/src/core/hle/service/ir/ir_rst.cpp
+++ b/src/core/hle/service/ir/ir_rst.cpp
@@ -18,7 +18,7 @@ namespace Service {
18namespace IR { 18namespace IR {
19 19
20union PadState { 20union PadState {
21 u32_le hex; 21 u32_le hex{};
22 22
23 BitField<14, 1, u32_le> zl; 23 BitField<14, 1, u32_le> zl;
24 BitField<15, 1, u32_le> zr; 24 BitField<15, 1, u32_le> zr;
diff --git a/src/core/hle/service/ldr_ro/cro_helper.h b/src/core/hle/service/ldr_ro/cro_helper.h
index 3bc10dbdc..57b4fb6df 100644
--- a/src/core/hle/service/ldr_ro/cro_helper.h
+++ b/src/core/hle/service/ldr_ro/cro_helper.h
@@ -413,7 +413,8 @@ private:
413 */ 413 */
414 template <typename T> 414 template <typename T>
415 void GetEntry(std::size_t index, T& data) const { 415 void GetEntry(std::size_t index, T& data) const {
416 Memory::ReadBlock(GetField(T::TABLE_OFFSET_FIELD) + index * sizeof(T), &data, sizeof(T)); 416 Memory::ReadBlock(GetField(T::TABLE_OFFSET_FIELD) + static_cast<u32>(index * sizeof(T)),
417 &data, sizeof(T));
417 } 418 }
418 419
419 /** 420 /**
@@ -425,7 +426,8 @@ private:
425 */ 426 */
426 template <typename T> 427 template <typename T>
427 void SetEntry(std::size_t index, const T& data) { 428 void SetEntry(std::size_t index, const T& data) {
428 Memory::WriteBlock(GetField(T::TABLE_OFFSET_FIELD) + index * sizeof(T), &data, sizeof(T)); 429 Memory::WriteBlock(GetField(T::TABLE_OFFSET_FIELD) + static_cast<u32>(index * sizeof(T)),
430 &data, sizeof(T));
429 } 431 }
430 432
431 /** 433 /**
diff --git a/src/core/hle/service/nim/nim.cpp b/src/core/hle/service/nim/nim.cpp
index d5624fe54..b10d5852b 100644
--- a/src/core/hle/service/nim/nim.cpp
+++ b/src/core/hle/service/nim/nim.cpp
@@ -5,6 +5,8 @@
5#include "common/common_types.h" 5#include "common/common_types.h"
6#include "common/logging/log.h" 6#include "common/logging/log.h"
7#include "core/hle/ipc.h" 7#include "core/hle/ipc.h"
8#include "core/hle/ipc_helpers.h"
9#include "core/hle/kernel/event.h"
8#include "core/hle/service/nim/nim.h" 10#include "core/hle/service/nim/nim.h"
9#include "core/hle/service/nim/nim_aoc.h" 11#include "core/hle/service/nim/nim_aoc.h"
10#include "core/hle/service/nim/nim_s.h" 12#include "core/hle/service/nim/nim_s.h"
@@ -14,6 +16,16 @@
14namespace Service { 16namespace Service {
15namespace NIM { 17namespace NIM {
16 18
19static Kernel::SharedPtr<Kernel::Event> nim_system_update_event;
20
21void CheckForSysUpdateEvent(Service::Interface* self) {
22 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x5, 0, 0); // 0x50000
23 IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
24 rb.Push(RESULT_SUCCESS);
25 rb.PushCopyHandles(Kernel::g_handle_table.Create(nim_system_update_event).Unwrap());
26 LOG_TRACE(Service_NIM, "called");
27}
28
17void CheckSysUpdateAvailable(Service::Interface* self) { 29void CheckSysUpdateAvailable(Service::Interface* self) {
18 u32* cmd_buff = Kernel::GetCommandBuffer(); 30 u32* cmd_buff = Kernel::GetCommandBuffer();
19 31
@@ -29,9 +41,13 @@ void Init() {
29 AddService(new NIM_AOC_Interface); 41 AddService(new NIM_AOC_Interface);
30 AddService(new NIM_S_Interface); 42 AddService(new NIM_S_Interface);
31 AddService(new NIM_U_Interface); 43 AddService(new NIM_U_Interface);
44
45 nim_system_update_event = Kernel::Event::Create(ResetType::OneShot, "NIM System Update Event");
32} 46}
33 47
34void Shutdown() {} 48void Shutdown() {
49 nim_system_update_event = nullptr;
50}
35 51
36} // namespace NIM 52} // namespace NIM
37 53
diff --git a/src/core/hle/service/nim/nim.h b/src/core/hle/service/nim/nim.h
index c3106f18b..dbf605e5a 100644
--- a/src/core/hle/service/nim/nim.h
+++ b/src/core/hle/service/nim/nim.h
@@ -11,6 +11,17 @@ class Interface;
11namespace NIM { 11namespace NIM {
12 12
13/** 13/**
14 * NIM::CheckForSysUpdateEvent service function
15 * Inputs:
16 * 1 : None
17 * Outputs:
18 * 1 : Result of function, 0 on success, otherwise error code
19 * 2 : Copy handle descriptor
20 * 3 : System Update event handle
21 */
22void CheckForSysUpdateEvent(Service::Interface* self);
23
24/**
14 * NIM::CheckSysUpdateAvailable service function 25 * NIM::CheckSysUpdateAvailable service function
15 * Inputs: 26 * Inputs:
16 * 1 : None 27 * 1 : None
diff --git a/src/core/hle/service/nim/nim_u.cpp b/src/core/hle/service/nim/nim_u.cpp
index 7664bad60..569660278 100644
--- a/src/core/hle/service/nim/nim_u.cpp
+++ b/src/core/hle/service/nim/nim_u.cpp
@@ -12,7 +12,7 @@ const Interface::FunctionInfo FunctionTable[] = {
12 {0x00010000, nullptr, "StartSysUpdate"}, 12 {0x00010000, nullptr, "StartSysUpdate"},
13 {0x00020000, nullptr, "GetUpdateDownloadProgress"}, 13 {0x00020000, nullptr, "GetUpdateDownloadProgress"},
14 {0x00040000, nullptr, "FinishTitlesInstall"}, 14 {0x00040000, nullptr, "FinishTitlesInstall"},
15 {0x00050000, nullptr, "CheckForSysUpdateEvent"}, 15 {0x00050000, CheckForSysUpdateEvent, "CheckForSysUpdateEvent"},
16 {0x00090000, CheckSysUpdateAvailable, "CheckSysUpdateAvailable"}, 16 {0x00090000, CheckSysUpdateAvailable, "CheckSysUpdateAvailable"},
17 {0x000A0000, nullptr, "GetState"}, 17 {0x000A0000, nullptr, "GetState"},
18 {0x000B0000, nullptr, "GetSystemTitleHash"}, 18 {0x000B0000, nullptr, "GetSystemTitleHash"},
diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp
new file mode 100644
index 000000000..9e19c38bf
--- /dev/null
+++ b/src/core/hle/service/ns/ns.cpp
@@ -0,0 +1,16 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "core/hle/service/ns/ns.h"
6#include "core/hle/service/ns/ns_s.h"
7
8namespace Service {
9namespace NS {
10
11void InstallInterfaces(SM::ServiceManager& service_manager) {
12 std::make_shared<NS_S>()->InstallAsService(service_manager);
13}
14
15} // namespace NS
16} // namespace Service
diff --git a/src/core/hle/service/ns/ns.h b/src/core/hle/service/ns/ns.h
new file mode 100644
index 000000000..c3d67d98c
--- /dev/null
+++ b/src/core/hle/service/ns/ns.h
@@ -0,0 +1,16 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include "core/hle/service/service.h"
8
9namespace Service {
10namespace NS {
11
12/// Registers all NS services with the specified service manager.
13void InstallInterfaces(SM::ServiceManager& service_manager);
14
15} // namespace NS
16} // namespace Service
diff --git a/src/core/hle/service/ns/ns_s.cpp b/src/core/hle/service/ns/ns_s.cpp
new file mode 100644
index 000000000..d952888dc
--- /dev/null
+++ b/src/core/hle/service/ns/ns_s.cpp
@@ -0,0 +1,34 @@
1// Copyright 2015 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "core/hle/service/ns/ns_s.h"
6
7namespace Service {
8namespace NS {
9
10NS_S::NS_S() : ServiceFramework("ns:s", 2) {
11 static const FunctionInfo functions[] = {
12 {0x000100C0, nullptr, "LaunchFIRM"},
13 {0x000200C0, nullptr, "LaunchTitle"},
14 {0x00030000, nullptr, "TerminateApplication"},
15 {0x00040040, nullptr, "TerminateProcess"},
16 {0x000500C0, nullptr, "LaunchApplicationFIRM"},
17 {0x00060042, nullptr, "SetFIRMParams4A0"},
18 {0x00070042, nullptr, "CardUpdateInitialize"},
19 {0x00080000, nullptr, "CardUpdateShutdown"},
20 {0x000D0140, nullptr, "SetTWLBannerHMAC"},
21 {0x000E0000, nullptr, "ShutdownAsync"},
22 {0x00100180, nullptr, "RebootSystem"},
23 {0x00110100, nullptr, "TerminateTitle"},
24 {0x001200C0, nullptr, "SetApplicationCpuTimeLimit"},
25 {0x00150140, nullptr, "LaunchApplication"},
26 {0x00160000, nullptr, "RebootSystemClean"},
27 };
28 RegisterHandlers(functions);
29}
30
31NS_S::~NS_S() = default;
32
33} // namespace NS
34} // namespace Service
diff --git a/src/core/hle/service/ns_s.h b/src/core/hle/service/ns/ns_s.h
index 90288a521..660ae453f 100644
--- a/src/core/hle/service/ns_s.h
+++ b/src/core/hle/service/ns/ns_s.h
@@ -4,18 +4,17 @@
4 4
5#pragma once 5#pragma once
6 6
7#include "core/hle/kernel/kernel.h"
7#include "core/hle/service/service.h" 8#include "core/hle/service/service.h"
8 9
9namespace Service { 10namespace Service {
10namespace NS { 11namespace NS {
11 12
12class NS_S final : public Interface { 13/// Interface to "ns:s" service
14class NS_S final : public ServiceFramework<NS_S> {
13public: 15public:
14 NS_S(); 16 NS_S();
15 17 ~NS_S();
16 std::string GetPortName() const override {
17 return "ns:s";
18 }
19}; 18};
20 19
21} // namespace NS 20} // namespace NS
diff --git a/src/core/hle/service/ns_s.cpp b/src/core/hle/service/ns_s.cpp
deleted file mode 100644
index 215c9aacc..000000000
--- a/src/core/hle/service/ns_s.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
1// Copyright 2015 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "core/hle/service/ns_s.h"
6
7namespace Service {
8namespace NS {
9
10const Interface::FunctionInfo FunctionTable[] = {
11 {0x000100C0, nullptr, "LaunchFIRM"},
12 {0x000200C0, nullptr, "LaunchTitle"},
13 {0x00030000, nullptr, "TerminateApplication"},
14 {0x00040040, nullptr, "TerminateProcess"},
15 {0x000500C0, nullptr, "LaunchApplicationFIRM"},
16 {0x00060042, nullptr, "SetFIRMParams4A0"},
17 {0x00070042, nullptr, "CardUpdateInitialize"},
18 {0x00080000, nullptr, "CardUpdateShutdown"},
19 {0x000D0140, nullptr, "SetTWLBannerHMAC"},
20 {0x000E0000, nullptr, "ShutdownAsync"},
21 {0x00100180, nullptr, "RebootSystem"},
22 {0x00110100, nullptr, "TerminateTitle"},
23 {0x001200C0, nullptr, "SetApplicationCpuTimeLimit"},
24 {0x00150140, nullptr, "LaunchApplication"},
25 {0x00160000, nullptr, "RebootSystemClean"},
26};
27
28NS_S::NS_S() {
29 Register(FunctionTable);
30}
31
32} // namespace NS
33} // namespace Service
diff --git a/src/core/hle/service/nwm/nwm_uds.cpp b/src/core/hle/service/nwm/nwm_uds.cpp
index 6dbdff044..87a6b0eca 100644
--- a/src/core/hle/service/nwm/nwm_uds.cpp
+++ b/src/core/hle/service/nwm/nwm_uds.cpp
@@ -2,8 +2,11 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <algorithm>
5#include <array> 6#include <array>
6#include <cstring> 7#include <cstring>
8#include <list>
9#include <mutex>
7#include <unordered_map> 10#include <unordered_map>
8#include <vector> 11#include <vector>
9#include "common/common_types.h" 12#include "common/common_types.h"
@@ -12,11 +15,14 @@
12#include "core/hle/ipc_helpers.h" 15#include "core/hle/ipc_helpers.h"
13#include "core/hle/kernel/event.h" 16#include "core/hle/kernel/event.h"
14#include "core/hle/kernel/shared_memory.h" 17#include "core/hle/kernel/shared_memory.h"
18#include "core/hle/lock.h"
15#include "core/hle/result.h" 19#include "core/hle/result.h"
16#include "core/hle/service/nwm/nwm_uds.h" 20#include "core/hle/service/nwm/nwm_uds.h"
17#include "core/hle/service/nwm/uds_beacon.h" 21#include "core/hle/service/nwm/uds_beacon.h"
22#include "core/hle/service/nwm/uds_connection.h"
18#include "core/hle/service/nwm/uds_data.h" 23#include "core/hle/service/nwm/uds_data.h"
19#include "core/memory.h" 24#include "core/memory.h"
25#include "network/network.h"
20 26
21namespace Service { 27namespace Service {
22namespace NWM { 28namespace NWM {
@@ -34,9 +40,12 @@ static ConnectionStatus connection_status{};
34/* Node information about the current network. 40/* Node information about the current network.
35 * The amount of elements in this vector is always the maximum number 41 * The amount of elements in this vector is always the maximum number
36 * of nodes specified in the network configuration. 42 * of nodes specified in the network configuration.
37 * The first node is always the host, so this always contains at least 1 entry. 43 * The first node is always the host.
38 */ 44 */
39static NodeList node_info(1); 45static NodeList node_info;
46
47// Node information about our own system.
48static NodeInfo current_node;
40 49
41// Mapping of bind node ids to their respective events. 50// Mapping of bind node ids to their respective events.
42static std::unordered_map<u32, Kernel::SharedPtr<Kernel::Event>> bind_node_events; 51static std::unordered_map<u32, Kernel::SharedPtr<Kernel::Event>> bind_node_events;
@@ -51,6 +60,298 @@ static NetworkInfo network_info;
51// Event that will generate and send the 802.11 beacon frames. 60// Event that will generate and send the 802.11 beacon frames.
52static int beacon_broadcast_event; 61static int beacon_broadcast_event;
53 62
63// Mutex to synchronize access to the connection status between the emulation thread and the
64// network thread.
65static std::mutex connection_status_mutex;
66
67// Mutex to synchronize access to the list of received beacons between the emulation thread and the
68// network thread.
69static std::mutex beacon_mutex;
70
71// Number of beacons to store before we start dropping the old ones.
72// TODO(Subv): Find a more accurate value for this limit.
73constexpr size_t MaxBeaconFrames = 15;
74
75// List of the last <MaxBeaconFrames> beacons received from the network.
76static std::list<Network::WifiPacket> received_beacons;
77
78/**
79 * Returns a list of received 802.11 beacon frames from the specified sender since the last call.
80 */
81std::list<Network::WifiPacket> GetReceivedBeacons(const MacAddress& sender) {
82 std::lock_guard<std::mutex> lock(beacon_mutex);
83 if (sender != Network::BroadcastMac) {
84 std::list<Network::WifiPacket> filtered_list;
85 const auto beacon = std::find_if(received_beacons.begin(), received_beacons.end(),
86 [&sender](const Network::WifiPacket& packet) {
87 return packet.transmitter_address == sender;
88 });
89 if (beacon != received_beacons.end()) {
90 filtered_list.push_back(*beacon);
91 // TODO(B3N30): Check if the complete deque is cleared or just the fetched entries
92 received_beacons.erase(beacon);
93 }
94 return filtered_list;
95 }
96 return std::move(received_beacons);
97}
98
99/// Sends a WifiPacket to the room we're currently connected to.
100void SendPacket(Network::WifiPacket& packet) {
101 // TODO(Subv): Implement.
102}
103
104/*
105 * Returns an available index in the nodes array for the
106 * currently-hosted UDS network.
107 */
108static u16 GetNextAvailableNodeId() {
109 for (u16 index = 0; index < connection_status.max_nodes; ++index) {
110 if ((connection_status.node_bitmask & (1 << index)) == 0)
111 return index;
112 }
113
114 // Any connection attempts to an already full network should have been refused.
115 ASSERT_MSG(false, "No available connection slots in the network");
116}
117
118// Inserts the received beacon frame in the beacon queue and removes any older beacons if the size
119// limit is exceeded.
120void HandleBeaconFrame(const Network::WifiPacket& packet) {
121 std::lock_guard<std::mutex> lock(beacon_mutex);
122 const auto unique_beacon =
123 std::find_if(received_beacons.begin(), received_beacons.end(),
124 [&packet](const Network::WifiPacket& new_packet) {
125 return new_packet.transmitter_address == packet.transmitter_address;
126 });
127 if (unique_beacon != received_beacons.end()) {
128 // We already have a beacon from the same mac in the deque, remove the old one;
129 received_beacons.erase(unique_beacon);
130 }
131
132 received_beacons.emplace_back(packet);
133
134 // Discard old beacons if the buffer is full.
135 if (received_beacons.size() > MaxBeaconFrames)
136 received_beacons.pop_front();
137}
138
139void HandleAssociationResponseFrame(const Network::WifiPacket& packet) {
140 auto assoc_result = GetAssociationResult(packet.data);
141
142 ASSERT_MSG(std::get<AssocStatus>(assoc_result) == AssocStatus::Successful,
143 "Could not join network");
144 {
145 std::lock_guard<std::mutex> lock(connection_status_mutex);
146 ASSERT(connection_status.status == static_cast<u32>(NetworkStatus::Connecting));
147 }
148
149 // Send the EAPoL-Start packet to the server.
150 using Network::WifiPacket;
151 WifiPacket eapol_start;
152 eapol_start.channel = network_channel;
153 eapol_start.data = GenerateEAPoLStartFrame(std::get<u16>(assoc_result), current_node);
154 // TODO(B3N30): Encrypt the packet.
155 eapol_start.destination_address = packet.transmitter_address;
156 eapol_start.type = WifiPacket::PacketType::Data;
157
158 SendPacket(eapol_start);
159}
160
161static void HandleEAPoLPacket(const Network::WifiPacket& packet) {
162 std::lock_guard<std::mutex> lock(connection_status_mutex);
163
164 if (GetEAPoLFrameType(packet.data) == EAPoLStartMagic) {
165 if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) {
166 LOG_DEBUG(Service_NWM, "Connection sequence aborted, because connection status is %u",
167 connection_status.status);
168 return;
169 }
170
171 auto node = DeserializeNodeInfoFromFrame(packet.data);
172
173 if (connection_status.max_nodes == connection_status.total_nodes) {
174 // Reject connection attempt
175 LOG_ERROR(Service_NWM, "Reached maximum nodes, but reject packet wasn't sent.");
176 // TODO(B3N30): Figure out what packet is sent here
177 return;
178 }
179
180 // Get an unused network node id
181 u16 node_id = GetNextAvailableNodeId();
182 node.network_node_id = node_id + 1;
183
184 connection_status.node_bitmask |= 1 << node_id;
185 connection_status.changed_nodes |= 1 << node_id;
186 connection_status.nodes[node_id] = node.network_node_id;
187 connection_status.total_nodes++;
188
189 u8 current_nodes = network_info.total_nodes;
190 node_info[current_nodes] = node;
191
192 network_info.total_nodes++;
193
194 // Send the EAPoL-Logoff packet.
195 using Network::WifiPacket;
196 WifiPacket eapol_logoff;
197 eapol_logoff.channel = network_channel;
198 eapol_logoff.data =
199 GenerateEAPoLLogoffFrame(packet.transmitter_address, node.network_node_id, node_info,
200 network_info.max_nodes, network_info.total_nodes);
201 // TODO(Subv): Encrypt the packet.
202 eapol_logoff.destination_address = packet.transmitter_address;
203 eapol_logoff.type = WifiPacket::PacketType::Data;
204
205 SendPacket(eapol_logoff);
206 // TODO(B3N30): Broadcast updated node list
207 // The 3ds does this presumably to support spectators.
208 std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
209 connection_status_event->Signal();
210 } else {
211 if (connection_status.status != static_cast<u32>(NetworkStatus::NotConnected)) {
212 LOG_DEBUG(Service_NWM, "Connection sequence aborted, because connection status is %u",
213 connection_status.status);
214 return;
215 }
216 auto logoff = ParseEAPoLLogoffFrame(packet.data);
217
218 network_info.total_nodes = logoff.connected_nodes;
219 network_info.max_nodes = logoff.max_nodes;
220
221 connection_status.network_node_id = logoff.assigned_node_id;
222 connection_status.total_nodes = logoff.connected_nodes;
223 connection_status.max_nodes = logoff.max_nodes;
224
225 node_info.clear();
226 node_info.reserve(network_info.max_nodes);
227 for (size_t index = 0; index < logoff.connected_nodes; ++index) {
228 connection_status.node_bitmask |= 1 << index;
229 connection_status.changed_nodes |= 1 << index;
230 connection_status.nodes[index] = logoff.nodes[index].network_node_id;
231
232 node_info.emplace_back(DeserializeNodeInfo(logoff.nodes[index]));
233 }
234
235 // We're now connected, signal the application
236 connection_status.status = static_cast<u32>(NetworkStatus::ConnectedAsClient);
237 // Some games require ConnectToNetwork to block, for now it doesn't
238 // If blocking is implemented this lock needs to be changed,
239 // otherwise it might cause deadlocks
240 std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
241 connection_status_event->Signal();
242 }
243}
244
245/*
246 * Start a connection sequence with an UDS server. The sequence starts by sending an 802.11
247 * authentication frame with SEQ1.
248 */
249void StartConnectionSequence(const MacAddress& server) {
250 using Network::WifiPacket;
251 WifiPacket auth_request;
252 {
253 std::lock_guard<std::mutex> lock(connection_status_mutex);
254 ASSERT(connection_status.status == static_cast<u32>(NetworkStatus::NotConnected));
255
256 // TODO(Subv): Handle timeout.
257
258 // Send an authentication frame with SEQ1
259 auth_request.channel = network_channel;
260 auth_request.data = GenerateAuthenticationFrame(AuthenticationSeq::SEQ1);
261 auth_request.destination_address = server;
262 auth_request.type = WifiPacket::PacketType::Authentication;
263 }
264
265 SendPacket(auth_request);
266}
267
268/// Sends an Association Response frame to the specified mac address
269void SendAssociationResponseFrame(const MacAddress& address) {
270 using Network::WifiPacket;
271 WifiPacket assoc_response;
272
273 {
274 std::lock_guard<std::mutex> lock(connection_status_mutex);
275 if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) {
276 LOG_ERROR(Service_NWM, "Connection sequence aborted, because connection status is %u",
277 connection_status.status);
278 return;
279 }
280
281 assoc_response.channel = network_channel;
282 // TODO(Subv): This will cause multiple clients to end up with the same association id, but
283 // we're not using that for anything.
284 u16 association_id = 1;
285 assoc_response.data = GenerateAssocResponseFrame(AssocStatus::Successful, association_id,
286 network_info.network_id);
287 assoc_response.destination_address = address;
288 assoc_response.type = WifiPacket::PacketType::AssociationResponse;
289 }
290
291 SendPacket(assoc_response);
292}
293
294/*
295 * Handles the authentication request frame and sends the authentication response and association
296 * response frames. Once an Authentication frame with SEQ1 is received by the server, it responds
297 * with an Authentication frame containing SEQ2, and immediately sends an Association response frame
298 * containing the details of the access point and the assigned association id for the new client.
299 */
300void HandleAuthenticationFrame(const Network::WifiPacket& packet) {
301 // Only the SEQ1 auth frame is handled here, the SEQ2 frame doesn't need any special behavior
302 if (GetAuthenticationSeqNumber(packet.data) == AuthenticationSeq::SEQ1) {
303 using Network::WifiPacket;
304 WifiPacket auth_request;
305 {
306 std::lock_guard<std::mutex> lock(connection_status_mutex);
307 if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) {
308 LOG_ERROR(Service_NWM,
309 "Connection sequence aborted, because connection status is %u",
310 connection_status.status);
311 return;
312 }
313
314 // Respond with an authentication response frame with SEQ2
315 auth_request.channel = network_channel;
316 auth_request.data = GenerateAuthenticationFrame(AuthenticationSeq::SEQ2);
317 auth_request.destination_address = packet.transmitter_address;
318 auth_request.type = WifiPacket::PacketType::Authentication;
319 }
320 SendPacket(auth_request);
321
322 SendAssociationResponseFrame(packet.transmitter_address);
323 }
324}
325
326static void HandleDataFrame(const Network::WifiPacket& packet) {
327 switch (GetFrameEtherType(packet.data)) {
328 case EtherType::EAPoL:
329 HandleEAPoLPacket(packet);
330 break;
331 case EtherType::SecureData:
332 // TODO(B3N30): Handle SecureData packets
333 break;
334 }
335}
336
337/// Callback to parse and handle a received wifi packet.
338void OnWifiPacketReceived(const Network::WifiPacket& packet) {
339 switch (packet.type) {
340 case Network::WifiPacket::PacketType::Beacon:
341 HandleBeaconFrame(packet);
342 break;
343 case Network::WifiPacket::PacketType::Authentication:
344 HandleAuthenticationFrame(packet);
345 break;
346 case Network::WifiPacket::PacketType::AssociationResponse:
347 HandleAssociationResponseFrame(packet);
348 break;
349 case Network::WifiPacket::PacketType::Data:
350 HandleDataFrame(packet);
351 break;
352 }
353}
354
54/** 355/**
55 * NWM_UDS::Shutdown service function 356 * NWM_UDS::Shutdown service function
56 * Inputs: 357 * Inputs:
@@ -111,11 +412,10 @@ static void RecvBeaconBroadcastData(Interface* self) {
111 u32 total_size = sizeof(BeaconDataReplyHeader); 412 u32 total_size = sizeof(BeaconDataReplyHeader);
112 413
113 // Retrieve all beacon frames that were received from the desired mac address. 414 // Retrieve all beacon frames that were received from the desired mac address.
114 std::deque<WifiPacket> beacons = 415 auto beacons = GetReceivedBeacons(mac_address);
115 GetReceivedPackets(WifiPacket::PacketType::Beacon, mac_address);
116 416
117 BeaconDataReplyHeader data_reply_header{}; 417 BeaconDataReplyHeader data_reply_header{};
118 data_reply_header.total_entries = beacons.size(); 418 data_reply_header.total_entries = static_cast<u32>(beacons.size());
119 data_reply_header.max_output_size = out_buffer_size; 419 data_reply_header.max_output_size = out_buffer_size;
120 420
121 Memory::WriteBlock(current_buffer_pos, &data_reply_header, sizeof(BeaconDataReplyHeader)); 421 Memory::WriteBlock(current_buffer_pos, &data_reply_header, sizeof(BeaconDataReplyHeader));
@@ -125,8 +425,8 @@ static void RecvBeaconBroadcastData(Interface* self) {
125 for (const auto& beacon : beacons) { 425 for (const auto& beacon : beacons) {
126 BeaconEntryHeader entry{}; 426 BeaconEntryHeader entry{};
127 // TODO(Subv): Figure out what this size is used for. 427 // TODO(Subv): Figure out what this size is used for.
128 entry.unk_size = sizeof(BeaconEntryHeader) + beacon.data.size(); 428 entry.unk_size = static_cast<u32>(sizeof(BeaconEntryHeader) + beacon.data.size());
129 entry.total_size = sizeof(BeaconEntryHeader) + beacon.data.size(); 429 entry.total_size = static_cast<u32>(sizeof(BeaconEntryHeader) + beacon.data.size());
130 entry.wifi_channel = beacon.channel; 430 entry.wifi_channel = beacon.channel;
131 entry.header_size = sizeof(BeaconEntryHeader); 431 entry.header_size = sizeof(BeaconEntryHeader);
132 entry.mac_address = beacon.transmitter_address; 432 entry.mac_address = beacon.transmitter_address;
@@ -137,9 +437,9 @@ static void RecvBeaconBroadcastData(Interface* self) {
137 current_buffer_pos += sizeof(BeaconEntryHeader); 437 current_buffer_pos += sizeof(BeaconEntryHeader);
138 438
139 Memory::WriteBlock(current_buffer_pos, beacon.data.data(), beacon.data.size()); 439 Memory::WriteBlock(current_buffer_pos, beacon.data.data(), beacon.data.size());
140 current_buffer_pos += beacon.data.size(); 440 current_buffer_pos += static_cast<VAddr>(beacon.data.size());
141 441
142 total_size += sizeof(BeaconEntryHeader) + beacon.data.size(); 442 total_size += static_cast<u32>(sizeof(BeaconEntryHeader) + beacon.data.size());
143 } 443 }
144 444
145 // Update the total size in the structure and write it to the buffer again. 445 // Update the total size in the structure and write it to the buffer again.
@@ -174,7 +474,7 @@ static void InitializeWithVersion(Interface* self) {
174 u32 sharedmem_size = rp.Pop<u32>(); 474 u32 sharedmem_size = rp.Pop<u32>();
175 475
176 // Update the node information with the data the game gave us. 476 // Update the node information with the data the game gave us.
177 rp.PopRaw(node_info[0]); 477 rp.PopRaw(current_node);
178 478
179 u16 version = rp.Pop<u16>(); 479 u16 version = rp.Pop<u16>();
180 480
@@ -184,15 +484,22 @@ static void InitializeWithVersion(Interface* self) {
184 484
185 ASSERT_MSG(recv_buffer_memory->size == sharedmem_size, "Invalid shared memory size."); 485 ASSERT_MSG(recv_buffer_memory->size == sharedmem_size, "Invalid shared memory size.");
186 486
187 // Reset the connection status, it contains all zeros after initialization, 487 {
188 // except for the actual status value. 488 std::lock_guard<std::mutex> lock(connection_status_mutex);
189 connection_status = {}; 489
190 connection_status.status = static_cast<u32>(NetworkStatus::NotConnected); 490 // Reset the connection status, it contains all zeros after initialization,
491 // except for the actual status value.
492 connection_status = {};
493 connection_status.status = static_cast<u32>(NetworkStatus::NotConnected);
494 }
191 495
192 IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); 496 IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
193 rb.Push(RESULT_SUCCESS); 497 rb.Push(RESULT_SUCCESS);
194 rb.PushCopyHandles(Kernel::g_handle_table.Create(connection_status_event).Unwrap()); 498 rb.PushCopyHandles(Kernel::g_handle_table.Create(connection_status_event).Unwrap());
195 499
500 // TODO(Subv): Connect the OnWifiPacketReceived function to the wifi packet received callback of
501 // the room we're currently in.
502
196 LOG_DEBUG(Service_NWM, "called sharedmem_size=0x%08X, version=0x%08X, sharedmem_handle=0x%08X", 503 LOG_DEBUG(Service_NWM, "called sharedmem_size=0x%08X, version=0x%08X, sharedmem_handle=0x%08X",
197 sharedmem_size, version, sharedmem_handle); 504 sharedmem_size, version, sharedmem_handle);
198} 505}
@@ -214,12 +521,16 @@ static void GetConnectionStatus(Interface* self) {
214 IPC::RequestBuilder rb = rp.MakeBuilder(13, 0); 521 IPC::RequestBuilder rb = rp.MakeBuilder(13, 0);
215 522
216 rb.Push(RESULT_SUCCESS); 523 rb.Push(RESULT_SUCCESS);
217 rb.PushRaw(connection_status); 524 {
218 525 std::lock_guard<std::mutex> lock(connection_status_mutex);
219 // Reset the bitmask of changed nodes after each call to this 526 rb.PushRaw(connection_status);
220 // function to prevent falsely informing games of outstanding 527
221 // changes in subsequent calls. 528 // Reset the bitmask of changed nodes after each call to this
222 connection_status.changed_nodes = 0; 529 // function to prevent falsely informing games of outstanding
530 // changes in subsequent calls.
531 // TODO(Subv): Find exactly where the NWM module resets this value.
532 connection_status.changed_nodes = 0;
533 }
223 534
224 LOG_DEBUG(Service_NWM, "called"); 535 LOG_DEBUG(Service_NWM, "called");
225} 536}
@@ -300,31 +611,36 @@ static void BeginHostingNetwork(Interface* self) {
300 // The real UDS module throws a fatal error if this assert fails. 611 // The real UDS module throws a fatal error if this assert fails.
301 ASSERT_MSG(network_info.max_nodes > 1, "Trying to host a network of only one member."); 612 ASSERT_MSG(network_info.max_nodes > 1, "Trying to host a network of only one member.");
302 613
303 connection_status.status = static_cast<u32>(NetworkStatus::ConnectedAsHost); 614 {
304 615 std::lock_guard<std::mutex> lock(connection_status_mutex);
305 // Ensure the application data size is less than the maximum value. 616 connection_status.status = static_cast<u32>(NetworkStatus::ConnectedAsHost);
306 ASSERT_MSG(network_info.application_data_size <= ApplicationDataSize, "Data size is too big."); 617
307 618 // Ensure the application data size is less than the maximum value.
308 // Set up basic information for this network. 619 ASSERT_MSG(network_info.application_data_size <= ApplicationDataSize,
309 network_info.oui_value = NintendoOUI; 620 "Data size is too big.");
310 network_info.oui_type = static_cast<u8>(NintendoTagId::NetworkInfo); 621
311 622 // Set up basic information for this network.
312 connection_status.max_nodes = network_info.max_nodes; 623 network_info.oui_value = NintendoOUI;
313 624 network_info.oui_type = static_cast<u8>(NintendoTagId::NetworkInfo);
314 // Resize the nodes list to hold max_nodes. 625
315 node_info.resize(network_info.max_nodes); 626 connection_status.max_nodes = network_info.max_nodes;
316 627
317 // There's currently only one node in the network (the host). 628 // Resize the nodes list to hold max_nodes.
318 connection_status.total_nodes = 1; 629 node_info.resize(network_info.max_nodes);
319 network_info.total_nodes = 1; 630
320 // The host is always the first node 631 // There's currently only one node in the network (the host).
321 connection_status.network_node_id = 1; 632 connection_status.total_nodes = 1;
322 node_info[0].network_node_id = 1; 633 network_info.total_nodes = 1;
323 connection_status.nodes[0] = connection_status.network_node_id; 634 // The host is always the first node
324 // Set the bit 0 in the nodes bitmask to indicate that node 1 is already taken. 635 connection_status.network_node_id = 1;
325 connection_status.node_bitmask |= 1; 636 current_node.network_node_id = 1;
326 // Notify the application that the first node was set. 637 connection_status.nodes[0] = connection_status.network_node_id;
327 connection_status.changed_nodes |= 1; 638 // Set the bit 0 in the nodes bitmask to indicate that node 1 is already taken.
639 connection_status.node_bitmask |= 1;
640 // Notify the application that the first node was set.
641 connection_status.changed_nodes |= 1;
642 node_info[0] = current_node;
643 }
328 644
329 // If the game has a preferred channel, use that instead. 645 // If the game has a preferred channel, use that instead.
330 if (network_info.channel != 0) 646 if (network_info.channel != 0)
@@ -361,9 +677,13 @@ static void DestroyNetwork(Interface* self) {
361 // Unschedule the beacon broadcast event. 677 // Unschedule the beacon broadcast event.
362 CoreTiming::UnscheduleEvent(beacon_broadcast_event, 0); 678 CoreTiming::UnscheduleEvent(beacon_broadcast_event, 0);
363 679
364 // TODO(Subv): Check if connection_status is indeed reset after this call. 680 {
365 connection_status = {}; 681 std::lock_guard<std::mutex> lock(connection_status_mutex);
366 connection_status.status = static_cast<u8>(NetworkStatus::NotConnected); 682
683 // TODO(Subv): Check if connection_status is indeed reset after this call.
684 connection_status = {};
685 connection_status.status = static_cast<u8>(NetworkStatus::NotConnected);
686 }
367 connection_status_event->Signal(); 687 connection_status_event->Signal();
368 688
369 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); 689 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
@@ -406,17 +726,24 @@ static void SendTo(Interface* self) {
406 726
407 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); 727 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
408 728
409 if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsClient) && 729 u16 network_node_id;
410 connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) {
411 rb.Push(ResultCode(ErrorDescription::NotAuthorized, ErrorModule::UDS,
412 ErrorSummary::InvalidState, ErrorLevel::Status));
413 return;
414 }
415 730
416 if (dest_node_id == connection_status.network_node_id) { 731 {
417 rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::UDS, 732 std::lock_guard<std::mutex> lock(connection_status_mutex);
418 ErrorSummary::WrongArgument, ErrorLevel::Status)); 733 if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsClient) &&
419 return; 734 connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) {
735 rb.Push(ResultCode(ErrorDescription::NotAuthorized, ErrorModule::UDS,
736 ErrorSummary::InvalidState, ErrorLevel::Status));
737 return;
738 }
739
740 if (dest_node_id == connection_status.network_node_id) {
741 rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::UDS,
742 ErrorSummary::WrongArgument, ErrorLevel::Status));
743 return;
744 }
745
746 network_node_id = connection_status.network_node_id;
420 } 747 }
421 748
422 // TODO(Subv): Do something with the flags. 749 // TODO(Subv): Do something with the flags.
@@ -433,8 +760,8 @@ static void SendTo(Interface* self) {
433 760
434 // TODO(Subv): Increment the sequence number after each sent packet. 761 // TODO(Subv): Increment the sequence number after each sent packet.
435 u16 sequence_number = 0; 762 u16 sequence_number = 0;
436 std::vector<u8> data_payload = GenerateDataPayload( 763 std::vector<u8> data_payload =
437 data, data_channel, dest_node_id, connection_status.network_node_id, sequence_number); 764 GenerateDataPayload(data, data_channel, dest_node_id, network_node_id, sequence_number);
438 765
439 // TODO(Subv): Retrieve the MAC address of the dest_node_id and our own to encrypt 766 // TODO(Subv): Retrieve the MAC address of the dest_node_id and our own to encrypt
440 // and encapsulate the payload. 767 // and encapsulate the payload.
@@ -461,6 +788,7 @@ static void GetChannel(Interface* self) {
461 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1A, 0, 0); 788 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1A, 0, 0);
462 IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); 789 IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
463 790
791 std::lock_guard<std::mutex> lock(connection_status_mutex);
464 bool is_connected = connection_status.status != static_cast<u32>(NetworkStatus::NotConnected); 792 bool is_connected = connection_status.status != static_cast<u32>(NetworkStatus::NotConnected);
465 793
466 u8 channel = is_connected ? network_channel : 0; 794 u8 channel = is_connected ? network_channel : 0;
@@ -610,37 +938,29 @@ static void BeaconBroadcastCallback(u64 userdata, int cycles_late) {
610 if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) 938 if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost))
611 return; 939 return;
612 940
613 // TODO(Subv): Actually send the beacon.
614 std::vector<u8> frame = GenerateBeaconFrame(network_info, node_info); 941 std::vector<u8> frame = GenerateBeaconFrame(network_info, node_info);
615 942
943 using Network::WifiPacket;
944 WifiPacket packet;
945 packet.type = WifiPacket::PacketType::Beacon;
946 packet.data = std::move(frame);
947 packet.destination_address = Network::BroadcastMac;
948 packet.channel = network_channel;
949
950 SendPacket(packet);
951
616 // Start broadcasting the network, send a beacon frame every 102.4ms. 952 // Start broadcasting the network, send a beacon frame every 102.4ms.
617 CoreTiming::ScheduleEvent(msToCycles(DefaultBeaconInterval * MillisecondsPerTU) - cycles_late, 953 CoreTiming::ScheduleEvent(msToCycles(DefaultBeaconInterval * MillisecondsPerTU) - cycles_late,
618 beacon_broadcast_event, 0); 954 beacon_broadcast_event, 0);
619} 955}
620 956
621/* 957/*
622 * Returns an available index in the nodes array for the
623 * currently-hosted UDS network.
624 */
625static u32 GetNextAvailableNodeId() {
626 ASSERT_MSG(connection_status.status == static_cast<u32>(NetworkStatus::ConnectedAsHost),
627 "Can not accept clients if we're not hosting a network");
628
629 for (unsigned index = 0; index < connection_status.max_nodes; ++index) {
630 if ((connection_status.node_bitmask & (1 << index)) == 0)
631 return index;
632 }
633
634 // Any connection attempts to an already full network should have been refused.
635 ASSERT_MSG(false, "No available connection slots in the network");
636}
637
638/*
639 * Called when a client connects to an UDS network we're hosting, 958 * Called when a client connects to an UDS network we're hosting,
640 * updates the connection status and signals the update event. 959 * updates the connection status and signals the update event.
641 * @param network_node_id Network Node Id of the connecting client. 960 * @param network_node_id Network Node Id of the connecting client.
642 */ 961 */
643void OnClientConnected(u16 network_node_id) { 962void OnClientConnected(u16 network_node_id) {
963 std::lock_guard<std::mutex> lock(connection_status_mutex);
644 ASSERT_MSG(connection_status.status == static_cast<u32>(NetworkStatus::ConnectedAsHost), 964 ASSERT_MSG(connection_status.status == static_cast<u32>(NetworkStatus::ConnectedAsHost),
645 "Can not accept clients if we're not hosting a network"); 965 "Can not accept clients if we're not hosting a network");
646 ASSERT_MSG(connection_status.total_nodes < connection_status.max_nodes, 966 ASSERT_MSG(connection_status.total_nodes < connection_status.max_nodes,
@@ -655,7 +975,7 @@ void OnClientConnected(u16 network_node_id) {
655} 975}
656 976
657const Interface::FunctionInfo FunctionTable[] = { 977const Interface::FunctionInfo FunctionTable[] = {
658 {0x00010442, nullptr, "Initialize (deprecated)"}, 978 {0x000102C2, nullptr, "Initialize (deprecated)"},
659 {0x00020000, nullptr, "Scrap"}, 979 {0x00020000, nullptr, "Scrap"},
660 {0x00030000, Shutdown, "Shutdown"}, 980 {0x00030000, Shutdown, "Shutdown"},
661 {0x00040402, nullptr, "CreateNetwork (deprecated)"}, 981 {0x00040402, nullptr, "CreateNetwork (deprecated)"},
@@ -702,8 +1022,11 @@ NWM_UDS::~NWM_UDS() {
702 connection_status_event = nullptr; 1022 connection_status_event = nullptr;
703 recv_buffer_memory = nullptr; 1023 recv_buffer_memory = nullptr;
704 1024
705 connection_status = {}; 1025 {
706 connection_status.status = static_cast<u32>(NetworkStatus::NotConnected); 1026 std::lock_guard<std::mutex> lock(connection_status_mutex);
1027 connection_status = {};
1028 connection_status.status = static_cast<u32>(NetworkStatus::NotConnected);
1029 }
707 1030
708 CoreTiming::UnscheduleEvent(beacon_broadcast_event, 0); 1031 CoreTiming::UnscheduleEvent(beacon_broadcast_event, 0);
709} 1032}
diff --git a/src/core/hle/service/nwm/nwm_uds.h b/src/core/hle/service/nwm/nwm_uds.h
index 141f49f9c..f1caaf974 100644
--- a/src/core/hle/service/nwm/nwm_uds.h
+++ b/src/core/hle/service/nwm/nwm_uds.h
@@ -42,6 +42,7 @@ using NodeList = std::vector<NodeInfo>;
42enum class NetworkStatus { 42enum class NetworkStatus {
43 NotConnected = 3, 43 NotConnected = 3,
44 ConnectedAsHost = 6, 44 ConnectedAsHost = 6,
45 Connecting = 7,
45 ConnectedAsClient = 9, 46 ConnectedAsClient = 9,
46 ConnectedAsSpectator = 10, 47 ConnectedAsSpectator = 10,
47}; 48};
@@ -85,6 +86,17 @@ static_assert(offsetof(NetworkInfo, oui_value) == 0xC, "oui_value is at the wron
85static_assert(offsetof(NetworkInfo, wlan_comm_id) == 0x10, "wlancommid is at the wrong offset."); 86static_assert(offsetof(NetworkInfo, wlan_comm_id) == 0x10, "wlancommid is at the wrong offset.");
86static_assert(sizeof(NetworkInfo) == 0x108, "NetworkInfo has incorrect size."); 87static_assert(sizeof(NetworkInfo) == 0x108, "NetworkInfo has incorrect size.");
87 88
89/// Additional block tag ids in the Beacon and Association Response frames
90enum class TagId : u8 {
91 SSID = 0,
92 SupportedRates = 1,
93 DSParameterSet = 2,
94 TrafficIndicationMap = 5,
95 CountryInformation = 7,
96 ERPInformation = 42,
97 VendorSpecific = 221
98};
99
88class NWM_UDS final : public Interface { 100class NWM_UDS final : public Interface {
89public: 101public:
90 NWM_UDS(); 102 NWM_UDS();
diff --git a/src/core/hle/service/nwm/uds_beacon.cpp b/src/core/hle/service/nwm/uds_beacon.cpp
index 6332b404c..73a80d940 100644
--- a/src/core/hle/service/nwm/uds_beacon.cpp
+++ b/src/core/hle/service/nwm/uds_beacon.cpp
@@ -243,7 +243,7 @@ std::vector<u8> GenerateNintendoFirstEncryptedDataTag(const NetworkInfo& network
243 243
244 EncryptedDataTag tag{}; 244 EncryptedDataTag tag{};
245 tag.header.tag_id = static_cast<u8>(TagId::VendorSpecific); 245 tag.header.tag_id = static_cast<u8>(TagId::VendorSpecific);
246 tag.header.length = sizeof(tag) - sizeof(TagHeader) + payload_size; 246 tag.header.length = static_cast<u8>(sizeof(tag) - sizeof(TagHeader) + payload_size);
247 tag.oui_type = static_cast<u8>(NintendoTagId::EncryptedData0); 247 tag.oui_type = static_cast<u8>(NintendoTagId::EncryptedData0);
248 tag.oui = NintendoOUI; 248 tag.oui = NintendoOUI;
249 249
@@ -279,7 +279,7 @@ std::vector<u8> GenerateNintendoSecondEncryptedDataTag(const NetworkInfo& networ
279 279
280 EncryptedDataTag tag{}; 280 EncryptedDataTag tag{};
281 tag.header.tag_id = static_cast<u8>(TagId::VendorSpecific); 281 tag.header.tag_id = static_cast<u8>(TagId::VendorSpecific);
282 tag.header.length = tag_length; 282 tag.header.length = static_cast<u8>(tag_length);
283 tag.oui_type = static_cast<u8>(NintendoTagId::EncryptedData1); 283 tag.oui_type = static_cast<u8>(NintendoTagId::EncryptedData1);
284 tag.oui = NintendoOUI; 284 tag.oui = NintendoOUI;
285 285
@@ -325,8 +325,5 @@ std::vector<u8> GenerateBeaconFrame(const NetworkInfo& network_info, const NodeL
325 return buffer; 325 return buffer;
326} 326}
327 327
328std::deque<WifiPacket> GetReceivedPackets(WifiPacket::PacketType type, const MacAddress& sender) {
329 return {};
330}
331} // namespace NWM 328} // namespace NWM
332} // namespace Service 329} // namespace Service
diff --git a/src/core/hle/service/nwm/uds_beacon.h b/src/core/hle/service/nwm/uds_beacon.h
index caacf4c6f..50cc76da2 100644
--- a/src/core/hle/service/nwm/uds_beacon.h
+++ b/src/core/hle/service/nwm/uds_beacon.h
@@ -17,17 +17,6 @@ namespace NWM {
17using MacAddress = std::array<u8, 6>; 17using MacAddress = std::array<u8, 6>;
18constexpr std::array<u8, 3> NintendoOUI = {0x00, 0x1F, 0x32}; 18constexpr std::array<u8, 3> NintendoOUI = {0x00, 0x1F, 0x32};
19 19
20/// Additional block tag ids in the Beacon frames
21enum class TagId : u8 {
22 SSID = 0,
23 SupportedRates = 1,
24 DSParameterSet = 2,
25 TrafficIndicationMap = 5,
26 CountryInformation = 7,
27 ERPInformation = 42,
28 VendorSpecific = 221
29};
30
31/** 20/**
32 * Internal vendor-specific tag ids as stored inside 21 * Internal vendor-specific tag ids as stored inside
33 * VendorSpecific blocks in the Beacon frames. 22 * VendorSpecific blocks in the Beacon frames.
@@ -135,20 +124,6 @@ struct BeaconData {
135 124
136static_assert(sizeof(BeaconData) == 0x12, "BeaconData has incorrect size."); 125static_assert(sizeof(BeaconData) == 0x12, "BeaconData has incorrect size.");
137 126
138/// Information about a received WiFi packet.
139/// Acts as our own 802.11 header.
140struct WifiPacket {
141 enum class PacketType { Beacon, Data };
142
143 PacketType type; ///< The type of 802.11 frame, Beacon / Data.
144
145 /// Raw 802.11 frame data, starting at the management frame header for management frames.
146 std::vector<u8> data;
147 MacAddress transmitter_address; ///< Mac address of the transmitter.
148 MacAddress destination_address; ///< Mac address of the receiver.
149 u8 channel; ///< WiFi channel where this frame was transmitted.
150};
151
152/** 127/**
153 * Decrypts the beacon data buffer for the network described by `network_info`. 128 * Decrypts the beacon data buffer for the network described by `network_info`.
154 */ 129 */
@@ -161,10 +136,5 @@ void DecryptBeaconData(const NetworkInfo& network_info, std::vector<u8>& buffer)
161 */ 136 */
162std::vector<u8> GenerateBeaconFrame(const NetworkInfo& network_info, const NodeList& nodes); 137std::vector<u8> GenerateBeaconFrame(const NetworkInfo& network_info, const NodeList& nodes);
163 138
164/**
165 * Returns a list of received 802.11 frames from the specified sender
166 * matching the type since the last call.
167 */
168std::deque<WifiPacket> GetReceivedPackets(WifiPacket::PacketType type, const MacAddress& sender);
169} // namespace NWM 139} // namespace NWM
170} // namespace Service 140} // namespace Service
diff --git a/src/core/hle/service/nwm/uds_connection.cpp b/src/core/hle/service/nwm/uds_connection.cpp
new file mode 100644
index 000000000..c74f51253
--- /dev/null
+++ b/src/core/hle/service/nwm/uds_connection.cpp
@@ -0,0 +1,88 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "core/hle/service/nwm/nwm_uds.h"
6#include "core/hle/service/nwm/uds_connection.h"
7#include "fmt/format.h"
8
9namespace Service {
10namespace NWM {
11
12// Note: These values were taken from a packet capture of an o3DS XL
13// broadcasting a Super Smash Bros. 4 lobby.
14constexpr u16 DefaultExtraCapabilities = 0x0431;
15
16std::vector<u8> GenerateAuthenticationFrame(AuthenticationSeq seq) {
17 AuthenticationFrame frame{};
18 frame.auth_seq = static_cast<u16>(seq);
19
20 std::vector<u8> data(sizeof(frame));
21 std::memcpy(data.data(), &frame, sizeof(frame));
22
23 return data;
24}
25
26AuthenticationSeq GetAuthenticationSeqNumber(const std::vector<u8>& body) {
27 AuthenticationFrame frame;
28 std::memcpy(&frame, body.data(), sizeof(frame));
29
30 return static_cast<AuthenticationSeq>(frame.auth_seq);
31}
32
33/**
34 * Generates an SSID tag of an 802.11 Beacon frame with an 8-byte character representation of the
35 * specified network id as the SSID value.
36 * @param network_id The network id to use.
37 * @returns A buffer with the SSID tag.
38 */
39static std::vector<u8> GenerateSSIDTag(u32 network_id) {
40 constexpr u8 SSIDSize = 8;
41
42 struct {
43 u8 id = static_cast<u8>(TagId::SSID);
44 u8 size = SSIDSize;
45 } tag_header;
46
47 std::vector<u8> buffer(sizeof(tag_header) + SSIDSize);
48
49 std::memcpy(buffer.data(), &tag_header, sizeof(tag_header));
50
51 std::string network_name = fmt::format("{0:08X}", network_id);
52
53 std::memcpy(buffer.data() + sizeof(tag_header), network_name.c_str(), SSIDSize);
54
55 return buffer;
56}
57
58std::vector<u8> GenerateAssocResponseFrame(AssocStatus status, u16 association_id, u32 network_id) {
59 AssociationResponseFrame frame{};
60 frame.capabilities = DefaultExtraCapabilities;
61 frame.status_code = static_cast<u16>(status);
62 // The association id is ORed with this magic value (0xC000)
63 constexpr u16 AssociationIdMagic = 0xC000;
64 frame.assoc_id = association_id | AssociationIdMagic;
65
66 std::vector<u8> data(sizeof(frame));
67 std::memcpy(data.data(), &frame, sizeof(frame));
68
69 auto ssid_tag = GenerateSSIDTag(network_id);
70 data.insert(data.end(), ssid_tag.begin(), ssid_tag.end());
71
72 // TODO(Subv): Add the SupportedRates tag.
73 // TODO(Subv): Add the DSParameterSet tag.
74 // TODO(Subv): Add the ERPInformation tag.
75 return data;
76}
77
78std::tuple<AssocStatus, u16> GetAssociationResult(const std::vector<u8>& body) {
79 AssociationResponseFrame frame;
80 memcpy(&frame, body.data(), sizeof(frame));
81
82 constexpr u16 AssociationIdMask = 0x3FFF;
83 return std::make_tuple(static_cast<AssocStatus>(frame.status_code),
84 frame.assoc_id & AssociationIdMask);
85}
86
87} // namespace NWM
88} // namespace Service
diff --git a/src/core/hle/service/nwm/uds_connection.h b/src/core/hle/service/nwm/uds_connection.h
new file mode 100644
index 000000000..a664f8471
--- /dev/null
+++ b/src/core/hle/service/nwm/uds_connection.h
@@ -0,0 +1,56 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <tuple>
8#include <vector>
9#include "common/common_types.h"
10#include "common/swap.h"
11#include "core/hle/service/service.h"
12
13namespace Service {
14namespace NWM {
15
16/// Sequence number of the 802.11 authentication frames.
17enum class AuthenticationSeq : u16 { SEQ1 = 1, SEQ2 = 2 };
18
19enum class AuthAlgorithm : u16 { OpenSystem = 0 };
20
21enum class AuthStatus : u16 { Successful = 0 };
22
23enum class AssocStatus : u16 { Successful = 0 };
24
25struct AuthenticationFrame {
26 u16_le auth_algorithm = static_cast<u16>(AuthAlgorithm::OpenSystem);
27 u16_le auth_seq;
28 u16_le status_code = static_cast<u16>(AuthStatus::Successful);
29};
30
31static_assert(sizeof(AuthenticationFrame) == 6, "AuthenticationFrame has wrong size");
32
33struct AssociationResponseFrame {
34 u16_le capabilities;
35 u16_le status_code;
36 u16_le assoc_id;
37};
38
39static_assert(sizeof(AssociationResponseFrame) == 6, "AssociationResponseFrame has wrong size");
40
41/// Generates an 802.11 authentication frame, starting at the frame body.
42std::vector<u8> GenerateAuthenticationFrame(AuthenticationSeq seq);
43
44/// Returns the sequence number from the body of an Authentication frame.
45AuthenticationSeq GetAuthenticationSeqNumber(const std::vector<u8>& body);
46
47/// Generates an 802.11 association response frame with the specified status, association id and
48/// network id, starting at the frame body.
49std::vector<u8> GenerateAssocResponseFrame(AssocStatus status, u16 association_id, u32 network_id);
50
51/// Returns a tuple of (association status, association id) from the body of an AssociationResponse
52/// frame.
53std::tuple<AssocStatus, u16> GetAssociationResult(const std::vector<u8>& body);
54
55} // namespace NWM
56} // namespace Service
diff --git a/src/core/hle/service/nwm/uds_data.cpp b/src/core/hle/service/nwm/uds_data.cpp
index 8c6742dba..4b389710f 100644
--- a/src/core/hle/service/nwm/uds_data.cpp
+++ b/src/core/hle/service/nwm/uds_data.cpp
@@ -2,6 +2,7 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <algorithm>
5#include <cstring> 6#include <cstring>
6#include <cryptopp/aes.h> 7#include <cryptopp/aes.h>
7#include <cryptopp/ccm.h> 8#include <cryptopp/ccm.h>
@@ -197,7 +198,7 @@ static std::vector<u8> DecryptDataFrame(const std::vector<u8>& encrypted_payload
197 df.ChannelMessageEnd(CryptoPP::DEFAULT_CHANNEL); 198 df.ChannelMessageEnd(CryptoPP::DEFAULT_CHANNEL);
198 df.SetRetrievalChannel(CryptoPP::DEFAULT_CHANNEL); 199 df.SetRetrievalChannel(CryptoPP::DEFAULT_CHANNEL);
199 200
200 int size = df.MaxRetrievable(); 201 size_t size = df.MaxRetrievable();
201 202
202 std::vector<u8> pdata(size); 203 std::vector<u8> pdata(size);
203 df.Get(pdata.data(), size); 204 df.Get(pdata.data(), size);
@@ -251,7 +252,7 @@ static std::vector<u8> EncryptDataFrame(const std::vector<u8>& payload,
251 252
252 df.SetRetrievalChannel(CryptoPP::DEFAULT_CHANNEL); 253 df.SetRetrievalChannel(CryptoPP::DEFAULT_CHANNEL);
253 254
254 int size = df.MaxRetrievable(); 255 size_t size = df.MaxRetrievable();
255 256
256 std::vector<u8> cipher(size); 257 std::vector<u8> cipher(size);
257 df.Get(cipher.data(), size); 258 df.Get(cipher.data(), size);
@@ -266,13 +267,107 @@ static std::vector<u8> EncryptDataFrame(const std::vector<u8>& payload,
266std::vector<u8> GenerateDataPayload(const std::vector<u8>& data, u8 channel, u16 dest_node, 267std::vector<u8> GenerateDataPayload(const std::vector<u8>& data, u8 channel, u16 dest_node,
267 u16 src_node, u16 sequence_number) { 268 u16 src_node, u16 sequence_number) {
268 std::vector<u8> buffer = GenerateLLCHeader(EtherType::SecureData); 269 std::vector<u8> buffer = GenerateLLCHeader(EtherType::SecureData);
269 std::vector<u8> securedata_header = 270 std::vector<u8> securedata_header = GenerateSecureDataHeader(
270 GenerateSecureDataHeader(data.size(), channel, dest_node, src_node, sequence_number); 271 static_cast<u16>(data.size()), channel, dest_node, src_node, sequence_number);
271 272
272 buffer.insert(buffer.end(), securedata_header.begin(), securedata_header.end()); 273 buffer.insert(buffer.end(), securedata_header.begin(), securedata_header.end());
273 buffer.insert(buffer.end(), data.begin(), data.end()); 274 buffer.insert(buffer.end(), data.begin(), data.end());
274 return buffer; 275 return buffer;
275} 276}
276 277
278std::vector<u8> GenerateEAPoLStartFrame(u16 association_id, const NodeInfo& node_info) {
279 EAPoLStartPacket eapol_start{};
280 eapol_start.association_id = association_id;
281 eapol_start.node.friend_code_seed = node_info.friend_code_seed;
282
283 std::copy(node_info.username.begin(), node_info.username.end(),
284 eapol_start.node.username.begin());
285
286 // Note: The network_node_id and unknown bytes seem to be uninitialized in the NWM module.
287 // TODO(B3N30): The last 8 bytes seem to have a fixed value of 07 88 15 00 04 e9 13 00 in
288 // EAPoL-Start packets from different 3DSs to the same host during a Super Smash Bros. 4 game.
289 // Find out what that means.
290
291 std::vector<u8> eapol_buffer(sizeof(EAPoLStartPacket));
292 std::memcpy(eapol_buffer.data(), &eapol_start, sizeof(eapol_start));
293
294 std::vector<u8> buffer = GenerateLLCHeader(EtherType::EAPoL);
295 buffer.insert(buffer.end(), eapol_buffer.begin(), eapol_buffer.end());
296 return buffer;
297}
298
299EtherType GetFrameEtherType(const std::vector<u8>& frame) {
300 LLCHeader header;
301 std::memcpy(&header, frame.data(), sizeof(header));
302
303 u16 ethertype = header.protocol;
304 return static_cast<EtherType>(ethertype);
305}
306
307u16 GetEAPoLFrameType(const std::vector<u8>& frame) {
308 // Ignore the LLC header
309 u16_be eapol_type;
310 std::memcpy(&eapol_type, frame.data() + sizeof(LLCHeader), sizeof(eapol_type));
311 return eapol_type;
312}
313
314NodeInfo DeserializeNodeInfoFromFrame(const std::vector<u8>& frame) {
315 EAPoLStartPacket eapol_start;
316
317 // Skip the LLC header
318 std::memcpy(&eapol_start, frame.data() + sizeof(LLCHeader), sizeof(eapol_start));
319
320 NodeInfo node{};
321 node.friend_code_seed = eapol_start.node.friend_code_seed;
322
323 std::copy(eapol_start.node.username.begin(), eapol_start.node.username.end(),
324 node.username.begin());
325
326 return node;
327}
328
329NodeInfo DeserializeNodeInfo(const EAPoLNodeInfo& node) {
330 NodeInfo node_info{};
331 node_info.friend_code_seed = node.friend_code_seed;
332 node_info.network_node_id = node.network_node_id;
333
334 std::copy(node.username.begin(), node.username.end(), node_info.username.begin());
335
336 return node_info;
337}
338
339std::vector<u8> GenerateEAPoLLogoffFrame(const MacAddress& mac_address, u16 network_node_id,
340 const NodeList& nodes, u8 max_nodes, u8 total_nodes) {
341 EAPoLLogoffPacket eapol_logoff{};
342 eapol_logoff.assigned_node_id = network_node_id;
343 eapol_logoff.connected_nodes = total_nodes;
344 eapol_logoff.max_nodes = max_nodes;
345
346 for (size_t index = 0; index < total_nodes; ++index) {
347 const auto& node_info = nodes[index];
348 auto& node = eapol_logoff.nodes[index];
349
350 node.friend_code_seed = node_info.friend_code_seed;
351 node.network_node_id = node_info.network_node_id;
352
353 std::copy(node_info.username.begin(), node_info.username.end(), node.username.begin());
354 }
355
356 std::vector<u8> eapol_buffer(sizeof(EAPoLLogoffPacket));
357 std::memcpy(eapol_buffer.data(), &eapol_logoff, sizeof(eapol_logoff));
358
359 std::vector<u8> buffer = GenerateLLCHeader(EtherType::EAPoL);
360 buffer.insert(buffer.end(), eapol_buffer.begin(), eapol_buffer.end());
361 return buffer;
362}
363
364EAPoLLogoffPacket ParseEAPoLLogoffFrame(const std::vector<u8>& frame) {
365 EAPoLLogoffPacket eapol_logoff;
366
367 // Skip the LLC header
368 std::memcpy(&eapol_logoff, frame.data() + sizeof(LLCHeader), sizeof(eapol_logoff));
369 return eapol_logoff;
370}
371
277} // namespace NWM 372} // namespace NWM
278} // namespace Service 373} // namespace Service
diff --git a/src/core/hle/service/nwm/uds_data.h b/src/core/hle/service/nwm/uds_data.h
index a23520a41..76bccb1bf 100644
--- a/src/core/hle/service/nwm/uds_data.h
+++ b/src/core/hle/service/nwm/uds_data.h
@@ -8,6 +8,7 @@
8#include <vector> 8#include <vector>
9#include "common/common_types.h" 9#include "common/common_types.h"
10#include "common/swap.h" 10#include "common/swap.h"
11#include "core/hle/service/nwm/uds_beacon.h"
11#include "core/hle/service/service.h" 12#include "core/hle/service/service.h"
12 13
13namespace Service { 14namespace Service {
@@ -67,6 +68,49 @@ struct DataFrameCryptoCTR {
67 68
68static_assert(sizeof(DataFrameCryptoCTR) == 16, "DataFrameCryptoCTR has the wrong size"); 69static_assert(sizeof(DataFrameCryptoCTR) == 16, "DataFrameCryptoCTR has the wrong size");
69 70
71struct EAPoLNodeInfo {
72 u64_be friend_code_seed;
73 std::array<u16_be, 10> username;
74 INSERT_PADDING_BYTES(4);
75 u16_be network_node_id;
76 INSERT_PADDING_BYTES(6);
77};
78
79static_assert(sizeof(EAPoLNodeInfo) == 0x28, "EAPoLNodeInfo has the wrong size");
80
81constexpr u16 EAPoLStartMagic = 0x201;
82
83/*
84 * Nintendo EAPoLStartPacket, is used to initaliaze a connection between client and host
85 */
86struct EAPoLStartPacket {
87 u16_be magic = EAPoLStartMagic;
88 u16_be association_id;
89 // This value is hardcoded to 1 in the NWM module.
90 u16_be unknown = 1;
91 INSERT_PADDING_BYTES(2);
92 EAPoLNodeInfo node;
93};
94
95static_assert(sizeof(EAPoLStartPacket) == 0x30, "EAPoLStartPacket has the wrong size");
96
97constexpr u16 EAPoLLogoffMagic = 0x202;
98
99struct EAPoLLogoffPacket {
100 u16_be magic = EAPoLLogoffMagic;
101 INSERT_PADDING_BYTES(2);
102 u16_be assigned_node_id;
103 MacAddress client_mac_address;
104 INSERT_PADDING_BYTES(6);
105 u8 connected_nodes;
106 u8 max_nodes;
107 INSERT_PADDING_BYTES(4);
108
109 std::array<EAPoLNodeInfo, UDSMaxNodes> nodes;
110};
111
112static_assert(sizeof(EAPoLLogoffPacket) == 0x298, "EAPoLLogoffPacket has the wrong size");
113
70/** 114/**
71 * Generates an unencrypted 802.11 data payload. 115 * Generates an unencrypted 802.11 data payload.
72 * @returns The generated frame payload. 116 * @returns The generated frame payload.
@@ -74,5 +118,47 @@ static_assert(sizeof(DataFrameCryptoCTR) == 16, "DataFrameCryptoCTR has the wron
74std::vector<u8> GenerateDataPayload(const std::vector<u8>& data, u8 channel, u16 dest_node, 118std::vector<u8> GenerateDataPayload(const std::vector<u8>& data, u8 channel, u16 dest_node,
75 u16 src_node, u16 sequence_number); 119 u16 src_node, u16 sequence_number);
76 120
121/*
122 * Generates an unencrypted 802.11 data frame body with the EAPoL-Start format for UDS
123 * communication.
124 * @returns The generated frame body.
125 */
126std::vector<u8> GenerateEAPoLStartFrame(u16 association_id, const NodeInfo& node_info);
127
128/*
129 * Returns the EtherType of the specified 802.11 frame.
130 */
131EtherType GetFrameEtherType(const std::vector<u8>& frame);
132
133/*
134 * Returns the EAPoL type (Start / Logoff) of the specified 802.11 frame.
135 * Note: The frame *must* be an EAPoL frame.
136 */
137u16 GetEAPoLFrameType(const std::vector<u8>& frame);
138
139/*
140 * Returns a deserialized NodeInfo structure from the information inside an EAPoL-Start packet
141 * encapsulated in an 802.11 data frame.
142 */
143NodeInfo DeserializeNodeInfoFromFrame(const std::vector<u8>& frame);
144
145/*
146 * Returns a NodeInfo constructed from the data in the specified EAPoLNodeInfo.
147 */
148NodeInfo DeserializeNodeInfo(const EAPoLNodeInfo& node);
149
150/*
151 * Generates an unencrypted 802.11 data frame body with the EAPoL-Logoff format for UDS
152 * communication.
153 * @returns The generated frame body.
154 */
155std::vector<u8> GenerateEAPoLLogoffFrame(const MacAddress& mac_address, u16 network_node_id,
156 const NodeList& nodes, u8 max_nodes, u8 total_nodes);
157
158/*
159 * Returns a EAPoLLogoffPacket representing the specified 802.11-encapsulated data frame.
160 */
161EAPoLLogoffPacket ParseEAPoLLogoffFrame(const std::vector<u8>& frame);
162
77} // namespace NWM 163} // namespace NWM
78} // namespace Service 164} // namespace Service
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp
index aad950e50..f267aad74 100644
--- a/src/core/hle/service/service.cpp
+++ b/src/core/hle/service/service.cpp
@@ -38,7 +38,7 @@
38#include "core/hle/service/news/news.h" 38#include "core/hle/service/news/news.h"
39#include "core/hle/service/nfc/nfc.h" 39#include "core/hle/service/nfc/nfc.h"
40#include "core/hle/service/nim/nim.h" 40#include "core/hle/service/nim/nim.h"
41#include "core/hle/service/ns_s.h" 41#include "core/hle/service/ns/ns.h"
42#include "core/hle/service/nwm/nwm.h" 42#include "core/hle/service/nwm/nwm.h"
43#include "core/hle/service/pm_app.h" 43#include "core/hle/service/pm_app.h"
44#include "core/hle/service/ptm/ptm.h" 44#include "core/hle/service/ptm/ptm.h"
@@ -215,6 +215,8 @@ void Init() {
215 SM::g_service_manager = std::make_shared<SM::ServiceManager>(); 215 SM::g_service_manager = std::make_shared<SM::ServiceManager>();
216 SM::ServiceManager::InstallInterfaces(SM::g_service_manager); 216 SM::ServiceManager::InstallInterfaces(SM::g_service_manager);
217 217
218 NS::InstallInterfaces(*SM::g_service_manager);
219
218 AddNamedPort(new ERR::ERR_F); 220 AddNamedPort(new ERR::ERR_F);
219 221
220 FS::ArchiveInit(); 222 FS::ArchiveInit();
@@ -246,7 +248,6 @@ void Init() {
246 AddService(new HTTP::HTTP_C); 248 AddService(new HTTP::HTTP_C);
247 AddService(new LDR::LDR_RO); 249 AddService(new LDR::LDR_RO);
248 AddService(new MIC::MIC_U); 250 AddService(new MIC::MIC_U);
249 AddService(new NS::NS_S);
250 AddService(new PM::PM_APP); 251 AddService(new PM::PM_APP);
251 AddService(new SOC::SOC_U); 252 AddService(new SOC::SOC_U);
252 AddService(new SSL::SSL_C); 253 AddService(new SSL::SSL_C);
diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp
index 5e7fc68f9..854ab9a05 100644
--- a/src/core/hle/service/sm/sm.cpp
+++ b/src/core/hle/service/sm/sm.cpp
@@ -36,6 +36,10 @@ ResultVal<Kernel::SharedPtr<Kernel::ServerPort>> ServiceManager::RegisterService
36 std::string name, unsigned int max_sessions) { 36 std::string name, unsigned int max_sessions) {
37 37
38 CASCADE_CODE(ValidateServiceName(name)); 38 CASCADE_CODE(ValidateServiceName(name));
39
40 if (registered_services.find(name) != registered_services.end())
41 return ERR_ALREADY_REGISTERED;
42
39 Kernel::SharedPtr<Kernel::ServerPort> server_port; 43 Kernel::SharedPtr<Kernel::ServerPort> server_port;
40 Kernel::SharedPtr<Kernel::ClientPort> client_port; 44 Kernel::SharedPtr<Kernel::ClientPort> client_port;
41 std::tie(server_port, client_port) = Kernel::ServerPort::CreatePortPair(max_sessions, name); 45 std::tie(server_port, client_port) = Kernel::ServerPort::CreatePortPair(max_sessions, name);
diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h
index 8f0dbf2db..9f60a7965 100644
--- a/src/core/hle/service/sm/sm.h
+++ b/src/core/hle/service/sm/sm.h
@@ -32,6 +32,9 @@ constexpr ResultCode ERR_ACCESS_DENIED(6, ErrorModule::SRV, ErrorSummary::Invali
32 ErrorLevel::Permanent); // 0xD8E06406 32 ErrorLevel::Permanent); // 0xD8E06406
33constexpr ResultCode ERR_NAME_CONTAINS_NUL(7, ErrorModule::SRV, ErrorSummary::WrongArgument, 33constexpr ResultCode ERR_NAME_CONTAINS_NUL(7, ErrorModule::SRV, ErrorSummary::WrongArgument,
34 ErrorLevel::Permanent); // 0xD9006407 34 ErrorLevel::Permanent); // 0xD9006407
35constexpr ResultCode ERR_ALREADY_REGISTERED(ErrorDescription::AlreadyExists, ErrorModule::OS,
36 ErrorSummary::WrongArgument,
37 ErrorLevel::Permanent); // 0xD9001BFC
35 38
36class ServiceManager { 39class ServiceManager {
37public: 40public:
diff --git a/src/core/hle/service/sm/srv.cpp b/src/core/hle/service/sm/srv.cpp
index 352941e69..fb873981c 100644
--- a/src/core/hle/service/sm/srv.cpp
+++ b/src/core/hle/service/sm/srv.cpp
@@ -13,6 +13,7 @@
13#include "core/hle/kernel/errors.h" 13#include "core/hle/kernel/errors.h"
14#include "core/hle/kernel/hle_ipc.h" 14#include "core/hle/kernel/hle_ipc.h"
15#include "core/hle/kernel/semaphore.h" 15#include "core/hle/kernel/semaphore.h"
16#include "core/hle/kernel/server_port.h"
16#include "core/hle/kernel/server_session.h" 17#include "core/hle/kernel/server_session.h"
17#include "core/hle/service/sm/sm.h" 18#include "core/hle/service/sm/sm.h"
18#include "core/hle/service/sm/srv.h" 19#include "core/hle/service/sm/srv.h"
@@ -61,7 +62,7 @@ void SRV::EnableNotification(Kernel::HLERequestContext& ctx) {
61 IPC::RequestParser rp(ctx, 0x2, 0, 0); 62 IPC::RequestParser rp(ctx, 0x2, 0, 0);
62 63
63 notification_semaphore = 64 notification_semaphore =
64 Kernel::Semaphore::Create(0, MAX_PENDING_NOTIFICATIONS, "SRV:Notification").Unwrap(); 65 Kernel::Semaphore::Create(0, MAX_PENDING_NOTIFICATIONS, 0, "SRV:Notification").Unwrap();
65 66
66 IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); 67 IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
67 rb.Push(RESULT_SUCCESS); 68 rb.Push(RESULT_SUCCESS);
@@ -184,12 +185,35 @@ void SRV::PublishToSubscriber(Kernel::HLERequestContext& ctx) {
184 flags); 185 flags);
185} 186}
186 187
188void SRV::RegisterService(Kernel::HLERequestContext& ctx) {
189 IPC::RequestParser rp(ctx, 0x3, 4, 0);
190
191 auto name_buf = rp.PopRaw<std::array<char, 8>>();
192 size_t name_len = rp.Pop<u32>();
193 u32 max_sessions = rp.Pop<u32>();
194
195 std::string name(name_buf.data(), std::min(name_len, name_buf.size()));
196
197 auto port = service_manager->RegisterService(name, max_sessions);
198
199 if (port.Failed()) {
200 IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
201 rb.Push(port.Code());
202 LOG_ERROR(Service_SRV, "called service=%s -> error 0x%08X", name.c_str(), port.Code().raw);
203 return;
204 }
205
206 IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
207 rb.Push(RESULT_SUCCESS);
208 rb.PushObjects(port.Unwrap());
209}
210
187SRV::SRV(std::shared_ptr<ServiceManager> service_manager) 211SRV::SRV(std::shared_ptr<ServiceManager> service_manager)
188 : ServiceFramework("srv:", 4), service_manager(std::move(service_manager)) { 212 : ServiceFramework("srv:", 4), service_manager(std::move(service_manager)) {
189 static const FunctionInfo functions[] = { 213 static const FunctionInfo functions[] = {
190 {0x00010002, &SRV::RegisterClient, "RegisterClient"}, 214 {0x00010002, &SRV::RegisterClient, "RegisterClient"},
191 {0x00020000, &SRV::EnableNotification, "EnableNotification"}, 215 {0x00020000, &SRV::EnableNotification, "EnableNotification"},
192 {0x00030100, nullptr, "RegisterService"}, 216 {0x00030100, &SRV::RegisterService, "RegisterService"},
193 {0x000400C0, nullptr, "UnregisterService"}, 217 {0x000400C0, nullptr, "UnregisterService"},
194 {0x00050100, &SRV::GetServiceHandle, "GetServiceHandle"}, 218 {0x00050100, &SRV::GetServiceHandle, "GetServiceHandle"},
195 {0x000600C2, nullptr, "RegisterPort"}, 219 {0x000600C2, nullptr, "RegisterPort"},
diff --git a/src/core/hle/service/sm/srv.h b/src/core/hle/service/sm/srv.h
index 75cca5184..aad839563 100644
--- a/src/core/hle/service/sm/srv.h
+++ b/src/core/hle/service/sm/srv.h
@@ -28,6 +28,7 @@ private:
28 void Subscribe(Kernel::HLERequestContext& ctx); 28 void Subscribe(Kernel::HLERequestContext& ctx);
29 void Unsubscribe(Kernel::HLERequestContext& ctx); 29 void Unsubscribe(Kernel::HLERequestContext& ctx);
30 void PublishToSubscriber(Kernel::HLERequestContext& ctx); 30 void PublishToSubscriber(Kernel::HLERequestContext& ctx);
31 void RegisterService(Kernel::HLERequestContext& ctx);
31 32
32 std::shared_ptr<ServiceManager> service_manager; 33 std::shared_ptr<ServiceManager> service_manager;
33 Kernel::SharedPtr<Kernel::Semaphore> notification_semaphore; 34 Kernel::SharedPtr<Kernel::Semaphore> notification_semaphore;
diff --git a/src/core/hw/gpu.cpp b/src/core/hw/gpu.cpp
index 6838e449c..d1bfe51e6 100644
--- a/src/core/hw/gpu.cpp
+++ b/src/core/hw/gpu.cpp
@@ -29,7 +29,7 @@ namespace GPU {
29Regs g_regs; 29Regs g_regs;
30 30
31/// 268MHz CPU clocks / 60Hz frames per second 31/// 268MHz CPU clocks / 60Hz frames per second
32const u64 frame_ticks = BASE_CLOCK_RATE_ARM11 / SCREEN_REFRESH_RATE; 32const u64 frame_ticks = static_cast<u64>(BASE_CLOCK_RATE_ARM11 / SCREEN_REFRESH_RATE);
33/// Event id for CoreTiming 33/// Event id for CoreTiming
34static int vblank_event; 34static int vblank_event;
35 35
@@ -515,15 +515,15 @@ template void Write<u8>(u32 addr, const u8 data);
515 515
516/// Update hardware 516/// Update hardware
517static void VBlankCallback(u64 userdata, int cycles_late) { 517static void VBlankCallback(u64 userdata, int cycles_late) {
518 VideoCore::g_renderer->SwapBuffers(); 518 //VideoCore::g_renderer->SwapBuffers();
519 519
520 // Signal to GSP that GPU interrupt has occurred 520 //// Signal to GSP that GPU interrupt has occurred
521 // TODO(yuriks): hwtest to determine if PDC0 is for the Top screen and PDC1 for the Sub 521 //// TODO(yuriks): hwtest to determine if PDC0 is for the Top screen and PDC1 for the Sub
522 // screen, or if both use the same interrupts and these two instead determine the 522 //// screen, or if both use the same interrupts and these two instead determine the
523 // beginning and end of the VBlank period. If needed, split the interrupt firing into 523 //// beginning and end of the VBlank period. If needed, split the interrupt firing into
524 // two different intervals. 524 //// two different intervals.
525 Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC0); 525 //Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC0);
526 Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC1); 526 //Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC1);
527 527
528 // Reschedule recurrent event 528 // Reschedule recurrent event
529 CoreTiming::ScheduleEvent(frame_ticks - cycles_late, vblank_event); 529 CoreTiming::ScheduleEvent(frame_ticks - cycles_late, vblank_event);
diff --git a/src/core/hw/gpu.h b/src/core/hw/gpu.h
index 21b127fee..e3d0a0e08 100644
--- a/src/core/hw/gpu.h
+++ b/src/core/hw/gpu.h
@@ -74,9 +74,9 @@ struct Regs {
74 case PixelFormat::RGB5A1: 74 case PixelFormat::RGB5A1:
75 case PixelFormat::RGBA4: 75 case PixelFormat::RGBA4:
76 return 2; 76 return 2;
77 default:
78 UNIMPLEMENTED();
79 } 77 }
78
79 UNREACHABLE();
80 } 80 }
81 81
82 INSERT_PADDING_WORDS(0x4); 82 INSERT_PADDING_WORDS(0x4);
diff --git a/src/core/loader/3dsx.cpp b/src/core/loader/3dsx.cpp
index 209328347..7b0342cc9 100644
--- a/src/core/loader/3dsx.cpp
+++ b/src/core/loader/3dsx.cpp
@@ -91,8 +91,8 @@ static u32 TranslateAddr(u32 addr, const THREEloadinfo* loadinfo, u32* offsets)
91 return loadinfo->seg_addrs[2] + addr - offsets[1]; 91 return loadinfo->seg_addrs[2] + addr - offsets[1];
92} 92}
93 93
94using Kernel::SharedPtr;
95using Kernel::CodeSet; 94using Kernel::CodeSet;
95using Kernel::SharedPtr;
96 96
97static THREEDSX_Error Load3DSXFile(FileUtil::IOFile& file, u32 base_addr, 97static THREEDSX_Error Load3DSXFile(FileUtil::IOFile& file, u32 base_addr,
98 SharedPtr<CodeSet>* out_codeset) { 98 SharedPtr<CodeSet>* out_codeset) {
@@ -255,7 +255,7 @@ FileType AppLoader_THREEDSX::IdentifyType(FileUtil::IOFile& file) {
255 return FileType::Error; 255 return FileType::Error;
256} 256}
257 257
258ResultStatus AppLoader_THREEDSX::Load() { 258ResultStatus AppLoader_THREEDSX::Load(Kernel::SharedPtr<Kernel::Process>& process) {
259 if (is_loaded) 259 if (is_loaded)
260 return ResultStatus::ErrorAlreadyLoaded; 260 return ResultStatus::ErrorAlreadyLoaded;
261 261
@@ -267,19 +267,17 @@ ResultStatus AppLoader_THREEDSX::Load() {
267 return ResultStatus::Error; 267 return ResultStatus::Error;
268 codeset->name = filename; 268 codeset->name = filename;
269 269
270 Kernel::g_current_process = Kernel::Process::Create("main"); 270 process = Kernel::Process::Create("main");
271 Kernel::g_current_process->LoadModule(codeset, codeset->entrypoint); 271 process->LoadModule(codeset, codeset->entrypoint);
272 Kernel::g_current_process->svc_access_mask.set(); 272 process->svc_access_mask.set();
273 Kernel::g_current_process->address_mappings = default_address_mappings; 273 process->address_mappings = default_address_mappings;
274 274
275 // Attach the default resource limit (APPLICATION) to the process 275 // Attach the default resource limit (APPLICATION) to the process
276 Kernel::g_current_process->resource_limit = 276 process->resource_limit =
277 Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); 277 Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION);
278 process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE);
278 279
279 Kernel::g_current_process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE); 280 Service::FS::RegisterSelfNCCH(*this);
280
281 Service::FS::RegisterArchiveType(std::make_unique<FileSys::ArchiveFactory_SelfNCCH>(*this),
282 Service::FS::ArchiveIdCode::SelfNCCH);
283 281
284 is_loaded = true; 282 is_loaded = true;
285 return ResultStatus::Success; 283 return ResultStatus::Success;
diff --git a/src/core/loader/3dsx.h b/src/core/loader/3dsx.h
index 3f376778a..1e59bbb9d 100644
--- a/src/core/loader/3dsx.h
+++ b/src/core/loader/3dsx.h
@@ -31,7 +31,7 @@ public:
31 return IdentifyType(file); 31 return IdentifyType(file);
32 } 32 }
33 33
34 ResultStatus Load() override; 34 ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override;
35 35
36 ResultStatus ReadIcon(std::vector<u8>& buffer) override; 36 ResultStatus ReadIcon(std::vector<u8>& buffer) override;
37 37
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp
index 2efc67ff8..9969a8c39 100644
--- a/src/core/loader/elf.cpp
+++ b/src/core/loader/elf.cpp
@@ -13,8 +13,8 @@
13#include "core/loader/elf.h" 13#include "core/loader/elf.h"
14#include "core/memory.h" 14#include "core/memory.h"
15 15
16using Kernel::SharedPtr;
17using Kernel::CodeSet; 16using Kernel::CodeSet;
17using Kernel::SharedPtr;
18 18
19//////////////////////////////////////////////////////////////////////////////////////////////////// 19////////////////////////////////////////////////////////////////////////////////////////////////////
20// ELF Header Constants 20// ELF Header Constants
@@ -382,7 +382,7 @@ FileType AppLoader_ELF::IdentifyType(FileUtil::IOFile& file) {
382 return FileType::Error; 382 return FileType::Error;
383} 383}
384 384
385ResultStatus AppLoader_ELF::Load() { 385ResultStatus AppLoader_ELF::Load(Kernel::SharedPtr<Kernel::Process>& process) {
386 if (is_loaded) 386 if (is_loaded)
387 return ResultStatus::ErrorAlreadyLoaded; 387 return ResultStatus::ErrorAlreadyLoaded;
388 388
@@ -401,16 +401,16 @@ ResultStatus AppLoader_ELF::Load() {
401 SharedPtr<CodeSet> codeset = elf_reader.LoadInto(Memory::PROCESS_IMAGE_VADDR); 401 SharedPtr<CodeSet> codeset = elf_reader.LoadInto(Memory::PROCESS_IMAGE_VADDR);
402 codeset->name = filename; 402 codeset->name = filename;
403 403
404 Kernel::g_current_process = Kernel::Process::Create("main"); 404 process = Kernel::Process::Create("main");
405 Kernel::g_current_process->LoadModule(codeset, codeset->entrypoint); 405 process->LoadModule(codeset, codeset->entrypoint);
406 Kernel::g_current_process->svc_access_mask.set(); 406 process->svc_access_mask.set();
407 Kernel::g_current_process->address_mappings = default_address_mappings; 407 process->address_mappings = default_address_mappings;
408 408
409 // Attach the default resource limit (APPLICATION) to the process 409 // Attach the default resource limit (APPLICATION) to the process
410 Kernel::g_current_process->resource_limit = 410 process->resource_limit =
411 Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); 411 Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION);
412 412
413 Kernel::g_current_process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE); 413 process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE);
414 414
415 is_loaded = true; 415 is_loaded = true;
416 return ResultStatus::Success; 416 return ResultStatus::Success;
diff --git a/src/core/loader/elf.h b/src/core/loader/elf.h
index 862aa90d8..113da5917 100644
--- a/src/core/loader/elf.h
+++ b/src/core/loader/elf.h
@@ -30,7 +30,7 @@ public:
30 return IdentifyType(file); 30 return IdentifyType(file);
31 } 31 }
32 32
33 ResultStatus Load() override; 33 ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override;
34 34
35private: 35private:
36 std::string filename; 36 std::string filename;
diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h
index ac26f31fa..311785d05 100644
--- a/src/core/loader/loader.h
+++ b/src/core/loader/loader.h
@@ -13,10 +13,12 @@
13#include <boost/optional.hpp> 13#include <boost/optional.hpp>
14#include "common/common_types.h" 14#include "common/common_types.h"
15#include "common/file_util.h" 15#include "common/file_util.h"
16#include "core/hle/kernel/kernel.h"
16 17
17namespace Kernel { 18namespace Kernel {
18struct AddressMapping; 19struct AddressMapping;
19} 20class Process;
21} // namespace Kernel
20 22
21//////////////////////////////////////////////////////////////////////////////////////////////////// 23////////////////////////////////////////////////////////////////////////////////////////////////////
22// Loader namespace 24// Loader namespace
@@ -94,10 +96,11 @@ public:
94 virtual FileType GetFileType() = 0; 96 virtual FileType GetFileType() = 0;
95 97
96 /** 98 /**
97 * Load the application 99 * Load the application and return the created Process instance
98 * @return ResultStatus result of function 100 * @param process The newly created process.
101 * @return The status result of the operation.
99 */ 102 */
100 virtual ResultStatus Load() = 0; 103 virtual ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) = 0;
101 104
102 /** 105 /**
103 * Loads the system mode that this application needs. 106 * Loads the system mode that this application needs.
@@ -168,6 +171,28 @@ public:
168 return ResultStatus::ErrorNotImplemented; 171 return ResultStatus::ErrorNotImplemented;
169 } 172 }
170 173
174 /**
175 * Get the update RomFS of the application
176 * Since the RomFS can be huge, we return a file reference instead of copying to a buffer
177 * @param romfs_file The file containing the RomFS
178 * @param offset The offset the romfs begins on
179 * @param size The size of the romfs
180 * @return ResultStatus result of function
181 */
182 virtual ResultStatus ReadUpdateRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
183 u64& size) {
184 return ResultStatus::ErrorNotImplemented;
185 }
186
187 /**
188 * Get the title of the application
189 * @param title Reference to store the application title into
190 * @return ResultStatus result of function
191 */
192 virtual ResultStatus ReadTitle(std::string& title) {
193 return ResultStatus::ErrorNotImplemented;
194 }
195
171protected: 196protected:
172 FileUtil::IOFile file; 197 FileUtil::IOFile file;
173 bool is_loaded = false; 198 bool is_loaded = false;
@@ -186,4 +211,4 @@ extern const std::initializer_list<Kernel::AddressMapping> default_address_mappi
186 */ 211 */
187std::unique_ptr<AppLoader> GetLoader(const std::string& filename); 212std::unique_ptr<AppLoader> GetLoader(const std::string& filename);
188 213
189} // namespace 214} // namespace Loader
diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp
index 728886ea8..e33a37b2e 100644
--- a/src/core/loader/ncch.cpp
+++ b/src/core/loader/ncch.cpp
@@ -4,13 +4,17 @@
4 4
5#include <algorithm> 5#include <algorithm>
6#include <cinttypes> 6#include <cinttypes>
7#include <codecvt>
7#include <cstring> 8#include <cstring>
9#include <locale>
8#include <memory> 10#include <memory>
9#include "common/logging/log.h" 11#include "common/logging/log.h"
10#include "common/string_util.h" 12#include "common/string_util.h"
11#include "common/swap.h" 13#include "common/swap.h"
12#include "core/core.h" 14#include "core/core.h"
13#include "core/file_sys/archive_selfncch.h" 15#include "core/file_sys/archive_selfncch.h"
16#include "core/file_sys/ncch_container.h"
17#include "core/file_sys/title_metadata.h"
14#include "core/hle/kernel/process.h" 18#include "core/hle/kernel/process.h"
15#include "core/hle/kernel/resource_limit.h" 19#include "core/hle/kernel/resource_limit.h"
16#include "core/hle/service/cfg/cfg.h" 20#include "core/hle/service/cfg/cfg.h"
@@ -18,93 +22,14 @@
18#include "core/loader/ncch.h" 22#include "core/loader/ncch.h"
19#include "core/loader/smdh.h" 23#include "core/loader/smdh.h"
20#include "core/memory.h" 24#include "core/memory.h"
25#include "network/network.h"
21 26
22//////////////////////////////////////////////////////////////////////////////////////////////////// 27////////////////////////////////////////////////////////////////////////////////////////////////////
23// Loader namespace 28// Loader namespace
24 29
25namespace Loader { 30namespace Loader {
26 31
27static const int kMaxSections = 8; ///< Maximum number of sections (files) in an ExeFs 32static const u64 UPDATE_MASK = 0x0000000e00000000;
28static const int kBlockSize = 0x200; ///< Size of ExeFS blocks (in bytes)
29
30/**
31 * Get the decompressed size of an LZSS compressed ExeFS file
32 * @param buffer Buffer of compressed file
33 * @param size Size of compressed buffer
34 * @return Size of decompressed buffer
35 */
36static u32 LZSS_GetDecompressedSize(const u8* buffer, u32 size) {
37 u32 offset_size = *(u32*)(buffer + size - 4);
38 return offset_size + size;
39}
40
41/**
42 * Decompress ExeFS file (compressed with LZSS)
43 * @param compressed Compressed buffer
44 * @param compressed_size Size of compressed buffer
45 * @param decompressed Decompressed buffer
46 * @param decompressed_size Size of decompressed buffer
47 * @return True on success, otherwise false
48 */
49static bool LZSS_Decompress(const u8* compressed, u32 compressed_size, u8* decompressed,
50 u32 decompressed_size) {
51 const u8* footer = compressed + compressed_size - 8;
52 u32 buffer_top_and_bottom = *reinterpret_cast<const u32*>(footer);
53 u32 out = decompressed_size;
54 u32 index = compressed_size - ((buffer_top_and_bottom >> 24) & 0xFF);
55 u32 stop_index = compressed_size - (buffer_top_and_bottom & 0xFFFFFF);
56
57 memset(decompressed, 0, decompressed_size);
58 memcpy(decompressed, compressed, compressed_size);
59
60 while (index > stop_index) {
61 u8 control = compressed[--index];
62
63 for (unsigned i = 0; i < 8; i++) {
64 if (index <= stop_index)
65 break;
66 if (index <= 0)
67 break;
68 if (out <= 0)
69 break;
70
71 if (control & 0x80) {
72 // Check if compression is out of bounds
73 if (index < 2)
74 return false;
75 index -= 2;
76
77 u32 segment_offset = compressed[index] | (compressed[index + 1] << 8);
78 u32 segment_size = ((segment_offset >> 12) & 15) + 3;
79 segment_offset &= 0x0FFF;
80 segment_offset += 2;
81
82 // Check if compression is out of bounds
83 if (out < segment_size)
84 return false;
85
86 for (unsigned j = 0; j < segment_size; j++) {
87 // Check if compression is out of bounds
88 if (out + segment_offset >= decompressed_size)
89 return false;
90
91 u8 data = decompressed[out + segment_offset];
92 decompressed[--out] = data;
93 }
94 } else {
95 // Check if compression is out of bounds
96 if (out < 1)
97 return false;
98 decompressed[--out] = compressed[--index];
99 }
100 control <<= 1;
101 }
102 }
103 return true;
104}
105
106////////////////////////////////////////////////////////////////////////////////////////////////////
107// AppLoader_NCCH class
108 33
109FileType AppLoader_NCCH::IdentifyType(FileUtil::IOFile& file) { 34FileType AppLoader_NCCH::IdentifyType(FileUtil::IOFile& file) {
110 u32 magic; 35 u32 magic;
@@ -121,203 +46,105 @@ FileType AppLoader_NCCH::IdentifyType(FileUtil::IOFile& file) {
121 return FileType::Error; 46 return FileType::Error;
122} 47}
123 48
49static std::string GetUpdateNCCHPath(u64_le program_id) {
50 u32 high = static_cast<u32>((program_id | UPDATE_MASK) >> 32);
51 u32 low = static_cast<u32>((program_id | UPDATE_MASK) & 0xFFFFFFFF);
52
53 // TODO(shinyquagsire23): Title database should be doing this path lookup
54 std::string content_path = Common::StringFromFormat(
55 "%sNintendo 3DS/%s/%s/title/%08x/%08x/content/", FileUtil::GetUserPath(D_SDMC_IDX).c_str(),
56 SYSTEM_ID, SDCARD_ID, high, low);
57 std::string tmd_path = content_path + "00000000.tmd";
58
59 u32 content_id = 0;
60 FileSys::TitleMetadata tmd(tmd_path);
61 if (tmd.Load() == ResultStatus::Success) {
62 content_id = tmd.GetBootContentID();
63 }
64
65 return Common::StringFromFormat("%s%08x.app", content_path.c_str(), content_id);
66}
67
124std::pair<boost::optional<u32>, ResultStatus> AppLoader_NCCH::LoadKernelSystemMode() { 68std::pair<boost::optional<u32>, ResultStatus> AppLoader_NCCH::LoadKernelSystemMode() {
125 if (!is_loaded) { 69 if (!is_loaded) {
126 ResultStatus res = LoadExeFS(); 70 ResultStatus res = base_ncch.Load();
127 if (res != ResultStatus::Success) { 71 if (res != ResultStatus::Success) {
128 return std::make_pair(boost::none, res); 72 return std::make_pair(boost::none, res);
129 } 73 }
130 } 74 }
75
131 // Set the system mode as the one from the exheader. 76 // Set the system mode as the one from the exheader.
132 return std::make_pair(exheader_header.arm11_system_local_caps.system_mode.Value(), 77 return std::make_pair(overlay_ncch->exheader_header.arm11_system_local_caps.system_mode.Value(),
133 ResultStatus::Success); 78 ResultStatus::Success);
134} 79}
135 80
136ResultStatus AppLoader_NCCH::LoadExec() { 81ResultStatus AppLoader_NCCH::LoadExec(Kernel::SharedPtr<Kernel::Process>& process) {
137 using Kernel::SharedPtr;
138 using Kernel::CodeSet; 82 using Kernel::CodeSet;
83 using Kernel::SharedPtr;
139 84
140 if (!is_loaded) 85 if (!is_loaded)
141 return ResultStatus::ErrorNotLoaded; 86 return ResultStatus::ErrorNotLoaded;
142 87
143 std::vector<u8> code; 88 std::vector<u8> code;
144 if (ResultStatus::Success == ReadCode(code)) { 89 u64_le program_id;
90 if (ResultStatus::Success == ReadCode(code) &&
91 ResultStatus::Success == ReadProgramId(program_id)) {
145 std::string process_name = Common::StringFromFixedZeroTerminatedBuffer( 92 std::string process_name = Common::StringFromFixedZeroTerminatedBuffer(
146 (const char*)exheader_header.codeset_info.name, 8); 93 (const char*)overlay_ncch->exheader_header.codeset_info.name, 8);
147 94
148 SharedPtr<CodeSet> codeset = CodeSet::Create(process_name, ncch_header.program_id); 95 SharedPtr<CodeSet> codeset = CodeSet::Create(process_name, program_id);
149 96
150 codeset->code.offset = 0; 97 codeset->code.offset = 0;
151 codeset->code.addr = exheader_header.codeset_info.text.address; 98 codeset->code.addr = overlay_ncch->exheader_header.codeset_info.text.address;
152 codeset->code.size = exheader_header.codeset_info.text.num_max_pages * Memory::PAGE_SIZE; 99 codeset->code.size =
100 overlay_ncch->exheader_header.codeset_info.text.num_max_pages * Memory::PAGE_SIZE;
153 101
154 codeset->rodata.offset = codeset->code.offset + codeset->code.size; 102 codeset->rodata.offset = codeset->code.offset + codeset->code.size;
155 codeset->rodata.addr = exheader_header.codeset_info.ro.address; 103 codeset->rodata.addr = overlay_ncch->exheader_header.codeset_info.ro.address;
156 codeset->rodata.size = exheader_header.codeset_info.ro.num_max_pages * Memory::PAGE_SIZE; 104 codeset->rodata.size =
105 overlay_ncch->exheader_header.codeset_info.ro.num_max_pages * Memory::PAGE_SIZE;
157 106
158 // TODO(yuriks): Not sure if the bss size is added to the page-aligned .data size or just 107 // TODO(yuriks): Not sure if the bss size is added to the page-aligned .data size or just
159 // to the regular size. Playing it safe for now. 108 // to the regular size. Playing it safe for now.
160 u32 bss_page_size = (exheader_header.codeset_info.bss_size + 0xFFF) & ~0xFFF; 109 u32 bss_page_size = (overlay_ncch->exheader_header.codeset_info.bss_size + 0xFFF) & ~0xFFF;
161 code.resize(code.size() + bss_page_size, 0); 110 code.resize(code.size() + bss_page_size, 0);
162 111
163 codeset->data.offset = codeset->rodata.offset + codeset->rodata.size; 112 codeset->data.offset = codeset->rodata.offset + codeset->rodata.size;
164 codeset->data.addr = exheader_header.codeset_info.data.address; 113 codeset->data.addr = overlay_ncch->exheader_header.codeset_info.data.address;
165 codeset->data.size = 114 codeset->data.size =
166 exheader_header.codeset_info.data.num_max_pages * Memory::PAGE_SIZE + bss_page_size; 115 overlay_ncch->exheader_header.codeset_info.data.num_max_pages * Memory::PAGE_SIZE +
116 bss_page_size;
167 117
168 codeset->entrypoint = codeset->code.addr; 118 codeset->entrypoint = codeset->code.addr;
169 codeset->memory = std::make_shared<std::vector<u8>>(std::move(code)); 119 codeset->memory = std::make_shared<std::vector<u8>>(std::move(code));
170 120
171 Kernel::g_current_process = Kernel::Process::Create("main"); 121 process = Kernel::Process::Create("main");
172 Kernel::g_current_process->LoadModule(codeset, codeset->entrypoint); 122 process->LoadModule(codeset, codeset->entrypoint);
173 123
174 // Attach a resource limit to the process based on the resource limit category 124 // Attach a resource limit to the process based on the resource limit category
175 Kernel::g_current_process->resource_limit = 125 process->resource_limit =
176 Kernel::ResourceLimit::GetForCategory(static_cast<Kernel::ResourceLimitCategory>( 126 Kernel::ResourceLimit::GetForCategory(static_cast<Kernel::ResourceLimitCategory>(
177 exheader_header.arm11_system_local_caps.resource_limit_category)); 127 overlay_ncch->exheader_header.arm11_system_local_caps.resource_limit_category));
178 128
179 // Set the default CPU core for this process 129 // Set the default CPU core for this process
180 Kernel::g_current_process->ideal_processor = 130 process->ideal_processor =
181 exheader_header.arm11_system_local_caps.ideal_processor; 131 overlay_ncch->exheader_header.arm11_system_local_caps.ideal_processor;
182 132
183 // Copy data while converting endianness 133 // Copy data while converting endianness
184 std::array<u32, ARRAY_SIZE(exheader_header.arm11_kernel_caps.descriptors)> kernel_caps; 134 std::array<u32, ARRAY_SIZE(overlay_ncch->exheader_header.arm11_kernel_caps.descriptors)>
185 std::copy_n(exheader_header.arm11_kernel_caps.descriptors, kernel_caps.size(), 135 kernel_caps;
136 std::copy_n(overlay_ncch->exheader_header.arm11_kernel_caps.descriptors, kernel_caps.size(),
186 begin(kernel_caps)); 137 begin(kernel_caps));
187 Kernel::g_current_process->ParseKernelCaps(kernel_caps.data(), kernel_caps.size()); 138 process->ParseKernelCaps(kernel_caps.data(), kernel_caps.size());
188 139
189 s32 priority = exheader_header.arm11_system_local_caps.priority; 140 s32 priority = overlay_ncch->exheader_header.arm11_system_local_caps.priority;
190 u32 stack_size = exheader_header.codeset_info.stack_size; 141 u32 stack_size = overlay_ncch->exheader_header.codeset_info.stack_size;
191 Kernel::g_current_process->Run(codeset->entrypoint, priority, stack_size); 142 process->Run(codeset->entrypoint, priority, stack_size);
192 return ResultStatus::Success; 143 return ResultStatus::Success;
193 } 144 }
194 return ResultStatus::Error; 145 return ResultStatus::Error;
195} 146}
196 147
197ResultStatus AppLoader_NCCH::LoadSectionExeFS(const char* name, std::vector<u8>& buffer) {
198 if (!file.IsOpen())
199 return ResultStatus::Error;
200
201 ResultStatus result = LoadExeFS();
202 if (result != ResultStatus::Success)
203 return result;
204
205 LOG_DEBUG(Loader, "%d sections:", kMaxSections);
206 // Iterate through the ExeFs archive until we find a section with the specified name...
207 for (unsigned section_number = 0; section_number < kMaxSections; section_number++) {
208 const auto& section = exefs_header.section[section_number];
209
210 // Load the specified section...
211 if (strcmp(section.name, name) == 0) {
212 LOG_DEBUG(Loader, "%d - offset: 0x%08X, size: 0x%08X, name: %s", section_number,
213 section.offset, section.size, section.name);
214
215 s64 section_offset =
216 (section.offset + exefs_offset + sizeof(ExeFs_Header) + ncch_offset);
217 file.Seek(section_offset, SEEK_SET);
218
219 if (strcmp(section.name, ".code") == 0 && is_compressed) {
220 // Section is compressed, read compressed .code section...
221 std::unique_ptr<u8[]> temp_buffer;
222 try {
223 temp_buffer.reset(new u8[section.size]);
224 } catch (std::bad_alloc&) {
225 return ResultStatus::ErrorMemoryAllocationFailed;
226 }
227
228 if (file.ReadBytes(&temp_buffer[0], section.size) != section.size)
229 return ResultStatus::Error;
230
231 // Decompress .code section...
232 u32 decompressed_size = LZSS_GetDecompressedSize(&temp_buffer[0], section.size);
233 buffer.resize(decompressed_size);
234 if (!LZSS_Decompress(&temp_buffer[0], section.size, &buffer[0], decompressed_size))
235 return ResultStatus::ErrorInvalidFormat;
236 } else {
237 // Section is uncompressed...
238 buffer.resize(section.size);
239 if (file.ReadBytes(&buffer[0], section.size) != section.size)
240 return ResultStatus::Error;
241 }
242 return ResultStatus::Success;
243 }
244 }
245 return ResultStatus::ErrorNotUsed;
246}
247
248ResultStatus AppLoader_NCCH::LoadExeFS() {
249 if (is_exefs_loaded)
250 return ResultStatus::Success;
251
252 if (!file.IsOpen())
253 return ResultStatus::Error;
254
255 // Reset read pointer in case this file has been read before.
256 file.Seek(0, SEEK_SET);
257
258 if (file.ReadBytes(&ncch_header, sizeof(NCCH_Header)) != sizeof(NCCH_Header))
259 return ResultStatus::Error;
260
261 // Skip NCSD header and load first NCCH (NCSD is just a container of NCCH files)...
262 if (MakeMagic('N', 'C', 'S', 'D') == ncch_header.magic) {
263 LOG_DEBUG(Loader, "Only loading the first (bootable) NCCH within the NCSD file!");
264 ncch_offset = 0x4000;
265 file.Seek(ncch_offset, SEEK_SET);
266 file.ReadBytes(&ncch_header, sizeof(NCCH_Header));
267 }
268
269 // Verify we are loading the correct file type...
270 if (MakeMagic('N', 'C', 'C', 'H') != ncch_header.magic)
271 return ResultStatus::ErrorInvalidFormat;
272
273 // Read ExHeader...
274
275 if (file.ReadBytes(&exheader_header, sizeof(ExHeader_Header)) != sizeof(ExHeader_Header))
276 return ResultStatus::Error;
277
278 is_compressed = (exheader_header.codeset_info.flags.flag & 1) == 1;
279 entry_point = exheader_header.codeset_info.text.address;
280 code_size = exheader_header.codeset_info.text.code_size;
281 stack_size = exheader_header.codeset_info.stack_size;
282 bss_size = exheader_header.codeset_info.bss_size;
283 core_version = exheader_header.arm11_system_local_caps.core_version;
284 priority = exheader_header.arm11_system_local_caps.priority;
285 resource_limit_category = exheader_header.arm11_system_local_caps.resource_limit_category;
286
287 LOG_DEBUG(Loader, "Name: %s", exheader_header.codeset_info.name);
288 LOG_DEBUG(Loader, "Program ID: %016" PRIX64, ncch_header.program_id);
289 LOG_DEBUG(Loader, "Code compressed: %s", is_compressed ? "yes" : "no");
290 LOG_DEBUG(Loader, "Entry point: 0x%08X", entry_point);
291 LOG_DEBUG(Loader, "Code size: 0x%08X", code_size);
292 LOG_DEBUG(Loader, "Stack size: 0x%08X", stack_size);
293 LOG_DEBUG(Loader, "Bss size: 0x%08X", bss_size);
294 LOG_DEBUG(Loader, "Core version: %d", core_version);
295 LOG_DEBUG(Loader, "Thread priority: 0x%X", priority);
296 LOG_DEBUG(Loader, "Resource limit category: %d", resource_limit_category);
297 LOG_DEBUG(Loader, "System Mode: %d",
298 static_cast<int>(exheader_header.arm11_system_local_caps.system_mode));
299
300 if (exheader_header.arm11_system_local_caps.program_id != ncch_header.program_id) {
301 LOG_ERROR(Loader, "ExHeader Program ID mismatch: the ROM is probably encrypted.");
302 return ResultStatus::ErrorEncrypted;
303 }
304
305 // Read ExeFS...
306
307 exefs_offset = ncch_header.exefs_offset * kBlockSize;
308 u32 exefs_size = ncch_header.exefs_size * kBlockSize;
309
310 LOG_DEBUG(Loader, "ExeFS offset: 0x%08X", exefs_offset);
311 LOG_DEBUG(Loader, "ExeFS size: 0x%08X", exefs_size);
312
313 file.Seek(exefs_offset + ncch_offset, SEEK_SET);
314 if (file.ReadBytes(&exefs_header, sizeof(ExeFs_Header)) != sizeof(ExeFs_Header))
315 return ResultStatus::Error;
316
317 is_exefs_loaded = true;
318 return ResultStatus::Success;
319}
320
321void AppLoader_NCCH::ParseRegionLockoutInfo() { 148void AppLoader_NCCH::ParseRegionLockoutInfo() {
322 std::vector<u8> smdh_buffer; 149 std::vector<u8> smdh_buffer;
323 if (ReadIcon(smdh_buffer) == ResultStatus::Success && smdh_buffer.size() >= sizeof(SMDH)) { 150 if (ReadIcon(smdh_buffer) == ResultStatus::Success && smdh_buffer.size() >= sizeof(SMDH)) {
@@ -335,28 +162,43 @@ void AppLoader_NCCH::ParseRegionLockoutInfo() {
335 } 162 }
336} 163}
337 164
338ResultStatus AppLoader_NCCH::Load() { 165ResultStatus AppLoader_NCCH::Load(Kernel::SharedPtr<Kernel::Process>& process) {
166 u64_le ncch_program_id;
167
339 if (is_loaded) 168 if (is_loaded)
340 return ResultStatus::ErrorAlreadyLoaded; 169 return ResultStatus::ErrorAlreadyLoaded;
341 170
342 ResultStatus result = LoadExeFS(); 171 ResultStatus result = base_ncch.Load();
343 if (result != ResultStatus::Success) 172 if (result != ResultStatus::Success)
344 return result; 173 return result;
345 174
346 std::string program_id{Common::StringFromFormat("%016" PRIX64, ncch_header.program_id)}; 175 ReadProgramId(ncch_program_id);
176 std::string program_id{Common::StringFromFormat("%016" PRIX64, ncch_program_id)};
347 177
348 LOG_INFO(Loader, "Program ID: %s", program_id.c_str()); 178 LOG_INFO(Loader, "Program ID: %s", program_id.c_str());
349 179
180 update_ncch.OpenFile(GetUpdateNCCHPath(ncch_program_id));
181 result = update_ncch.Load();
182 if (result == ResultStatus::Success) {
183 overlay_ncch = &update_ncch;
184 }
185
350 Core::Telemetry().AddField(Telemetry::FieldType::Session, "ProgramId", program_id); 186 Core::Telemetry().AddField(Telemetry::FieldType::Session, "ProgramId", program_id);
351 187
188 if (auto room_member = Network::GetRoomMember().lock()) {
189 Network::GameInfo game_info;
190 ReadTitle(game_info.name);
191 game_info.id = ncch_program_id;
192 room_member->SendGameInfo(game_info);
193 }
194
352 is_loaded = true; // Set state to loaded 195 is_loaded = true; // Set state to loaded
353 196
354 result = LoadExec(); // Load the executable into memory for booting 197 result = LoadExec(process); // Load the executable into memory for booting
355 if (ResultStatus::Success != result) 198 if (ResultStatus::Success != result)
356 return result; 199 return result;
357 200
358 Service::FS::RegisterArchiveType(std::make_unique<FileSys::ArchiveFactory_SelfNCCH>(*this), 201 Service::FS::RegisterSelfNCCH(*this);
359 Service::FS::ArchiveIdCode::SelfNCCH);
360 202
361 ParseRegionLockoutInfo(); 203 ParseRegionLockoutInfo();
362 204
@@ -364,61 +206,58 @@ ResultStatus AppLoader_NCCH::Load() {
364} 206}
365 207
366ResultStatus AppLoader_NCCH::ReadCode(std::vector<u8>& buffer) { 208ResultStatus AppLoader_NCCH::ReadCode(std::vector<u8>& buffer) {
367 return LoadSectionExeFS(".code", buffer); 209 return overlay_ncch->LoadSectionExeFS(".code", buffer);
368} 210}
369 211
370ResultStatus AppLoader_NCCH::ReadIcon(std::vector<u8>& buffer) { 212ResultStatus AppLoader_NCCH::ReadIcon(std::vector<u8>& buffer) {
371 return LoadSectionExeFS("icon", buffer); 213 return overlay_ncch->LoadSectionExeFS("icon", buffer);
372} 214}
373 215
374ResultStatus AppLoader_NCCH::ReadBanner(std::vector<u8>& buffer) { 216ResultStatus AppLoader_NCCH::ReadBanner(std::vector<u8>& buffer) {
375 return LoadSectionExeFS("banner", buffer); 217 return overlay_ncch->LoadSectionExeFS("banner", buffer);
376} 218}
377 219
378ResultStatus AppLoader_NCCH::ReadLogo(std::vector<u8>& buffer) { 220ResultStatus AppLoader_NCCH::ReadLogo(std::vector<u8>& buffer) {
379 return LoadSectionExeFS("logo", buffer); 221 return overlay_ncch->LoadSectionExeFS("logo", buffer);
380} 222}
381 223
382ResultStatus AppLoader_NCCH::ReadProgramId(u64& out_program_id) { 224ResultStatus AppLoader_NCCH::ReadProgramId(u64& out_program_id) {
383 if (!file.IsOpen()) 225 ResultStatus result = base_ncch.ReadProgramId(out_program_id);
384 return ResultStatus::Error;
385
386 ResultStatus result = LoadExeFS();
387 if (result != ResultStatus::Success) 226 if (result != ResultStatus::Success)
388 return result; 227 return result;
389 228
390 out_program_id = ncch_header.program_id;
391 return ResultStatus::Success; 229 return ResultStatus::Success;
392} 230}
393 231
394ResultStatus AppLoader_NCCH::ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset, 232ResultStatus AppLoader_NCCH::ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
395 u64& size) { 233 u64& size) {
396 if (!file.IsOpen()) 234 return base_ncch.ReadRomFS(romfs_file, offset, size);
397 return ResultStatus::Error; 235}
398 236
399 // Check if the NCCH has a RomFS... 237ResultStatus AppLoader_NCCH::ReadUpdateRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file,
400 if (ncch_header.romfs_offset != 0 && ncch_header.romfs_size != 0) { 238 u64& offset, u64& size) {
401 u32 romfs_offset = ncch_offset + (ncch_header.romfs_offset * kBlockSize) + 0x1000; 239 ResultStatus result = update_ncch.ReadRomFS(romfs_file, offset, size);
402 u32 romfs_size = (ncch_header.romfs_size * kBlockSize) - 0x1000;
403 240
404 LOG_DEBUG(Loader, "RomFS offset: 0x%08X", romfs_offset); 241 if (result != ResultStatus::Success)
405 LOG_DEBUG(Loader, "RomFS size: 0x%08X", romfs_size); 242 return base_ncch.ReadRomFS(romfs_file, offset, size);
243}
406 244
407 if (file.GetSize() < romfs_offset + romfs_size) 245ResultStatus AppLoader_NCCH::ReadTitle(std::string& title) {
408 return ResultStatus::Error; 246 std::vector<u8> data;
247 Loader::SMDH smdh;
248 ReadIcon(data);
409 249
410 // We reopen the file, to allow its position to be independent from file's 250 if (!Loader::IsValidSMDH(data)) {
411 romfs_file = std::make_shared<FileUtil::IOFile>(filepath, "rb"); 251 return ResultStatus::ErrorInvalidFormat;
412 if (!romfs_file->IsOpen()) 252 }
413 return ResultStatus::Error;
414 253
415 offset = romfs_offset; 254 memcpy(&smdh, data.data(), sizeof(Loader::SMDH));
416 size = romfs_size;
417 255
418 return ResultStatus::Success; 256 const auto& short_title = smdh.GetShortTitle(SMDH::TitleLanguage::English);
419 } 257 auto title_end = std::find(short_title.begin(), short_title.end(), u'\0');
420 LOG_DEBUG(Loader, "NCCH has no RomFS"); 258 title = Common::UTF16ToUTF8(std::u16string{short_title.begin(), title_end});
421 return ResultStatus::ErrorNotUsed; 259
260 return ResultStatus::Success;
422} 261}
423 262
424} // namespace Loader 263} // namespace Loader
diff --git a/src/core/loader/ncch.h b/src/core/loader/ncch.h
index 0ebd47fd5..09230ae33 100644
--- a/src/core/loader/ncch.h
+++ b/src/core/loader/ncch.h
@@ -5,155 +5,12 @@
5#pragma once 5#pragma once
6 6
7#include <memory> 7#include <memory>
8#include "common/bit_field.h"
9#include "common/common_types.h" 8#include "common/common_types.h"
10#include "common/swap.h" 9#include "common/swap.h"
10#include "core/file_sys/ncch_container.h"
11#include "core/loader/loader.h" 11#include "core/loader/loader.h"
12 12
13//////////////////////////////////////////////////////////////////////////////////////////////////// 13////////////////////////////////////////////////////////////////////////////////////////////////////
14/// NCCH header (Note: "NCCH" appears to be a publicly unknown acronym)
15
16struct NCCH_Header {
17 u8 signature[0x100];
18 u32_le magic;
19 u32_le content_size;
20 u8 partition_id[8];
21 u16_le maker_code;
22 u16_le version;
23 u8 reserved_0[4];
24 u64_le program_id;
25 u8 reserved_1[0x10];
26 u8 logo_region_hash[0x20];
27 u8 product_code[0x10];
28 u8 extended_header_hash[0x20];
29 u32_le extended_header_size;
30 u8 reserved_2[4];
31 u8 flags[8];
32 u32_le plain_region_offset;
33 u32_le plain_region_size;
34 u32_le logo_region_offset;
35 u32_le logo_region_size;
36 u32_le exefs_offset;
37 u32_le exefs_size;
38 u32_le exefs_hash_region_size;
39 u8 reserved_3[4];
40 u32_le romfs_offset;
41 u32_le romfs_size;
42 u32_le romfs_hash_region_size;
43 u8 reserved_4[4];
44 u8 exefs_super_block_hash[0x20];
45 u8 romfs_super_block_hash[0x20];
46};
47
48static_assert(sizeof(NCCH_Header) == 0x200, "NCCH header structure size is wrong");
49
50////////////////////////////////////////////////////////////////////////////////////////////////////
51// ExeFS (executable file system) headers
52
53struct ExeFs_SectionHeader {
54 char name[8];
55 u32 offset;
56 u32 size;
57};
58
59struct ExeFs_Header {
60 ExeFs_SectionHeader section[8];
61 u8 reserved[0x80];
62 u8 hashes[8][0x20];
63};
64
65////////////////////////////////////////////////////////////////////////////////////////////////////
66// ExHeader (executable file system header) headers
67
68struct ExHeader_SystemInfoFlags {
69 u8 reserved[5];
70 u8 flag;
71 u8 remaster_version[2];
72};
73
74struct ExHeader_CodeSegmentInfo {
75 u32 address;
76 u32 num_max_pages;
77 u32 code_size;
78};
79
80struct ExHeader_CodeSetInfo {
81 u8 name[8];
82 ExHeader_SystemInfoFlags flags;
83 ExHeader_CodeSegmentInfo text;
84 u32 stack_size;
85 ExHeader_CodeSegmentInfo ro;
86 u8 reserved[4];
87 ExHeader_CodeSegmentInfo data;
88 u32 bss_size;
89};
90
91struct ExHeader_DependencyList {
92 u8 program_id[0x30][8];
93};
94
95struct ExHeader_SystemInfo {
96 u64 save_data_size;
97 u8 jump_id[8];
98 u8 reserved_2[0x30];
99};
100
101struct ExHeader_StorageInfo {
102 u8 ext_save_data_id[8];
103 u8 system_save_data_id[8];
104 u8 reserved[8];
105 u8 access_info[7];
106 u8 other_attributes;
107};
108
109struct ExHeader_ARM11_SystemLocalCaps {
110 u64_le program_id;
111 u32_le core_version;
112 u8 reserved_flags[2];
113 union {
114 u8 flags0;
115 BitField<0, 2, u8> ideal_processor;
116 BitField<2, 2, u8> affinity_mask;
117 BitField<4, 4, u8> system_mode;
118 };
119 u8 priority;
120 u8 resource_limit_descriptor[0x10][2];
121 ExHeader_StorageInfo storage_info;
122 u8 service_access_control[0x20][8];
123 u8 ex_service_access_control[0x2][8];
124 u8 reserved[0xf];
125 u8 resource_limit_category;
126};
127
128struct ExHeader_ARM11_KernelCaps {
129 u32_le descriptors[28];
130 u8 reserved[0x10];
131};
132
133struct ExHeader_ARM9_AccessControl {
134 u8 descriptors[15];
135 u8 descversion;
136};
137
138struct ExHeader_Header {
139 ExHeader_CodeSetInfo codeset_info;
140 ExHeader_DependencyList dependency_list;
141 ExHeader_SystemInfo system_info;
142 ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps;
143 ExHeader_ARM11_KernelCaps arm11_kernel_caps;
144 ExHeader_ARM9_AccessControl arm9_access_control;
145 struct {
146 u8 signature[0x100];
147 u8 ncch_public_key_modulus[0x100];
148 ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps;
149 ExHeader_ARM11_KernelCaps arm11_kernel_caps;
150 ExHeader_ARM9_AccessControl arm9_access_control;
151 } access_desc;
152};
153
154static_assert(sizeof(ExHeader_Header) == 0x800, "ExHeader structure size is wrong");
155
156////////////////////////////////////////////////////////////////////////////////////////////////////
157// Loader namespace 14// Loader namespace
158 15
159namespace Loader { 16namespace Loader {
@@ -162,7 +19,8 @@ namespace Loader {
162class AppLoader_NCCH final : public AppLoader { 19class AppLoader_NCCH final : public AppLoader {
163public: 20public:
164 AppLoader_NCCH(FileUtil::IOFile&& file, const std::string& filepath) 21 AppLoader_NCCH(FileUtil::IOFile&& file, const std::string& filepath)
165 : AppLoader(std::move(file)), filepath(filepath) {} 22 : AppLoader(std::move(file)), filepath(filepath), base_ncch(filepath),
23 overlay_ncch(&base_ncch) {}
166 24
167 /** 25 /**
168 * Returns the type of the file 26 * Returns the type of the file
@@ -175,7 +33,7 @@ public:
175 return IdentifyType(file); 33 return IdentifyType(file);
176 } 34 }
177 35
178 ResultStatus Load() override; 36 ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override;
179 37
180 /** 38 /**
181 * Loads the Exheader and returns the system mode for this application. 39 * Loads the Exheader and returns the system mode for this application.
@@ -191,63 +49,30 @@ public:
191 49
192 ResultStatus ReadLogo(std::vector<u8>& buffer) override; 50 ResultStatus ReadLogo(std::vector<u8>& buffer) override;
193 51
194 /**
195 * Get the program id of the application
196 * @param out_program_id Reference to store program id into
197 * @return ResultStatus result of function
198 */
199 ResultStatus ReadProgramId(u64& out_program_id) override; 52 ResultStatus ReadProgramId(u64& out_program_id) override;
200 53
201 /**
202 * Get the RomFS of the application
203 * @param romfs_file Reference to buffer to store data
204 * @param offset Offset in the file to the RomFS
205 * @param size Size of the RomFS in bytes
206 * @return ResultStatus result of function
207 */
208 ResultStatus ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset, 54 ResultStatus ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
209 u64& size) override; 55 u64& size) override;
210 56
211private: 57 ResultStatus ReadUpdateRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
212 /** 58 u64& size) override;
213 * Reads an application ExeFS section of an NCCH file into AppLoader (e.g. .code, .logo, etc.)
214 * @param name Name of section to read out of NCCH file
215 * @param buffer Vector to read data into
216 * @return ResultStatus result of function
217 */
218 ResultStatus LoadSectionExeFS(const char* name, std::vector<u8>& buffer);
219 59
220 /** 60 ResultStatus ReadTitle(std::string& title) override;
221 * Loads .code section into memory for booting
222 * @return ResultStatus result of function
223 */
224 ResultStatus LoadExec();
225 61
62private:
226 /** 63 /**
227 * Ensure ExeFS is loaded and ready for reading sections 64 * Loads .code section into memory for booting
65 * @param process The newly created process
228 * @return ResultStatus result of function 66 * @return ResultStatus result of function
229 */ 67 */
230 ResultStatus LoadExeFS(); 68 ResultStatus LoadExec(Kernel::SharedPtr<Kernel::Process>& process);
231 69
232 /// Reads the region lockout info in the SMDH and send it to CFG service 70 /// Reads the region lockout info in the SMDH and send it to CFG service
233 void ParseRegionLockoutInfo(); 71 void ParseRegionLockoutInfo();
234 72
235 bool is_exefs_loaded = false; 73 FileSys::NCCHContainer base_ncch;
236 bool is_compressed = false; 74 FileSys::NCCHContainer update_ncch;
237 75 FileSys::NCCHContainer* overlay_ncch;
238 u32 entry_point = 0;
239 u32 code_size = 0;
240 u32 stack_size = 0;
241 u32 bss_size = 0;
242 u32 core_version = 0;
243 u8 priority = 0;
244 u8 resource_limit_category = 0;
245 u32 ncch_offset = 0; // Offset to NCCH header, can be 0 or after NCSD header
246 u32 exefs_offset = 0;
247
248 NCCH_Header ncch_header;
249 ExeFs_Header exefs_header;
250 ExHeader_Header exheader_header;
251 76
252 std::string filepath; 77 std::string filepath;
253}; 78};
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp
index 753e7e08b..24c2c55a9 100644
--- a/src/core/loader/nro.cpp
+++ b/src/core/loader/nro.cpp
@@ -132,7 +132,7 @@ bool AppLoader_NRO::LoadNro(const std::string& path, VAddr load_base) {
132 return true; 132 return true;
133} 133}
134 134
135ResultStatus AppLoader_NRO::Load() { 135ResultStatus AppLoader_NRO::Load(Kernel::SharedPtr<Kernel::Process>& process) {
136 if (is_loaded) { 136 if (is_loaded) {
137 return ResultStatus::ErrorAlreadyLoaded; 137 return ResultStatus::ErrorAlreadyLoaded;
138 } 138 }
@@ -142,16 +142,16 @@ ResultStatus AppLoader_NRO::Load() {
142 142
143 // Load and relocate "main" and "sdk" NSO 143 // Load and relocate "main" and "sdk" NSO
144 static constexpr VAddr base_addr{Memory::PROCESS_IMAGE_VADDR}; 144 static constexpr VAddr base_addr{Memory::PROCESS_IMAGE_VADDR};
145 Kernel::g_current_process = Kernel::Process::Create("main"); 145 process = Kernel::Process::Create("main");
146 if (!LoadNro(filepath, base_addr)) { 146 if (!LoadNro(filepath, base_addr)) {
147 return ResultStatus::ErrorInvalidFormat; 147 return ResultStatus::ErrorInvalidFormat;
148 } 148 }
149 149
150 Kernel::g_current_process->svc_access_mask.set(); 150 process->svc_access_mask.set();
151 Kernel::g_current_process->address_mappings = default_address_mappings; 151 process->address_mappings = default_address_mappings;
152 Kernel::g_current_process->resource_limit = 152 process->resource_limit =
153 Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); 153 Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION);
154 Kernel::g_current_process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE); 154 process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE);
155 155
156 ResolveImports(); 156 ResolveImports();
157 157
diff --git a/src/core/loader/nro.h b/src/core/loader/nro.h
index c3c7622fd..c85768c5b 100644
--- a/src/core/loader/nro.h
+++ b/src/core/loader/nro.h
@@ -31,7 +31,7 @@ public:
31 return IdentifyType(file); 31 return IdentifyType(file);
32 } 32 }
33 33
34 ResultStatus Load() override; 34 ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override;
35 35
36private: 36private:
37 bool LoadNro(const std::string& path, VAddr load_base); 37 bool LoadNro(const std::string& path, VAddr load_base);
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp
index ac8d12ecc..b1b57d0c0 100644
--- a/src/core/loader/nso.cpp
+++ b/src/core/loader/nso.cpp
@@ -144,7 +144,7 @@ VAddr AppLoader_NSO::LoadNso(const std::string& path, VAddr load_base, bool relo
144 return load_base + image_size; 144 return load_base + image_size;
145} 145}
146 146
147ResultStatus AppLoader_NSO::Load() { 147ResultStatus AppLoader_NSO::Load(Kernel::SharedPtr<Kernel::Process>& process) {
148 if (is_loaded) { 148 if (is_loaded) {
149 return ResultStatus::ErrorAlreadyLoaded; 149 return ResultStatus::ErrorAlreadyLoaded;
150 } 150 }
@@ -154,7 +154,7 @@ ResultStatus AppLoader_NSO::Load() {
154 154
155 // Load and relocate "rtld" NSO 155 // Load and relocate "rtld" NSO
156 static constexpr VAddr base_addr{Memory::PROCESS_IMAGE_VADDR}; 156 static constexpr VAddr base_addr{Memory::PROCESS_IMAGE_VADDR};
157 Kernel::g_current_process = Kernel::Process::Create("main"); 157 process = Kernel::Process::Create("main");
158 VAddr next_base_addr{LoadNso(filepath, base_addr)}; 158 VAddr next_base_addr{LoadNso(filepath, base_addr)};
159 if (!next_base_addr) { 159 if (!next_base_addr) {
160 return ResultStatus::ErrorInvalidFormat; 160 return ResultStatus::ErrorInvalidFormat;
@@ -170,11 +170,11 @@ ResultStatus AppLoader_NSO::Load() {
170 } 170 }
171 } 171 }
172 172
173 Kernel::g_current_process->svc_access_mask.set(); 173 process->svc_access_mask.set();
174 Kernel::g_current_process->address_mappings = default_address_mappings; 174 process->address_mappings = default_address_mappings;
175 Kernel::g_current_process->resource_limit = 175 process->resource_limit =
176 Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); 176 Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION);
177 Kernel::g_current_process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE); 177 process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE);
178 178
179 ResolveImports(); 179 ResolveImports();
180 180
diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h
index c29803d81..b6b86c209 100644
--- a/src/core/loader/nso.h
+++ b/src/core/loader/nso.h
@@ -32,7 +32,7 @@ public:
32 return IdentifyType(file); 32 return IdentifyType(file);
33 } 33 }
34 34
35 ResultStatus Load() override; 35 ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override;
36 36
37private: 37private:
38 VAddr LoadNso(const std::string& path, VAddr load_base, bool relocate = false); 38 VAddr LoadNso(const std::string& path, VAddr load_base, bool relocate = false);
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index ebe16b030..462d68386 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -4,95 +4,53 @@
4 4
5#include <array> 5#include <array>
6#include <cstring> 6#include <cstring>
7#include "audio_core/audio_core.h"
7#include "common/assert.h" 8#include "common/assert.h"
8#include "common/common_types.h" 9#include "common/common_types.h"
9#include "common/logging/log.h" 10#include "common/logging/log.h"
10#include "common/swap.h" 11#include "common/swap.h"
12#include "core/arm/arm_interface.h"
13#include "core/core.h"
14#include "core/hle/kernel/memory.h"
11#include "core/hle/kernel/process.h" 15#include "core/hle/kernel/process.h"
16#include "core/hle/lock.h"
12#include "core/memory.h" 17#include "core/memory.h"
13#include "core/memory_setup.h" 18#include "core/memory_setup.h"
14#include "core/mmio.h"
15#include "video_core/renderer_base.h" 19#include "video_core/renderer_base.h"
16#include "video_core/video_core.h" 20#include "video_core/video_core.h"
17 21
18namespace Memory { 22namespace Memory {
19 23
20enum class PageType { 24static std::array<u8, Memory::VRAM_SIZE> vram;
21 /// Page is unmapped and should cause an access error. 25static std::array<u8, Memory::N3DS_EXTRA_RAM_SIZE> n3ds_extra_ram;
22 Unmapped,
23 /// Page is mapped to regular memory. This is the only type you can get pointers to.
24 Memory,
25 /// Page is mapped to regular memory, but also needs to check for rasterizer cache flushing and
26 /// invalidation
27 RasterizerCachedMemory,
28 /// Page is mapped to a I/O region. Writing and reading to this page is handled by functions.
29 Special,
30 /// Page is mapped to a I/O region, but also needs to check for rasterizer cache flushing and
31 /// invalidation
32 RasterizerCachedSpecial,
33};
34
35struct SpecialRegion {
36 VAddr base;
37 u64 size;
38 MMIORegionPointer handler;
39};
40 26
41/** 27static PageTable* current_page_table = nullptr;
42 * A (reasonably) fast way of allowing switchable and remappable process address spaces. It loosely 28
43 * mimics the way a real CPU page table works, but instead is optimized for minimal decoding and 29void SetCurrentPageTable(PageTable* page_table) {
44 * fetching requirements when accessing. In the usual case of an access to regular memory, it only 30 current_page_table = page_table;
45 * requires an indexed fetch and a check for NULL. 31 if (Core::System::GetInstance().IsPoweredOn()) {
46 */ 32 Core::CPU().PageTableChanged();
47struct PageTable { 33 }
48 /** 34}
49 * Array of memory pointers backing each page. An entry can only be non-null if the 35
50 * corresponding entry in the `attributes` array is of type `Memory`. 36PageTable* GetCurrentPageTable() {
51 */ 37 return current_page_table;
52 std::map<u64, u8*> pointers; 38}
53 39
54 /** 40static void MapPages(PageTable& page_table, VAddr base, u32 size, u8* memory, PageType type) {
55 * Contains MMIO handlers that back memory regions whose entries in the `attribute` array is of
56 * type `Special`.
57 */
58 std::vector<SpecialRegion> special_regions;
59
60 /**
61 * Array of fine grained page attributes. If it is set to any value other than `Memory`, then
62 * the corresponding entry in `pointers` MUST be set to null.
63 */
64 std::map<u64, PageType> attributes;
65
66 /**
67 * Indicates the number of externally cached resources touching a page that should be
68 * flushed before the memory is accessed
69 */
70 std::map<u64, u8> cached_res_count;
71};
72
73/// Singular page table used for the singleton process
74static PageTable main_page_table;
75/// Currently active page table
76static PageTable* current_page_table = &main_page_table;
77
78//std::array<u8*, PAGE_TABLE_NUM_ENTRIES>* GetCurrentPageTablePointers() {
79// return &current_page_table->pointers;
80//}
81
82static void MapPages(u64 base, u64 size, u8* memory, PageType type) {
83 LOG_DEBUG(HW_Memory, "Mapping %p onto %08X-%08X", memory, base * PAGE_SIZE, 41 LOG_DEBUG(HW_Memory, "Mapping %p onto %08X-%08X", memory, base * PAGE_SIZE,
84 (base + size) * PAGE_SIZE); 42 (base + size) * PAGE_SIZE);
85 43
86 RasterizerFlushVirtualRegion(base << PAGE_BITS, size * PAGE_SIZE, 44 RasterizerFlushVirtualRegion(base << PAGE_BITS, size * PAGE_SIZE,
87 FlushMode::FlushAndInvalidate); 45 FlushMode::FlushAndInvalidate);
88 46
89 u64 end = base + size; 47 VAddr end = base + size;
90 while (base != end) { 48 while (base != end) {
91 ASSERT_MSG(base < PAGE_TABLE_NUM_ENTRIES, "out of range mapping at %08X", base); 49 ASSERT_MSG(base < PAGE_TABLE_NUM_ENTRIES, "out of range mapping at %08X", base);
92 50
93 current_page_table->attributes[base] = type; 51 page_table.attributes[base] = type;
94 current_page_table->pointers[base] = memory; 52 page_table.pointers[base] = memory;
95 current_page_table->cached_res_count[base] = 0; 53 page_table.cached_res_count[base] = 0;
96 54
97 base += 1; 55 base += 1;
98 if (memory != nullptr) 56 if (memory != nullptr)
@@ -100,40 +58,34 @@ static void MapPages(u64 base, u64 size, u8* memory, PageType type) {
100 } 58 }
101} 59}
102 60
103void InitMemoryMap() { 61void MapMemoryRegion(PageTable& page_table, VAddr base, u32 size, u8* target) {
104 //main_page_table.pointers.fill(nullptr);
105 //main_page_table.attributes.fill(PageType::Unmapped);
106 //main_page_table.cached_res_count.fill(0);
107}
108
109void MapMemoryRegion(VAddr base, u64 size, u8* target) {
110 ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size); 62 ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size);
111 ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base); 63 ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base);
112 MapPages(base / PAGE_SIZE, size / PAGE_SIZE, target, PageType::Memory); 64 MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, target, PageType::Memory);
113} 65}
114 66
115void MapIoRegion(VAddr base, u64 size, MMIORegionPointer mmio_handler) { 67void MapIoRegion(PageTable& page_table, VAddr base, u32 size, MMIORegionPointer mmio_handler) {
116 ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size); 68 ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size);
117 ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base); 69 ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base);
118 MapPages(base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Special); 70 MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Special);
119 71
120 current_page_table->special_regions.emplace_back(SpecialRegion{base, size, mmio_handler}); 72 page_table.special_regions.emplace_back(SpecialRegion{base, size, mmio_handler});
121} 73}
122 74
123void UnmapRegion(VAddr base, u64 size) { 75void UnmapRegion(PageTable& page_table, VAddr base, u32 size) {
124 ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size); 76 ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size);
125 ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base); 77 ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base);
126 MapPages(base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Unmapped); 78 MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Unmapped);
127} 79}
128 80
129/** 81/**
130 * Gets a pointer to the exact memory at the virtual address (i.e. not page aligned) 82 * Gets a pointer to the exact memory at the virtual address (i.e. not page aligned)
131 * using a VMA from the current process 83 * using a VMA from the current process
132 */ 84 */
133static u8* GetPointerFromVMA(VAddr vaddr) { 85static u8* GetPointerFromVMA(const Kernel::Process& process, VAddr vaddr) {
134 u8* direct_pointer = nullptr; 86 u8* direct_pointer = nullptr;
135 87
136 auto& vm_manager = Kernel::g_current_process->vm_manager; 88 auto& vm_manager = process.vm_manager;
137 89
138 auto it = vm_manager.FindVMA(vaddr); 90 auto it = vm_manager.FindVMA(vaddr);
139 ASSERT(it != vm_manager.vma_map.end()); 91 ASSERT(it != vm_manager.vma_map.end());
@@ -156,10 +108,18 @@ static u8* GetPointerFromVMA(VAddr vaddr) {
156} 108}
157 109
158/** 110/**
111 * Gets a pointer to the exact memory at the virtual address (i.e. not page aligned)
112 * using a VMA from the current process.
113 */
114static u8* GetPointerFromVMA(VAddr vaddr) {
115 return GetPointerFromVMA(*Kernel::g_current_process, vaddr);
116}
117
118/**
159 * This function should only be called for virtual addreses with attribute `PageType::Special`. 119 * This function should only be called for virtual addreses with attribute `PageType::Special`.
160 */ 120 */
161static MMIORegionPointer GetMMIOHandler(VAddr vaddr) { 121static MMIORegionPointer GetMMIOHandler(const PageTable& page_table, VAddr vaddr) {
162 for (const auto& region : current_page_table->special_regions) { 122 for (const auto& region : page_table.special_regions) {
163 if (vaddr >= region.base && vaddr < (region.base + region.size)) { 123 if (vaddr >= region.base && vaddr < (region.base + region.size)) {
164 return region.handler; 124 return region.handler;
165 } 125 }
@@ -168,6 +128,11 @@ static MMIORegionPointer GetMMIOHandler(VAddr vaddr) {
168 return nullptr; // Should never happen 128 return nullptr; // Should never happen
169} 129}
170 130
131static MMIORegionPointer GetMMIOHandler(VAddr vaddr) {
132 const PageTable& page_table = Kernel::g_current_process->vm_manager.page_table;
133 return GetMMIOHandler(page_table, vaddr);
134}
135
171template <typename T> 136template <typename T>
172T ReadMMIO(MMIORegionPointer mmio_handler, VAddr addr); 137T ReadMMIO(MMIORegionPointer mmio_handler, VAddr addr);
173 138
@@ -181,10 +146,13 @@ T Read(const VAddr vaddr) {
181 return value; 146 return value;
182 } 147 }
183 148
149 // The memory access might do an MMIO or cached access, so we have to lock the HLE kernel state
150 std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
151
184 PageType type = current_page_table->attributes[vaddr >> PAGE_BITS]; 152 PageType type = current_page_table->attributes[vaddr >> PAGE_BITS];
185 switch (type) { 153 switch (type) {
186 case PageType::Unmapped: 154 case PageType::Unmapped:
187 LOG_ERROR(HW_Memory, "unmapped Read%lu @ 0x%llx", sizeof(T) * 8, vaddr); 155 LOG_ERROR(HW_Memory, "unmapped Read%lu @ 0x%08X", sizeof(T) * 8, vaddr);
188 return 0; 156 return 0;
189 case PageType::Memory: 157 case PageType::Memory:
190 ASSERT_MSG(false, "Mapped memory page without a pointer @ %08X", vaddr); 158 ASSERT_MSG(false, "Mapped memory page without a pointer @ %08X", vaddr);
@@ -219,10 +187,13 @@ void Write(const VAddr vaddr, const T data) {
219 return; 187 return;
220 } 188 }
221 189
190 // The memory access might do an MMIO or cached access, so we have to lock the HLE kernel state
191 std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
192
222 PageType type = current_page_table->attributes[vaddr >> PAGE_BITS]; 193 PageType type = current_page_table->attributes[vaddr >> PAGE_BITS];
223 switch (type) { 194 switch (type) {
224 case PageType::Unmapped: 195 case PageType::Unmapped:
225 LOG_ERROR(HW_Memory, "unmapped Write%lu 0x%llx @ 0x%llx", sizeof(data) * 8, (u64)data, 196 LOG_ERROR(HW_Memory, "unmapped Write%lu 0x%08X @ 0x%08X", sizeof(data) * 8, (u32)data,
226 vaddr); 197 vaddr);
227 return; 198 return;
228 case PageType::Memory: 199 case PageType::Memory:
@@ -246,18 +217,20 @@ void Write(const VAddr vaddr, const T data) {
246 } 217 }
247} 218}
248 219
249bool IsValidVirtualAddress(const VAddr vaddr) { 220bool IsValidVirtualAddress(const Kernel::Process& process, const VAddr vaddr) {
250 const u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; 221 auto& page_table = process.vm_manager.page_table;
222
223 const u8* page_pointer = page_table.pointers[vaddr >> PAGE_BITS];
251 if (page_pointer) 224 if (page_pointer)
252 return true; 225 return true;
253 226
254 if (current_page_table->attributes[vaddr >> PAGE_BITS] == PageType::RasterizerCachedMemory) 227 if (page_table.attributes[vaddr >> PAGE_BITS] == PageType::RasterizerCachedMemory)
255 return true; 228 return true;
256 229
257 if (current_page_table->attributes[vaddr >> PAGE_BITS] != PageType::Special) 230 if (page_table.attributes[vaddr >> PAGE_BITS] != PageType::Special)
258 return false; 231 return false;
259 232
260 MMIORegionPointer mmio_region = GetMMIOHandler(vaddr); 233 MMIORegionPointer mmio_region = GetMMIOHandler(page_table, vaddr);
261 if (mmio_region) { 234 if (mmio_region) {
262 return mmio_region->IsValidAddress(vaddr); 235 return mmio_region->IsValidAddress(vaddr);
263 } 236 }
@@ -265,9 +238,12 @@ bool IsValidVirtualAddress(const VAddr vaddr) {
265 return false; 238 return false;
266} 239}
267 240
241bool IsValidVirtualAddress(const VAddr vaddr) {
242 return IsValidVirtualAddress(*Kernel::g_current_process, vaddr);
243}
244
268bool IsValidPhysicalAddress(const PAddr paddr) { 245bool IsValidPhysicalAddress(const PAddr paddr) {
269 boost::optional<VAddr> vaddr = PhysicalToVirtualAddress(paddr); 246 return GetPhysicalPointer(paddr) != nullptr;
270 return vaddr && IsValidVirtualAddress(*vaddr);
271} 247}
272 248
273u8* GetPointer(const VAddr vaddr) { 249u8* GetPointer(const VAddr vaddr) {
@@ -280,7 +256,7 @@ u8* GetPointer(const VAddr vaddr) {
280 return GetPointerFromVMA(vaddr); 256 return GetPointerFromVMA(vaddr);
281 } 257 }
282 258
283 LOG_ERROR(HW_Memory, "unknown GetPointer @ 0x%llx", vaddr); 259 LOG_ERROR(HW_Memory, "unknown GetPointer @ 0x%08x", vaddr);
284 return nullptr; 260 return nullptr;
285} 261}
286 262
@@ -299,12 +275,66 @@ std::string ReadCString(VAddr vaddr, std::size_t max_length) {
299} 275}
300 276
301u8* GetPhysicalPointer(PAddr address) { 277u8* GetPhysicalPointer(PAddr address) {
302 // TODO(Subv): This call should not go through the application's memory mapping. 278 struct MemoryArea {
303 boost::optional<VAddr> vaddr = PhysicalToVirtualAddress(address); 279 PAddr paddr_base;
304 return vaddr ? GetPointer(*vaddr) : nullptr; 280 u32 size;
281 };
282
283 static constexpr MemoryArea memory_areas[] = {
284 {VRAM_PADDR, VRAM_SIZE},
285 {IO_AREA_PADDR, IO_AREA_SIZE},
286 {DSP_RAM_PADDR, DSP_RAM_SIZE},
287 {FCRAM_PADDR, FCRAM_N3DS_SIZE},
288 {N3DS_EXTRA_RAM_PADDR, N3DS_EXTRA_RAM_SIZE},
289 };
290
291 const auto area =
292 std::find_if(std::begin(memory_areas), std::end(memory_areas), [&](const auto& area) {
293 return address >= area.paddr_base && address < area.paddr_base + area.size;
294 });
295
296 if (area == std::end(memory_areas)) {
297 LOG_ERROR(HW_Memory, "unknown GetPhysicalPointer @ 0x%08X", address);
298 return nullptr;
299 }
300
301 if (area->paddr_base == IO_AREA_PADDR) {
302 LOG_ERROR(HW_Memory, "MMIO mappings are not supported yet. phys_addr=0x%08X", address);
303 return nullptr;
304 }
305
306 u64 offset_into_region = address - area->paddr_base;
307
308 u8* target_pointer = nullptr;
309 switch (area->paddr_base) {
310 case VRAM_PADDR:
311 target_pointer = vram.data() + offset_into_region;
312 break;
313 case DSP_RAM_PADDR:
314 target_pointer = AudioCore::GetDspMemory().data() + offset_into_region;
315 break;
316 case FCRAM_PADDR:
317 for (const auto& region : Kernel::memory_regions) {
318 if (offset_into_region >= region.base &&
319 offset_into_region < region.base + region.size) {
320 target_pointer =
321 region.linear_heap_memory->data() + offset_into_region - region.base;
322 break;
323 }
324 }
325 ASSERT_MSG(target_pointer != nullptr, "Invalid FCRAM address");
326 break;
327 case N3DS_EXTRA_RAM_PADDR:
328 target_pointer = n3ds_extra_ram.data() + offset_into_region;
329 break;
330 default:
331 UNREACHABLE();
332 }
333
334 return target_pointer;
305} 335}
306 336
307void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) { 337void RasterizerMarkRegionCached(PAddr start, u32 size, int count_delta) {
308 if (start == 0) { 338 if (start == 0) {
309 return; 339 return;
310 } 340 }
@@ -314,8 +344,15 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) {
314 344
315 for (unsigned i = 0; i < num_pages; ++i, paddr += PAGE_SIZE) { 345 for (unsigned i = 0; i < num_pages; ++i, paddr += PAGE_SIZE) {
316 boost::optional<VAddr> maybe_vaddr = PhysicalToVirtualAddress(paddr); 346 boost::optional<VAddr> maybe_vaddr = PhysicalToVirtualAddress(paddr);
317 if (!maybe_vaddr) 347 // While the physical <-> virtual mapping is 1:1 for the regions supported by the cache,
348 // some games (like Pokemon Super Mystery Dungeon) will try to use textures that go beyond
349 // the end address of VRAM, causing the Virtual->Physical translation to fail when flushing
350 // parts of the texture.
351 if (!maybe_vaddr) {
352 LOG_ERROR(HW_Memory,
353 "Trying to flush a cached region to an invalid physical address %08X", paddr);
318 continue; 354 continue;
355 }
319 VAddr vaddr = *maybe_vaddr; 356 VAddr vaddr = *maybe_vaddr;
320 357
321 u8& res_count = current_page_table->cached_res_count[vaddr >> PAGE_BITS]; 358 u8& res_count = current_page_table->cached_res_count[vaddr >> PAGE_BITS];
@@ -327,6 +364,10 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) {
327 if (res_count == 0) { 364 if (res_count == 0) {
328 PageType& page_type = current_page_table->attributes[vaddr >> PAGE_BITS]; 365 PageType& page_type = current_page_table->attributes[vaddr >> PAGE_BITS];
329 switch (page_type) { 366 switch (page_type) {
367 case PageType::Unmapped:
368 // It is not necessary for a process to have this region mapped into its address
369 // space, for example, a system module need not have a VRAM mapping.
370 break;
330 case PageType::Memory: 371 case PageType::Memory:
331 page_type = PageType::RasterizerCachedMemory; 372 page_type = PageType::RasterizerCachedMemory;
332 current_page_table->pointers[vaddr >> PAGE_BITS] = nullptr; 373 current_page_table->pointers[vaddr >> PAGE_BITS] = nullptr;
@@ -345,6 +386,10 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) {
345 if (res_count == 0) { 386 if (res_count == 0) {
346 PageType& page_type = current_page_table->attributes[vaddr >> PAGE_BITS]; 387 PageType& page_type = current_page_table->attributes[vaddr >> PAGE_BITS];
347 switch (page_type) { 388 switch (page_type) {
389 case PageType::Unmapped:
390 // It is not necessary for a process to have this region mapped into its address
391 // space, for example, a system module need not have a VRAM mapping.
392 break;
348 case PageType::RasterizerCachedMemory: { 393 case PageType::RasterizerCachedMemory: {
349 u8* pointer = GetPointerFromVMA(vaddr & ~PAGE_MASK); 394 u8* pointer = GetPointerFromVMA(vaddr & ~PAGE_MASK);
350 if (pointer == nullptr) { 395 if (pointer == nullptr) {
@@ -368,13 +413,13 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) {
368 } 413 }
369} 414}
370 415
371void RasterizerFlushRegion(PAddr start, u64 size) { 416void RasterizerFlushRegion(PAddr start, u32 size) {
372 if (VideoCore::g_renderer != nullptr) { 417 if (VideoCore::g_renderer != nullptr) {
373 VideoCore::g_renderer->Rasterizer()->FlushRegion(start, size); 418 VideoCore::g_renderer->Rasterizer()->FlushRegion(start, size);
374 } 419 }
375} 420}
376 421
377void RasterizerFlushAndInvalidateRegion(PAddr start, u64 size) { 422void RasterizerFlushAndInvalidateRegion(PAddr start, u32 size) {
378 // Since pages are unmapped on shutdown after video core is shutdown, the renderer may be 423 // Since pages are unmapped on shutdown after video core is shutdown, the renderer may be
379 // null here 424 // null here
380 if (VideoCore::g_renderer != nullptr) { 425 if (VideoCore::g_renderer != nullptr) {
@@ -382,7 +427,7 @@ void RasterizerFlushAndInvalidateRegion(PAddr start, u64 size) {
382 } 427 }
383} 428}
384 429
385void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) { 430void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode) {
386 // Since pages are unmapped on shutdown after video core is shutdown, the renderer may be 431 // Since pages are unmapped on shutdown after video core is shutdown, the renderer may be
387 // null here 432 // null here
388 if (VideoCore::g_renderer != nullptr) { 433 if (VideoCore::g_renderer != nullptr) {
@@ -398,7 +443,7 @@ void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) {
398 VAddr overlap_end = std::min(end, region_end); 443 VAddr overlap_end = std::min(end, region_end);
399 444
400 PAddr physical_start = TryVirtualToPhysicalAddress(overlap_start).value(); 445 PAddr physical_start = TryVirtualToPhysicalAddress(overlap_start).value();
401 u64 overlap_size = overlap_end - overlap_start; 446 u32 overlap_size = static_cast<u32>(overlap_end - overlap_start);
402 447
403 auto* rasterizer = VideoCore::g_renderer->Rasterizer(); 448 auto* rasterizer = VideoCore::g_renderer->Rasterizer();
404 switch (mode) { 449 switch (mode) {
@@ -433,44 +478,50 @@ u64 Read64(const VAddr addr) {
433 return Read<u64_le>(addr); 478 return Read<u64_le>(addr);
434} 479}
435 480
436void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) { 481void ReadBlock(const Kernel::Process& process, const VAddr src_addr, void* dest_buffer,
482 const size_t size) {
483 auto& page_table = process.vm_manager.page_table;
484
437 size_t remaining_size = size; 485 size_t remaining_size = size;
438 size_t page_index = src_addr >> PAGE_BITS; 486 size_t page_index = src_addr >> PAGE_BITS;
439 size_t page_offset = src_addr & PAGE_MASK; 487 size_t page_offset = src_addr & PAGE_MASK;
440 488
441 while (remaining_size > 0) { 489 while (remaining_size > 0) {
442 const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size); 490 const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size);
443 const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset; 491 const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset);
444 492
445 switch (current_page_table->attributes[page_index]) { 493 switch (page_table.attributes[page_index]) {
446 case PageType::Unmapped: { 494 case PageType::Unmapped: {
447 LOG_ERROR(HW_Memory, "unmapped ReadBlock @ 0x%llx (start address = 0x%llx, size = %zu)", 495 LOG_ERROR(HW_Memory, "unmapped ReadBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
448 current_vaddr, src_addr, size); 496 current_vaddr, src_addr, size);
449 std::memset(dest_buffer, 0, copy_amount); 497 std::memset(dest_buffer, 0, copy_amount);
450 break; 498 break;
451 } 499 }
452 case PageType::Memory: { 500 case PageType::Memory: {
453 DEBUG_ASSERT(current_page_table->pointers[page_index]); 501 DEBUG_ASSERT(page_table.pointers[page_index]);
454 502
455 const u8* src_ptr = current_page_table->pointers[page_index] + page_offset; 503 const u8* src_ptr = page_table.pointers[page_index] + page_offset;
456 std::memcpy(dest_buffer, src_ptr, copy_amount); 504 std::memcpy(dest_buffer, src_ptr, copy_amount);
457 break; 505 break;
458 } 506 }
459 case PageType::Special: { 507 case PageType::Special: {
460 DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); 508 MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr);
461 509 DEBUG_ASSERT(handler);
462 GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, dest_buffer, copy_amount); 510 handler->ReadBlock(current_vaddr, dest_buffer, copy_amount);
463 break; 511 break;
464 } 512 }
465 case PageType::RasterizerCachedMemory: { 513 case PageType::RasterizerCachedMemory: {
466 RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush); 514 RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
467 std::memcpy(dest_buffer, GetPointerFromVMA(current_vaddr), copy_amount); 515 FlushMode::Flush);
516 std::memcpy(dest_buffer, GetPointerFromVMA(process, current_vaddr), copy_amount);
468 break; 517 break;
469 } 518 }
470 case PageType::RasterizerCachedSpecial: { 519 case PageType::RasterizerCachedSpecial: {
471 DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); 520 MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr);
472 RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush); 521 DEBUG_ASSERT(handler);
473 GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, dest_buffer, copy_amount); 522 RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
523 FlushMode::Flush);
524 handler->ReadBlock(current_vaddr, dest_buffer, copy_amount);
474 break; 525 break;
475 } 526 }
476 default: 527 default:
@@ -484,6 +535,10 @@ void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) {
484 } 535 }
485} 536}
486 537
538void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) {
539 ReadBlock(*Kernel::g_current_process, src_addr, dest_buffer, size);
540}
541
487void Write8(const VAddr addr, const u8 data) { 542void Write8(const VAddr addr, const u8 data) {
488 Write<u8>(addr, data); 543 Write<u8>(addr, data);
489} 544}
@@ -500,44 +555,49 @@ void Write64(const VAddr addr, const u64 data) {
500 Write<u64_le>(addr, data); 555 Write<u64_le>(addr, data);
501} 556}
502 557
503void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size) { 558void WriteBlock(const Kernel::Process& process, const VAddr dest_addr, const void* src_buffer,
559 const size_t size) {
560 auto& page_table = process.vm_manager.page_table;
504 size_t remaining_size = size; 561 size_t remaining_size = size;
505 size_t page_index = dest_addr >> PAGE_BITS; 562 size_t page_index = dest_addr >> PAGE_BITS;
506 size_t page_offset = dest_addr & PAGE_MASK; 563 size_t page_offset = dest_addr & PAGE_MASK;
507 564
508 while (remaining_size > 0) { 565 while (remaining_size > 0) {
509 const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size); 566 const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size);
510 const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset; 567 const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset);
511 568
512 switch (current_page_table->attributes[page_index]) { 569 switch (page_table.attributes[page_index]) {
513 case PageType::Unmapped: { 570 case PageType::Unmapped: {
514 LOG_ERROR(HW_Memory, 571 LOG_ERROR(HW_Memory,
515 "unmapped WriteBlock @ 0x%llx (start address = 0x%llx, size = %zu)", 572 "unmapped WriteBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
516 current_vaddr, dest_addr, size); 573 current_vaddr, dest_addr, size);
517 break; 574 break;
518 } 575 }
519 case PageType::Memory: { 576 case PageType::Memory: {
520 DEBUG_ASSERT(current_page_table->pointers[page_index]); 577 DEBUG_ASSERT(page_table.pointers[page_index]);
521 578
522 u8* dest_ptr = current_page_table->pointers[page_index] + page_offset; 579 u8* dest_ptr = page_table.pointers[page_index] + page_offset;
523 std::memcpy(dest_ptr, src_buffer, copy_amount); 580 std::memcpy(dest_ptr, src_buffer, copy_amount);
524 break; 581 break;
525 } 582 }
526 case PageType::Special: { 583 case PageType::Special: {
527 DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); 584 MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr);
528 585 DEBUG_ASSERT(handler);
529 GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, src_buffer, copy_amount); 586 handler->WriteBlock(current_vaddr, src_buffer, copy_amount);
530 break; 587 break;
531 } 588 }
532 case PageType::RasterizerCachedMemory: { 589 case PageType::RasterizerCachedMemory: {
533 RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate); 590 RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
534 std::memcpy(GetPointerFromVMA(current_vaddr), src_buffer, copy_amount); 591 FlushMode::FlushAndInvalidate);
592 std::memcpy(GetPointerFromVMA(process, current_vaddr), src_buffer, copy_amount);
535 break; 593 break;
536 } 594 }
537 case PageType::RasterizerCachedSpecial: { 595 case PageType::RasterizerCachedSpecial: {
538 DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); 596 MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr);
539 RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate); 597 DEBUG_ASSERT(handler);
540 GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, src_buffer, copy_amount); 598 RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
599 FlushMode::FlushAndInvalidate);
600 handler->WriteBlock(current_vaddr, src_buffer, copy_amount);
541 break; 601 break;
542 } 602 }
543 default: 603 default:
@@ -551,6 +611,10 @@ void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size
551 } 611 }
552} 612}
553 613
614void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size) {
615 WriteBlock(*Kernel::g_current_process, dest_addr, src_buffer, size);
616}
617
554void ZeroBlock(const VAddr dest_addr, const size_t size) { 618void ZeroBlock(const VAddr dest_addr, const size_t size) {
555 size_t remaining_size = size; 619 size_t remaining_size = size;
556 size_t page_index = dest_addr >> PAGE_BITS; 620 size_t page_index = dest_addr >> PAGE_BITS;
@@ -560,11 +624,11 @@ void ZeroBlock(const VAddr dest_addr, const size_t size) {
560 624
561 while (remaining_size > 0) { 625 while (remaining_size > 0) {
562 const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size); 626 const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size);
563 const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset; 627 const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset);
564 628
565 switch (current_page_table->attributes[page_index]) { 629 switch (current_page_table->attributes[page_index]) {
566 case PageType::Unmapped: { 630 case PageType::Unmapped: {
567 LOG_ERROR(HW_Memory, "unmapped ZeroBlock @ 0x%llx (start address = 0x%llx, size = %zu)", 631 LOG_ERROR(HW_Memory, "unmapped ZeroBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
568 current_vaddr, dest_addr, size); 632 current_vaddr, dest_addr, size);
569 break; 633 break;
570 } 634 }
@@ -582,13 +646,15 @@ void ZeroBlock(const VAddr dest_addr, const size_t size) {
582 break; 646 break;
583 } 647 }
584 case PageType::RasterizerCachedMemory: { 648 case PageType::RasterizerCachedMemory: {
585 RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate); 649 RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
650 FlushMode::FlushAndInvalidate);
586 std::memset(GetPointerFromVMA(current_vaddr), 0, copy_amount); 651 std::memset(GetPointerFromVMA(current_vaddr), 0, copy_amount);
587 break; 652 break;
588 } 653 }
589 case PageType::RasterizerCachedSpecial: { 654 case PageType::RasterizerCachedSpecial: {
590 DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); 655 DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
591 RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate); 656 RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
657 FlushMode::FlushAndInvalidate);
592 GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, zeros.data(), copy_amount); 658 GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, zeros.data(), copy_amount);
593 break; 659 break;
594 } 660 }
@@ -609,11 +675,11 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, const size_t size) {
609 675
610 while (remaining_size > 0) { 676 while (remaining_size > 0) {
611 const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size); 677 const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size);
612 const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset; 678 const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset);
613 679
614 switch (current_page_table->attributes[page_index]) { 680 switch (current_page_table->attributes[page_index]) {
615 case PageType::Unmapped: { 681 case PageType::Unmapped: {
616 LOG_ERROR(HW_Memory, "unmapped CopyBlock @ 0x%llx (start address = 0x%llx, size = %zu)", 682 LOG_ERROR(HW_Memory, "unmapped CopyBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
617 current_vaddr, src_addr, size); 683 current_vaddr, src_addr, size);
618 ZeroBlock(dest_addr, copy_amount); 684 ZeroBlock(dest_addr, copy_amount);
619 break; 685 break;
@@ -633,13 +699,15 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, const size_t size) {
633 break; 699 break;
634 } 700 }
635 case PageType::RasterizerCachedMemory: { 701 case PageType::RasterizerCachedMemory: {
636 RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush); 702 RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
703 FlushMode::Flush);
637 WriteBlock(dest_addr, GetPointerFromVMA(current_vaddr), copy_amount); 704 WriteBlock(dest_addr, GetPointerFromVMA(current_vaddr), copy_amount);
638 break; 705 break;
639 } 706 }
640 case PageType::RasterizerCachedSpecial: { 707 case PageType::RasterizerCachedSpecial: {
641 DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); 708 DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
642 RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush); 709 RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
710 FlushMode::Flush);
643 711
644 std::vector<u8> buffer(copy_amount); 712 std::vector<u8> buffer(copy_amount);
645 GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, buffer.data(), buffer.size()); 713 GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, buffer.data(), buffer.size());
@@ -652,8 +720,8 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, const size_t size) {
652 720
653 page_index++; 721 page_index++;
654 page_offset = 0; 722 page_offset = 0;
655 dest_addr += copy_amount; 723 dest_addr += static_cast<VAddr>(copy_amount);
656 src_addr += copy_amount; 724 src_addr += static_cast<VAddr>(copy_amount);
657 remaining_size -= copy_amount; 725 remaining_size -= copy_amount;
658 } 726 }
659} 727}
@@ -721,7 +789,7 @@ boost::optional<PAddr> TryVirtualToPhysicalAddress(const VAddr addr) {
721PAddr VirtualToPhysicalAddress(const VAddr addr) { 789PAddr VirtualToPhysicalAddress(const VAddr addr) {
722 auto paddr = TryVirtualToPhysicalAddress(addr); 790 auto paddr = TryVirtualToPhysicalAddress(addr);
723 if (!paddr) { 791 if (!paddr) {
724 LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x%llx", addr); 792 LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x%08X", addr);
725 // To help with debugging, set bit on address so that it's obviously invalid. 793 // To help with debugging, set bit on address so that it's obviously invalid.
726 return addr | 0x80000000; 794 return addr | 0x80000000;
727 } 795 }
@@ -746,4 +814,4 @@ boost::optional<VAddr> PhysicalToVirtualAddress(const PAddr addr) {
746 return boost::none; 814 return boost::none;
747} 815}
748 816
749} // namespace 817} // namespace Memory
diff --git a/src/core/memory.h b/src/core/memory.h
index e14d68654..9a04b9a16 100644
--- a/src/core/memory.h
+++ b/src/core/memory.h
@@ -6,9 +6,16 @@
6 6
7#include <array> 7#include <array>
8#include <cstddef> 8#include <cstddef>
9#include <map>
9#include <string> 10#include <string>
11#include <vector>
10#include <boost/optional.hpp> 12#include <boost/optional.hpp>
11#include "common/common_types.h" 13#include "common/common_types.h"
14#include "core/mmio.h"
15
16namespace Kernel {
17class Process;
18}
12 19
13namespace Memory { 20namespace Memory {
14 21
@@ -19,7 +26,60 @@ namespace Memory {
19const int PAGE_BITS = 12; 26const int PAGE_BITS = 12;
20const u64 PAGE_SIZE = 1 << PAGE_BITS; 27const u64 PAGE_SIZE = 1 << PAGE_BITS;
21const u64 PAGE_MASK = PAGE_SIZE - 1; 28const u64 PAGE_MASK = PAGE_SIZE - 1;
22const size_t PAGE_TABLE_NUM_ENTRIES = 1ULL << (64 - PAGE_BITS); 29const size_t PAGE_TABLE_NUM_ENTRIES = 1ULL << (32 - PAGE_BITS);
30
31enum class PageType {
32 /// Page is unmapped and should cause an access error.
33 Unmapped,
34 /// Page is mapped to regular memory. This is the only type you can get pointers to.
35 Memory,
36 /// Page is mapped to regular memory, but also needs to check for rasterizer cache flushing and
37 /// invalidation
38 RasterizerCachedMemory,
39 /// Page is mapped to a I/O region. Writing and reading to this page is handled by functions.
40 Special,
41 /// Page is mapped to a I/O region, but also needs to check for rasterizer cache flushing and
42 /// invalidation
43 RasterizerCachedSpecial,
44};
45
46struct SpecialRegion {
47 VAddr base;
48 u32 size;
49 MMIORegionPointer handler;
50};
51
52/**
53 * A (reasonably) fast way of allowing switchable and remappable process address spaces. It loosely
54 * mimics the way a real CPU page table works, but instead is optimized for minimal decoding and
55 * fetching requirements when accessing. In the usual case of an access to regular memory, it only
56 * requires an indexed fetch and a check for NULL.
57 */
58struct PageTable {
59 /**
60 * Array of memory pointers backing each page. An entry can only be non-null if the
61 * corresponding entry in the `attributes` array is of type `Memory`.
62 */
63 std::array<u8*, PAGE_TABLE_NUM_ENTRIES> pointers;
64
65 /**
66 * Contains MMIO handlers that back memory regions whose entries in the `attribute` array is of
67 * type `Special`.
68 */
69 std::vector<SpecialRegion> special_regions;
70
71 /**
72 * Array of fine grained page attributes. If it is set to any value other than `Memory`, then
73 * the corresponding entry in `pointers` MUST be set to null.
74 */
75 std::array<PageType, PAGE_TABLE_NUM_ENTRIES> attributes;
76
77 /**
78 * Indicates the number of externally cached resources touching a page that should be
79 * flushed before the memory is accessed
80 */
81 std::array<u8, PAGE_TABLE_NUM_ENTRIES> cached_res_count;
82};
23 83
24/// Physical memory regions as seen from the ARM11 84/// Physical memory regions as seen from the ARM11
25enum : PAddr { 85enum : PAddr {
@@ -126,7 +186,14 @@ enum : VAddr {
126 NEW_LINEAR_HEAP_VADDR_END = NEW_LINEAR_HEAP_VADDR + NEW_LINEAR_HEAP_SIZE, 186 NEW_LINEAR_HEAP_VADDR_END = NEW_LINEAR_HEAP_VADDR + NEW_LINEAR_HEAP_SIZE,
127}; 187};
128 188
189/// Currently active page table
190void SetCurrentPageTable(PageTable* page_table);
191PageTable* GetCurrentPageTable();
192
193/// Determines if the given VAddr is valid for the specified process.
194bool IsValidVirtualAddress(const Kernel::Process& process, const VAddr vaddr);
129bool IsValidVirtualAddress(const VAddr addr); 195bool IsValidVirtualAddress(const VAddr addr);
196
130bool IsValidPhysicalAddress(const PAddr addr); 197bool IsValidPhysicalAddress(const PAddr addr);
131 198
132u8 Read8(VAddr addr); 199u8 Read8(VAddr addr);
@@ -139,7 +206,11 @@ void Write16(VAddr addr, u16 data);
139void Write32(VAddr addr, u32 data); 206void Write32(VAddr addr, u32 data);
140void Write64(VAddr addr, u64 data); 207void Write64(VAddr addr, u64 data);
141 208
209void ReadBlock(const Kernel::Process& process, const VAddr src_addr, void* dest_buffer,
210 size_t size);
142void ReadBlock(const VAddr src_addr, void* dest_buffer, size_t size); 211void ReadBlock(const VAddr src_addr, void* dest_buffer, size_t size);
212void WriteBlock(const Kernel::Process& process, const VAddr dest_addr, const void* src_buffer,
213 size_t size);
143void WriteBlock(const VAddr dest_addr, const void* src_buffer, size_t size); 214void WriteBlock(const VAddr dest_addr, const void* src_buffer, size_t size);
144void ZeroBlock(const VAddr dest_addr, const size_t size); 215void ZeroBlock(const VAddr dest_addr, const size_t size);
145void CopyBlock(VAddr dest_addr, VAddr src_addr, size_t size); 216void CopyBlock(VAddr dest_addr, VAddr src_addr, size_t size);
@@ -169,8 +240,6 @@ boost::optional<VAddr> PhysicalToVirtualAddress(PAddr addr);
169 240
170/** 241/**
171 * Gets a pointer to the memory region beginning at the specified physical address. 242 * Gets a pointer to the memory region beginning at the specified physical address.
172 *
173 * @note This is currently implemented using PhysicalToVirtualAddress().
174 */ 243 */
175u8* GetPhysicalPointer(PAddr address); 244u8* GetPhysicalPointer(PAddr address);
176 245
@@ -178,17 +247,17 @@ u8* GetPhysicalPointer(PAddr address);
178 * Adds the supplied value to the rasterizer resource cache counter of each 247 * Adds the supplied value to the rasterizer resource cache counter of each
179 * page touching the region. 248 * page touching the region.
180 */ 249 */
181void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta); 250void RasterizerMarkRegionCached(PAddr start, u32 size, int count_delta);
182 251
183/** 252/**
184 * Flushes any externally cached rasterizer resources touching the given region. 253 * Flushes any externally cached rasterizer resources touching the given region.
185 */ 254 */
186void RasterizerFlushRegion(PAddr start, u64 size); 255void RasterizerFlushRegion(PAddr start, u32 size);
187 256
188/** 257/**
189 * Flushes and invalidates any externally cached rasterizer resources touching the given region. 258 * Flushes and invalidates any externally cached rasterizer resources touching the given region.
190 */ 259 */
191void RasterizerFlushAndInvalidateRegion(PAddr start, u64 size); 260void RasterizerFlushAndInvalidateRegion(PAddr start, u32 size);
192 261
193enum class FlushMode { 262enum class FlushMode {
194 /// Write back modified surfaces to RAM 263 /// Write back modified surfaces to RAM
@@ -201,12 +270,6 @@ enum class FlushMode {
201 * Flushes and invalidates any externally cached rasterizer resources touching the given virtual 270 * Flushes and invalidates any externally cached rasterizer resources touching the given virtual
202 * address region. 271 * address region.
203 */ 272 */
204void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode); 273void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode);
205 274
206/** 275} // namespace Memory
207 * Dynarmic has an optimization to memory accesses when the pointer to the page exists that
208 * can be used by setting up the current page table as a callback. This function is used to
209 * retrieve the current page table for that purpose.
210 */
211//std::array<u8*, PAGE_TABLE_NUM_ENTRIES>* GetCurrentPageTablePointers();
212}
diff --git a/src/core/memory_setup.h b/src/core/memory_setup.h
index fc3fda466..c58baa50b 100644
--- a/src/core/memory_setup.h
+++ b/src/core/memory_setup.h
@@ -9,24 +9,24 @@
9 9
10namespace Memory { 10namespace Memory {
11 11
12void InitMemoryMap();
13
14/** 12/**
15 * Maps an allocated buffer onto a region of the emulated process address space. 13 * Maps an allocated buffer onto a region of the emulated process address space.
16 * 14 *
15 * @param page_table The page table of the emulated process.
17 * @param base The address to start mapping at. Must be page-aligned. 16 * @param base The address to start mapping at. Must be page-aligned.
18 * @param size The amount of bytes to map. Must be page-aligned. 17 * @param size The amount of bytes to map. Must be page-aligned.
19 * @param target Buffer with the memory backing the mapping. Must be of length at least `size`. 18 * @param target Buffer with the memory backing the mapping. Must be of length at least `size`.
20 */ 19 */
21void MapMemoryRegion(VAddr base, u64 size, u8* target); 20void MapMemoryRegion(PageTable& page_table, VAddr base, u32 size, u8* target);
22 21
23/** 22/**
24 * Maps a region of the emulated process address space as a IO region. 23 * Maps a region of the emulated process address space as a IO region.
24 * @param page_table The page table of the emulated process.
25 * @param base The address to start mapping at. Must be page-aligned. 25 * @param base The address to start mapping at. Must be page-aligned.
26 * @param size The amount of bytes to map. Must be page-aligned. 26 * @param size The amount of bytes to map. Must be page-aligned.
27 * @param mmio_handler The handler that backs the mapping. 27 * @param mmio_handler The handler that backs the mapping.
28 */ 28 */
29void MapIoRegion(VAddr base, u64 size, MMIORegionPointer mmio_handler); 29void MapIoRegion(PageTable& page_table, VAddr base, u32 size, MMIORegionPointer mmio_handler);
30 30
31void UnmapRegion(VAddr base, u64 size); 31void UnmapRegion(PageTable& page_table, VAddr base, u32 size);
32} 32}
diff --git a/src/core/settings.cpp b/src/core/settings.cpp
index d4f0429d1..efcf1267d 100644
--- a/src/core/settings.cpp
+++ b/src/core/settings.cpp
@@ -36,4 +36,4 @@ void Apply() {
36 Service::IR::ReloadInputDevices(); 36 Service::IR::ReloadInputDevices();
37} 37}
38 38
39} // namespace 39} // namespace Settings
diff --git a/src/core/settings.h b/src/core/settings.h
index ee16bb90a..8d78cb424 100644
--- a/src/core/settings.h
+++ b/src/core/settings.h
@@ -15,6 +15,7 @@ enum class LayoutOption {
15 Default, 15 Default,
16 SingleScreen, 16 SingleScreen,
17 LargeScreen, 17 LargeScreen,
18 SideScreen,
18}; 19};
19 20
20namespace NativeButton { 21namespace NativeButton {
@@ -70,7 +71,7 @@ enum Values {
70static const std::array<const char*, NumAnalogs> mapping = {{ 71static const std::array<const char*, NumAnalogs> mapping = {{
71 "circle_pad", "c_stick", 72 "circle_pad", "c_stick",
72}}; 73}};
73} // namespace NumAnalog 74} // namespace NativeAnalog
74 75
75struct Values { 76struct Values {
76 // CheckNew3DS 77 // CheckNew3DS
@@ -79,6 +80,8 @@ struct Values {
79 // Controls 80 // Controls
80 std::array<std::string, NativeButton::NumButtons> buttons; 81 std::array<std::string, NativeButton::NumButtons> buttons;
81 std::array<std::string, NativeAnalog::NumAnalogs> analogs; 82 std::array<std::string, NativeAnalog::NumAnalogs> analogs;
83 std::string motion_device;
84 std::string touch_device;
82 85
83 // Core 86 // Core
84 bool use_cpu_jit; 87 bool use_cpu_jit;
@@ -128,7 +131,11 @@ struct Values {
128 u16 gdbstub_port; 131 u16 gdbstub_port;
129 132
130 // WebService 133 // WebService
134 bool enable_telemetry;
131 std::string telemetry_endpoint_url; 135 std::string telemetry_endpoint_url;
136 std::string verify_endpoint_url;
137 std::string citra_username;
138 std::string citra_token;
132} extern values; 139} extern values;
133 140
134// a special value for Values::region_value indicating that citra will automatically select a region 141// a special value for Values::region_value indicating that citra will automatically select a region
@@ -136,4 +143,4 @@ struct Values {
136static constexpr int REGION_VALUE_AUTO_SELECT = -1; 143static constexpr int REGION_VALUE_AUTO_SELECT = -1;
137 144
138void Apply(); 145void Apply();
139} 146} // namespace Settings
diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp
index 841d6cfa1..ca517ff44 100644
--- a/src/core/telemetry_session.cpp
+++ b/src/core/telemetry_session.cpp
@@ -3,15 +3,19 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <cstring> 5#include <cstring>
6#include <cryptopp/osrng.h>
6 7
7#include "common/assert.h" 8#include "common/assert.h"
9#include "common/file_util.h"
8#include "common/scm_rev.h" 10#include "common/scm_rev.h"
9#include "common/x64/cpu_detect.h" 11#include "common/x64/cpu_detect.h"
12#include "core/core.h"
10#include "core/settings.h" 13#include "core/settings.h"
11#include "core/telemetry_session.h" 14#include "core/telemetry_session.h"
12 15
13#ifdef ENABLE_WEB_SERVICE 16#ifdef ENABLE_WEB_SERVICE
14#include "web_service/telemetry_json.h" 17#include "web_service/telemetry_json.h"
18#include "web_service/verify_login.h"
15#endif 19#endif
16 20
17namespace Core { 21namespace Core {
@@ -28,23 +32,94 @@ static const char* CpuVendorToStr(Common::CPUVendor vendor) {
28 UNREACHABLE(); 32 UNREACHABLE();
29} 33}
30 34
35static u64 GenerateTelemetryId() {
36 u64 telemetry_id{};
37 CryptoPP::AutoSeededRandomPool rng;
38 rng.GenerateBlock(reinterpret_cast<CryptoPP::byte*>(&telemetry_id), sizeof(u64));
39 return telemetry_id;
40}
41
42u64 GetTelemetryId() {
43 u64 telemetry_id{};
44 static const std::string& filename{FileUtil::GetUserPath(D_CONFIG_IDX) + "telemetry_id"};
45
46 if (FileUtil::Exists(filename)) {
47 FileUtil::IOFile file(filename, "rb");
48 if (!file.IsOpen()) {
49 LOG_ERROR(Core, "failed to open telemetry_id: %s", filename.c_str());
50 return {};
51 }
52 file.ReadBytes(&telemetry_id, sizeof(u64));
53 } else {
54 FileUtil::IOFile file(filename, "wb");
55 if (!file.IsOpen()) {
56 LOG_ERROR(Core, "failed to open telemetry_id: %s", filename.c_str());
57 return {};
58 }
59 telemetry_id = GenerateTelemetryId();
60 file.WriteBytes(&telemetry_id, sizeof(u64));
61 }
62
63 return telemetry_id;
64}
65
66u64 RegenerateTelemetryId() {
67 const u64 new_telemetry_id{GenerateTelemetryId()};
68 static const std::string& filename{FileUtil::GetUserPath(D_CONFIG_IDX) + "telemetry_id"};
69
70 FileUtil::IOFile file(filename, "wb");
71 if (!file.IsOpen()) {
72 LOG_ERROR(Core, "failed to open telemetry_id: %s", filename.c_str());
73 return {};
74 }
75 file.WriteBytes(&new_telemetry_id, sizeof(u64));
76 return new_telemetry_id;
77}
78
79std::future<bool> VerifyLogin(std::string username, std::string token, std::function<void()> func) {
80#ifdef ENABLE_WEB_SERVICE
81 return WebService::VerifyLogin(username, token, Settings::values.verify_endpoint_url, func);
82#else
83 return std::async(std::launch::async, [func{std::move(func)}]() {
84 func();
85 return false;
86 });
87#endif
88}
89
31TelemetrySession::TelemetrySession() { 90TelemetrySession::TelemetrySession() {
32#ifdef ENABLE_WEB_SERVICE 91#ifdef ENABLE_WEB_SERVICE
33 backend = std::make_unique<WebService::TelemetryJson>(); 92 if (Settings::values.enable_telemetry) {
93 backend = std::make_unique<WebService::TelemetryJson>(
94 Settings::values.telemetry_endpoint_url, Settings::values.citra_username,
95 Settings::values.citra_token);
96 } else {
97 backend = std::make_unique<Telemetry::NullVisitor>();
98 }
34#else 99#else
35 backend = std::make_unique<Telemetry::NullVisitor>(); 100 backend = std::make_unique<Telemetry::NullVisitor>();
36#endif 101#endif
102 // Log one-time top-level information
103 AddField(Telemetry::FieldType::None, "TelemetryId", GetTelemetryId());
104
37 // Log one-time session start information 105 // Log one-time session start information
38 const s64 init_time{std::chrono::duration_cast<std::chrono::milliseconds>( 106 const s64 init_time{std::chrono::duration_cast<std::chrono::milliseconds>(
39 std::chrono::system_clock::now().time_since_epoch()) 107 std::chrono::system_clock::now().time_since_epoch())
40 .count()}; 108 .count()};
41 AddField(Telemetry::FieldType::Session, "Init_Time", init_time); 109 AddField(Telemetry::FieldType::Session, "Init_Time", init_time);
110 std::string program_name;
111 const Loader::ResultStatus res{System::GetInstance().GetAppLoader().ReadTitle(program_name)};
112 if (res == Loader::ResultStatus::Success) {
113 AddField(Telemetry::FieldType::Session, "ProgramName", program_name);
114 }
42 115
43 // Log application information 116 // Log application information
44 const bool is_git_dirty{std::strstr(Common::g_scm_desc, "dirty") != nullptr}; 117 const bool is_git_dirty{std::strstr(Common::g_scm_desc, "dirty") != nullptr};
45 AddField(Telemetry::FieldType::App, "Git_IsDirty", is_git_dirty); 118 AddField(Telemetry::FieldType::App, "Git_IsDirty", is_git_dirty);
46 AddField(Telemetry::FieldType::App, "Git_Branch", Common::g_scm_branch); 119 AddField(Telemetry::FieldType::App, "Git_Branch", Common::g_scm_branch);
47 AddField(Telemetry::FieldType::App, "Git_Revision", Common::g_scm_rev); 120 AddField(Telemetry::FieldType::App, "Git_Revision", Common::g_scm_rev);
121 AddField(Telemetry::FieldType::App, "BuildDate", Common::g_build_date);
122 AddField(Telemetry::FieldType::App, "BuildName", Common::g_build_name);
48 123
49 // Log user system information 124 // Log user system information
50 AddField(Telemetry::FieldType::UserSystem, "CPU_Model", Common::GetCPUCaps().cpu_string); 125 AddField(Telemetry::FieldType::UserSystem, "CPU_Model", Common::GetCPUCaps().cpu_string);
@@ -68,6 +143,15 @@ TelemetrySession::TelemetrySession() {
68 Common::GetCPUCaps().sse4_1); 143 Common::GetCPUCaps().sse4_1);
69 AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE42", 144 AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE42",
70 Common::GetCPUCaps().sse4_2); 145 Common::GetCPUCaps().sse4_2);
146#ifdef __APPLE__
147 AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Apple");
148#elif defined(_WIN32)
149 AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Windows");
150#elif defined(__linux__) || defined(linux) || defined(__linux)
151 AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Linux");
152#else
153 AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Unknown");
154#endif
71 155
72 // Log user configuration information 156 // Log user configuration information
73 AddField(Telemetry::FieldType::UserConfig, "Audio_EnableAudioStretching", 157 AddField(Telemetry::FieldType::UserConfig, "Audio_EnableAudioStretching",
diff --git a/src/core/telemetry_session.h b/src/core/telemetry_session.h
index cf53835c3..550c6ea2d 100644
--- a/src/core/telemetry_session.h
+++ b/src/core/telemetry_session.h
@@ -4,6 +4,7 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <future>
7#include <memory> 8#include <memory>
8#include "common/telemetry.h" 9#include "common/telemetry.h"
9 10
@@ -35,4 +36,25 @@ private:
35 std::unique_ptr<Telemetry::VisitorInterface> backend; ///< Backend interface that logs fields 36 std::unique_ptr<Telemetry::VisitorInterface> backend; ///< Backend interface that logs fields
36}; 37};
37 38
39/**
40 * Gets TelemetryId, a unique identifier used for the user's telemetry sessions.
41 * @returns The current TelemetryId for the session.
42 */
43u64 GetTelemetryId();
44
45/**
46 * Regenerates TelemetryId, a unique identifier used for the user's telemetry sessions.
47 * @returns The new TelemetryId that was generated.
48 */
49u64 RegenerateTelemetryId();
50
51/**
52 * Verifies the username and token.
53 * @param username Citra username to use for authentication.
54 * @param token Citra token to use for authentication.
55 * @param func A function that gets exectued when the verification is finished
56 * @returns Future with bool indicating whether the verification succeeded
57 */
58std::future<bool> VerifyLogin(std::string username, std::string token, std::function<void()> func);
59
38} // namespace Core 60} // namespace Core
diff --git a/src/input_common/CMakeLists.txt b/src/input_common/CMakeLists.txt
index e3e36ada7..92792a702 100644
--- a/src/input_common/CMakeLists.txt
+++ b/src/input_common/CMakeLists.txt
@@ -2,12 +2,14 @@ set(SRCS
2 analog_from_button.cpp 2 analog_from_button.cpp
3 keyboard.cpp 3 keyboard.cpp
4 main.cpp 4 main.cpp
5 motion_emu.cpp
5 ) 6 )
6 7
7set(HEADERS 8set(HEADERS
8 analog_from_button.h 9 analog_from_button.h
9 keyboard.h 10 keyboard.h
10 main.h 11 main.h
12 motion_emu.h
11 ) 13 )
12 14
13if(SDL2_FOUND) 15if(SDL2_FOUND)
diff --git a/src/input_common/main.cpp b/src/input_common/main.cpp
index 699f41e6b..557353740 100644
--- a/src/input_common/main.cpp
+++ b/src/input_common/main.cpp
@@ -7,6 +7,7 @@
7#include "input_common/analog_from_button.h" 7#include "input_common/analog_from_button.h"
8#include "input_common/keyboard.h" 8#include "input_common/keyboard.h"
9#include "input_common/main.h" 9#include "input_common/main.h"
10#include "input_common/motion_emu.h"
10#ifdef HAVE_SDL2 11#ifdef HAVE_SDL2
11#include "input_common/sdl/sdl.h" 12#include "input_common/sdl/sdl.h"
12#endif 13#endif
@@ -14,12 +15,16 @@
14namespace InputCommon { 15namespace InputCommon {
15 16
16static std::shared_ptr<Keyboard> keyboard; 17static std::shared_ptr<Keyboard> keyboard;
18static std::shared_ptr<MotionEmu> motion_emu;
17 19
18void Init() { 20void Init() {
19 keyboard = std::make_shared<InputCommon::Keyboard>(); 21 keyboard = std::make_shared<Keyboard>();
20 Input::RegisterFactory<Input::ButtonDevice>("keyboard", keyboard); 22 Input::RegisterFactory<Input::ButtonDevice>("keyboard", keyboard);
21 Input::RegisterFactory<Input::AnalogDevice>("analog_from_button", 23 Input::RegisterFactory<Input::AnalogDevice>("analog_from_button",
22 std::make_shared<InputCommon::AnalogFromButton>()); 24 std::make_shared<AnalogFromButton>());
25 motion_emu = std::make_shared<MotionEmu>();
26 Input::RegisterFactory<Input::MotionDevice>("motion_emu", motion_emu);
27
23#ifdef HAVE_SDL2 28#ifdef HAVE_SDL2
24 SDL::Init(); 29 SDL::Init();
25#endif 30#endif
@@ -29,6 +34,8 @@ void Shutdown() {
29 Input::UnregisterFactory<Input::ButtonDevice>("keyboard"); 34 Input::UnregisterFactory<Input::ButtonDevice>("keyboard");
30 keyboard.reset(); 35 keyboard.reset();
31 Input::UnregisterFactory<Input::AnalogDevice>("analog_from_button"); 36 Input::UnregisterFactory<Input::AnalogDevice>("analog_from_button");
37 Input::UnregisterFactory<Input::MotionDevice>("motion_emu");
38 motion_emu.reset();
32 39
33#ifdef HAVE_SDL2 40#ifdef HAVE_SDL2
34 SDL::Shutdown(); 41 SDL::Shutdown();
@@ -39,6 +46,10 @@ Keyboard* GetKeyboard() {
39 return keyboard.get(); 46 return keyboard.get();
40} 47}
41 48
49MotionEmu* GetMotionEmu() {
50 return motion_emu.get();
51}
52
42std::string GenerateKeyboardParam(int key_code) { 53std::string GenerateKeyboardParam(int key_code) {
43 Common::ParamPackage param{ 54 Common::ParamPackage param{
44 {"engine", "keyboard"}, {"code", std::to_string(key_code)}, 55 {"engine", "keyboard"}, {"code", std::to_string(key_code)},
diff --git a/src/input_common/main.h b/src/input_common/main.h
index 140bbd014..5604f0fa8 100644
--- a/src/input_common/main.h
+++ b/src/input_common/main.h
@@ -11,7 +11,7 @@ namespace InputCommon {
11/// Initializes and registers all built-in input device factories. 11/// Initializes and registers all built-in input device factories.
12void Init(); 12void Init();
13 13
14/// Unresisters all build-in input device factories and shut them down. 14/// Deregisters all built-in input device factories and shuts them down.
15void Shutdown(); 15void Shutdown();
16 16
17class Keyboard; 17class Keyboard;
@@ -19,6 +19,11 @@ class Keyboard;
19/// Gets the keyboard button device factory. 19/// Gets the keyboard button device factory.
20Keyboard* GetKeyboard(); 20Keyboard* GetKeyboard();
21 21
22class MotionEmu;
23
24/// Gets the motion emulation factory.
25MotionEmu* GetMotionEmu();
26
22/// Generates a serialized param package for creating a keyboard button device 27/// Generates a serialized param package for creating a keyboard button device
23std::string GenerateKeyboardParam(int key_code); 28std::string GenerateKeyboardParam(int key_code);
24 29
diff --git a/src/input_common/motion_emu.cpp b/src/input_common/motion_emu.cpp
new file mode 100644
index 000000000..59a035e70
--- /dev/null
+++ b/src/input_common/motion_emu.cpp
@@ -0,0 +1,168 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <chrono>
6#include <mutex>
7#include <thread>
8#include <tuple>
9#include "common/math_util.h"
10#include "common/quaternion.h"
11#include "common/thread.h"
12#include "common/vector_math.h"
13#include "input_common/motion_emu.h"
14
15namespace InputCommon {
16
17// Implementation class of the motion emulation device
18class MotionEmuDevice {
19public:
20 MotionEmuDevice(int update_millisecond, float sensitivity)
21 : update_millisecond(update_millisecond),
22 update_duration(std::chrono::duration_cast<std::chrono::steady_clock::duration>(
23 std::chrono::milliseconds(update_millisecond))),
24 sensitivity(sensitivity), motion_emu_thread(&MotionEmuDevice::MotionEmuThread, this) {}
25
26 ~MotionEmuDevice() {
27 if (motion_emu_thread.joinable()) {
28 shutdown_event.Set();
29 motion_emu_thread.join();
30 }
31 }
32
33 void BeginTilt(int x, int y) {
34 mouse_origin = Math::MakeVec(x, y);
35 is_tilting = true;
36 }
37
38 void Tilt(int x, int y) {
39 auto mouse_move = Math::MakeVec(x, y) - mouse_origin;
40 if (is_tilting) {
41 std::lock_guard<std::mutex> guard(tilt_mutex);
42 if (mouse_move.x == 0 && mouse_move.y == 0) {
43 tilt_angle = 0;
44 } else {
45 tilt_direction = mouse_move.Cast<float>();
46 tilt_angle = MathUtil::Clamp(tilt_direction.Normalize() * sensitivity, 0.0f,
47 MathUtil::PI * 0.5f);
48 }
49 }
50 }
51
52 void EndTilt() {
53 std::lock_guard<std::mutex> guard(tilt_mutex);
54 tilt_angle = 0;
55 is_tilting = false;
56 }
57
58 std::tuple<Math::Vec3<float>, Math::Vec3<float>> GetStatus() {
59 std::lock_guard<std::mutex> guard(status_mutex);
60 return status;
61 }
62
63private:
64 const int update_millisecond;
65 const std::chrono::steady_clock::duration update_duration;
66 const float sensitivity;
67
68 Math::Vec2<int> mouse_origin;
69
70 std::mutex tilt_mutex;
71 Math::Vec2<float> tilt_direction;
72 float tilt_angle = 0;
73
74 bool is_tilting = false;
75
76 Common::Event shutdown_event;
77
78 std::tuple<Math::Vec3<float>, Math::Vec3<float>> status;
79 std::mutex status_mutex;
80
81 // Note: always keep the thread declaration at the end so that other objects are initialized
82 // before this!
83 std::thread motion_emu_thread;
84
85 void MotionEmuThread() {
86 auto update_time = std::chrono::steady_clock::now();
87 Math::Quaternion<float> q = MakeQuaternion(Math::Vec3<float>(), 0);
88 Math::Quaternion<float> old_q;
89
90 while (!shutdown_event.WaitUntil(update_time)) {
91 update_time += update_duration;
92 old_q = q;
93
94 {
95 std::lock_guard<std::mutex> guard(tilt_mutex);
96
97 // Find the quaternion describing current 3DS tilting
98 q = MakeQuaternion(Math::MakeVec(-tilt_direction.y, 0.0f, tilt_direction.x),
99 tilt_angle);
100 }
101
102 auto inv_q = q.Inverse();
103
104 // Set the gravity vector in world space
105 auto gravity = Math::MakeVec(0.0f, -1.0f, 0.0f);
106
107 // Find the angular rate vector in world space
108 auto angular_rate = ((q - old_q) * inv_q).xyz * 2;
109 angular_rate *= 1000 / update_millisecond / MathUtil::PI * 180;
110
111 // Transform the two vectors from world space to 3DS space
112 gravity = QuaternionRotate(inv_q, gravity);
113 angular_rate = QuaternionRotate(inv_q, angular_rate);
114
115 // Update the sensor state
116 {
117 std::lock_guard<std::mutex> guard(status_mutex);
118 status = std::make_tuple(gravity, angular_rate);
119 }
120 }
121 }
122};
123
124// Interface wrapper held by input receiver as a unique_ptr. It holds the implementation class as
125// a shared_ptr, which is also observed by the factory class as a weak_ptr. In this way the factory
126// can forward all the inputs to the implementation only when it is valid.
127class MotionEmuDeviceWrapper : public Input::MotionDevice {
128public:
129 MotionEmuDeviceWrapper(int update_millisecond, float sensitivity) {
130 device = std::make_shared<MotionEmuDevice>(update_millisecond, sensitivity);
131 }
132
133 std::tuple<Math::Vec3<float>, Math::Vec3<float>> GetStatus() const {
134 return device->GetStatus();
135 }
136
137 std::shared_ptr<MotionEmuDevice> device;
138};
139
140std::unique_ptr<Input::MotionDevice> MotionEmu::Create(const Common::ParamPackage& params) {
141 int update_period = params.Get("update_period", 100);
142 float sensitivity = params.Get("sensitivity", 0.01f);
143 auto device_wrapper = std::make_unique<MotionEmuDeviceWrapper>(update_period, sensitivity);
144 // Previously created device is disconnected here. Having two motion devices for 3DS is not
145 // expected.
146 current_device = device_wrapper->device;
147 return std::move(device_wrapper);
148}
149
150void MotionEmu::BeginTilt(int x, int y) {
151 if (auto ptr = current_device.lock()) {
152 ptr->BeginTilt(x, y);
153 }
154}
155
156void MotionEmu::Tilt(int x, int y) {
157 if (auto ptr = current_device.lock()) {
158 ptr->Tilt(x, y);
159 }
160}
161
162void MotionEmu::EndTilt() {
163 if (auto ptr = current_device.lock()) {
164 ptr->EndTilt();
165 }
166}
167
168} // namespace InputCommon
diff --git a/src/input_common/motion_emu.h b/src/input_common/motion_emu.h
new file mode 100644
index 000000000..7a7e22467
--- /dev/null
+++ b/src/input_common/motion_emu.h
@@ -0,0 +1,46 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include "core/frontend/input.h"
8
9namespace InputCommon {
10
11class MotionEmuDevice;
12
13class MotionEmu : public Input::Factory<Input::MotionDevice> {
14public:
15 /**
16 * Creates a motion device emulated from mouse input
17 * @param params contains parameters for creating the device:
18 * - "update_period": update period in milliseconds
19 * - "sensitivity": the coefficient converting mouse movement to tilting angle
20 */
21 std::unique_ptr<Input::MotionDevice> Create(const Common::ParamPackage& params) override;
22
23 /**
24 * Signals that a motion sensor tilt has begun.
25 * @param x the x-coordinate of the cursor
26 * @param y the y-coordinate of the cursor
27 */
28 void BeginTilt(int x, int y);
29
30 /**
31 * Signals that a motion sensor tilt is occurring.
32 * @param x the x-coordinate of the cursor
33 * @param y the y-coordinate of the cursor
34 */
35 void Tilt(int x, int y);
36
37 /**
38 * Signals that a motion sensor tilt has ended.
39 */
40 void EndTilt();
41
42private:
43 std::weak_ptr<MotionEmuDevice> current_device;
44};
45
46} // namespace InputCommon
diff --git a/src/input_common/sdl/sdl.cpp b/src/input_common/sdl/sdl.cpp
index 756ee58b7..d404afa89 100644
--- a/src/input_common/sdl/sdl.cpp
+++ b/src/input_common/sdl/sdl.cpp
@@ -159,7 +159,7 @@ public:
159 * - "axis"(optional): the index of the axis to bind 159 * - "axis"(optional): the index of the axis to bind
160 * - "direction"(only used for hat): the direction name of the hat to bind. Can be "up", 160 * - "direction"(only used for hat): the direction name of the hat to bind. Can be "up",
161 * "down", "left" or "right" 161 * "down", "left" or "right"
162 * - "threshould"(only used for axis): a float value in (-1.0, 1.0) which the button is 162 * - "threshold"(only used for axis): a float value in (-1.0, 1.0) which the button is
163 * triggered if the axis value crosses 163 * triggered if the axis value crosses
164 * - "direction"(only used for axis): "+" means the button is triggered when the axis value 164 * - "direction"(only used for axis): "+" means the button is triggered when the axis value
165 * is greater than the threshold; "-" means the button is triggered when the axis value 165 * is greater than the threshold; "-" means the button is triggered when the axis value
diff --git a/src/network/packet.cpp b/src/network/packet.cpp
index 660e92c0d..7e1a812f3 100644
--- a/src/network/packet.cpp
+++ b/src/network/packet.cpp
@@ -13,6 +13,18 @@
13 13
14namespace Network { 14namespace Network {
15 15
16#ifndef htonll
17u64 htonll(u64 x) {
18 return ((1 == htonl(1)) ? (x) : ((uint64_t)htonl((x)&0xFFFFFFFF) << 32) | htonl((x) >> 32));
19}
20#endif
21
22#ifndef ntohll
23u64 ntohll(u64 x) {
24 return ((1 == ntohl(1)) ? (x) : ((uint64_t)ntohl((x)&0xFFFFFFFF) << 32) | ntohl((x) >> 32));
25}
26#endif
27
16void Packet::Append(const void* in_data, std::size_t size_in_bytes) { 28void Packet::Append(const void* in_data, std::size_t size_in_bytes) {
17 if (in_data && (size_in_bytes > 0)) { 29 if (in_data && (size_in_bytes > 0)) {
18 std::size_t start = data.size(); 30 std::size_t start = data.size();
@@ -100,6 +112,20 @@ Packet& Packet::operator>>(u32& out_data) {
100 return *this; 112 return *this;
101} 113}
102 114
115Packet& Packet::operator>>(s64& out_data) {
116 s64 value;
117 Read(&value, sizeof(value));
118 out_data = ntohll(value);
119 return *this;
120}
121
122Packet& Packet::operator>>(u64& out_data) {
123 u64 value;
124 Read(&value, sizeof(value));
125 out_data = ntohll(value);
126 return *this;
127}
128
103Packet& Packet::operator>>(float& out_data) { 129Packet& Packet::operator>>(float& out_data) {
104 Read(&out_data, sizeof(out_data)); 130 Read(&out_data, sizeof(out_data));
105 return *this; 131 return *this;
@@ -183,6 +209,18 @@ Packet& Packet::operator<<(u32 in_data) {
183 return *this; 209 return *this;
184} 210}
185 211
212Packet& Packet::operator<<(s64 in_data) {
213 s64 toWrite = htonll(in_data);
214 Append(&toWrite, sizeof(toWrite));
215 return *this;
216}
217
218Packet& Packet::operator<<(u64 in_data) {
219 u64 toWrite = htonll(in_data);
220 Append(&toWrite, sizeof(toWrite));
221 return *this;
222}
223
186Packet& Packet::operator<<(float in_data) { 224Packet& Packet::operator<<(float in_data) {
187 Append(&in_data, sizeof(in_data)); 225 Append(&in_data, sizeof(in_data));
188 return *this; 226 return *this;
@@ -195,7 +233,7 @@ Packet& Packet::operator<<(double in_data) {
195 233
196Packet& Packet::operator<<(const char* in_data) { 234Packet& Packet::operator<<(const char* in_data) {
197 // First insert string length 235 // First insert string length
198 u32 length = std::strlen(in_data); 236 u32 length = static_cast<u32>(std::strlen(in_data));
199 *this << length; 237 *this << length;
200 238
201 // Then insert characters 239 // Then insert characters
diff --git a/src/network/packet.h b/src/network/packet.h
index 94b351ab1..5a2e58dc2 100644
--- a/src/network/packet.h
+++ b/src/network/packet.h
@@ -72,6 +72,8 @@ public:
72 Packet& operator>>(u16& out_data); 72 Packet& operator>>(u16& out_data);
73 Packet& operator>>(s32& out_data); 73 Packet& operator>>(s32& out_data);
74 Packet& operator>>(u32& out_data); 74 Packet& operator>>(u32& out_data);
75 Packet& operator>>(s64& out_data);
76 Packet& operator>>(u64& out_data);
75 Packet& operator>>(float& out_data); 77 Packet& operator>>(float& out_data);
76 Packet& operator>>(double& out_data); 78 Packet& operator>>(double& out_data);
77 Packet& operator>>(char* out_data); 79 Packet& operator>>(char* out_data);
@@ -89,6 +91,8 @@ public:
89 Packet& operator<<(u16 in_data); 91 Packet& operator<<(u16 in_data);
90 Packet& operator<<(s32 in_data); 92 Packet& operator<<(s32 in_data);
91 Packet& operator<<(u32 in_data); 93 Packet& operator<<(u32 in_data);
94 Packet& operator<<(s64 in_data);
95 Packet& operator<<(u64 in_data);
92 Packet& operator<<(float in_data); 96 Packet& operator<<(float in_data);
93 Packet& operator<<(double in_data); 97 Packet& operator<<(double in_data);
94 Packet& operator<<(const char* in_data); 98 Packet& operator<<(const char* in_data);
diff --git a/src/network/room.cpp b/src/network/room.cpp
index 8b7915bb7..261049ab0 100644
--- a/src/network/room.cpp
+++ b/src/network/room.cpp
@@ -4,9 +4,9 @@
4 4
5#include <algorithm> 5#include <algorithm>
6#include <atomic> 6#include <atomic>
7#include <mutex>
7#include <random> 8#include <random>
8#include <thread> 9#include <thread>
9#include <vector>
10#include "enet/enet.h" 10#include "enet/enet.h"
11#include "network/packet.h" 11#include "network/packet.h"
12#include "network/room.h" 12#include "network/room.h"
@@ -19,7 +19,7 @@ static constexpr u32 MaxConcurrentConnections = 10;
19class Room::RoomImpl { 19class Room::RoomImpl {
20public: 20public:
21 // This MAC address is used to generate a 'Nintendo' like Mac address. 21 // This MAC address is used to generate a 'Nintendo' like Mac address.
22 const MacAddress NintendoOUI = {0x00, 0x1F, 0x32, 0x00, 0x00, 0x00}; 22 const MacAddress NintendoOUI;
23 std::mt19937 random_gen; ///< Random number generator. Used for GenerateMacAddress 23 std::mt19937 random_gen; ///< Random number generator. Used for GenerateMacAddress
24 24
25 ENetHost* server = nullptr; ///< Network interface. 25 ENetHost* server = nullptr; ///< Network interface.
@@ -29,14 +29,17 @@ public:
29 29
30 struct Member { 30 struct Member {
31 std::string nickname; ///< The nickname of the member. 31 std::string nickname; ///< The nickname of the member.
32 std::string game_name; ///< The current game of the member 32 GameInfo game_info; ///< The current game of the member
33 MacAddress mac_address; ///< The assigned mac address of the member. 33 MacAddress mac_address; ///< The assigned mac address of the member.
34 ENetPeer* peer; ///< The remote peer. 34 ENetPeer* peer; ///< The remote peer.
35 }; 35 };
36 using MemberList = std::vector<Member>; 36 using MemberList = std::vector<Member>;
37 MemberList members; ///< Information about the members of this room. 37 MemberList members; ///< Information about the members of this room
38 mutable std::mutex member_mutex; ///< Mutex for locking the members list
39 /// This should be a std::shared_mutex as soon as C++17 is supported
38 40
39 RoomImpl() : random_gen(std::random_device()()) {} 41 RoomImpl()
42 : random_gen(std::random_device()()), NintendoOUI{0x00, 0x1F, 0x32, 0x00, 0x00, 0x00} {}
40 43
41 /// Thread that receives and dispatches network packets 44 /// Thread that receives and dispatches network packets
42 std::unique_ptr<std::thread> room_thread; 45 std::unique_ptr<std::thread> room_thread;
@@ -146,7 +149,7 @@ void Room::RoomImpl::ServerLoop() {
146 case IdJoinRequest: 149 case IdJoinRequest:
147 HandleJoinRequest(&event); 150 HandleJoinRequest(&event);
148 break; 151 break;
149 case IdSetGameName: 152 case IdSetGameInfo:
150 HandleGameNamePacket(&event); 153 HandleGameNamePacket(&event);
151 break; 154 break;
152 case IdWifiPacket: 155 case IdWifiPacket:
@@ -212,7 +215,10 @@ void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) {
212 member.nickname = nickname; 215 member.nickname = nickname;
213 member.peer = event->peer; 216 member.peer = event->peer;
214 217
215 members.push_back(std::move(member)); 218 {
219 std::lock_guard<std::mutex> lock(member_mutex);
220 members.push_back(std::move(member));
221 }
216 222
217 // Notify everyone that the room information has changed. 223 // Notify everyone that the room information has changed.
218 BroadcastRoomInformation(); 224 BroadcastRoomInformation();
@@ -222,12 +228,14 @@ void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) {
222bool Room::RoomImpl::IsValidNickname(const std::string& nickname) const { 228bool Room::RoomImpl::IsValidNickname(const std::string& nickname) const {
223 // A nickname is valid if it is not already taken by anybody else in the room. 229 // A nickname is valid if it is not already taken by anybody else in the room.
224 // TODO(B3N30): Check for empty names, spaces, etc. 230 // TODO(B3N30): Check for empty names, spaces, etc.
231 std::lock_guard<std::mutex> lock(member_mutex);
225 return std::all_of(members.begin(), members.end(), 232 return std::all_of(members.begin(), members.end(),
226 [&nickname](const auto& member) { return member.nickname != nickname; }); 233 [&nickname](const auto& member) { return member.nickname != nickname; });
227} 234}
228 235
229bool Room::RoomImpl::IsValidMacAddress(const MacAddress& address) const { 236bool Room::RoomImpl::IsValidMacAddress(const MacAddress& address) const {
230 // A MAC address is valid if it is not already taken by anybody else in the room. 237 // A MAC address is valid if it is not already taken by anybody else in the room.
238 std::lock_guard<std::mutex> lock(member_mutex);
231 return std::all_of(members.begin(), members.end(), 239 return std::all_of(members.begin(), members.end(),
232 [&address](const auto& member) { return member.mac_address != address; }); 240 [&address](const auto& member) { return member.mac_address != address; });
233} 241}
@@ -278,6 +286,7 @@ void Room::RoomImpl::SendCloseMessage() {
278 packet << static_cast<u8>(IdCloseRoom); 286 packet << static_cast<u8>(IdCloseRoom);
279 ENetPacket* enet_packet = 287 ENetPacket* enet_packet =
280 enet_packet_create(packet.GetData(), packet.GetDataSize(), ENET_PACKET_FLAG_RELIABLE); 288 enet_packet_create(packet.GetData(), packet.GetDataSize(), ENET_PACKET_FLAG_RELIABLE);
289 std::lock_guard<std::mutex> lock(member_mutex);
281 for (auto& member : members) { 290 for (auto& member : members) {
282 enet_peer_send(member.peer, 0, enet_packet); 291 enet_peer_send(member.peer, 0, enet_packet);
283 } 292 }
@@ -294,10 +303,14 @@ void Room::RoomImpl::BroadcastRoomInformation() {
294 packet << room_information.member_slots; 303 packet << room_information.member_slots;
295 304
296 packet << static_cast<u32>(members.size()); 305 packet << static_cast<u32>(members.size());
297 for (const auto& member : members) { 306 {
298 packet << member.nickname; 307 std::lock_guard<std::mutex> lock(member_mutex);
299 packet << member.mac_address; 308 for (const auto& member : members) {
300 packet << member.game_name; 309 packet << member.nickname;
310 packet << member.mac_address;
311 packet << member.game_info.name;
312 packet << member.game_info.id;
313 }
301 } 314 }
302 315
303 ENetPacket* enet_packet = 316 ENetPacket* enet_packet =
@@ -334,11 +347,13 @@ void Room::RoomImpl::HandleWifiPacket(const ENetEvent* event) {
334 ENET_PACKET_FLAG_RELIABLE); 347 ENET_PACKET_FLAG_RELIABLE);
335 348
336 if (destination_address == BroadcastMac) { // Send the data to everyone except the sender 349 if (destination_address == BroadcastMac) { // Send the data to everyone except the sender
350 std::lock_guard<std::mutex> lock(member_mutex);
337 for (const auto& member : members) { 351 for (const auto& member : members) {
338 if (member.peer != event->peer) 352 if (member.peer != event->peer)
339 enet_peer_send(member.peer, 0, enet_packet); 353 enet_peer_send(member.peer, 0, enet_packet);
340 } 354 }
341 } else { // Send the data only to the destination client 355 } else { // Send the data only to the destination client
356 std::lock_guard<std::mutex> lock(member_mutex);
342 auto member = std::find_if(members.begin(), members.end(), 357 auto member = std::find_if(members.begin(), members.end(),
343 [destination_address](const Member& member) -> bool { 358 [destination_address](const Member& member) -> bool {
344 return member.mac_address == destination_address; 359 return member.mac_address == destination_address;
@@ -360,6 +375,8 @@ void Room::RoomImpl::HandleChatPacket(const ENetEvent* event) {
360 auto CompareNetworkAddress = [event](const Member member) -> bool { 375 auto CompareNetworkAddress = [event](const Member member) -> bool {
361 return member.peer == event->peer; 376 return member.peer == event->peer;
362 }; 377 };
378
379 std::lock_guard<std::mutex> lock(member_mutex);
363 const auto sending_member = std::find_if(members.begin(), members.end(), CompareNetworkAddress); 380 const auto sending_member = std::find_if(members.begin(), members.end(), CompareNetworkAddress);
364 if (sending_member == members.end()) { 381 if (sending_member == members.end()) {
365 return; // Received a chat message from a unknown sender 382 return; // Received a chat message from a unknown sender
@@ -384,22 +401,32 @@ void Room::RoomImpl::HandleGameNamePacket(const ENetEvent* event) {
384 in_packet.Append(event->packet->data, event->packet->dataLength); 401 in_packet.Append(event->packet->data, event->packet->dataLength);
385 402
386 in_packet.IgnoreBytes(sizeof(u8)); // Igonore the message type 403 in_packet.IgnoreBytes(sizeof(u8)); // Igonore the message type
387 std::string game_name; 404 GameInfo game_info;
388 in_packet >> game_name; 405 in_packet >> game_info.name;
389 auto member = 406 in_packet >> game_info.id;
390 std::find_if(members.begin(), members.end(), 407
391 [event](const Member& member) -> bool { return member.peer == event->peer; }); 408 {
392 if (member != members.end()) { 409 std::lock_guard<std::mutex> lock(member_mutex);
393 member->game_name = game_name; 410 auto member =
394 BroadcastRoomInformation(); 411 std::find_if(members.begin(), members.end(), [event](const Member& member) -> bool {
412 return member.peer == event->peer;
413 });
414 if (member != members.end()) {
415 member->game_info = game_info;
416 }
395 } 417 }
418 BroadcastRoomInformation();
396} 419}
397 420
398void Room::RoomImpl::HandleClientDisconnection(ENetPeer* client) { 421void Room::RoomImpl::HandleClientDisconnection(ENetPeer* client) {
399 // Remove the client from the members list. 422 // Remove the client from the members list.
400 members.erase(std::remove_if(members.begin(), members.end(), 423 {
401 [client](const Member& member) { return member.peer == client; }), 424 std::lock_guard<std::mutex> lock(member_mutex);
402 members.end()); 425 members.erase(
426 std::remove_if(members.begin(), members.end(),
427 [client](const Member& member) { return member.peer == client; }),
428 members.end());
429 }
403 430
404 // Announce the change to all clients. 431 // Announce the change to all clients.
405 enet_peer_disconnect(client, 0); 432 enet_peer_disconnect(client, 0);
@@ -436,6 +463,19 @@ const RoomInformation& Room::GetRoomInformation() const {
436 return room_impl->room_information; 463 return room_impl->room_information;
437} 464}
438 465
466std::vector<Room::Member> Room::GetRoomMemberList() const {
467 std::vector<Room::Member> member_list;
468 std::lock_guard<std::mutex> lock(room_impl->member_mutex);
469 for (const auto& member_impl : room_impl->members) {
470 Member member;
471 member.nickname = member_impl.nickname;
472 member.mac_address = member_impl.mac_address;
473 member.game_info = member_impl.game_info;
474 member_list.push_back(member);
475 }
476 return member_list;
477};
478
439void Room::Destroy() { 479void Room::Destroy() {
440 room_impl->state = State::Closed; 480 room_impl->state = State::Closed;
441 room_impl->room_thread->join(); 481 room_impl->room_thread->join();
@@ -446,7 +486,10 @@ void Room::Destroy() {
446 } 486 }
447 room_impl->room_information = {}; 487 room_impl->room_information = {};
448 room_impl->server = nullptr; 488 room_impl->server = nullptr;
449 room_impl->members.clear(); 489 {
490 std::lock_guard<std::mutex> lock(room_impl->member_mutex);
491 room_impl->members.clear();
492 }
450 room_impl->room_information.member_slots = 0; 493 room_impl->room_information.member_slots = 0;
451 room_impl->room_information.name.clear(); 494 room_impl->room_information.name.clear();
452} 495}
diff --git a/src/network/room.h b/src/network/room.h
index 54cccf0ae..8285a4d0c 100644
--- a/src/network/room.h
+++ b/src/network/room.h
@@ -7,6 +7,7 @@
7#include <array> 7#include <array>
8#include <memory> 8#include <memory>
9#include <string> 9#include <string>
10#include <vector>
10#include "common/common_types.h" 11#include "common/common_types.h"
11 12
12namespace Network { 13namespace Network {
@@ -21,10 +22,15 @@ struct RoomInformation {
21 u32 member_slots; ///< Maximum number of members in this room 22 u32 member_slots; ///< Maximum number of members in this room
22}; 23};
23 24
25struct GameInfo {
26 std::string name{""};
27 u64 id{0};
28};
29
24using MacAddress = std::array<u8, 6>; 30using MacAddress = std::array<u8, 6>;
25/// A special MAC address that tells the room we're joining to assign us a MAC address 31/// A special MAC address that tells the room we're joining to assign us a MAC address
26/// automatically. 32/// automatically.
27const MacAddress NoPreferredMac = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 33constexpr MacAddress NoPreferredMac = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
28 34
29// 802.11 broadcast MAC address 35// 802.11 broadcast MAC address
30constexpr MacAddress BroadcastMac = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 36constexpr MacAddress BroadcastMac = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
@@ -34,7 +40,7 @@ enum RoomMessageTypes : u8 {
34 IdJoinRequest = 1, 40 IdJoinRequest = 1,
35 IdJoinSuccess, 41 IdJoinSuccess,
36 IdRoomInformation, 42 IdRoomInformation,
37 IdSetGameName, 43 IdSetGameInfo,
38 IdWifiPacket, 44 IdWifiPacket,
39 IdChatMessage, 45 IdChatMessage,
40 IdNameCollision, 46 IdNameCollision,
@@ -51,6 +57,12 @@ public:
51 Closed, ///< The room is not opened and can not accept connections. 57 Closed, ///< The room is not opened and can not accept connections.
52 }; 58 };
53 59
60 struct Member {
61 std::string nickname; ///< The nickname of the member.
62 GameInfo game_info; ///< The current game of the member
63 MacAddress mac_address; ///< The assigned mac address of the member.
64 };
65
54 Room(); 66 Room();
55 ~Room(); 67 ~Room();
56 68
@@ -65,6 +77,11 @@ public:
65 const RoomInformation& GetRoomInformation() const; 77 const RoomInformation& GetRoomInformation() const;
66 78
67 /** 79 /**
80 * Gets a list of the mbmers connected to the room.
81 */
82 std::vector<Member> GetRoomMemberList() const;
83
84 /**
68 * Creates the socket for this room. Will bind to default address if 85 * Creates the socket for this room. Will bind to default address if
69 * server is empty string. 86 * server is empty string.
70 */ 87 */
diff --git a/src/network/room_member.cpp b/src/network/room_member.cpp
index dac9bacae..f229ec6fd 100644
--- a/src/network/room_member.cpp
+++ b/src/network/room_member.cpp
@@ -5,6 +5,7 @@
5#include <atomic> 5#include <atomic>
6#include <list> 6#include <list>
7#include <mutex> 7#include <mutex>
8#include <set>
8#include <thread> 9#include <thread>
9#include "common/assert.h" 10#include "common/assert.h"
10#include "enet/enet.h" 11#include "enet/enet.h"
@@ -25,6 +26,9 @@ public:
25 /// Information about the room we're connected to. 26 /// Information about the room we're connected to.
26 RoomInformation room_information; 27 RoomInformation room_information;
27 28
29 /// The current game name, id and version
30 GameInfo current_game_info;
31
28 std::atomic<State> state{State::Idle}; ///< Current state of the RoomMember. 32 std::atomic<State> state{State::Idle}; ///< Current state of the RoomMember.
29 void SetState(const State new_state); 33 void SetState(const State new_state);
30 bool IsConnected() const; 34 bool IsConnected() const;
@@ -37,6 +41,24 @@ public:
37 std::unique_ptr<std::thread> loop_thread; 41 std::unique_ptr<std::thread> loop_thread;
38 std::mutex send_list_mutex; ///< Mutex that controls access to the `send_list` variable. 42 std::mutex send_list_mutex; ///< Mutex that controls access to the `send_list` variable.
39 std::list<Packet> send_list; ///< A list that stores all packets to send the async 43 std::list<Packet> send_list; ///< A list that stores all packets to send the async
44
45 template <typename T>
46 using CallbackSet = std::set<CallbackHandle<T>>;
47 std::mutex callback_mutex; ///< The mutex used for handling callbacks
48
49 class Callbacks {
50 public:
51 template <typename T>
52 CallbackSet<T>& Get();
53
54 private:
55 CallbackSet<WifiPacket> callback_set_wifi_packet;
56 CallbackSet<ChatEntry> callback_set_chat_messages;
57 CallbackSet<RoomInformation> callback_set_room_information;
58 CallbackSet<State> callback_set_state;
59 };
60 Callbacks callbacks; ///< All CallbackSets to all events
61
40 void MemberLoop(); 62 void MemberLoop();
41 63
42 void StartLoop(); 64 void StartLoop();
@@ -84,12 +106,20 @@ public:
84 * Disconnects the RoomMember from the Room 106 * Disconnects the RoomMember from the Room
85 */ 107 */
86 void Disconnect(); 108 void Disconnect();
109
110 template <typename T>
111 void Invoke(const T& data);
112
113 template <typename T>
114 CallbackHandle<T> Bind(std::function<void(const T&)> callback);
87}; 115};
88 116
89// RoomMemberImpl 117// RoomMemberImpl
90void RoomMember::RoomMemberImpl::SetState(const State new_state) { 118void RoomMember::RoomMemberImpl::SetState(const State new_state) {
91 state = new_state; 119 if (state != new_state) {
92 // TODO(B3N30): Invoke the callback functions 120 state = new_state;
121 Invoke<State>(state);
122 }
93} 123}
94 124
95bool RoomMember::RoomMemberImpl::IsConnected() const { 125bool RoomMember::RoomMemberImpl::IsConnected() const {
@@ -195,9 +225,10 @@ void RoomMember::RoomMemberImpl::HandleRoomInformationPacket(const ENetEvent* ev
195 for (auto& member : member_information) { 225 for (auto& member : member_information) {
196 packet >> member.nickname; 226 packet >> member.nickname;
197 packet >> member.mac_address; 227 packet >> member.mac_address;
198 packet >> member.game_name; 228 packet >> member.game_info.name;
229 packet >> member.game_info.id;
199 } 230 }
200 // TODO(B3N30): Invoke callbacks 231 Invoke(room_information);
201} 232}
202 233
203void RoomMember::RoomMemberImpl::HandleJoinPacket(const ENetEvent* event) { 234void RoomMember::RoomMemberImpl::HandleJoinPacket(const ENetEvent* event) {
@@ -209,7 +240,7 @@ void RoomMember::RoomMemberImpl::HandleJoinPacket(const ENetEvent* event) {
209 240
210 // Parse the MAC Address from the packet 241 // Parse the MAC Address from the packet
211 packet >> mac_address; 242 packet >> mac_address;
212 // TODO(B3N30): Invoke callbacks 243 SetState(State::Joined);
213} 244}
214 245
215void RoomMember::RoomMemberImpl::HandleWifiPackets(const ENetEvent* event) { 246void RoomMember::RoomMemberImpl::HandleWifiPackets(const ENetEvent* event) {
@@ -235,7 +266,7 @@ void RoomMember::RoomMemberImpl::HandleWifiPackets(const ENetEvent* event) {
235 266
236 packet >> wifi_packet.data; 267 packet >> wifi_packet.data;
237 268
238 // TODO(B3N30): Invoke callbacks 269 Invoke<WifiPacket>(wifi_packet);
239} 270}
240 271
241void RoomMember::RoomMemberImpl::HandleChatPacket(const ENetEvent* event) { 272void RoomMember::RoomMemberImpl::HandleChatPacket(const ENetEvent* event) {
@@ -248,7 +279,7 @@ void RoomMember::RoomMemberImpl::HandleChatPacket(const ENetEvent* event) {
248 ChatEntry chat_entry{}; 279 ChatEntry chat_entry{};
249 packet >> chat_entry.nickname; 280 packet >> chat_entry.nickname;
250 packet >> chat_entry.message; 281 packet >> chat_entry.message;
251 // TODO(B3N30): Invoke callbacks 282 Invoke<ChatEntry>(chat_entry);
252} 283}
253 284
254void RoomMember::RoomMemberImpl::Disconnect() { 285void RoomMember::RoomMemberImpl::Disconnect() {
@@ -276,6 +307,46 @@ void RoomMember::RoomMemberImpl::Disconnect() {
276 server = nullptr; 307 server = nullptr;
277} 308}
278 309
310template <>
311RoomMember::RoomMemberImpl::CallbackSet<WifiPacket>& RoomMember::RoomMemberImpl::Callbacks::Get() {
312 return callback_set_wifi_packet;
313}
314
315template <>
316RoomMember::RoomMemberImpl::CallbackSet<RoomMember::State>&
317RoomMember::RoomMemberImpl::Callbacks::Get() {
318 return callback_set_state;
319}
320
321template <>
322RoomMember::RoomMemberImpl::CallbackSet<RoomInformation>&
323RoomMember::RoomMemberImpl::Callbacks::Get() {
324 return callback_set_room_information;
325}
326
327template <>
328RoomMember::RoomMemberImpl::CallbackSet<ChatEntry>& RoomMember::RoomMemberImpl::Callbacks::Get() {
329 return callback_set_chat_messages;
330}
331
332template <typename T>
333void RoomMember::RoomMemberImpl::Invoke(const T& data) {
334 std::lock_guard<std::mutex> lock(callback_mutex);
335 CallbackSet<T> callback_set = callbacks.Get<T>();
336 for (auto const& callback : callback_set)
337 (*callback)(data);
338}
339
340template <typename T>
341RoomMember::CallbackHandle<T> RoomMember::RoomMemberImpl::Bind(
342 std::function<void(const T&)> callback) {
343 std::lock_guard<std::mutex> lock(callback_mutex);
344 CallbackHandle<T> handle;
345 handle = std::make_shared<std::function<void(const T&)>>(callback);
346 callbacks.Get<T>().insert(handle);
347 return handle;
348}
349
279// RoomMember 350// RoomMember
280RoomMember::RoomMember() : room_member_impl{std::make_unique<RoomMemberImpl>()} { 351RoomMember::RoomMember() : room_member_impl{std::make_unique<RoomMemberImpl>()} {
281 room_member_impl->client = enet_host_create(nullptr, 1, NumChannels, 0, 0); 352 room_member_impl->client = enet_host_create(nullptr, 1, NumChannels, 0, 0);
@@ -339,6 +410,7 @@ void RoomMember::Join(const std::string& nick, const char* server_addr, u16 serv
339 room_member_impl->SetState(State::Joining); 410 room_member_impl->SetState(State::Joining);
340 room_member_impl->StartLoop(); 411 room_member_impl->StartLoop();
341 room_member_impl->SendJoinRequest(nick, preferred_mac); 412 room_member_impl->SendJoinRequest(nick, preferred_mac);
413 SendGameInfo(room_member_impl->current_game_info);
342 } else { 414 } else {
343 room_member_impl->SetState(State::CouldNotConnect); 415 room_member_impl->SetState(State::CouldNotConnect);
344 } 416 }
@@ -366,17 +438,53 @@ void RoomMember::SendChatMessage(const std::string& message) {
366 room_member_impl->Send(std::move(packet)); 438 room_member_impl->Send(std::move(packet));
367} 439}
368 440
369void RoomMember::SendGameName(const std::string& game_name) { 441void RoomMember::SendGameInfo(const GameInfo& game_info) {
442 room_member_impl->current_game_info = game_info;
443 if (!IsConnected())
444 return;
445
370 Packet packet; 446 Packet packet;
371 packet << static_cast<u8>(IdSetGameName); 447 packet << static_cast<u8>(IdSetGameInfo);
372 packet << game_name; 448 packet << game_info.name;
449 packet << game_info.id;
373 room_member_impl->Send(std::move(packet)); 450 room_member_impl->Send(std::move(packet));
374} 451}
375 452
453RoomMember::CallbackHandle<RoomMember::State> RoomMember::BindOnStateChanged(
454 std::function<void(const RoomMember::State&)> callback) {
455 return room_member_impl->Bind(callback);
456}
457
458RoomMember::CallbackHandle<WifiPacket> RoomMember::BindOnWifiPacketReceived(
459 std::function<void(const WifiPacket&)> callback) {
460 return room_member_impl->Bind(callback);
461}
462
463RoomMember::CallbackHandle<RoomInformation> RoomMember::BindOnRoomInformationChanged(
464 std::function<void(const RoomInformation&)> callback) {
465 return room_member_impl->Bind(callback);
466}
467
468RoomMember::CallbackHandle<ChatEntry> RoomMember::BindOnChatMessageRecieved(
469 std::function<void(const ChatEntry&)> callback) {
470 return room_member_impl->Bind(callback);
471}
472
473template <typename T>
474void RoomMember::Unbind(CallbackHandle<T> handle) {
475 std::lock_guard<std::mutex> lock(room_member_impl->callback_mutex);
476 room_member_impl->callbacks.Get<T>().erase(handle);
477}
478
376void RoomMember::Leave() { 479void RoomMember::Leave() {
377 room_member_impl->SetState(State::Idle); 480 room_member_impl->SetState(State::Idle);
378 room_member_impl->loop_thread->join(); 481 room_member_impl->loop_thread->join();
379 room_member_impl->loop_thread.reset(); 482 room_member_impl->loop_thread.reset();
380} 483}
381 484
485template void RoomMember::Unbind(CallbackHandle<WifiPacket>);
486template void RoomMember::Unbind(CallbackHandle<RoomMember::State>);
487template void RoomMember::Unbind(CallbackHandle<RoomInformation>);
488template void RoomMember::Unbind(CallbackHandle<ChatEntry>);
489
382} // namespace Network 490} // namespace Network
diff --git a/src/network/room_member.h b/src/network/room_member.h
index bc1af3a7e..98770a234 100644
--- a/src/network/room_member.h
+++ b/src/network/room_member.h
@@ -4,6 +4,7 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <functional>
7#include <memory> 8#include <memory>
8#include <string> 9#include <string>
9#include <vector> 10#include <vector>
@@ -53,12 +54,23 @@ public:
53 54
54 struct MemberInformation { 55 struct MemberInformation {
55 std::string nickname; ///< Nickname of the member. 56 std::string nickname; ///< Nickname of the member.
56 std::string game_name; ///< Name of the game they're currently playing, or empty if they're 57 GameInfo game_info; ///< Name of the game they're currently playing, or empty if they're
57 /// not playing anything. 58 /// not playing anything.
58 MacAddress mac_address; ///< MAC address associated with this member. 59 MacAddress mac_address; ///< MAC address associated with this member.
59 }; 60 };
60 using MemberList = std::vector<MemberInformation>; 61 using MemberList = std::vector<MemberInformation>;
61 62
63 // The handle for the callback functions
64 template <typename T>
65 using CallbackHandle = std::shared_ptr<std::function<void(const T&)>>;
66
67 /**
68 * Unbinds a callback function from the events.
69 * @param handle The connection handle to disconnect
70 */
71 template <typename T>
72 void Unbind(CallbackHandle<T> handle);
73
62 RoomMember(); 74 RoomMember();
63 ~RoomMember(); 75 ~RoomMember();
64 76
@@ -113,10 +125,49 @@ public:
113 void SendChatMessage(const std::string& message); 125 void SendChatMessage(const std::string& message);
114 126
115 /** 127 /**
116 * Sends the current game name to the room. 128 * Sends the current game info to the room.
117 * @param game_name The game name. 129 * @param game_info The game information.
130 */
131 void SendGameInfo(const GameInfo& game_info);
132
133 /**
134 * Binds a function to an event that will be triggered every time the State of the member
135 * changed. The function wil be called every time the event is triggered. The callback function
136 * must not bind or unbind a function. Doing so will cause a deadlock
137 * @param callback The function to call
138 * @return A handle used for removing the function from the registered list
139 */
140 CallbackHandle<State> BindOnStateChanged(std::function<void(const State&)> callback);
141
142 /**
143 * Binds a function to an event that will be triggered every time a WifiPacket is received.
144 * The function wil be called everytime the event is triggered.
145 * The callback function must not bind or unbind a function. Doing so will cause a deadlock
146 * @param callback The function to call
147 * @return A handle used for removing the function from the registered list
148 */
149 CallbackHandle<WifiPacket> BindOnWifiPacketReceived(
150 std::function<void(const WifiPacket&)> callback);
151
152 /**
153 * Binds a function to an event that will be triggered every time the RoomInformation changes.
154 * The function wil be called every time the event is triggered.
155 * The callback function must not bind or unbind a function. Doing so will cause a deadlock
156 * @param callback The function to call
157 * @return A handle used for removing the function from the registered list
158 */
159 CallbackHandle<RoomInformation> BindOnRoomInformationChanged(
160 std::function<void(const RoomInformation&)> callback);
161
162 /**
163 * Binds a function to an event that will be triggered every time a ChatMessage is received.
164 * The function wil be called every time the event is triggered.
165 * The callback function must not bind or unbind a function. Doing so will cause a deadlock
166 * @param callback The function to call
167 * @return A handle used for removing the function from the registered list
118 */ 168 */
119 void SendGameName(const std::string& game_name); 169 CallbackHandle<ChatEntry> BindOnChatMessageRecieved(
170 std::function<void(const ChatEntry&)> callback);
120 171
121 /** 172 /**
122 * Leaves the current room. 173 * Leaves the current room.
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index a14df325a..1aac0daa2 100644
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -1,12 +1,16 @@
1set(SRCS 1set(SRCS
2 common/param_package.cpp 2 common/param_package.cpp
3 core/arm/arm_test_common.cpp
4 core/arm/dyncom/arm_dyncom_vfp_tests.cpp
3 core/file_sys/path_parser.cpp 5 core/file_sys/path_parser.cpp
4 core/hle/kernel/hle_ipc.cpp 6 core/hle/kernel/hle_ipc.cpp
7 core/memory/memory.cpp
5 glad.cpp 8 glad.cpp
6 tests.cpp 9 tests.cpp
7 ) 10 )
8 11
9set(HEADERS 12set(HEADERS
13 core/arm/arm_test_common.h
10 ) 14 )
11 15
12create_directory_groups(${SRCS} ${HEADERS}) 16create_directory_groups(${SRCS} ${HEADERS})
diff --git a/src/tests/core/arm/arm_test_common.cpp b/src/tests/core/arm/arm_test_common.cpp
new file mode 100644
index 000000000..2339bdfb8
--- /dev/null
+++ b/src/tests/core/arm/arm_test_common.cpp
@@ -0,0 +1,137 @@
1// Copyright 2016 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "core/core.h"
6#include "core/hle/kernel/process.h"
7#include "core/memory.h"
8#include "core/memory_setup.h"
9#include "tests/core/arm/arm_test_common.h"
10
11namespace ArmTests {
12
13static Memory::PageTable* page_table = nullptr;
14
15TestEnvironment::TestEnvironment(bool mutable_memory_)
16 : mutable_memory(mutable_memory_), test_memory(std::make_shared<TestMemory>(this)) {
17
18 Kernel::g_current_process = Kernel::Process::Create("");
19 page_table = &Kernel::g_current_process->vm_manager.page_table;
20
21 page_table->pointers.fill(nullptr);
22 page_table->attributes.fill(Memory::PageType::Unmapped);
23 page_table->cached_res_count.fill(0);
24
25 Memory::MapIoRegion(*page_table, 0x00000000, 0x80000000, test_memory);
26 Memory::MapIoRegion(*page_table, 0x80000000, 0x80000000, test_memory);
27
28 Memory::SetCurrentPageTable(page_table);
29}
30
31TestEnvironment::~TestEnvironment() {
32 Memory::UnmapRegion(*page_table, 0x80000000, 0x80000000);
33 Memory::UnmapRegion(*page_table, 0x00000000, 0x80000000);
34}
35
36void TestEnvironment::SetMemory64(VAddr vaddr, u64 value) {
37 SetMemory32(vaddr + 0, static_cast<u32>(value));
38 SetMemory32(vaddr + 4, static_cast<u32>(value >> 32));
39}
40
41void TestEnvironment::SetMemory32(VAddr vaddr, u32 value) {
42 SetMemory16(vaddr + 0, static_cast<u16>(value));
43 SetMemory16(vaddr + 2, static_cast<u16>(value >> 16));
44}
45
46void TestEnvironment::SetMemory16(VAddr vaddr, u16 value) {
47 SetMemory8(vaddr + 0, static_cast<u8>(value));
48 SetMemory8(vaddr + 1, static_cast<u8>(value >> 8));
49}
50
51void TestEnvironment::SetMemory8(VAddr vaddr, u8 value) {
52 test_memory->data[vaddr] = value;
53}
54
55std::vector<WriteRecord> TestEnvironment::GetWriteRecords() const {
56 return write_records;
57}
58
59void TestEnvironment::ClearWriteRecords() {
60 write_records.clear();
61}
62
63TestEnvironment::TestMemory::~TestMemory() {}
64
65bool TestEnvironment::TestMemory::IsValidAddress(VAddr addr) {
66 return true;
67}
68
69u8 TestEnvironment::TestMemory::Read8(VAddr addr) {
70 auto iter = data.find(addr);
71 if (iter == data.end()) {
72 return addr; // Some arbitrary data
73 }
74 return iter->second;
75}
76
77u16 TestEnvironment::TestMemory::Read16(VAddr addr) {
78 return Read8(addr) | static_cast<u16>(Read8(addr + 1)) << 8;
79}
80
81u32 TestEnvironment::TestMemory::Read32(VAddr addr) {
82 return Read16(addr) | static_cast<u32>(Read16(addr + 2)) << 16;
83}
84
85u64 TestEnvironment::TestMemory::Read64(VAddr addr) {
86 return Read32(addr) | static_cast<u64>(Read32(addr + 4)) << 32;
87}
88
89bool TestEnvironment::TestMemory::ReadBlock(VAddr src_addr, void* dest_buffer, size_t size) {
90 VAddr addr = src_addr;
91 u8* data = static_cast<u8*>(dest_buffer);
92
93 for (size_t i = 0; i < size; i++, addr++, data++) {
94 *data = Read8(addr);
95 }
96
97 return true;
98}
99
100void TestEnvironment::TestMemory::Write8(VAddr addr, u8 data) {
101 env->write_records.emplace_back(8, addr, data);
102 if (env->mutable_memory)
103 env->SetMemory8(addr, data);
104}
105
106void TestEnvironment::TestMemory::Write16(VAddr addr, u16 data) {
107 env->write_records.emplace_back(16, addr, data);
108 if (env->mutable_memory)
109 env->SetMemory16(addr, data);
110}
111
112void TestEnvironment::TestMemory::Write32(VAddr addr, u32 data) {
113 env->write_records.emplace_back(32, addr, data);
114 if (env->mutable_memory)
115 env->SetMemory32(addr, data);
116}
117
118void TestEnvironment::TestMemory::Write64(VAddr addr, u64 data) {
119 env->write_records.emplace_back(64, addr, data);
120 if (env->mutable_memory)
121 env->SetMemory64(addr, data);
122}
123
124bool TestEnvironment::TestMemory::WriteBlock(VAddr dest_addr, const void* src_buffer, size_t size) {
125 VAddr addr = dest_addr;
126 const u8* data = static_cast<const u8*>(src_buffer);
127
128 for (size_t i = 0; i < size; i++, addr++, data++) {
129 env->write_records.emplace_back(8, addr, *data);
130 if (env->mutable_memory)
131 env->SetMemory8(addr, *data);
132 }
133
134 return true;
135}
136
137} // namespace ArmTests
diff --git a/src/tests/core/arm/arm_test_common.h b/src/tests/core/arm/arm_test_common.h
new file mode 100644
index 000000000..592c28594
--- /dev/null
+++ b/src/tests/core/arm/arm_test_common.h
@@ -0,0 +1,84 @@
1// Copyright 2016 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <tuple>
6#include <unordered_map>
7#include <vector>
8
9#include "common/common_types.h"
10#include "core/mmio.h"
11
12namespace ArmTests {
13
14struct WriteRecord {
15 WriteRecord(size_t size, VAddr addr, u64 data) : size(size), addr(addr), data(data) {}
16 size_t size;
17 VAddr addr;
18 u64 data;
19 bool operator==(const WriteRecord& o) const {
20 return std::tie(size, addr, data) == std::tie(o.size, o.addr, o.data);
21 }
22};
23
24class TestEnvironment final {
25public:
26 /*
27 * Inititalise test environment
28 * @param mutable_memory If false, writes to memory can never be read back.
29 * (Memory is immutable.)
30 */
31 explicit TestEnvironment(bool mutable_memory = false);
32
33 /// Shutdown test environment
34 ~TestEnvironment();
35
36 /// Sets value at memory location vaddr.
37 void SetMemory8(VAddr vaddr, u8 value);
38 void SetMemory16(VAddr vaddr, u16 value);
39 void SetMemory32(VAddr vaddr, u32 value);
40 void SetMemory64(VAddr vaddr, u64 value);
41
42 /**
43 * Whenever Memory::Write{8,16,32,64} is called within the test environment,
44 * a new write-record is made.
45 * @returns A vector of write records made since they were last cleared.
46 */
47 std::vector<WriteRecord> GetWriteRecords() const;
48
49 /// Empties the internal write-record store.
50 void ClearWriteRecords();
51
52private:
53 friend struct TestMemory;
54 struct TestMemory final : Memory::MMIORegion {
55 explicit TestMemory(TestEnvironment* env_) : env(env_) {}
56 TestEnvironment* env;
57
58 ~TestMemory() override;
59
60 bool IsValidAddress(VAddr addr) override;
61
62 u8 Read8(VAddr addr) override;
63 u16 Read16(VAddr addr) override;
64 u32 Read32(VAddr addr) override;
65 u64 Read64(VAddr addr) override;
66
67 bool ReadBlock(VAddr src_addr, void* dest_buffer, size_t size) override;
68
69 void Write8(VAddr addr, u8 data) override;
70 void Write16(VAddr addr, u16 data) override;
71 void Write32(VAddr addr, u32 data) override;
72 void Write64(VAddr addr, u64 data) override;
73
74 bool WriteBlock(VAddr dest_addr, const void* src_buffer, size_t size) override;
75
76 std::unordered_map<VAddr, u8> data;
77 };
78
79 bool mutable_memory;
80 std::shared_ptr<TestMemory> test_memory;
81 std::vector<WriteRecord> write_records;
82};
83
84} // namespace ArmTests
diff --git a/src/tests/core/arm/dyncom/arm_dyncom_vfp_tests.cpp b/src/tests/core/arm/dyncom/arm_dyncom_vfp_tests.cpp
new file mode 100644
index 000000000..83719a58e
--- /dev/null
+++ b/src/tests/core/arm/dyncom/arm_dyncom_vfp_tests.cpp
@@ -0,0 +1,50 @@
1// Copyright 2016 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <catch.hpp>
6
7#include "core/arm/dyncom/arm_dyncom.h"
8#include "core/core_timing.h"
9#include "tests/core/arm/arm_test_common.h"
10
11namespace ArmTests {
12
13struct VfpTestCase {
14 u32 initial_fpscr;
15 u32 a;
16 u32 b;
17 u32 result;
18 u32 final_fpscr;
19};
20
21TEST_CASE("ARM_DynCom (vfp): vadd", "[arm_dyncom]") {
22 TestEnvironment test_env(false);
23 test_env.SetMemory32(0, 0xEE321A03); // vadd.f32 s2, s4, s6
24 test_env.SetMemory32(4, 0xEAFFFFFE); // b +#0
25
26 ARM_DynCom dyncom(USER32MODE);
27
28 std::vector<VfpTestCase> test_cases{{
29#include "vfp_vadd_f32.inc"
30 }};
31
32 for (const auto& test_case : test_cases) {
33 dyncom.SetPC(0);
34 dyncom.SetVFPSystemReg(VFP_FPSCR, test_case.initial_fpscr);
35 dyncom.SetVFPReg(4, test_case.a);
36 dyncom.SetVFPReg(6, test_case.b);
37 dyncom.ExecuteInstructions(1);
38 if (dyncom.GetVFPReg(2) != test_case.result ||
39 dyncom.GetVFPSystemReg(VFP_FPSCR) != test_case.final_fpscr) {
40 printf("f: %x\n", test_case.initial_fpscr);
41 printf("a: %x\n", test_case.a);
42 printf("b: %x\n", test_case.b);
43 printf("c: %x (%x)\n", dyncom.GetVFPReg(2), test_case.result);
44 printf("f: %x (%x)\n", dyncom.GetVFPSystemReg(VFP_FPSCR), test_case.final_fpscr);
45 FAIL();
46 }
47 }
48}
49
50} // namespace ArmTests \ No newline at end of file
diff --git a/src/tests/core/arm/dyncom/vfp_vadd_f32.inc b/src/tests/core/arm/dyncom/vfp_vadd_f32.inc
new file mode 100644
index 000000000..d0032c2e6
--- /dev/null
+++ b/src/tests/core/arm/dyncom/vfp_vadd_f32.inc
@@ -0,0 +1,13456 @@
1{0x3c00000, 0x0, 0x0, 0x0, 0x3c00000},
2{0x3c00000, 0x0, 0x1, 0x0, 0x3c00080},
3{0x3c00000, 0x0, 0x76, 0x0, 0x3c00080},
4{0x3c00000, 0x0, 0x2b94, 0x0, 0x3c00080},
5{0x3c00000, 0x0, 0x636d24, 0x0, 0x3c00080},
6{0x3c00000, 0x0, 0x7fffff, 0x0, 0x3c00080},
7{0x3c00000, 0x0, 0x800000, 0x800000, 0x3c00000},
8{0x3c00000, 0x0, 0x800002, 0x800002, 0x3c00000},
9{0x3c00000, 0x0, 0x1398437, 0x1398437, 0x3c00000},
10{0x3c00000, 0x0, 0xba98d27, 0xba98d27, 0x3c00000},
11{0x3c00000, 0x0, 0xba98d7a, 0xba98d7a, 0x3c00000},
12{0x3c00000, 0x0, 0x751f853a, 0x751f853a, 0x3c00000},
13{0x3c00000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3c00000},
14{0x3c00000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3c00000},
15{0x3c00000, 0x0, 0x7f800000, 0x7f800000, 0x3c00000},
16{0x3c00000, 0x0, 0x7f800001, 0x7fc00000, 0x3c00001},
17{0x3c00000, 0x0, 0x7f984a37, 0x7fc00000, 0x3c00001},
18{0x3c00000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3c00001},
19{0x3c00000, 0x0, 0x7fc00000, 0x7fc00000, 0x3c00000},
20{0x3c00000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
21{0x3c00000, 0x0, 0x7fffffff, 0x7fc00000, 0x3c00000},
22{0x3c00000, 0x0, 0x80000000, 0x0, 0x3c00000},
23{0x3c00000, 0x0, 0x80000001, 0x0, 0x3c00080},
24{0x3c00000, 0x0, 0x80000076, 0x0, 0x3c00080},
25{0x3c00000, 0x0, 0x80002b94, 0x0, 0x3c00080},
26{0x3c00000, 0x0, 0x80636d24, 0x0, 0x3c00080},
27{0x3c00000, 0x0, 0x807fffff, 0x0, 0x3c00080},
28{0x3c00000, 0x0, 0x80800000, 0x80800000, 0x3c00000},
29{0x3c00000, 0x0, 0x80800002, 0x80800002, 0x3c00000},
30{0x3c00000, 0x0, 0x81398437, 0x81398437, 0x3c00000},
31{0x3c00000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3c00000},
32{0x3c00000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3c00000},
33{0x3c00000, 0x0, 0xf51f853a, 0xf51f853a, 0x3c00000},
34{0x3c00000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3c00000},
35{0x3c00000, 0x0, 0xff7fffff, 0xff7fffff, 0x3c00000},
36{0x3c00000, 0x0, 0xff800000, 0xff800000, 0x3c00000},
37{0x3c00000, 0x0, 0xff800001, 0x7fc00000, 0x3c00001},
38{0x3c00000, 0x0, 0xff984a37, 0x7fc00000, 0x3c00001},
39{0x3c00000, 0x0, 0xffbfffff, 0x7fc00000, 0x3c00001},
40{0x3c00000, 0x0, 0xffc00000, 0x7fc00000, 0x3c00000},
41{0x3c00000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3c00000},
42{0x3c00000, 0x0, 0xffffffff, 0x7fc00000, 0x3c00000},
43{0x3c00000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3c00000},
44{0x3c00000, 0x0, 0xe73a5134, 0xe73a5134, 0x3c00000},
45{0x3c00000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3c00000},
46{0x3c00000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3c00000},
47{0x3c00000, 0x0, 0x9503366, 0x9503366, 0x3c00000},
48{0x3c00000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3c00000},
49{0x3c00000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3c00000},
50{0x3c00000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3c00000},
51{0x3c00000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3c00000},
52{0x3c00000, 0x0, 0x966320b, 0x966320b, 0x3c00000},
53{0x3c00000, 0x0, 0xb26bddee, 0xb26bddee, 0x3c00000},
54{0x3c00000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00000},
55{0x3c00000, 0x0, 0x317285d3, 0x317285d3, 0x3c00000},
56{0x3c00000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3c00000},
57{0x3c00000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3c00000},
58{0x3c00000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3c00000},
59{0x3c00000, 0x1, 0x0, 0x0, 0x3c00080},
60{0x3c00000, 0x1, 0x1, 0x0, 0x3c00080},
61{0x3c00000, 0x1, 0x76, 0x0, 0x3c00080},
62{0x3c00000, 0x1, 0x2b94, 0x0, 0x3c00080},
63{0x3c00000, 0x1, 0x636d24, 0x0, 0x3c00080},
64{0x3c00000, 0x1, 0x7fffff, 0x0, 0x3c00080},
65{0x3c00000, 0x1, 0x800000, 0x800000, 0x3c00080},
66{0x3c00000, 0x1, 0x800002, 0x800002, 0x3c00080},
67{0x3c00000, 0x1, 0x1398437, 0x1398437, 0x3c00080},
68{0x3c00000, 0x1, 0xba98d27, 0xba98d27, 0x3c00080},
69{0x3c00000, 0x1, 0xba98d7a, 0xba98d7a, 0x3c00080},
70{0x3c00000, 0x1, 0x751f853a, 0x751f853a, 0x3c00080},
71{0x3c00000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
72{0x3c00000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
73{0x3c00000, 0x1, 0x7f800000, 0x7f800000, 0x3c00080},
74{0x3c00000, 0x1, 0x7f800001, 0x7fc00000, 0x3c00081},
75{0x3c00000, 0x1, 0x7f984a37, 0x7fc00000, 0x3c00081},
76{0x3c00000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3c00081},
77{0x3c00000, 0x1, 0x7fc00000, 0x7fc00000, 0x3c00080},
78{0x3c00000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
79{0x3c00000, 0x1, 0x7fffffff, 0x7fc00000, 0x3c00080},
80{0x3c00000, 0x1, 0x80000000, 0x0, 0x3c00080},
81{0x3c00000, 0x1, 0x80000001, 0x0, 0x3c00080},
82{0x3c00000, 0x1, 0x80000076, 0x0, 0x3c00080},
83{0x3c00000, 0x1, 0x80002b94, 0x0, 0x3c00080},
84{0x3c00000, 0x1, 0x80636d24, 0x0, 0x3c00080},
85{0x3c00000, 0x1, 0x807fffff, 0x0, 0x3c00080},
86{0x3c00000, 0x1, 0x80800000, 0x80800000, 0x3c00080},
87{0x3c00000, 0x1, 0x80800002, 0x80800002, 0x3c00080},
88{0x3c00000, 0x1, 0x81398437, 0x81398437, 0x3c00080},
89{0x3c00000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
90{0x3c00000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
91{0x3c00000, 0x1, 0xf51f853a, 0xf51f853a, 0x3c00080},
92{0x3c00000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
93{0x3c00000, 0x1, 0xff7fffff, 0xff7fffff, 0x3c00080},
94{0x3c00000, 0x1, 0xff800000, 0xff800000, 0x3c00080},
95{0x3c00000, 0x1, 0xff800001, 0x7fc00000, 0x3c00081},
96{0x3c00000, 0x1, 0xff984a37, 0x7fc00000, 0x3c00081},
97{0x3c00000, 0x1, 0xffbfffff, 0x7fc00000, 0x3c00081},
98{0x3c00000, 0x1, 0xffc00000, 0x7fc00000, 0x3c00080},
99{0x3c00000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3c00080},
100{0x3c00000, 0x1, 0xffffffff, 0x7fc00000, 0x3c00080},
101{0x3c00000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
102{0x3c00000, 0x1, 0xe73a5134, 0xe73a5134, 0x3c00080},
103{0x3c00000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
104{0x3c00000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
105{0x3c00000, 0x1, 0x9503366, 0x9503366, 0x3c00080},
106{0x3c00000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
107{0x3c00000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
108{0x3c00000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
109{0x3c00000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
110{0x3c00000, 0x1, 0x966320b, 0x966320b, 0x3c00080},
111{0x3c00000, 0x1, 0xb26bddee, 0xb26bddee, 0x3c00080},
112{0x3c00000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
113{0x3c00000, 0x1, 0x317285d3, 0x317285d3, 0x3c00080},
114{0x3c00000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
115{0x3c00000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
116{0x3c00000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
117{0x3c00000, 0x76, 0x0, 0x0, 0x3c00080},
118{0x3c00000, 0x76, 0x1, 0x0, 0x3c00080},
119{0x3c00000, 0x76, 0x76, 0x0, 0x3c00080},
120{0x3c00000, 0x76, 0x2b94, 0x0, 0x3c00080},
121{0x3c00000, 0x76, 0x636d24, 0x0, 0x3c00080},
122{0x3c00000, 0x76, 0x7fffff, 0x0, 0x3c00080},
123{0x3c00000, 0x76, 0x800000, 0x800000, 0x3c00080},
124{0x3c00000, 0x76, 0x800002, 0x800002, 0x3c00080},
125{0x3c00000, 0x76, 0x1398437, 0x1398437, 0x3c00080},
126{0x3c00000, 0x76, 0xba98d27, 0xba98d27, 0x3c00080},
127{0x3c00000, 0x76, 0xba98d7a, 0xba98d7a, 0x3c00080},
128{0x3c00000, 0x76, 0x751f853a, 0x751f853a, 0x3c00080},
129{0x3c00000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
130{0x3c00000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
131{0x3c00000, 0x76, 0x7f800000, 0x7f800000, 0x3c00080},
132{0x3c00000, 0x76, 0x7f800001, 0x7fc00000, 0x3c00081},
133{0x3c00000, 0x76, 0x7f984a37, 0x7fc00000, 0x3c00081},
134{0x3c00000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3c00081},
135{0x3c00000, 0x76, 0x7fc00000, 0x7fc00000, 0x3c00080},
136{0x3c00000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
137{0x3c00000, 0x76, 0x7fffffff, 0x7fc00000, 0x3c00080},
138{0x3c00000, 0x76, 0x80000000, 0x0, 0x3c00080},
139{0x3c00000, 0x76, 0x80000001, 0x0, 0x3c00080},
140{0x3c00000, 0x76, 0x80000076, 0x0, 0x3c00080},
141{0x3c00000, 0x76, 0x80002b94, 0x0, 0x3c00080},
142{0x3c00000, 0x76, 0x80636d24, 0x0, 0x3c00080},
143{0x3c00000, 0x76, 0x807fffff, 0x0, 0x3c00080},
144{0x3c00000, 0x76, 0x80800000, 0x80800000, 0x3c00080},
145{0x3c00000, 0x76, 0x80800002, 0x80800002, 0x3c00080},
146{0x3c00000, 0x76, 0x81398437, 0x81398437, 0x3c00080},
147{0x3c00000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
148{0x3c00000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
149{0x3c00000, 0x76, 0xf51f853a, 0xf51f853a, 0x3c00080},
150{0x3c00000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
151{0x3c00000, 0x76, 0xff7fffff, 0xff7fffff, 0x3c00080},
152{0x3c00000, 0x76, 0xff800000, 0xff800000, 0x3c00080},
153{0x3c00000, 0x76, 0xff800001, 0x7fc00000, 0x3c00081},
154{0x3c00000, 0x76, 0xff984a37, 0x7fc00000, 0x3c00081},
155{0x3c00000, 0x76, 0xffbfffff, 0x7fc00000, 0x3c00081},
156{0x3c00000, 0x76, 0xffc00000, 0x7fc00000, 0x3c00080},
157{0x3c00000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3c00080},
158{0x3c00000, 0x76, 0xffffffff, 0x7fc00000, 0x3c00080},
159{0x3c00000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
160{0x3c00000, 0x76, 0xe73a5134, 0xe73a5134, 0x3c00080},
161{0x3c00000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
162{0x3c00000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
163{0x3c00000, 0x76, 0x9503366, 0x9503366, 0x3c00080},
164{0x3c00000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
165{0x3c00000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
166{0x3c00000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
167{0x3c00000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
168{0x3c00000, 0x76, 0x966320b, 0x966320b, 0x3c00080},
169{0x3c00000, 0x76, 0xb26bddee, 0xb26bddee, 0x3c00080},
170{0x3c00000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
171{0x3c00000, 0x76, 0x317285d3, 0x317285d3, 0x3c00080},
172{0x3c00000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
173{0x3c00000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
174{0x3c00000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
175{0x3c00000, 0x2b94, 0x0, 0x0, 0x3c00080},
176{0x3c00000, 0x2b94, 0x1, 0x0, 0x3c00080},
177{0x3c00000, 0x2b94, 0x76, 0x0, 0x3c00080},
178{0x3c00000, 0x2b94, 0x2b94, 0x0, 0x3c00080},
179{0x3c00000, 0x2b94, 0x636d24, 0x0, 0x3c00080},
180{0x3c00000, 0x2b94, 0x7fffff, 0x0, 0x3c00080},
181{0x3c00000, 0x2b94, 0x800000, 0x800000, 0x3c00080},
182{0x3c00000, 0x2b94, 0x800002, 0x800002, 0x3c00080},
183{0x3c00000, 0x2b94, 0x1398437, 0x1398437, 0x3c00080},
184{0x3c00000, 0x2b94, 0xba98d27, 0xba98d27, 0x3c00080},
185{0x3c00000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3c00080},
186{0x3c00000, 0x2b94, 0x751f853a, 0x751f853a, 0x3c00080},
187{0x3c00000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
188{0x3c00000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
189{0x3c00000, 0x2b94, 0x7f800000, 0x7f800000, 0x3c00080},
190{0x3c00000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3c00081},
191{0x3c00000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3c00081},
192{0x3c00000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3c00081},
193{0x3c00000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3c00080},
194{0x3c00000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
195{0x3c00000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3c00080},
196{0x3c00000, 0x2b94, 0x80000000, 0x0, 0x3c00080},
197{0x3c00000, 0x2b94, 0x80000001, 0x0, 0x3c00080},
198{0x3c00000, 0x2b94, 0x80000076, 0x0, 0x3c00080},
199{0x3c00000, 0x2b94, 0x80002b94, 0x0, 0x3c00080},
200{0x3c00000, 0x2b94, 0x80636d24, 0x0, 0x3c00080},
201{0x3c00000, 0x2b94, 0x807fffff, 0x0, 0x3c00080},
202{0x3c00000, 0x2b94, 0x80800000, 0x80800000, 0x3c00080},
203{0x3c00000, 0x2b94, 0x80800002, 0x80800002, 0x3c00080},
204{0x3c00000, 0x2b94, 0x81398437, 0x81398437, 0x3c00080},
205{0x3c00000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
206{0x3c00000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
207{0x3c00000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3c00080},
208{0x3c00000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
209{0x3c00000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3c00080},
210{0x3c00000, 0x2b94, 0xff800000, 0xff800000, 0x3c00080},
211{0x3c00000, 0x2b94, 0xff800001, 0x7fc00000, 0x3c00081},
212{0x3c00000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3c00081},
213{0x3c00000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3c00081},
214{0x3c00000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3c00080},
215{0x3c00000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3c00080},
216{0x3c00000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3c00080},
217{0x3c00000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
218{0x3c00000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3c00080},
219{0x3c00000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
220{0x3c00000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
221{0x3c00000, 0x2b94, 0x9503366, 0x9503366, 0x3c00080},
222{0x3c00000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
223{0x3c00000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
224{0x3c00000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
225{0x3c00000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
226{0x3c00000, 0x2b94, 0x966320b, 0x966320b, 0x3c00080},
227{0x3c00000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3c00080},
228{0x3c00000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
229{0x3c00000, 0x2b94, 0x317285d3, 0x317285d3, 0x3c00080},
230{0x3c00000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
231{0x3c00000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
232{0x3c00000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
233{0x3c00000, 0x636d24, 0x0, 0x0, 0x3c00080},
234{0x3c00000, 0x636d24, 0x1, 0x0, 0x3c00080},
235{0x3c00000, 0x636d24, 0x76, 0x0, 0x3c00080},
236{0x3c00000, 0x636d24, 0x2b94, 0x0, 0x3c00080},
237{0x3c00000, 0x636d24, 0x636d24, 0x0, 0x3c00080},
238{0x3c00000, 0x636d24, 0x7fffff, 0x0, 0x3c00080},
239{0x3c00000, 0x636d24, 0x800000, 0x800000, 0x3c00080},
240{0x3c00000, 0x636d24, 0x800002, 0x800002, 0x3c00080},
241{0x3c00000, 0x636d24, 0x1398437, 0x1398437, 0x3c00080},
242{0x3c00000, 0x636d24, 0xba98d27, 0xba98d27, 0x3c00080},
243{0x3c00000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3c00080},
244{0x3c00000, 0x636d24, 0x751f853a, 0x751f853a, 0x3c00080},
245{0x3c00000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
246{0x3c00000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
247{0x3c00000, 0x636d24, 0x7f800000, 0x7f800000, 0x3c00080},
248{0x3c00000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3c00081},
249{0x3c00000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3c00081},
250{0x3c00000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3c00081},
251{0x3c00000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3c00080},
252{0x3c00000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
253{0x3c00000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3c00080},
254{0x3c00000, 0x636d24, 0x80000000, 0x0, 0x3c00080},
255{0x3c00000, 0x636d24, 0x80000001, 0x0, 0x3c00080},
256{0x3c00000, 0x636d24, 0x80000076, 0x0, 0x3c00080},
257{0x3c00000, 0x636d24, 0x80002b94, 0x0, 0x3c00080},
258{0x3c00000, 0x636d24, 0x80636d24, 0x0, 0x3c00080},
259{0x3c00000, 0x636d24, 0x807fffff, 0x0, 0x3c00080},
260{0x3c00000, 0x636d24, 0x80800000, 0x80800000, 0x3c00080},
261{0x3c00000, 0x636d24, 0x80800002, 0x80800002, 0x3c00080},
262{0x3c00000, 0x636d24, 0x81398437, 0x81398437, 0x3c00080},
263{0x3c00000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
264{0x3c00000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
265{0x3c00000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3c00080},
266{0x3c00000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
267{0x3c00000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3c00080},
268{0x3c00000, 0x636d24, 0xff800000, 0xff800000, 0x3c00080},
269{0x3c00000, 0x636d24, 0xff800001, 0x7fc00000, 0x3c00081},
270{0x3c00000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3c00081},
271{0x3c00000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3c00081},
272{0x3c00000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3c00080},
273{0x3c00000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3c00080},
274{0x3c00000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3c00080},
275{0x3c00000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
276{0x3c00000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3c00080},
277{0x3c00000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
278{0x3c00000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
279{0x3c00000, 0x636d24, 0x9503366, 0x9503366, 0x3c00080},
280{0x3c00000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
281{0x3c00000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
282{0x3c00000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
283{0x3c00000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
284{0x3c00000, 0x636d24, 0x966320b, 0x966320b, 0x3c00080},
285{0x3c00000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3c00080},
286{0x3c00000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
287{0x3c00000, 0x636d24, 0x317285d3, 0x317285d3, 0x3c00080},
288{0x3c00000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
289{0x3c00000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
290{0x3c00000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
291{0x3c00000, 0x7fffff, 0x0, 0x0, 0x3c00080},
292{0x3c00000, 0x7fffff, 0x1, 0x0, 0x3c00080},
293{0x3c00000, 0x7fffff, 0x76, 0x0, 0x3c00080},
294{0x3c00000, 0x7fffff, 0x2b94, 0x0, 0x3c00080},
295{0x3c00000, 0x7fffff, 0x636d24, 0x0, 0x3c00080},
296{0x3c00000, 0x7fffff, 0x7fffff, 0x0, 0x3c00080},
297{0x3c00000, 0x7fffff, 0x800000, 0x800000, 0x3c00080},
298{0x3c00000, 0x7fffff, 0x800002, 0x800002, 0x3c00080},
299{0x3c00000, 0x7fffff, 0x1398437, 0x1398437, 0x3c00080},
300{0x3c00000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3c00080},
301{0x3c00000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3c00080},
302{0x3c00000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3c00080},
303{0x3c00000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
304{0x3c00000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
305{0x3c00000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3c00080},
306{0x3c00000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3c00081},
307{0x3c00000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3c00081},
308{0x3c00000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3c00081},
309{0x3c00000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3c00080},
310{0x3c00000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
311{0x3c00000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3c00080},
312{0x3c00000, 0x7fffff, 0x80000000, 0x0, 0x3c00080},
313{0x3c00000, 0x7fffff, 0x80000001, 0x0, 0x3c00080},
314{0x3c00000, 0x7fffff, 0x80000076, 0x0, 0x3c00080},
315{0x3c00000, 0x7fffff, 0x80002b94, 0x0, 0x3c00080},
316{0x3c00000, 0x7fffff, 0x80636d24, 0x0, 0x3c00080},
317{0x3c00000, 0x7fffff, 0x807fffff, 0x0, 0x3c00080},
318{0x3c00000, 0x7fffff, 0x80800000, 0x80800000, 0x3c00080},
319{0x3c00000, 0x7fffff, 0x80800002, 0x80800002, 0x3c00080},
320{0x3c00000, 0x7fffff, 0x81398437, 0x81398437, 0x3c00080},
321{0x3c00000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
322{0x3c00000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
323{0x3c00000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3c00080},
324{0x3c00000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
325{0x3c00000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3c00080},
326{0x3c00000, 0x7fffff, 0xff800000, 0xff800000, 0x3c00080},
327{0x3c00000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3c00081},
328{0x3c00000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3c00081},
329{0x3c00000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3c00081},
330{0x3c00000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3c00080},
331{0x3c00000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3c00080},
332{0x3c00000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3c00080},
333{0x3c00000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
334{0x3c00000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3c00080},
335{0x3c00000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
336{0x3c00000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
337{0x3c00000, 0x7fffff, 0x9503366, 0x9503366, 0x3c00080},
338{0x3c00000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
339{0x3c00000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
340{0x3c00000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
341{0x3c00000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
342{0x3c00000, 0x7fffff, 0x966320b, 0x966320b, 0x3c00080},
343{0x3c00000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3c00080},
344{0x3c00000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
345{0x3c00000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3c00080},
346{0x3c00000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
347{0x3c00000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
348{0x3c00000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
349{0x3c00000, 0x800000, 0x0, 0x800000, 0x3c00000},
350{0x3c00000, 0x800000, 0x1, 0x800000, 0x3c00080},
351{0x3c00000, 0x800000, 0x76, 0x800000, 0x3c00080},
352{0x3c00000, 0x800000, 0x2b94, 0x800000, 0x3c00080},
353{0x3c00000, 0x800000, 0x636d24, 0x800000, 0x3c00080},
354{0x3c00000, 0x800000, 0x7fffff, 0x800000, 0x3c00080},
355{0x3c00000, 0x800000, 0x800000, 0x1000000, 0x3c00000},
356{0x3c00000, 0x800000, 0x800002, 0x1000001, 0x3c00000},
357{0x3c00000, 0x800000, 0x1398437, 0x1798437, 0x3c00000},
358{0x3c00000, 0x800000, 0xba98d27, 0xba98d29, 0x3c00000},
359{0x3c00000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3c00000},
360{0x3c00000, 0x800000, 0x751f853a, 0x751f853a, 0x3c00010},
361{0x3c00000, 0x800000, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
362{0x3c00000, 0x800000, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
363{0x3c00000, 0x800000, 0x7f800000, 0x7f800000, 0x3c00000},
364{0x3c00000, 0x800000, 0x7f800001, 0x7fc00000, 0x3c00001},
365{0x3c00000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3c00001},
366{0x3c00000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
367{0x3c00000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3c00000},
368{0x3c00000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
369{0x3c00000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3c00000},
370{0x3c00000, 0x800000, 0x80000000, 0x800000, 0x3c00000},
371{0x3c00000, 0x800000, 0x80000001, 0x800000, 0x3c00080},
372{0x3c00000, 0x800000, 0x80000076, 0x800000, 0x3c00080},
373{0x3c00000, 0x800000, 0x80002b94, 0x800000, 0x3c00080},
374{0x3c00000, 0x800000, 0x80636d24, 0x800000, 0x3c00080},
375{0x3c00000, 0x800000, 0x807fffff, 0x800000, 0x3c00080},
376{0x3c00000, 0x800000, 0x80800000, 0x0, 0x3c00000},
377{0x3c00000, 0x800000, 0x80800002, 0x0, 0x3c00008},
378{0x3c00000, 0x800000, 0x81398437, 0x80f3086e, 0x3c00000},
379{0x3c00000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3c00000},
380{0x3c00000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3c00000},
381{0x3c00000, 0x800000, 0xf51f853a, 0xf51f8539, 0x3c00010},
382{0x3c00000, 0x800000, 0xff7ffff0, 0xff7fffef, 0x3c00010},
383{0x3c00000, 0x800000, 0xff7fffff, 0xff7ffffe, 0x3c00010},
384{0x3c00000, 0x800000, 0xff800000, 0xff800000, 0x3c00000},
385{0x3c00000, 0x800000, 0xff800001, 0x7fc00000, 0x3c00001},
386{0x3c00000, 0x800000, 0xff984a37, 0x7fc00000, 0x3c00001},
387{0x3c00000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3c00001},
388{0x3c00000, 0x800000, 0xffc00000, 0x7fc00000, 0x3c00000},
389{0x3c00000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
390{0x3c00000, 0x800000, 0xffffffff, 0x7fc00000, 0x3c00000},
391{0x3c00000, 0x800000, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
392{0x3c00000, 0x800000, 0xe73a5134, 0xe73a5133, 0x3c00010},
393{0x3c00000, 0x800000, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
394{0x3c00000, 0x800000, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
395{0x3c00000, 0x800000, 0x9503366, 0x95033a6, 0x3c00000},
396{0x3c00000, 0x800000, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
397{0x3c00000, 0x800000, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
398{0x3c00000, 0x800000, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
399{0x3c00000, 0x800000, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
400{0x3c00000, 0x800000, 0x966320b, 0x966324b, 0x3c00000},
401{0x3c00000, 0x800000, 0xb26bddee, 0xb26bdded, 0x3c00010},
402{0x3c00000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
403{0x3c00000, 0x800000, 0x317285d3, 0x317285d3, 0x3c00010},
404{0x3c00000, 0x800000, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
405{0x3c00000, 0x800000, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
406{0x3c00000, 0x800000, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
407{0x3c00000, 0x800002, 0x0, 0x800002, 0x3c00000},
408{0x3c00000, 0x800002, 0x1, 0x800002, 0x3c00080},
409{0x3c00000, 0x800002, 0x76, 0x800002, 0x3c00080},
410{0x3c00000, 0x800002, 0x2b94, 0x800002, 0x3c00080},
411{0x3c00000, 0x800002, 0x636d24, 0x800002, 0x3c00080},
412{0x3c00000, 0x800002, 0x7fffff, 0x800002, 0x3c00080},
413{0x3c00000, 0x800002, 0x800000, 0x1000001, 0x3c00000},
414{0x3c00000, 0x800002, 0x800002, 0x1000002, 0x3c00000},
415{0x3c00000, 0x800002, 0x1398437, 0x1798438, 0x3c00000},
416{0x3c00000, 0x800002, 0xba98d27, 0xba98d29, 0x3c00010},
417{0x3c00000, 0x800002, 0xba98d7a, 0xba98d7c, 0x3c00010},
418{0x3c00000, 0x800002, 0x751f853a, 0x751f853a, 0x3c00010},
419{0x3c00000, 0x800002, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
420{0x3c00000, 0x800002, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
421{0x3c00000, 0x800002, 0x7f800000, 0x7f800000, 0x3c00000},
422{0x3c00000, 0x800002, 0x7f800001, 0x7fc00000, 0x3c00001},
423{0x3c00000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3c00001},
424{0x3c00000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3c00001},
425{0x3c00000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3c00000},
426{0x3c00000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
427{0x3c00000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3c00000},
428{0x3c00000, 0x800002, 0x80000000, 0x800002, 0x3c00000},
429{0x3c00000, 0x800002, 0x80000001, 0x800002, 0x3c00080},
430{0x3c00000, 0x800002, 0x80000076, 0x800002, 0x3c00080},
431{0x3c00000, 0x800002, 0x80002b94, 0x800002, 0x3c00080},
432{0x3c00000, 0x800002, 0x80636d24, 0x800002, 0x3c00080},
433{0x3c00000, 0x800002, 0x807fffff, 0x800002, 0x3c00080},
434{0x3c00000, 0x800002, 0x80800000, 0x0, 0x3c00008},
435{0x3c00000, 0x800002, 0x80800002, 0x0, 0x3c00000},
436{0x3c00000, 0x800002, 0x81398437, 0x80f3086c, 0x3c00000},
437{0x3c00000, 0x800002, 0x8ba98d27, 0x8ba98d24, 0x3c00010},
438{0x3c00000, 0x800002, 0x8ba98d7a, 0x8ba98d77, 0x3c00010},
439{0x3c00000, 0x800002, 0xf51f853a, 0xf51f8539, 0x3c00010},
440{0x3c00000, 0x800002, 0xff7ffff0, 0xff7fffef, 0x3c00010},
441{0x3c00000, 0x800002, 0xff7fffff, 0xff7ffffe, 0x3c00010},
442{0x3c00000, 0x800002, 0xff800000, 0xff800000, 0x3c00000},
443{0x3c00000, 0x800002, 0xff800001, 0x7fc00000, 0x3c00001},
444{0x3c00000, 0x800002, 0xff984a37, 0x7fc00000, 0x3c00001},
445{0x3c00000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3c00001},
446{0x3c00000, 0x800002, 0xffc00000, 0x7fc00000, 0x3c00000},
447{0x3c00000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3c00000},
448{0x3c00000, 0x800002, 0xffffffff, 0x7fc00000, 0x3c00000},
449{0x3c00000, 0x800002, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
450{0x3c00000, 0x800002, 0xe73a5134, 0xe73a5133, 0x3c00010},
451{0x3c00000, 0x800002, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
452{0x3c00000, 0x800002, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
453{0x3c00000, 0x800002, 0x9503366, 0x95033a6, 0x3c00010},
454{0x3c00000, 0x800002, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
455{0x3c00000, 0x800002, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
456{0x3c00000, 0x800002, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
457{0x3c00000, 0x800002, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
458{0x3c00000, 0x800002, 0x966320b, 0x966324b, 0x3c00010},
459{0x3c00000, 0x800002, 0xb26bddee, 0xb26bdded, 0x3c00010},
460{0x3c00000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
461{0x3c00000, 0x800002, 0x317285d3, 0x317285d3, 0x3c00010},
462{0x3c00000, 0x800002, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
463{0x3c00000, 0x800002, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
464{0x3c00000, 0x800002, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
465{0x3c00000, 0x1398437, 0x0, 0x1398437, 0x3c00000},
466{0x3c00000, 0x1398437, 0x1, 0x1398437, 0x3c00080},
467{0x3c00000, 0x1398437, 0x76, 0x1398437, 0x3c00080},
468{0x3c00000, 0x1398437, 0x2b94, 0x1398437, 0x3c00080},
469{0x3c00000, 0x1398437, 0x636d24, 0x1398437, 0x3c00080},
470{0x3c00000, 0x1398437, 0x7fffff, 0x1398437, 0x3c00080},
471{0x3c00000, 0x1398437, 0x800000, 0x1798437, 0x3c00000},
472{0x3c00000, 0x1398437, 0x800002, 0x1798438, 0x3c00000},
473{0x3c00000, 0x1398437, 0x1398437, 0x1b98437, 0x3c00000},
474{0x3c00000, 0x1398437, 0xba98d27, 0xba98d2c, 0x3c00010},
475{0x3c00000, 0x1398437, 0xba98d7a, 0xba98d7f, 0x3c00010},
476{0x3c00000, 0x1398437, 0x751f853a, 0x751f853a, 0x3c00010},
477{0x3c00000, 0x1398437, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
478{0x3c00000, 0x1398437, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
479{0x3c00000, 0x1398437, 0x7f800000, 0x7f800000, 0x3c00000},
480{0x3c00000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3c00001},
481{0x3c00000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3c00001},
482{0x3c00000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3c00001},
483{0x3c00000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3c00000},
484{0x3c00000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
485{0x3c00000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3c00000},
486{0x3c00000, 0x1398437, 0x80000000, 0x1398437, 0x3c00000},
487{0x3c00000, 0x1398437, 0x80000001, 0x1398437, 0x3c00080},
488{0x3c00000, 0x1398437, 0x80000076, 0x1398437, 0x3c00080},
489{0x3c00000, 0x1398437, 0x80002b94, 0x1398437, 0x3c00080},
490{0x3c00000, 0x1398437, 0x80636d24, 0x1398437, 0x3c00080},
491{0x3c00000, 0x1398437, 0x807fffff, 0x1398437, 0x3c00080},
492{0x3c00000, 0x1398437, 0x80800000, 0xf3086e, 0x3c00000},
493{0x3c00000, 0x1398437, 0x80800002, 0xf3086c, 0x3c00000},
494{0x3c00000, 0x1398437, 0x81398437, 0x0, 0x3c00000},
495{0x3c00000, 0x1398437, 0x8ba98d27, 0x8ba98d21, 0x3c00010},
496{0x3c00000, 0x1398437, 0x8ba98d7a, 0x8ba98d74, 0x3c00010},
497{0x3c00000, 0x1398437, 0xf51f853a, 0xf51f8539, 0x3c00010},
498{0x3c00000, 0x1398437, 0xff7ffff0, 0xff7fffef, 0x3c00010},
499{0x3c00000, 0x1398437, 0xff7fffff, 0xff7ffffe, 0x3c00010},
500{0x3c00000, 0x1398437, 0xff800000, 0xff800000, 0x3c00000},
501{0x3c00000, 0x1398437, 0xff800001, 0x7fc00000, 0x3c00001},
502{0x3c00000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3c00001},
503{0x3c00000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3c00001},
504{0x3c00000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3c00000},
505{0x3c00000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3c00000},
506{0x3c00000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3c00000},
507{0x3c00000, 0x1398437, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
508{0x3c00000, 0x1398437, 0xe73a5134, 0xe73a5133, 0x3c00010},
509{0x3c00000, 0x1398437, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
510{0x3c00000, 0x1398437, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
511{0x3c00000, 0x1398437, 0x9503366, 0x950341f, 0x3c00010},
512{0x3c00000, 0x1398437, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
513{0x3c00000, 0x1398437, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
514{0x3c00000, 0x1398437, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
515{0x3c00000, 0x1398437, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
516{0x3c00000, 0x1398437, 0x966320b, 0x96632c4, 0x3c00010},
517{0x3c00000, 0x1398437, 0xb26bddee, 0xb26bdded, 0x3c00010},
518{0x3c00000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
519{0x3c00000, 0x1398437, 0x317285d3, 0x317285d3, 0x3c00010},
520{0x3c00000, 0x1398437, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
521{0x3c00000, 0x1398437, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
522{0x3c00000, 0x1398437, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
523{0x3c00000, 0xba98d27, 0x0, 0xba98d27, 0x3c00000},
524{0x3c00000, 0xba98d27, 0x1, 0xba98d27, 0x3c00080},
525{0x3c00000, 0xba98d27, 0x76, 0xba98d27, 0x3c00080},
526{0x3c00000, 0xba98d27, 0x2b94, 0xba98d27, 0x3c00080},
527{0x3c00000, 0xba98d27, 0x636d24, 0xba98d27, 0x3c00080},
528{0x3c00000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3c00080},
529{0x3c00000, 0xba98d27, 0x800000, 0xba98d29, 0x3c00000},
530{0x3c00000, 0xba98d27, 0x800002, 0xba98d29, 0x3c00010},
531{0x3c00000, 0xba98d27, 0x1398437, 0xba98d2c, 0x3c00010},
532{0x3c00000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3c00000},
533{0x3c00000, 0xba98d27, 0xba98d7a, 0xc298d50, 0x3c00010},
534{0x3c00000, 0xba98d27, 0x751f853a, 0x751f853a, 0x3c00010},
535{0x3c00000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
536{0x3c00000, 0xba98d27, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
537{0x3c00000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3c00000},
538{0x3c00000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3c00001},
539{0x3c00000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3c00001},
540{0x3c00000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3c00001},
541{0x3c00000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3c00000},
542{0x3c00000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
543{0x3c00000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3c00000},
544{0x3c00000, 0xba98d27, 0x80000000, 0xba98d27, 0x3c00000},
545{0x3c00000, 0xba98d27, 0x80000001, 0xba98d27, 0x3c00080},
546{0x3c00000, 0xba98d27, 0x80000076, 0xba98d27, 0x3c00080},
547{0x3c00000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3c00080},
548{0x3c00000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3c00080},
549{0x3c00000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3c00080},
550{0x3c00000, 0xba98d27, 0x80800000, 0xba98d25, 0x3c00000},
551{0x3c00000, 0xba98d27, 0x80800002, 0xba98d24, 0x3c00010},
552{0x3c00000, 0xba98d27, 0x81398437, 0xba98d21, 0x3c00010},
553{0x3c00000, 0xba98d27, 0x8ba98d27, 0x0, 0x3c00000},
554{0x3c00000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3c00000},
555{0x3c00000, 0xba98d27, 0xf51f853a, 0xf51f8539, 0x3c00010},
556{0x3c00000, 0xba98d27, 0xff7ffff0, 0xff7fffef, 0x3c00010},
557{0x3c00000, 0xba98d27, 0xff7fffff, 0xff7ffffe, 0x3c00010},
558{0x3c00000, 0xba98d27, 0xff800000, 0xff800000, 0x3c00000},
559{0x3c00000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3c00001},
560{0x3c00000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3c00001},
561{0x3c00000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3c00001},
562{0x3c00000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3c00000},
563{0x3c00000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3c00000},
564{0x3c00000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3c00000},
565{0x3c00000, 0xba98d27, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
566{0x3c00000, 0xba98d27, 0xe73a5134, 0xe73a5133, 0x3c00010},
567{0x3c00000, 0xba98d27, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
568{0x3c00000, 0xba98d27, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
569{0x3c00000, 0xba98d27, 0x9503366, 0xbb00ec2, 0x3c00010},
570{0x3c00000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
571{0x3c00000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
572{0x3c00000, 0xba98d27, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
573{0x3c00000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
574{0x3c00000, 0xba98d27, 0x966320b, 0xbb0beb7, 0x3c00010},
575{0x3c00000, 0xba98d27, 0xb26bddee, 0xb26bdded, 0x3c00010},
576{0x3c00000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
577{0x3c00000, 0xba98d27, 0x317285d3, 0x317285d3, 0x3c00010},
578{0x3c00000, 0xba98d27, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
579{0x3c00000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
580{0x3c00000, 0xba98d27, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
581{0x3c00000, 0xba98d7a, 0x0, 0xba98d7a, 0x3c00000},
582{0x3c00000, 0xba98d7a, 0x1, 0xba98d7a, 0x3c00080},
583{0x3c00000, 0xba98d7a, 0x76, 0xba98d7a, 0x3c00080},
584{0x3c00000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3c00080},
585{0x3c00000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3c00080},
586{0x3c00000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3c00080},
587{0x3c00000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3c00000},
588{0x3c00000, 0xba98d7a, 0x800002, 0xba98d7c, 0x3c00010},
589{0x3c00000, 0xba98d7a, 0x1398437, 0xba98d7f, 0x3c00010},
590{0x3c00000, 0xba98d7a, 0xba98d27, 0xc298d50, 0x3c00010},
591{0x3c00000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3c00000},
592{0x3c00000, 0xba98d7a, 0x751f853a, 0x751f853a, 0x3c00010},
593{0x3c00000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
594{0x3c00000, 0xba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
595{0x3c00000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3c00000},
596{0x3c00000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3c00001},
597{0x3c00000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3c00001},
598{0x3c00000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3c00001},
599{0x3c00000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3c00000},
600{0x3c00000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
601{0x3c00000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3c00000},
602{0x3c00000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3c00000},
603{0x3c00000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3c00080},
604{0x3c00000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3c00080},
605{0x3c00000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3c00080},
606{0x3c00000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3c00080},
607{0x3c00000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3c00080},
608{0x3c00000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3c00000},
609{0x3c00000, 0xba98d7a, 0x80800002, 0xba98d77, 0x3c00010},
610{0x3c00000, 0xba98d7a, 0x81398437, 0xba98d74, 0x3c00010},
611{0x3c00000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3c00000},
612{0x3c00000, 0xba98d7a, 0x8ba98d7a, 0x0, 0x3c00000},
613{0x3c00000, 0xba98d7a, 0xf51f853a, 0xf51f8539, 0x3c00010},
614{0x3c00000, 0xba98d7a, 0xff7ffff0, 0xff7fffef, 0x3c00010},
615{0x3c00000, 0xba98d7a, 0xff7fffff, 0xff7ffffe, 0x3c00010},
616{0x3c00000, 0xba98d7a, 0xff800000, 0xff800000, 0x3c00000},
617{0x3c00000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3c00001},
618{0x3c00000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3c00001},
619{0x3c00000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3c00001},
620{0x3c00000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3c00000},
621{0x3c00000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3c00000},
622{0x3c00000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3c00000},
623{0x3c00000, 0xba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
624{0x3c00000, 0xba98d7a, 0xe73a5134, 0xe73a5133, 0x3c00010},
625{0x3c00000, 0xba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
626{0x3c00000, 0xba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
627{0x3c00000, 0xba98d7a, 0x9503366, 0xbb00f15, 0x3c00010},
628{0x3c00000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
629{0x3c00000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
630{0x3c00000, 0xba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
631{0x3c00000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
632{0x3c00000, 0xba98d7a, 0x966320b, 0xbb0bf0a, 0x3c00010},
633{0x3c00000, 0xba98d7a, 0xb26bddee, 0xb26bdded, 0x3c00010},
634{0x3c00000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
635{0x3c00000, 0xba98d7a, 0x317285d3, 0x317285d3, 0x3c00010},
636{0x3c00000, 0xba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
637{0x3c00000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
638{0x3c00000, 0xba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
639{0x3c00000, 0x751f853a, 0x0, 0x751f853a, 0x3c00000},
640{0x3c00000, 0x751f853a, 0x1, 0x751f853a, 0x3c00080},
641{0x3c00000, 0x751f853a, 0x76, 0x751f853a, 0x3c00080},
642{0x3c00000, 0x751f853a, 0x2b94, 0x751f853a, 0x3c00080},
643{0x3c00000, 0x751f853a, 0x636d24, 0x751f853a, 0x3c00080},
644{0x3c00000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3c00080},
645{0x3c00000, 0x751f853a, 0x800000, 0x751f853a, 0x3c00010},
646{0x3c00000, 0x751f853a, 0x800002, 0x751f853a, 0x3c00010},
647{0x3c00000, 0x751f853a, 0x1398437, 0x751f853a, 0x3c00010},
648{0x3c00000, 0x751f853a, 0xba98d27, 0x751f853a, 0x3c00010},
649{0x3c00000, 0x751f853a, 0xba98d7a, 0x751f853a, 0x3c00010},
650{0x3c00000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3c00000},
651{0x3c00000, 0x751f853a, 0x7f7ffff0, 0x7f7ffff9, 0x3c00010},
652{0x3c00000, 0x751f853a, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
653{0x3c00000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3c00000},
654{0x3c00000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3c00001},
655{0x3c00000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3c00001},
656{0x3c00000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3c00001},
657{0x3c00000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3c00000},
658{0x3c00000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
659{0x3c00000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3c00000},
660{0x3c00000, 0x751f853a, 0x80000000, 0x751f853a, 0x3c00000},
661{0x3c00000, 0x751f853a, 0x80000001, 0x751f853a, 0x3c00080},
662{0x3c00000, 0x751f853a, 0x80000076, 0x751f853a, 0x3c00080},
663{0x3c00000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3c00080},
664{0x3c00000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3c00080},
665{0x3c00000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3c00080},
666{0x3c00000, 0x751f853a, 0x80800000, 0x751f8539, 0x3c00010},
667{0x3c00000, 0x751f853a, 0x80800002, 0x751f8539, 0x3c00010},
668{0x3c00000, 0x751f853a, 0x81398437, 0x751f8539, 0x3c00010},
669{0x3c00000, 0x751f853a, 0x8ba98d27, 0x751f8539, 0x3c00010},
670{0x3c00000, 0x751f853a, 0x8ba98d7a, 0x751f8539, 0x3c00010},
671{0x3c00000, 0x751f853a, 0xf51f853a, 0x0, 0x3c00000},
672{0x3c00000, 0x751f853a, 0xff7ffff0, 0xff7fffe6, 0x3c00010},
673{0x3c00000, 0x751f853a, 0xff7fffff, 0xff7ffff5, 0x3c00010},
674{0x3c00000, 0x751f853a, 0xff800000, 0xff800000, 0x3c00000},
675{0x3c00000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3c00001},
676{0x3c00000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3c00001},
677{0x3c00000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3c00001},
678{0x3c00000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3c00000},
679{0x3c00000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3c00000},
680{0x3c00000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3c00000},
681{0x3c00000, 0x751f853a, 0x4f3495cb, 0x751f853a, 0x3c00010},
682{0x3c00000, 0x751f853a, 0xe73a5134, 0x751f8539, 0x3c00010},
683{0x3c00000, 0x751f853a, 0x7c994e9e, 0x7c994fdd, 0x3c00010},
684{0x3c00000, 0x751f853a, 0x6164bd6c, 0x751f853a, 0x3c00010},
685{0x3c00000, 0x751f853a, 0x9503366, 0x751f853a, 0x3c00010},
686{0x3c00000, 0x751f853a, 0xbf5a97c9, 0x751f8539, 0x3c00010},
687{0x3c00000, 0x751f853a, 0xe6ff1a14, 0x751f8539, 0x3c00010},
688{0x3c00000, 0x751f853a, 0x77f31e2f, 0x77f81a58, 0x3c00010},
689{0x3c00000, 0x751f853a, 0xaab4d7d8, 0x751f8539, 0x3c00010},
690{0x3c00000, 0x751f853a, 0x966320b, 0x751f853a, 0x3c00010},
691{0x3c00000, 0x751f853a, 0xb26bddee, 0x751f8539, 0x3c00010},
692{0x3c00000, 0x751f853a, 0xb5c8e5d3, 0x751f8539, 0x3c00010},
693{0x3c00000, 0x751f853a, 0x317285d3, 0x751f853a, 0x3c00010},
694{0x3c00000, 0x751f853a, 0x3c9623b1, 0x751f853a, 0x3c00010},
695{0x3c00000, 0x751f853a, 0x51fd2c7c, 0x751f853a, 0x3c00010},
696{0x3c00000, 0x751f853a, 0x7b906a6c, 0x7b906f68, 0x3c00010},
697{0x3c00000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3c00000},
698{0x3c00000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3c00080},
699{0x3c00000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3c00080},
700{0x3c00000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3c00080},
701{0x3c00000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3c00080},
702{0x3c00000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3c00080},
703{0x3c00000, 0x7f7ffff0, 0x800000, 0x7f7ffff0, 0x3c00010},
704{0x3c00000, 0x7f7ffff0, 0x800002, 0x7f7ffff0, 0x3c00010},
705{0x3c00000, 0x7f7ffff0, 0x1398437, 0x7f7ffff0, 0x3c00010},
706{0x3c00000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff0, 0x3c00010},
707{0x3c00000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff0, 0x3c00010},
708{0x3c00000, 0x7f7ffff0, 0x751f853a, 0x7f7ffff9, 0x3c00010},
709{0x3c00000, 0x7f7ffff0, 0x7f7ffff0, 0x7f7fffff, 0x3c00014},
710{0x3c00000, 0x7f7ffff0, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
711{0x3c00000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3c00000},
712{0x3c00000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3c00001},
713{0x3c00000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3c00001},
714{0x3c00000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3c00001},
715{0x3c00000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3c00000},
716{0x3c00000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
717{0x3c00000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3c00000},
718{0x3c00000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3c00000},
719{0x3c00000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3c00080},
720{0x3c00000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3c00080},
721{0x3c00000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3c00080},
722{0x3c00000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3c00080},
723{0x3c00000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3c00080},
724{0x3c00000, 0x7f7ffff0, 0x80800000, 0x7f7fffef, 0x3c00010},
725{0x3c00000, 0x7f7ffff0, 0x80800002, 0x7f7fffef, 0x3c00010},
726{0x3c00000, 0x7f7ffff0, 0x81398437, 0x7f7fffef, 0x3c00010},
727{0x3c00000, 0x7f7ffff0, 0x8ba98d27, 0x7f7fffef, 0x3c00010},
728{0x3c00000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7fffef, 0x3c00010},
729{0x3c00000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe6, 0x3c00010},
730{0x3c00000, 0x7f7ffff0, 0xff7ffff0, 0x0, 0x3c00000},
731{0x3c00000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3c00000},
732{0x3c00000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3c00000},
733{0x3c00000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3c00001},
734{0x3c00000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3c00001},
735{0x3c00000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3c00001},
736{0x3c00000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3c00000},
737{0x3c00000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3c00000},
738{0x3c00000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3c00000},
739{0x3c00000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff0, 0x3c00010},
740{0x3c00000, 0x7f7ffff0, 0xe73a5134, 0x7f7fffef, 0x3c00010},
741{0x3c00000, 0x7f7ffff0, 0x7c994e9e, 0x7f7fffff, 0x3c00014},
742{0x3c00000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff0, 0x3c00010},
743{0x3c00000, 0x7f7ffff0, 0x9503366, 0x7f7ffff0, 0x3c00010},
744{0x3c00000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7fffef, 0x3c00010},
745{0x3c00000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7fffef, 0x3c00010},
746{0x3c00000, 0x7f7ffff0, 0x77f31e2f, 0x7f7fffff, 0x3c00014},
747{0x3c00000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7fffef, 0x3c00010},
748{0x3c00000, 0x7f7ffff0, 0x966320b, 0x7f7ffff0, 0x3c00010},
749{0x3c00000, 0x7f7ffff0, 0xb26bddee, 0x7f7fffef, 0x3c00010},
750{0x3c00000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7fffef, 0x3c00010},
751{0x3c00000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff0, 0x3c00010},
752{0x3c00000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff0, 0x3c00010},
753{0x3c00000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff0, 0x3c00010},
754{0x3c00000, 0x7f7ffff0, 0x7b906a6c, 0x7f7fffff, 0x3c00014},
755{0x3c00000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3c00000},
756{0x3c00000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3c00080},
757{0x3c00000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3c00080},
758{0x3c00000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3c00080},
759{0x3c00000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3c00080},
760{0x3c00000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3c00080},
761{0x3c00000, 0x7f7fffff, 0x800000, 0x7f7fffff, 0x3c00010},
762{0x3c00000, 0x7f7fffff, 0x800002, 0x7f7fffff, 0x3c00010},
763{0x3c00000, 0x7f7fffff, 0x1398437, 0x7f7fffff, 0x3c00010},
764{0x3c00000, 0x7f7fffff, 0xba98d27, 0x7f7fffff, 0x3c00010},
765{0x3c00000, 0x7f7fffff, 0xba98d7a, 0x7f7fffff, 0x3c00010},
766{0x3c00000, 0x7f7fffff, 0x751f853a, 0x7f7fffff, 0x3c00014},
767{0x3c00000, 0x7f7fffff, 0x7f7ffff0, 0x7f7fffff, 0x3c00014},
768{0x3c00000, 0x7f7fffff, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
769{0x3c00000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3c00000},
770{0x3c00000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3c00001},
771{0x3c00000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
772{0x3c00000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
773{0x3c00000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3c00000},
774{0x3c00000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
775{0x3c00000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3c00000},
776{0x3c00000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3c00000},
777{0x3c00000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3c00080},
778{0x3c00000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3c00080},
779{0x3c00000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3c00080},
780{0x3c00000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3c00080},
781{0x3c00000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3c00080},
782{0x3c00000, 0x7f7fffff, 0x80800000, 0x7f7ffffe, 0x3c00010},
783{0x3c00000, 0x7f7fffff, 0x80800002, 0x7f7ffffe, 0x3c00010},
784{0x3c00000, 0x7f7fffff, 0x81398437, 0x7f7ffffe, 0x3c00010},
785{0x3c00000, 0x7f7fffff, 0x8ba98d27, 0x7f7ffffe, 0x3c00010},
786{0x3c00000, 0x7f7fffff, 0x8ba98d7a, 0x7f7ffffe, 0x3c00010},
787{0x3c00000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff5, 0x3c00010},
788{0x3c00000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3c00000},
789{0x3c00000, 0x7f7fffff, 0xff7fffff, 0x0, 0x3c00000},
790{0x3c00000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3c00000},
791{0x3c00000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3c00001},
792{0x3c00000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3c00001},
793{0x3c00000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
794{0x3c00000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3c00000},
795{0x3c00000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3c00000},
796{0x3c00000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3c00000},
797{0x3c00000, 0x7f7fffff, 0x4f3495cb, 0x7f7fffff, 0x3c00010},
798{0x3c00000, 0x7f7fffff, 0xe73a5134, 0x7f7ffffe, 0x3c00010},
799{0x3c00000, 0x7f7fffff, 0x7c994e9e, 0x7f7fffff, 0x3c00014},
800{0x3c00000, 0x7f7fffff, 0x6164bd6c, 0x7f7fffff, 0x3c00010},
801{0x3c00000, 0x7f7fffff, 0x9503366, 0x7f7fffff, 0x3c00010},
802{0x3c00000, 0x7f7fffff, 0xbf5a97c9, 0x7f7ffffe, 0x3c00010},
803{0x3c00000, 0x7f7fffff, 0xe6ff1a14, 0x7f7ffffe, 0x3c00010},
804{0x3c00000, 0x7f7fffff, 0x77f31e2f, 0x7f7fffff, 0x3c00014},
805{0x3c00000, 0x7f7fffff, 0xaab4d7d8, 0x7f7ffffe, 0x3c00010},
806{0x3c00000, 0x7f7fffff, 0x966320b, 0x7f7fffff, 0x3c00010},
807{0x3c00000, 0x7f7fffff, 0xb26bddee, 0x7f7ffffe, 0x3c00010},
808{0x3c00000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7ffffe, 0x3c00010},
809{0x3c00000, 0x7f7fffff, 0x317285d3, 0x7f7fffff, 0x3c00010},
810{0x3c00000, 0x7f7fffff, 0x3c9623b1, 0x7f7fffff, 0x3c00010},
811{0x3c00000, 0x7f7fffff, 0x51fd2c7c, 0x7f7fffff, 0x3c00010},
812{0x3c00000, 0x7f7fffff, 0x7b906a6c, 0x7f7fffff, 0x3c00014},
813{0x3c00000, 0x7f800000, 0x0, 0x7f800000, 0x3c00000},
814{0x3c00000, 0x7f800000, 0x1, 0x7f800000, 0x3c00080},
815{0x3c00000, 0x7f800000, 0x76, 0x7f800000, 0x3c00080},
816{0x3c00000, 0x7f800000, 0x2b94, 0x7f800000, 0x3c00080},
817{0x3c00000, 0x7f800000, 0x636d24, 0x7f800000, 0x3c00080},
818{0x3c00000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3c00080},
819{0x3c00000, 0x7f800000, 0x800000, 0x7f800000, 0x3c00000},
820{0x3c00000, 0x7f800000, 0x800002, 0x7f800000, 0x3c00000},
821{0x3c00000, 0x7f800000, 0x1398437, 0x7f800000, 0x3c00000},
822{0x3c00000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3c00000},
823{0x3c00000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3c00000},
824{0x3c00000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3c00000},
825{0x3c00000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3c00000},
826{0x3c00000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3c00000},
827{0x3c00000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3c00000},
828{0x3c00000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3c00001},
829{0x3c00000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3c00001},
830{0x3c00000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
831{0x3c00000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3c00000},
832{0x3c00000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
833{0x3c00000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3c00000},
834{0x3c00000, 0x7f800000, 0x80000000, 0x7f800000, 0x3c00000},
835{0x3c00000, 0x7f800000, 0x80000001, 0x7f800000, 0x3c00080},
836{0x3c00000, 0x7f800000, 0x80000076, 0x7f800000, 0x3c00080},
837{0x3c00000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3c00080},
838{0x3c00000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3c00080},
839{0x3c00000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3c00080},
840{0x3c00000, 0x7f800000, 0x80800000, 0x7f800000, 0x3c00000},
841{0x3c00000, 0x7f800000, 0x80800002, 0x7f800000, 0x3c00000},
842{0x3c00000, 0x7f800000, 0x81398437, 0x7f800000, 0x3c00000},
843{0x3c00000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3c00000},
844{0x3c00000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3c00000},
845{0x3c00000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3c00000},
846{0x3c00000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3c00000},
847{0x3c00000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3c00000},
848{0x3c00000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3c00001},
849{0x3c00000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3c00001},
850{0x3c00000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3c00001},
851{0x3c00000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3c00001},
852{0x3c00000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3c00000},
853{0x3c00000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
854{0x3c00000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3c00000},
855{0x3c00000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3c00000},
856{0x3c00000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3c00000},
857{0x3c00000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3c00000},
858{0x3c00000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3c00000},
859{0x3c00000, 0x7f800000, 0x9503366, 0x7f800000, 0x3c00000},
860{0x3c00000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3c00000},
861{0x3c00000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3c00000},
862{0x3c00000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3c00000},
863{0x3c00000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3c00000},
864{0x3c00000, 0x7f800000, 0x966320b, 0x7f800000, 0x3c00000},
865{0x3c00000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3c00000},
866{0x3c00000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3c00000},
867{0x3c00000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3c00000},
868{0x3c00000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3c00000},
869{0x3c00000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3c00000},
870{0x3c00000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3c00000},
871{0x3c00000, 0x7f800001, 0x0, 0x7fc00000, 0x3c00001},
872{0x3c00000, 0x7f800001, 0x1, 0x7fc00000, 0x3c00081},
873{0x3c00000, 0x7f800001, 0x76, 0x7fc00000, 0x3c00081},
874{0x3c00000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3c00081},
875{0x3c00000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3c00081},
876{0x3c00000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3c00081},
877{0x3c00000, 0x7f800001, 0x800000, 0x7fc00000, 0x3c00001},
878{0x3c00000, 0x7f800001, 0x800002, 0x7fc00000, 0x3c00001},
879{0x3c00000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3c00001},
880{0x3c00000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3c00001},
881{0x3c00000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3c00001},
882{0x3c00000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3c00001},
883{0x3c00000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
884{0x3c00000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3c00001},
885{0x3c00000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3c00001},
886{0x3c00000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3c00001},
887{0x3c00000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3c00001},
888{0x3c00000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3c00001},
889{0x3c00000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3c00001},
890{0x3c00000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
891{0x3c00000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3c00001},
892{0x3c00000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3c00001},
893{0x3c00000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3c00081},
894{0x3c00000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3c00081},
895{0x3c00000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3c00081},
896{0x3c00000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3c00081},
897{0x3c00000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3c00081},
898{0x3c00000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3c00001},
899{0x3c00000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3c00001},
900{0x3c00000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3c00001},
901{0x3c00000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3c00001},
902{0x3c00000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
903{0x3c00000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3c00001},
904{0x3c00000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3c00001},
905{0x3c00000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3c00001},
906{0x3c00000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3c00001},
907{0x3c00000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3c00001},
908{0x3c00000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3c00001},
909{0x3c00000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3c00001},
910{0x3c00000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3c00001},
911{0x3c00000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3c00001},
912{0x3c00000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3c00001},
913{0x3c00000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3c00001},
914{0x3c00000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3c00001},
915{0x3c00000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3c00001},
916{0x3c00000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3c00001},
917{0x3c00000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3c00001},
918{0x3c00000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
919{0x3c00000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
920{0x3c00000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3c00001},
921{0x3c00000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
922{0x3c00000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3c00001},
923{0x3c00000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3c00001},
924{0x3c00000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
925{0x3c00000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3c00001},
926{0x3c00000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3c00001},
927{0x3c00000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
928{0x3c00000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3c00001},
929{0x3c00000, 0x7f984a37, 0x0, 0x7fc00000, 0x3c00001},
930{0x3c00000, 0x7f984a37, 0x1, 0x7fc00000, 0x3c00081},
931{0x3c00000, 0x7f984a37, 0x76, 0x7fc00000, 0x3c00081},
932{0x3c00000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3c00081},
933{0x3c00000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3c00081},
934{0x3c00000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3c00081},
935{0x3c00000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3c00001},
936{0x3c00000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3c00001},
937{0x3c00000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3c00001},
938{0x3c00000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3c00001},
939{0x3c00000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3c00001},
940{0x3c00000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3c00001},
941{0x3c00000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
942{0x3c00000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3c00001},
943{0x3c00000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3c00001},
944{0x3c00000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3c00001},
945{0x3c00000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3c00001},
946{0x3c00000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3c00001},
947{0x3c00000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3c00001},
948{0x3c00000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
949{0x3c00000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3c00001},
950{0x3c00000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3c00001},
951{0x3c00000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3c00081},
952{0x3c00000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3c00081},
953{0x3c00000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3c00081},
954{0x3c00000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3c00081},
955{0x3c00000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3c00081},
956{0x3c00000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3c00001},
957{0x3c00000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3c00001},
958{0x3c00000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3c00001},
959{0x3c00000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3c00001},
960{0x3c00000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
961{0x3c00000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3c00001},
962{0x3c00000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3c00001},
963{0x3c00000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3c00001},
964{0x3c00000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3c00001},
965{0x3c00000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3c00001},
966{0x3c00000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3c00001},
967{0x3c00000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3c00001},
968{0x3c00000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3c00001},
969{0x3c00000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3c00001},
970{0x3c00000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3c00001},
971{0x3c00000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3c00001},
972{0x3c00000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3c00001},
973{0x3c00000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3c00001},
974{0x3c00000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3c00001},
975{0x3c00000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3c00001},
976{0x3c00000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
977{0x3c00000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
978{0x3c00000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3c00001},
979{0x3c00000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
980{0x3c00000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3c00001},
981{0x3c00000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3c00001},
982{0x3c00000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
983{0x3c00000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3c00001},
984{0x3c00000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3c00001},
985{0x3c00000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
986{0x3c00000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3c00001},
987{0x3c00000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3c00001},
988{0x3c00000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3c00081},
989{0x3c00000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3c00081},
990{0x3c00000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3c00081},
991{0x3c00000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3c00081},
992{0x3c00000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3c00081},
993{0x3c00000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3c00001},
994{0x3c00000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3c00001},
995{0x3c00000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3c00001},
996{0x3c00000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3c00001},
997{0x3c00000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3c00001},
998{0x3c00000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3c00001},
999{0x3c00000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
1000{0x3c00000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3c00001},
1001{0x3c00000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3c00001},
1002{0x3c00000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3c00001},
1003{0x3c00000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
1004{0x3c00000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
1005{0x3c00000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3c00001},
1006{0x3c00000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
1007{0x3c00000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3c00001},
1008{0x3c00000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3c00001},
1009{0x3c00000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3c00081},
1010{0x3c00000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3c00081},
1011{0x3c00000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3c00081},
1012{0x3c00000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3c00081},
1013{0x3c00000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3c00081},
1014{0x3c00000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3c00001},
1015{0x3c00000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3c00001},
1016{0x3c00000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3c00001},
1017{0x3c00000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3c00001},
1018{0x3c00000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
1019{0x3c00000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3c00001},
1020{0x3c00000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3c00001},
1021{0x3c00000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3c00001},
1022{0x3c00000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3c00001},
1023{0x3c00000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3c00001},
1024{0x3c00000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3c00001},
1025{0x3c00000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
1026{0x3c00000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3c00001},
1027{0x3c00000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3c00001},
1028{0x3c00000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3c00001},
1029{0x3c00000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3c00001},
1030{0x3c00000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3c00001},
1031{0x3c00000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3c00001},
1032{0x3c00000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3c00001},
1033{0x3c00000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3c00001},
1034{0x3c00000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
1035{0x3c00000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
1036{0x3c00000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3c00001},
1037{0x3c00000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
1038{0x3c00000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3c00001},
1039{0x3c00000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3c00001},
1040{0x3c00000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
1041{0x3c00000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3c00001},
1042{0x3c00000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3c00001},
1043{0x3c00000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
1044{0x3c00000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3c00001},
1045{0x3c00000, 0x7fc00000, 0x0, 0x7fc00000, 0x3c00000},
1046{0x3c00000, 0x7fc00000, 0x1, 0x7fc00000, 0x3c00080},
1047{0x3c00000, 0x7fc00000, 0x76, 0x7fc00000, 0x3c00080},
1048{0x3c00000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3c00080},
1049{0x3c00000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3c00080},
1050{0x3c00000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3c00080},
1051{0x3c00000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3c00000},
1052{0x3c00000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3c00000},
1053{0x3c00000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3c00000},
1054{0x3c00000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3c00000},
1055{0x3c00000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3c00000},
1056{0x3c00000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3c00000},
1057{0x3c00000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
1058{0x3c00000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3c00000},
1059{0x3c00000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3c00000},
1060{0x3c00000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3c00001},
1061{0x3c00000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3c00001},
1062{0x3c00000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
1063{0x3c00000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3c00000},
1064{0x3c00000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
1065{0x3c00000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3c00000},
1066{0x3c00000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3c00000},
1067{0x3c00000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3c00080},
1068{0x3c00000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3c00080},
1069{0x3c00000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3c00080},
1070{0x3c00000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3c00080},
1071{0x3c00000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3c00080},
1072{0x3c00000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3c00000},
1073{0x3c00000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3c00000},
1074{0x3c00000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3c00000},
1075{0x3c00000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3c00000},
1076{0x3c00000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
1077{0x3c00000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3c00000},
1078{0x3c00000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3c00000},
1079{0x3c00000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3c00000},
1080{0x3c00000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3c00000},
1081{0x3c00000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3c00001},
1082{0x3c00000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3c00001},
1083{0x3c00000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3c00001},
1084{0x3c00000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3c00000},
1085{0x3c00000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
1086{0x3c00000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3c00000},
1087{0x3c00000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3c00000},
1088{0x3c00000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3c00000},
1089{0x3c00000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3c00000},
1090{0x3c00000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3c00000},
1091{0x3c00000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3c00000},
1092{0x3c00000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
1093{0x3c00000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
1094{0x3c00000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3c00000},
1095{0x3c00000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
1096{0x3c00000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3c00000},
1097{0x3c00000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3c00000},
1098{0x3c00000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
1099{0x3c00000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3c00000},
1100{0x3c00000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3c00000},
1101{0x3c00000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
1102{0x3c00000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3c00000},
1103{0x3c00000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3c00000},
1104{0x3c00000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3c00080},
1105{0x3c00000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3c00080},
1106{0x3c00000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3c00080},
1107{0x3c00000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3c00080},
1108{0x3c00000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3c00080},
1109{0x3c00000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3c00000},
1110{0x3c00000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3c00000},
1111{0x3c00000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3c00000},
1112{0x3c00000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3c00000},
1113{0x3c00000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3c00000},
1114{0x3c00000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3c00000},
1115{0x3c00000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
1116{0x3c00000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3c00000},
1117{0x3c00000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3c00000},
1118{0x3c00000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3c00001},
1119{0x3c00000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3c00001},
1120{0x3c00000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3c00001},
1121{0x3c00000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3c00000},
1122{0x3c00000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
1123{0x3c00000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3c00000},
1124{0x3c00000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3c00000},
1125{0x3c00000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3c00080},
1126{0x3c00000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3c00080},
1127{0x3c00000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3c00080},
1128{0x3c00000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3c00080},
1129{0x3c00000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3c00080},
1130{0x3c00000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3c00000},
1131{0x3c00000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3c00000},
1132{0x3c00000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3c00000},
1133{0x3c00000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3c00000},
1134{0x3c00000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
1135{0x3c00000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3c00000},
1136{0x3c00000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3c00000},
1137{0x3c00000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3c00000},
1138{0x3c00000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3c00000},
1139{0x3c00000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3c00001},
1140{0x3c00000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3c00001},
1141{0x3c00000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3c00001},
1142{0x3c00000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3c00000},
1143{0x3c00000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3c00000},
1144{0x3c00000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3c00000},
1145{0x3c00000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3c00000},
1146{0x3c00000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3c00000},
1147{0x3c00000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3c00000},
1148{0x3c00000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3c00000},
1149{0x3c00000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3c00000},
1150{0x3c00000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
1151{0x3c00000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
1152{0x3c00000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3c00000},
1153{0x3c00000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
1154{0x3c00000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3c00000},
1155{0x3c00000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3c00000},
1156{0x3c00000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
1157{0x3c00000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3c00000},
1158{0x3c00000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3c00000},
1159{0x3c00000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
1160{0x3c00000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3c00000},
1161{0x3c00000, 0x7fffffff, 0x0, 0x7fc00000, 0x3c00000},
1162{0x3c00000, 0x7fffffff, 0x1, 0x7fc00000, 0x3c00080},
1163{0x3c00000, 0x7fffffff, 0x76, 0x7fc00000, 0x3c00080},
1164{0x3c00000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3c00080},
1165{0x3c00000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3c00080},
1166{0x3c00000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3c00080},
1167{0x3c00000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3c00000},
1168{0x3c00000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3c00000},
1169{0x3c00000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3c00000},
1170{0x3c00000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3c00000},
1171{0x3c00000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3c00000},
1172{0x3c00000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3c00000},
1173{0x3c00000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
1174{0x3c00000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3c00000},
1175{0x3c00000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3c00000},
1176{0x3c00000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3c00001},
1177{0x3c00000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
1178{0x3c00000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
1179{0x3c00000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3c00000},
1180{0x3c00000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
1181{0x3c00000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3c00000},
1182{0x3c00000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3c00000},
1183{0x3c00000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3c00080},
1184{0x3c00000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3c00080},
1185{0x3c00000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3c00080},
1186{0x3c00000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3c00080},
1187{0x3c00000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3c00080},
1188{0x3c00000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3c00000},
1189{0x3c00000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3c00000},
1190{0x3c00000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3c00000},
1191{0x3c00000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3c00000},
1192{0x3c00000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
1193{0x3c00000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3c00000},
1194{0x3c00000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3c00000},
1195{0x3c00000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3c00000},
1196{0x3c00000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3c00000},
1197{0x3c00000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3c00001},
1198{0x3c00000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3c00001},
1199{0x3c00000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
1200{0x3c00000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3c00000},
1201{0x3c00000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3c00000},
1202{0x3c00000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3c00000},
1203{0x3c00000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3c00000},
1204{0x3c00000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3c00000},
1205{0x3c00000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3c00000},
1206{0x3c00000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3c00000},
1207{0x3c00000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3c00000},
1208{0x3c00000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
1209{0x3c00000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
1210{0x3c00000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3c00000},
1211{0x3c00000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
1212{0x3c00000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3c00000},
1213{0x3c00000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3c00000},
1214{0x3c00000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
1215{0x3c00000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3c00000},
1216{0x3c00000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3c00000},
1217{0x3c00000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
1218{0x3c00000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3c00000},
1219{0x3c00000, 0x80000000, 0x0, 0x0, 0x3c00000},
1220{0x3c00000, 0x80000000, 0x1, 0x0, 0x3c00080},
1221{0x3c00000, 0x80000000, 0x76, 0x0, 0x3c00080},
1222{0x3c00000, 0x80000000, 0x2b94, 0x0, 0x3c00080},
1223{0x3c00000, 0x80000000, 0x636d24, 0x0, 0x3c00080},
1224{0x3c00000, 0x80000000, 0x7fffff, 0x0, 0x3c00080},
1225{0x3c00000, 0x80000000, 0x800000, 0x800000, 0x3c00000},
1226{0x3c00000, 0x80000000, 0x800002, 0x800002, 0x3c00000},
1227{0x3c00000, 0x80000000, 0x1398437, 0x1398437, 0x3c00000},
1228{0x3c00000, 0x80000000, 0xba98d27, 0xba98d27, 0x3c00000},
1229{0x3c00000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3c00000},
1230{0x3c00000, 0x80000000, 0x751f853a, 0x751f853a, 0x3c00000},
1231{0x3c00000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3c00000},
1232{0x3c00000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3c00000},
1233{0x3c00000, 0x80000000, 0x7f800000, 0x7f800000, 0x3c00000},
1234{0x3c00000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3c00001},
1235{0x3c00000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3c00001},
1236{0x3c00000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
1237{0x3c00000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3c00000},
1238{0x3c00000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
1239{0x3c00000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3c00000},
1240{0x3c00000, 0x80000000, 0x80000000, 0x80000000, 0x3c00000},
1241{0x3c00000, 0x80000000, 0x80000001, 0x0, 0x3c00080},
1242{0x3c00000, 0x80000000, 0x80000076, 0x0, 0x3c00080},
1243{0x3c00000, 0x80000000, 0x80002b94, 0x0, 0x3c00080},
1244{0x3c00000, 0x80000000, 0x80636d24, 0x0, 0x3c00080},
1245{0x3c00000, 0x80000000, 0x807fffff, 0x0, 0x3c00080},
1246{0x3c00000, 0x80000000, 0x80800000, 0x80800000, 0x3c00000},
1247{0x3c00000, 0x80000000, 0x80800002, 0x80800002, 0x3c00000},
1248{0x3c00000, 0x80000000, 0x81398437, 0x81398437, 0x3c00000},
1249{0x3c00000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3c00000},
1250{0x3c00000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3c00000},
1251{0x3c00000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3c00000},
1252{0x3c00000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3c00000},
1253{0x3c00000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3c00000},
1254{0x3c00000, 0x80000000, 0xff800000, 0xff800000, 0x3c00000},
1255{0x3c00000, 0x80000000, 0xff800001, 0x7fc00000, 0x3c00001},
1256{0x3c00000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3c00001},
1257{0x3c00000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3c00001},
1258{0x3c00000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3c00000},
1259{0x3c00000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
1260{0x3c00000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3c00000},
1261{0x3c00000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3c00000},
1262{0x3c00000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3c00000},
1263{0x3c00000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3c00000},
1264{0x3c00000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3c00000},
1265{0x3c00000, 0x80000000, 0x9503366, 0x9503366, 0x3c00000},
1266{0x3c00000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3c00000},
1267{0x3c00000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3c00000},
1268{0x3c00000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3c00000},
1269{0x3c00000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3c00000},
1270{0x3c00000, 0x80000000, 0x966320b, 0x966320b, 0x3c00000},
1271{0x3c00000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3c00000},
1272{0x3c00000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00000},
1273{0x3c00000, 0x80000000, 0x317285d3, 0x317285d3, 0x3c00000},
1274{0x3c00000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3c00000},
1275{0x3c00000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3c00000},
1276{0x3c00000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3c00000},
1277{0x3c00000, 0x80000001, 0x0, 0x0, 0x3c00080},
1278{0x3c00000, 0x80000001, 0x1, 0x0, 0x3c00080},
1279{0x3c00000, 0x80000001, 0x76, 0x0, 0x3c00080},
1280{0x3c00000, 0x80000001, 0x2b94, 0x0, 0x3c00080},
1281{0x3c00000, 0x80000001, 0x636d24, 0x0, 0x3c00080},
1282{0x3c00000, 0x80000001, 0x7fffff, 0x0, 0x3c00080},
1283{0x3c00000, 0x80000001, 0x800000, 0x800000, 0x3c00080},
1284{0x3c00000, 0x80000001, 0x800002, 0x800002, 0x3c00080},
1285{0x3c00000, 0x80000001, 0x1398437, 0x1398437, 0x3c00080},
1286{0x3c00000, 0x80000001, 0xba98d27, 0xba98d27, 0x3c00080},
1287{0x3c00000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3c00080},
1288{0x3c00000, 0x80000001, 0x751f853a, 0x751f853a, 0x3c00080},
1289{0x3c00000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
1290{0x3c00000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
1291{0x3c00000, 0x80000001, 0x7f800000, 0x7f800000, 0x3c00080},
1292{0x3c00000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3c00081},
1293{0x3c00000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3c00081},
1294{0x3c00000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3c00081},
1295{0x3c00000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3c00080},
1296{0x3c00000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
1297{0x3c00000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3c00080},
1298{0x3c00000, 0x80000001, 0x80000000, 0x0, 0x3c00080},
1299{0x3c00000, 0x80000001, 0x80000001, 0x0, 0x3c00080},
1300{0x3c00000, 0x80000001, 0x80000076, 0x0, 0x3c00080},
1301{0x3c00000, 0x80000001, 0x80002b94, 0x0, 0x3c00080},
1302{0x3c00000, 0x80000001, 0x80636d24, 0x0, 0x3c00080},
1303{0x3c00000, 0x80000001, 0x807fffff, 0x0, 0x3c00080},
1304{0x3c00000, 0x80000001, 0x80800000, 0x80800000, 0x3c00080},
1305{0x3c00000, 0x80000001, 0x80800002, 0x80800002, 0x3c00080},
1306{0x3c00000, 0x80000001, 0x81398437, 0x81398437, 0x3c00080},
1307{0x3c00000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
1308{0x3c00000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
1309{0x3c00000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3c00080},
1310{0x3c00000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
1311{0x3c00000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3c00080},
1312{0x3c00000, 0x80000001, 0xff800000, 0xff800000, 0x3c00080},
1313{0x3c00000, 0x80000001, 0xff800001, 0x7fc00000, 0x3c00081},
1314{0x3c00000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3c00081},
1315{0x3c00000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3c00081},
1316{0x3c00000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3c00080},
1317{0x3c00000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3c00080},
1318{0x3c00000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3c00080},
1319{0x3c00000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
1320{0x3c00000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3c00080},
1321{0x3c00000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
1322{0x3c00000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
1323{0x3c00000, 0x80000001, 0x9503366, 0x9503366, 0x3c00080},
1324{0x3c00000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
1325{0x3c00000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
1326{0x3c00000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
1327{0x3c00000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
1328{0x3c00000, 0x80000001, 0x966320b, 0x966320b, 0x3c00080},
1329{0x3c00000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3c00080},
1330{0x3c00000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
1331{0x3c00000, 0x80000001, 0x317285d3, 0x317285d3, 0x3c00080},
1332{0x3c00000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
1333{0x3c00000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
1334{0x3c00000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
1335{0x3c00000, 0x80000076, 0x0, 0x0, 0x3c00080},
1336{0x3c00000, 0x80000076, 0x1, 0x0, 0x3c00080},
1337{0x3c00000, 0x80000076, 0x76, 0x0, 0x3c00080},
1338{0x3c00000, 0x80000076, 0x2b94, 0x0, 0x3c00080},
1339{0x3c00000, 0x80000076, 0x636d24, 0x0, 0x3c00080},
1340{0x3c00000, 0x80000076, 0x7fffff, 0x0, 0x3c00080},
1341{0x3c00000, 0x80000076, 0x800000, 0x800000, 0x3c00080},
1342{0x3c00000, 0x80000076, 0x800002, 0x800002, 0x3c00080},
1343{0x3c00000, 0x80000076, 0x1398437, 0x1398437, 0x3c00080},
1344{0x3c00000, 0x80000076, 0xba98d27, 0xba98d27, 0x3c00080},
1345{0x3c00000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3c00080},
1346{0x3c00000, 0x80000076, 0x751f853a, 0x751f853a, 0x3c00080},
1347{0x3c00000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
1348{0x3c00000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
1349{0x3c00000, 0x80000076, 0x7f800000, 0x7f800000, 0x3c00080},
1350{0x3c00000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3c00081},
1351{0x3c00000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3c00081},
1352{0x3c00000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3c00081},
1353{0x3c00000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3c00080},
1354{0x3c00000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
1355{0x3c00000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3c00080},
1356{0x3c00000, 0x80000076, 0x80000000, 0x0, 0x3c00080},
1357{0x3c00000, 0x80000076, 0x80000001, 0x0, 0x3c00080},
1358{0x3c00000, 0x80000076, 0x80000076, 0x0, 0x3c00080},
1359{0x3c00000, 0x80000076, 0x80002b94, 0x0, 0x3c00080},
1360{0x3c00000, 0x80000076, 0x80636d24, 0x0, 0x3c00080},
1361{0x3c00000, 0x80000076, 0x807fffff, 0x0, 0x3c00080},
1362{0x3c00000, 0x80000076, 0x80800000, 0x80800000, 0x3c00080},
1363{0x3c00000, 0x80000076, 0x80800002, 0x80800002, 0x3c00080},
1364{0x3c00000, 0x80000076, 0x81398437, 0x81398437, 0x3c00080},
1365{0x3c00000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
1366{0x3c00000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
1367{0x3c00000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3c00080},
1368{0x3c00000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
1369{0x3c00000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3c00080},
1370{0x3c00000, 0x80000076, 0xff800000, 0xff800000, 0x3c00080},
1371{0x3c00000, 0x80000076, 0xff800001, 0x7fc00000, 0x3c00081},
1372{0x3c00000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3c00081},
1373{0x3c00000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3c00081},
1374{0x3c00000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3c00080},
1375{0x3c00000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3c00080},
1376{0x3c00000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3c00080},
1377{0x3c00000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
1378{0x3c00000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3c00080},
1379{0x3c00000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
1380{0x3c00000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
1381{0x3c00000, 0x80000076, 0x9503366, 0x9503366, 0x3c00080},
1382{0x3c00000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
1383{0x3c00000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
1384{0x3c00000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
1385{0x3c00000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
1386{0x3c00000, 0x80000076, 0x966320b, 0x966320b, 0x3c00080},
1387{0x3c00000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3c00080},
1388{0x3c00000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
1389{0x3c00000, 0x80000076, 0x317285d3, 0x317285d3, 0x3c00080},
1390{0x3c00000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
1391{0x3c00000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
1392{0x3c00000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
1393{0x3c00000, 0x80002b94, 0x0, 0x0, 0x3c00080},
1394{0x3c00000, 0x80002b94, 0x1, 0x0, 0x3c00080},
1395{0x3c00000, 0x80002b94, 0x76, 0x0, 0x3c00080},
1396{0x3c00000, 0x80002b94, 0x2b94, 0x0, 0x3c00080},
1397{0x3c00000, 0x80002b94, 0x636d24, 0x0, 0x3c00080},
1398{0x3c00000, 0x80002b94, 0x7fffff, 0x0, 0x3c00080},
1399{0x3c00000, 0x80002b94, 0x800000, 0x800000, 0x3c00080},
1400{0x3c00000, 0x80002b94, 0x800002, 0x800002, 0x3c00080},
1401{0x3c00000, 0x80002b94, 0x1398437, 0x1398437, 0x3c00080},
1402{0x3c00000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3c00080},
1403{0x3c00000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3c00080},
1404{0x3c00000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3c00080},
1405{0x3c00000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
1406{0x3c00000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
1407{0x3c00000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3c00080},
1408{0x3c00000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3c00081},
1409{0x3c00000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3c00081},
1410{0x3c00000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3c00081},
1411{0x3c00000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3c00080},
1412{0x3c00000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
1413{0x3c00000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3c00080},
1414{0x3c00000, 0x80002b94, 0x80000000, 0x0, 0x3c00080},
1415{0x3c00000, 0x80002b94, 0x80000001, 0x0, 0x3c00080},
1416{0x3c00000, 0x80002b94, 0x80000076, 0x0, 0x3c00080},
1417{0x3c00000, 0x80002b94, 0x80002b94, 0x0, 0x3c00080},
1418{0x3c00000, 0x80002b94, 0x80636d24, 0x0, 0x3c00080},
1419{0x3c00000, 0x80002b94, 0x807fffff, 0x0, 0x3c00080},
1420{0x3c00000, 0x80002b94, 0x80800000, 0x80800000, 0x3c00080},
1421{0x3c00000, 0x80002b94, 0x80800002, 0x80800002, 0x3c00080},
1422{0x3c00000, 0x80002b94, 0x81398437, 0x81398437, 0x3c00080},
1423{0x3c00000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
1424{0x3c00000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
1425{0x3c00000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3c00080},
1426{0x3c00000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
1427{0x3c00000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3c00080},
1428{0x3c00000, 0x80002b94, 0xff800000, 0xff800000, 0x3c00080},
1429{0x3c00000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3c00081},
1430{0x3c00000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3c00081},
1431{0x3c00000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3c00081},
1432{0x3c00000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3c00080},
1433{0x3c00000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3c00080},
1434{0x3c00000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3c00080},
1435{0x3c00000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
1436{0x3c00000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3c00080},
1437{0x3c00000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
1438{0x3c00000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
1439{0x3c00000, 0x80002b94, 0x9503366, 0x9503366, 0x3c00080},
1440{0x3c00000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
1441{0x3c00000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
1442{0x3c00000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
1443{0x3c00000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
1444{0x3c00000, 0x80002b94, 0x966320b, 0x966320b, 0x3c00080},
1445{0x3c00000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3c00080},
1446{0x3c00000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
1447{0x3c00000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3c00080},
1448{0x3c00000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
1449{0x3c00000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
1450{0x3c00000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
1451{0x3c00000, 0x80636d24, 0x0, 0x0, 0x3c00080},
1452{0x3c00000, 0x80636d24, 0x1, 0x0, 0x3c00080},
1453{0x3c00000, 0x80636d24, 0x76, 0x0, 0x3c00080},
1454{0x3c00000, 0x80636d24, 0x2b94, 0x0, 0x3c00080},
1455{0x3c00000, 0x80636d24, 0x636d24, 0x0, 0x3c00080},
1456{0x3c00000, 0x80636d24, 0x7fffff, 0x0, 0x3c00080},
1457{0x3c00000, 0x80636d24, 0x800000, 0x800000, 0x3c00080},
1458{0x3c00000, 0x80636d24, 0x800002, 0x800002, 0x3c00080},
1459{0x3c00000, 0x80636d24, 0x1398437, 0x1398437, 0x3c00080},
1460{0x3c00000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3c00080},
1461{0x3c00000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3c00080},
1462{0x3c00000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3c00080},
1463{0x3c00000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
1464{0x3c00000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
1465{0x3c00000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3c00080},
1466{0x3c00000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3c00081},
1467{0x3c00000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3c00081},
1468{0x3c00000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3c00081},
1469{0x3c00000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3c00080},
1470{0x3c00000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
1471{0x3c00000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3c00080},
1472{0x3c00000, 0x80636d24, 0x80000000, 0x0, 0x3c00080},
1473{0x3c00000, 0x80636d24, 0x80000001, 0x0, 0x3c00080},
1474{0x3c00000, 0x80636d24, 0x80000076, 0x0, 0x3c00080},
1475{0x3c00000, 0x80636d24, 0x80002b94, 0x0, 0x3c00080},
1476{0x3c00000, 0x80636d24, 0x80636d24, 0x0, 0x3c00080},
1477{0x3c00000, 0x80636d24, 0x807fffff, 0x0, 0x3c00080},
1478{0x3c00000, 0x80636d24, 0x80800000, 0x80800000, 0x3c00080},
1479{0x3c00000, 0x80636d24, 0x80800002, 0x80800002, 0x3c00080},
1480{0x3c00000, 0x80636d24, 0x81398437, 0x81398437, 0x3c00080},
1481{0x3c00000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
1482{0x3c00000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
1483{0x3c00000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3c00080},
1484{0x3c00000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
1485{0x3c00000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3c00080},
1486{0x3c00000, 0x80636d24, 0xff800000, 0xff800000, 0x3c00080},
1487{0x3c00000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3c00081},
1488{0x3c00000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3c00081},
1489{0x3c00000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3c00081},
1490{0x3c00000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3c00080},
1491{0x3c00000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3c00080},
1492{0x3c00000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3c00080},
1493{0x3c00000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
1494{0x3c00000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3c00080},
1495{0x3c00000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
1496{0x3c00000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
1497{0x3c00000, 0x80636d24, 0x9503366, 0x9503366, 0x3c00080},
1498{0x3c00000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
1499{0x3c00000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
1500{0x3c00000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
1501{0x3c00000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
1502{0x3c00000, 0x80636d24, 0x966320b, 0x966320b, 0x3c00080},
1503{0x3c00000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3c00080},
1504{0x3c00000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
1505{0x3c00000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3c00080},
1506{0x3c00000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
1507{0x3c00000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
1508{0x3c00000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
1509{0x3c00000, 0x807fffff, 0x0, 0x0, 0x3c00080},
1510{0x3c00000, 0x807fffff, 0x1, 0x0, 0x3c00080},
1511{0x3c00000, 0x807fffff, 0x76, 0x0, 0x3c00080},
1512{0x3c00000, 0x807fffff, 0x2b94, 0x0, 0x3c00080},
1513{0x3c00000, 0x807fffff, 0x636d24, 0x0, 0x3c00080},
1514{0x3c00000, 0x807fffff, 0x7fffff, 0x0, 0x3c00080},
1515{0x3c00000, 0x807fffff, 0x800000, 0x800000, 0x3c00080},
1516{0x3c00000, 0x807fffff, 0x800002, 0x800002, 0x3c00080},
1517{0x3c00000, 0x807fffff, 0x1398437, 0x1398437, 0x3c00080},
1518{0x3c00000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3c00080},
1519{0x3c00000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3c00080},
1520{0x3c00000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3c00080},
1521{0x3c00000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
1522{0x3c00000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
1523{0x3c00000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3c00080},
1524{0x3c00000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3c00081},
1525{0x3c00000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3c00081},
1526{0x3c00000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3c00081},
1527{0x3c00000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3c00080},
1528{0x3c00000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
1529{0x3c00000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3c00080},
1530{0x3c00000, 0x807fffff, 0x80000000, 0x0, 0x3c00080},
1531{0x3c00000, 0x807fffff, 0x80000001, 0x0, 0x3c00080},
1532{0x3c00000, 0x807fffff, 0x80000076, 0x0, 0x3c00080},
1533{0x3c00000, 0x807fffff, 0x80002b94, 0x0, 0x3c00080},
1534{0x3c00000, 0x807fffff, 0x80636d24, 0x0, 0x3c00080},
1535{0x3c00000, 0x807fffff, 0x807fffff, 0x0, 0x3c00080},
1536{0x3c00000, 0x807fffff, 0x80800000, 0x80800000, 0x3c00080},
1537{0x3c00000, 0x807fffff, 0x80800002, 0x80800002, 0x3c00080},
1538{0x3c00000, 0x807fffff, 0x81398437, 0x81398437, 0x3c00080},
1539{0x3c00000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
1540{0x3c00000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
1541{0x3c00000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3c00080},
1542{0x3c00000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
1543{0x3c00000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3c00080},
1544{0x3c00000, 0x807fffff, 0xff800000, 0xff800000, 0x3c00080},
1545{0x3c00000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3c00081},
1546{0x3c00000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3c00081},
1547{0x3c00000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3c00081},
1548{0x3c00000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3c00080},
1549{0x3c00000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3c00080},
1550{0x3c00000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3c00080},
1551{0x3c00000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
1552{0x3c00000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3c00080},
1553{0x3c00000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
1554{0x3c00000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
1555{0x3c00000, 0x807fffff, 0x9503366, 0x9503366, 0x3c00080},
1556{0x3c00000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
1557{0x3c00000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
1558{0x3c00000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
1559{0x3c00000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
1560{0x3c00000, 0x807fffff, 0x966320b, 0x966320b, 0x3c00080},
1561{0x3c00000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3c00080},
1562{0x3c00000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
1563{0x3c00000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3c00080},
1564{0x3c00000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
1565{0x3c00000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
1566{0x3c00000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
1567{0x3c00000, 0x80800000, 0x0, 0x80800000, 0x3c00000},
1568{0x3c00000, 0x80800000, 0x1, 0x80800000, 0x3c00080},
1569{0x3c00000, 0x80800000, 0x76, 0x80800000, 0x3c00080},
1570{0x3c00000, 0x80800000, 0x2b94, 0x80800000, 0x3c00080},
1571{0x3c00000, 0x80800000, 0x636d24, 0x80800000, 0x3c00080},
1572{0x3c00000, 0x80800000, 0x7fffff, 0x80800000, 0x3c00080},
1573{0x3c00000, 0x80800000, 0x800000, 0x0, 0x3c00000},
1574{0x3c00000, 0x80800000, 0x800002, 0x0, 0x3c00008},
1575{0x3c00000, 0x80800000, 0x1398437, 0xf3086e, 0x3c00000},
1576{0x3c00000, 0x80800000, 0xba98d27, 0xba98d25, 0x3c00000},
1577{0x3c00000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3c00000},
1578{0x3c00000, 0x80800000, 0x751f853a, 0x751f8539, 0x3c00010},
1579{0x3c00000, 0x80800000, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
1580{0x3c00000, 0x80800000, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
1581{0x3c00000, 0x80800000, 0x7f800000, 0x7f800000, 0x3c00000},
1582{0x3c00000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3c00001},
1583{0x3c00000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3c00001},
1584{0x3c00000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
1585{0x3c00000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3c00000},
1586{0x3c00000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
1587{0x3c00000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3c00000},
1588{0x3c00000, 0x80800000, 0x80000000, 0x80800000, 0x3c00000},
1589{0x3c00000, 0x80800000, 0x80000001, 0x80800000, 0x3c00080},
1590{0x3c00000, 0x80800000, 0x80000076, 0x80800000, 0x3c00080},
1591{0x3c00000, 0x80800000, 0x80002b94, 0x80800000, 0x3c00080},
1592{0x3c00000, 0x80800000, 0x80636d24, 0x80800000, 0x3c00080},
1593{0x3c00000, 0x80800000, 0x807fffff, 0x80800000, 0x3c00080},
1594{0x3c00000, 0x80800000, 0x80800000, 0x81000000, 0x3c00000},
1595{0x3c00000, 0x80800000, 0x80800002, 0x81000001, 0x3c00000},
1596{0x3c00000, 0x80800000, 0x81398437, 0x81798437, 0x3c00000},
1597{0x3c00000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3c00000},
1598{0x3c00000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3c00000},
1599{0x3c00000, 0x80800000, 0xf51f853a, 0xf51f853a, 0x3c00010},
1600{0x3c00000, 0x80800000, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
1601{0x3c00000, 0x80800000, 0xff7fffff, 0xff7fffff, 0x3c00010},
1602{0x3c00000, 0x80800000, 0xff800000, 0xff800000, 0x3c00000},
1603{0x3c00000, 0x80800000, 0xff800001, 0x7fc00000, 0x3c00001},
1604{0x3c00000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3c00001},
1605{0x3c00000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3c00001},
1606{0x3c00000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3c00000},
1607{0x3c00000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
1608{0x3c00000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3c00000},
1609{0x3c00000, 0x80800000, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
1610{0x3c00000, 0x80800000, 0xe73a5134, 0xe73a5134, 0x3c00010},
1611{0x3c00000, 0x80800000, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
1612{0x3c00000, 0x80800000, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
1613{0x3c00000, 0x80800000, 0x9503366, 0x9503326, 0x3c00000},
1614{0x3c00000, 0x80800000, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
1615{0x3c00000, 0x80800000, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
1616{0x3c00000, 0x80800000, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
1617{0x3c00000, 0x80800000, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010},
1618{0x3c00000, 0x80800000, 0x966320b, 0x96631cb, 0x3c00000},
1619{0x3c00000, 0x80800000, 0xb26bddee, 0xb26bddee, 0x3c00010},
1620{0x3c00000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010},
1621{0x3c00000, 0x80800000, 0x317285d3, 0x317285d2, 0x3c00010},
1622{0x3c00000, 0x80800000, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
1623{0x3c00000, 0x80800000, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
1624{0x3c00000, 0x80800000, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
1625{0x3c00000, 0x80800002, 0x0, 0x80800002, 0x3c00000},
1626{0x3c00000, 0x80800002, 0x1, 0x80800002, 0x3c00080},
1627{0x3c00000, 0x80800002, 0x76, 0x80800002, 0x3c00080},
1628{0x3c00000, 0x80800002, 0x2b94, 0x80800002, 0x3c00080},
1629{0x3c00000, 0x80800002, 0x636d24, 0x80800002, 0x3c00080},
1630{0x3c00000, 0x80800002, 0x7fffff, 0x80800002, 0x3c00080},
1631{0x3c00000, 0x80800002, 0x800000, 0x0, 0x3c00008},
1632{0x3c00000, 0x80800002, 0x800002, 0x0, 0x3c00000},
1633{0x3c00000, 0x80800002, 0x1398437, 0xf3086c, 0x3c00000},
1634{0x3c00000, 0x80800002, 0xba98d27, 0xba98d24, 0x3c00010},
1635{0x3c00000, 0x80800002, 0xba98d7a, 0xba98d77, 0x3c00010},
1636{0x3c00000, 0x80800002, 0x751f853a, 0x751f8539, 0x3c00010},
1637{0x3c00000, 0x80800002, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
1638{0x3c00000, 0x80800002, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
1639{0x3c00000, 0x80800002, 0x7f800000, 0x7f800000, 0x3c00000},
1640{0x3c00000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3c00001},
1641{0x3c00000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3c00001},
1642{0x3c00000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3c00001},
1643{0x3c00000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3c00000},
1644{0x3c00000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
1645{0x3c00000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3c00000},
1646{0x3c00000, 0x80800002, 0x80000000, 0x80800002, 0x3c00000},
1647{0x3c00000, 0x80800002, 0x80000001, 0x80800002, 0x3c00080},
1648{0x3c00000, 0x80800002, 0x80000076, 0x80800002, 0x3c00080},
1649{0x3c00000, 0x80800002, 0x80002b94, 0x80800002, 0x3c00080},
1650{0x3c00000, 0x80800002, 0x80636d24, 0x80800002, 0x3c00080},
1651{0x3c00000, 0x80800002, 0x807fffff, 0x80800002, 0x3c00080},
1652{0x3c00000, 0x80800002, 0x80800000, 0x81000001, 0x3c00000},
1653{0x3c00000, 0x80800002, 0x80800002, 0x81000002, 0x3c00000},
1654{0x3c00000, 0x80800002, 0x81398437, 0x81798438, 0x3c00000},
1655{0x3c00000, 0x80800002, 0x8ba98d27, 0x8ba98d29, 0x3c00010},
1656{0x3c00000, 0x80800002, 0x8ba98d7a, 0x8ba98d7c, 0x3c00010},
1657{0x3c00000, 0x80800002, 0xf51f853a, 0xf51f853a, 0x3c00010},
1658{0x3c00000, 0x80800002, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
1659{0x3c00000, 0x80800002, 0xff7fffff, 0xff7fffff, 0x3c00010},
1660{0x3c00000, 0x80800002, 0xff800000, 0xff800000, 0x3c00000},
1661{0x3c00000, 0x80800002, 0xff800001, 0x7fc00000, 0x3c00001},
1662{0x3c00000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3c00001},
1663{0x3c00000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3c00001},
1664{0x3c00000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3c00000},
1665{0x3c00000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3c00000},
1666{0x3c00000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3c00000},
1667{0x3c00000, 0x80800002, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
1668{0x3c00000, 0x80800002, 0xe73a5134, 0xe73a5134, 0x3c00010},
1669{0x3c00000, 0x80800002, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
1670{0x3c00000, 0x80800002, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
1671{0x3c00000, 0x80800002, 0x9503366, 0x9503325, 0x3c00010},
1672{0x3c00000, 0x80800002, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
1673{0x3c00000, 0x80800002, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
1674{0x3c00000, 0x80800002, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
1675{0x3c00000, 0x80800002, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010},
1676{0x3c00000, 0x80800002, 0x966320b, 0x96631ca, 0x3c00010},
1677{0x3c00000, 0x80800002, 0xb26bddee, 0xb26bddee, 0x3c00010},
1678{0x3c00000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010},
1679{0x3c00000, 0x80800002, 0x317285d3, 0x317285d2, 0x3c00010},
1680{0x3c00000, 0x80800002, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
1681{0x3c00000, 0x80800002, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
1682{0x3c00000, 0x80800002, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
1683{0x3c00000, 0x81398437, 0x0, 0x81398437, 0x3c00000},
1684{0x3c00000, 0x81398437, 0x1, 0x81398437, 0x3c00080},
1685{0x3c00000, 0x81398437, 0x76, 0x81398437, 0x3c00080},
1686{0x3c00000, 0x81398437, 0x2b94, 0x81398437, 0x3c00080},
1687{0x3c00000, 0x81398437, 0x636d24, 0x81398437, 0x3c00080},
1688{0x3c00000, 0x81398437, 0x7fffff, 0x81398437, 0x3c00080},
1689{0x3c00000, 0x81398437, 0x800000, 0x80f3086e, 0x3c00000},
1690{0x3c00000, 0x81398437, 0x800002, 0x80f3086c, 0x3c00000},
1691{0x3c00000, 0x81398437, 0x1398437, 0x0, 0x3c00000},
1692{0x3c00000, 0x81398437, 0xba98d27, 0xba98d21, 0x3c00010},
1693{0x3c00000, 0x81398437, 0xba98d7a, 0xba98d74, 0x3c00010},
1694{0x3c00000, 0x81398437, 0x751f853a, 0x751f8539, 0x3c00010},
1695{0x3c00000, 0x81398437, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
1696{0x3c00000, 0x81398437, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
1697{0x3c00000, 0x81398437, 0x7f800000, 0x7f800000, 0x3c00000},
1698{0x3c00000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3c00001},
1699{0x3c00000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3c00001},
1700{0x3c00000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3c00001},
1701{0x3c00000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3c00000},
1702{0x3c00000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
1703{0x3c00000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3c00000},
1704{0x3c00000, 0x81398437, 0x80000000, 0x81398437, 0x3c00000},
1705{0x3c00000, 0x81398437, 0x80000001, 0x81398437, 0x3c00080},
1706{0x3c00000, 0x81398437, 0x80000076, 0x81398437, 0x3c00080},
1707{0x3c00000, 0x81398437, 0x80002b94, 0x81398437, 0x3c00080},
1708{0x3c00000, 0x81398437, 0x80636d24, 0x81398437, 0x3c00080},
1709{0x3c00000, 0x81398437, 0x807fffff, 0x81398437, 0x3c00080},
1710{0x3c00000, 0x81398437, 0x80800000, 0x81798437, 0x3c00000},
1711{0x3c00000, 0x81398437, 0x80800002, 0x81798438, 0x3c00000},
1712{0x3c00000, 0x81398437, 0x81398437, 0x81b98437, 0x3c00000},
1713{0x3c00000, 0x81398437, 0x8ba98d27, 0x8ba98d2c, 0x3c00010},
1714{0x3c00000, 0x81398437, 0x8ba98d7a, 0x8ba98d7f, 0x3c00010},
1715{0x3c00000, 0x81398437, 0xf51f853a, 0xf51f853a, 0x3c00010},
1716{0x3c00000, 0x81398437, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
1717{0x3c00000, 0x81398437, 0xff7fffff, 0xff7fffff, 0x3c00010},
1718{0x3c00000, 0x81398437, 0xff800000, 0xff800000, 0x3c00000},
1719{0x3c00000, 0x81398437, 0xff800001, 0x7fc00000, 0x3c00001},
1720{0x3c00000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3c00001},
1721{0x3c00000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3c00001},
1722{0x3c00000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3c00000},
1723{0x3c00000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3c00000},
1724{0x3c00000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3c00000},
1725{0x3c00000, 0x81398437, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
1726{0x3c00000, 0x81398437, 0xe73a5134, 0xe73a5134, 0x3c00010},
1727{0x3c00000, 0x81398437, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
1728{0x3c00000, 0x81398437, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
1729{0x3c00000, 0x81398437, 0x9503366, 0x95032ac, 0x3c00010},
1730{0x3c00000, 0x81398437, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
1731{0x3c00000, 0x81398437, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
1732{0x3c00000, 0x81398437, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
1733{0x3c00000, 0x81398437, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010},
1734{0x3c00000, 0x81398437, 0x966320b, 0x9663151, 0x3c00010},
1735{0x3c00000, 0x81398437, 0xb26bddee, 0xb26bddee, 0x3c00010},
1736{0x3c00000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010},
1737{0x3c00000, 0x81398437, 0x317285d3, 0x317285d2, 0x3c00010},
1738{0x3c00000, 0x81398437, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
1739{0x3c00000, 0x81398437, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
1740{0x3c00000, 0x81398437, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
1741{0x3c00000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3c00000},
1742{0x3c00000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3c00080},
1743{0x3c00000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3c00080},
1744{0x3c00000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3c00080},
1745{0x3c00000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3c00080},
1746{0x3c00000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3c00080},
1747{0x3c00000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3c00000},
1748{0x3c00000, 0x8ba98d27, 0x800002, 0x8ba98d24, 0x3c00010},
1749{0x3c00000, 0x8ba98d27, 0x1398437, 0x8ba98d21, 0x3c00010},
1750{0x3c00000, 0x8ba98d27, 0xba98d27, 0x0, 0x3c00000},
1751{0x3c00000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3c00000},
1752{0x3c00000, 0x8ba98d27, 0x751f853a, 0x751f8539, 0x3c00010},
1753{0x3c00000, 0x8ba98d27, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
1754{0x3c00000, 0x8ba98d27, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
1755{0x3c00000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3c00000},
1756{0x3c00000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3c00001},
1757{0x3c00000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3c00001},
1758{0x3c00000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3c00001},
1759{0x3c00000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3c00000},
1760{0x3c00000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
1761{0x3c00000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3c00000},
1762{0x3c00000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3c00000},
1763{0x3c00000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3c00080},
1764{0x3c00000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3c00080},
1765{0x3c00000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3c00080},
1766{0x3c00000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3c00080},
1767{0x3c00000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3c00080},
1768{0x3c00000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3c00000},
1769{0x3c00000, 0x8ba98d27, 0x80800002, 0x8ba98d29, 0x3c00010},
1770{0x3c00000, 0x8ba98d27, 0x81398437, 0x8ba98d2c, 0x3c00010},
1771{0x3c00000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3c00000},
1772{0x3c00000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d50, 0x3c00010},
1773{0x3c00000, 0x8ba98d27, 0xf51f853a, 0xf51f853a, 0x3c00010},
1774{0x3c00000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
1775{0x3c00000, 0x8ba98d27, 0xff7fffff, 0xff7fffff, 0x3c00010},
1776{0x3c00000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3c00000},
1777{0x3c00000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3c00001},
1778{0x3c00000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3c00001},
1779{0x3c00000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3c00001},
1780{0x3c00000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3c00000},
1781{0x3c00000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3c00000},
1782{0x3c00000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3c00000},
1783{0x3c00000, 0x8ba98d27, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
1784{0x3c00000, 0x8ba98d27, 0xe73a5134, 0xe73a5134, 0x3c00010},
1785{0x3c00000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
1786{0x3c00000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
1787{0x3c00000, 0x8ba98d27, 0x9503366, 0x8ba30b8b, 0x3c00010},
1788{0x3c00000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
1789{0x3c00000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
1790{0x3c00000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
1791{0x3c00000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010},
1792{0x3c00000, 0x8ba98d27, 0x966320b, 0x8ba25b96, 0x3c00010},
1793{0x3c00000, 0x8ba98d27, 0xb26bddee, 0xb26bddee, 0x3c00010},
1794{0x3c00000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010},
1795{0x3c00000, 0x8ba98d27, 0x317285d3, 0x317285d2, 0x3c00010},
1796{0x3c00000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
1797{0x3c00000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
1798{0x3c00000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
1799{0x3c00000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3c00000},
1800{0x3c00000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3c00080},
1801{0x3c00000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3c00080},
1802{0x3c00000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3c00080},
1803{0x3c00000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3c00080},
1804{0x3c00000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3c00080},
1805{0x3c00000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3c00000},
1806{0x3c00000, 0x8ba98d7a, 0x800002, 0x8ba98d77, 0x3c00010},
1807{0x3c00000, 0x8ba98d7a, 0x1398437, 0x8ba98d74, 0x3c00010},
1808{0x3c00000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3c00000},
1809{0x3c00000, 0x8ba98d7a, 0xba98d7a, 0x0, 0x3c00000},
1810{0x3c00000, 0x8ba98d7a, 0x751f853a, 0x751f8539, 0x3c00010},
1811{0x3c00000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
1812{0x3c00000, 0x8ba98d7a, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
1813{0x3c00000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3c00000},
1814{0x3c00000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3c00001},
1815{0x3c00000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3c00001},
1816{0x3c00000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3c00001},
1817{0x3c00000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3c00000},
1818{0x3c00000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
1819{0x3c00000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3c00000},
1820{0x3c00000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3c00000},
1821{0x3c00000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3c00080},
1822{0x3c00000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3c00080},
1823{0x3c00000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3c00080},
1824{0x3c00000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3c00080},
1825{0x3c00000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3c00080},
1826{0x3c00000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3c00000},
1827{0x3c00000, 0x8ba98d7a, 0x80800002, 0x8ba98d7c, 0x3c00010},
1828{0x3c00000, 0x8ba98d7a, 0x81398437, 0x8ba98d7f, 0x3c00010},
1829{0x3c00000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d50, 0x3c00010},
1830{0x3c00000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3c00000},
1831{0x3c00000, 0x8ba98d7a, 0xf51f853a, 0xf51f853a, 0x3c00010},
1832{0x3c00000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
1833{0x3c00000, 0x8ba98d7a, 0xff7fffff, 0xff7fffff, 0x3c00010},
1834{0x3c00000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3c00000},
1835{0x3c00000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3c00001},
1836{0x3c00000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3c00001},
1837{0x3c00000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3c00001},
1838{0x3c00000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3c00000},
1839{0x3c00000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3c00000},
1840{0x3c00000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3c00000},
1841{0x3c00000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
1842{0x3c00000, 0x8ba98d7a, 0xe73a5134, 0xe73a5134, 0x3c00010},
1843{0x3c00000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
1844{0x3c00000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
1845{0x3c00000, 0x8ba98d7a, 0x9503366, 0x8ba30bde, 0x3c00010},
1846{0x3c00000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
1847{0x3c00000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
1848{0x3c00000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
1849{0x3c00000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010},
1850{0x3c00000, 0x8ba98d7a, 0x966320b, 0x8ba25be9, 0x3c00010},
1851{0x3c00000, 0x8ba98d7a, 0xb26bddee, 0xb26bddee, 0x3c00010},
1852{0x3c00000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010},
1853{0x3c00000, 0x8ba98d7a, 0x317285d3, 0x317285d2, 0x3c00010},
1854{0x3c00000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
1855{0x3c00000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
1856{0x3c00000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
1857{0x3c00000, 0xf51f853a, 0x0, 0xf51f853a, 0x3c00000},
1858{0x3c00000, 0xf51f853a, 0x1, 0xf51f853a, 0x3c00080},
1859{0x3c00000, 0xf51f853a, 0x76, 0xf51f853a, 0x3c00080},
1860{0x3c00000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3c00080},
1861{0x3c00000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3c00080},
1862{0x3c00000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3c00080},
1863{0x3c00000, 0xf51f853a, 0x800000, 0xf51f8539, 0x3c00010},
1864{0x3c00000, 0xf51f853a, 0x800002, 0xf51f8539, 0x3c00010},
1865{0x3c00000, 0xf51f853a, 0x1398437, 0xf51f8539, 0x3c00010},
1866{0x3c00000, 0xf51f853a, 0xba98d27, 0xf51f8539, 0x3c00010},
1867{0x3c00000, 0xf51f853a, 0xba98d7a, 0xf51f8539, 0x3c00010},
1868{0x3c00000, 0xf51f853a, 0x751f853a, 0x0, 0x3c00000},
1869{0x3c00000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe6, 0x3c00010},
1870{0x3c00000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff5, 0x3c00010},
1871{0x3c00000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3c00000},
1872{0x3c00000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3c00001},
1873{0x3c00000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3c00001},
1874{0x3c00000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3c00001},
1875{0x3c00000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3c00000},
1876{0x3c00000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
1877{0x3c00000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3c00000},
1878{0x3c00000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3c00000},
1879{0x3c00000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3c00080},
1880{0x3c00000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3c00080},
1881{0x3c00000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3c00080},
1882{0x3c00000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3c00080},
1883{0x3c00000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3c00080},
1884{0x3c00000, 0xf51f853a, 0x80800000, 0xf51f853a, 0x3c00010},
1885{0x3c00000, 0xf51f853a, 0x80800002, 0xf51f853a, 0x3c00010},
1886{0x3c00000, 0xf51f853a, 0x81398437, 0xf51f853a, 0x3c00010},
1887{0x3c00000, 0xf51f853a, 0x8ba98d27, 0xf51f853a, 0x3c00010},
1888{0x3c00000, 0xf51f853a, 0x8ba98d7a, 0xf51f853a, 0x3c00010},
1889{0x3c00000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3c00000},
1890{0x3c00000, 0xf51f853a, 0xff7ffff0, 0xff7ffff9, 0x3c00010},
1891{0x3c00000, 0xf51f853a, 0xff7fffff, 0xff7fffff, 0x3c00014},
1892{0x3c00000, 0xf51f853a, 0xff800000, 0xff800000, 0x3c00000},
1893{0x3c00000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3c00001},
1894{0x3c00000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3c00001},
1895{0x3c00000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3c00001},
1896{0x3c00000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3c00000},
1897{0x3c00000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3c00000},
1898{0x3c00000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3c00000},
1899{0x3c00000, 0xf51f853a, 0x4f3495cb, 0xf51f8539, 0x3c00010},
1900{0x3c00000, 0xf51f853a, 0xe73a5134, 0xf51f853a, 0x3c00010},
1901{0x3c00000, 0xf51f853a, 0x7c994e9e, 0x7c994d5e, 0x3c00010},
1902{0x3c00000, 0xf51f853a, 0x6164bd6c, 0xf51f8539, 0x3c00010},
1903{0x3c00000, 0xf51f853a, 0x9503366, 0xf51f8539, 0x3c00010},
1904{0x3c00000, 0xf51f853a, 0xbf5a97c9, 0xf51f853a, 0x3c00010},
1905{0x3c00000, 0xf51f853a, 0xe6ff1a14, 0xf51f853a, 0x3c00010},
1906{0x3c00000, 0xf51f853a, 0x77f31e2f, 0x77ee2205, 0x3c00010},
1907{0x3c00000, 0xf51f853a, 0xaab4d7d8, 0xf51f853a, 0x3c00010},
1908{0x3c00000, 0xf51f853a, 0x966320b, 0xf51f8539, 0x3c00010},
1909{0x3c00000, 0xf51f853a, 0xb26bddee, 0xf51f853a, 0x3c00010},
1910{0x3c00000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853a, 0x3c00010},
1911{0x3c00000, 0xf51f853a, 0x317285d3, 0xf51f8539, 0x3c00010},
1912{0x3c00000, 0xf51f853a, 0x3c9623b1, 0xf51f8539, 0x3c00010},
1913{0x3c00000, 0xf51f853a, 0x51fd2c7c, 0xf51f8539, 0x3c00010},
1914{0x3c00000, 0xf51f853a, 0x7b906a6c, 0x7b90656f, 0x3c00010},
1915{0x3c00000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3c00000},
1916{0x3c00000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3c00080},
1917{0x3c00000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3c00080},
1918{0x3c00000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3c00080},
1919{0x3c00000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3c00080},
1920{0x3c00000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3c00080},
1921{0x3c00000, 0xff7ffff0, 0x800000, 0xff7fffef, 0x3c00010},
1922{0x3c00000, 0xff7ffff0, 0x800002, 0xff7fffef, 0x3c00010},
1923{0x3c00000, 0xff7ffff0, 0x1398437, 0xff7fffef, 0x3c00010},
1924{0x3c00000, 0xff7ffff0, 0xba98d27, 0xff7fffef, 0x3c00010},
1925{0x3c00000, 0xff7ffff0, 0xba98d7a, 0xff7fffef, 0x3c00010},
1926{0x3c00000, 0xff7ffff0, 0x751f853a, 0xff7fffe6, 0x3c00010},
1927{0x3c00000, 0xff7ffff0, 0x7f7ffff0, 0x0, 0x3c00000},
1928{0x3c00000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3c00000},
1929{0x3c00000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3c00000},
1930{0x3c00000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3c00001},
1931{0x3c00000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3c00001},
1932{0x3c00000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3c00001},
1933{0x3c00000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3c00000},
1934{0x3c00000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
1935{0x3c00000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3c00000},
1936{0x3c00000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3c00000},
1937{0x3c00000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3c00080},
1938{0x3c00000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3c00080},
1939{0x3c00000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3c00080},
1940{0x3c00000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3c00080},
1941{0x3c00000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3c00080},
1942{0x3c00000, 0xff7ffff0, 0x80800000, 0xff7ffff0, 0x3c00010},
1943{0x3c00000, 0xff7ffff0, 0x80800002, 0xff7ffff0, 0x3c00010},
1944{0x3c00000, 0xff7ffff0, 0x81398437, 0xff7ffff0, 0x3c00010},
1945{0x3c00000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff0, 0x3c00010},
1946{0x3c00000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff0, 0x3c00010},
1947{0x3c00000, 0xff7ffff0, 0xf51f853a, 0xff7ffff9, 0x3c00010},
1948{0x3c00000, 0xff7ffff0, 0xff7ffff0, 0xff7fffff, 0x3c00014},
1949{0x3c00000, 0xff7ffff0, 0xff7fffff, 0xff7fffff, 0x3c00014},
1950{0x3c00000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3c00000},
1951{0x3c00000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3c00001},
1952{0x3c00000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3c00001},
1953{0x3c00000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3c00001},
1954{0x3c00000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3c00000},
1955{0x3c00000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3c00000},
1956{0x3c00000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3c00000},
1957{0x3c00000, 0xff7ffff0, 0x4f3495cb, 0xff7fffef, 0x3c00010},
1958{0x3c00000, 0xff7ffff0, 0xe73a5134, 0xff7ffff0, 0x3c00010},
1959{0x3c00000, 0xff7ffff0, 0x7c994e9e, 0xff7b357b, 0x3c00010},
1960{0x3c00000, 0xff7ffff0, 0x6164bd6c, 0xff7fffef, 0x3c00010},
1961{0x3c00000, 0xff7ffff0, 0x9503366, 0xff7fffef, 0x3c00010},
1962{0x3c00000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff0, 0x3c00010},
1963{0x3c00000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff0, 0x3c00010},
1964{0x3c00000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe09, 0x3c00010},
1965{0x3c00000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff0, 0x3c00010},
1966{0x3c00000, 0xff7ffff0, 0x966320b, 0xff7fffef, 0x3c00010},
1967{0x3c00000, 0xff7ffff0, 0xb26bddee, 0xff7ffff0, 0x3c00010},
1968{0x3c00000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff0, 0x3c00010},
1969{0x3c00000, 0xff7ffff0, 0x317285d3, 0xff7fffef, 0x3c00010},
1970{0x3c00000, 0xff7ffff0, 0x3c9623b1, 0xff7fffef, 0x3c00010},
1971{0x3c00000, 0xff7ffff0, 0x51fd2c7c, 0xff7fffef, 0x3c00010},
1972{0x3c00000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1b, 0x3c00010},
1973{0x3c00000, 0xff7fffff, 0x0, 0xff7fffff, 0x3c00000},
1974{0x3c00000, 0xff7fffff, 0x1, 0xff7fffff, 0x3c00080},
1975{0x3c00000, 0xff7fffff, 0x76, 0xff7fffff, 0x3c00080},
1976{0x3c00000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3c00080},
1977{0x3c00000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3c00080},
1978{0x3c00000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3c00080},
1979{0x3c00000, 0xff7fffff, 0x800000, 0xff7ffffe, 0x3c00010},
1980{0x3c00000, 0xff7fffff, 0x800002, 0xff7ffffe, 0x3c00010},
1981{0x3c00000, 0xff7fffff, 0x1398437, 0xff7ffffe, 0x3c00010},
1982{0x3c00000, 0xff7fffff, 0xba98d27, 0xff7ffffe, 0x3c00010},
1983{0x3c00000, 0xff7fffff, 0xba98d7a, 0xff7ffffe, 0x3c00010},
1984{0x3c00000, 0xff7fffff, 0x751f853a, 0xff7ffff5, 0x3c00010},
1985{0x3c00000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3c00000},
1986{0x3c00000, 0xff7fffff, 0x7f7fffff, 0x0, 0x3c00000},
1987{0x3c00000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3c00000},
1988{0x3c00000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3c00001},
1989{0x3c00000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
1990{0x3c00000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
1991{0x3c00000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3c00000},
1992{0x3c00000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
1993{0x3c00000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3c00000},
1994{0x3c00000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3c00000},
1995{0x3c00000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3c00080},
1996{0x3c00000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3c00080},
1997{0x3c00000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3c00080},
1998{0x3c00000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3c00080},
1999{0x3c00000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3c00080},
2000{0x3c00000, 0xff7fffff, 0x80800000, 0xff7fffff, 0x3c00010},
2001{0x3c00000, 0xff7fffff, 0x80800002, 0xff7fffff, 0x3c00010},
2002{0x3c00000, 0xff7fffff, 0x81398437, 0xff7fffff, 0x3c00010},
2003{0x3c00000, 0xff7fffff, 0x8ba98d27, 0xff7fffff, 0x3c00010},
2004{0x3c00000, 0xff7fffff, 0x8ba98d7a, 0xff7fffff, 0x3c00010},
2005{0x3c00000, 0xff7fffff, 0xf51f853a, 0xff7fffff, 0x3c00014},
2006{0x3c00000, 0xff7fffff, 0xff7ffff0, 0xff7fffff, 0x3c00014},
2007{0x3c00000, 0xff7fffff, 0xff7fffff, 0xff7fffff, 0x3c00014},
2008{0x3c00000, 0xff7fffff, 0xff800000, 0xff800000, 0x3c00000},
2009{0x3c00000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3c00001},
2010{0x3c00000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3c00001},
2011{0x3c00000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
2012{0x3c00000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3c00000},
2013{0x3c00000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3c00000},
2014{0x3c00000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3c00000},
2015{0x3c00000, 0xff7fffff, 0x4f3495cb, 0xff7ffffe, 0x3c00010},
2016{0x3c00000, 0xff7fffff, 0xe73a5134, 0xff7fffff, 0x3c00010},
2017{0x3c00000, 0xff7fffff, 0x7c994e9e, 0xff7b358a, 0x3c00010},
2018{0x3c00000, 0xff7fffff, 0x6164bd6c, 0xff7ffffe, 0x3c00010},
2019{0x3c00000, 0xff7fffff, 0x9503366, 0xff7ffffe, 0x3c00010},
2020{0x3c00000, 0xff7fffff, 0xbf5a97c9, 0xff7fffff, 0x3c00010},
2021{0x3c00000, 0xff7fffff, 0xe6ff1a14, 0xff7fffff, 0x3c00010},
2022{0x3c00000, 0xff7fffff, 0x77f31e2f, 0xff7ffe18, 0x3c00010},
2023{0x3c00000, 0xff7fffff, 0xaab4d7d8, 0xff7fffff, 0x3c00010},
2024{0x3c00000, 0xff7fffff, 0x966320b, 0xff7ffffe, 0x3c00010},
2025{0x3c00000, 0xff7fffff, 0xb26bddee, 0xff7fffff, 0x3c00010},
2026{0x3c00000, 0xff7fffff, 0xb5c8e5d3, 0xff7fffff, 0x3c00010},
2027{0x3c00000, 0xff7fffff, 0x317285d3, 0xff7ffffe, 0x3c00010},
2028{0x3c00000, 0xff7fffff, 0x3c9623b1, 0xff7ffffe, 0x3c00010},
2029{0x3c00000, 0xff7fffff, 0x51fd2c7c, 0xff7ffffe, 0x3c00010},
2030{0x3c00000, 0xff7fffff, 0x7b906a6c, 0xff7edf2a, 0x3c00010},
2031{0x3c00000, 0xff800000, 0x0, 0xff800000, 0x3c00000},
2032{0x3c00000, 0xff800000, 0x1, 0xff800000, 0x3c00080},
2033{0x3c00000, 0xff800000, 0x76, 0xff800000, 0x3c00080},
2034{0x3c00000, 0xff800000, 0x2b94, 0xff800000, 0x3c00080},
2035{0x3c00000, 0xff800000, 0x636d24, 0xff800000, 0x3c00080},
2036{0x3c00000, 0xff800000, 0x7fffff, 0xff800000, 0x3c00080},
2037{0x3c00000, 0xff800000, 0x800000, 0xff800000, 0x3c00000},
2038{0x3c00000, 0xff800000, 0x800002, 0xff800000, 0x3c00000},
2039{0x3c00000, 0xff800000, 0x1398437, 0xff800000, 0x3c00000},
2040{0x3c00000, 0xff800000, 0xba98d27, 0xff800000, 0x3c00000},
2041{0x3c00000, 0xff800000, 0xba98d7a, 0xff800000, 0x3c00000},
2042{0x3c00000, 0xff800000, 0x751f853a, 0xff800000, 0x3c00000},
2043{0x3c00000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3c00000},
2044{0x3c00000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3c00000},
2045{0x3c00000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3c00001},
2046{0x3c00000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3c00001},
2047{0x3c00000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3c00001},
2048{0x3c00000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2049{0x3c00000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3c00000},
2050{0x3c00000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
2051{0x3c00000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3c00000},
2052{0x3c00000, 0xff800000, 0x80000000, 0xff800000, 0x3c00000},
2053{0x3c00000, 0xff800000, 0x80000001, 0xff800000, 0x3c00080},
2054{0x3c00000, 0xff800000, 0x80000076, 0xff800000, 0x3c00080},
2055{0x3c00000, 0xff800000, 0x80002b94, 0xff800000, 0x3c00080},
2056{0x3c00000, 0xff800000, 0x80636d24, 0xff800000, 0x3c00080},
2057{0x3c00000, 0xff800000, 0x807fffff, 0xff800000, 0x3c00080},
2058{0x3c00000, 0xff800000, 0x80800000, 0xff800000, 0x3c00000},
2059{0x3c00000, 0xff800000, 0x80800002, 0xff800000, 0x3c00000},
2060{0x3c00000, 0xff800000, 0x81398437, 0xff800000, 0x3c00000},
2061{0x3c00000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3c00000},
2062{0x3c00000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3c00000},
2063{0x3c00000, 0xff800000, 0xf51f853a, 0xff800000, 0x3c00000},
2064{0x3c00000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3c00000},
2065{0x3c00000, 0xff800000, 0xff7fffff, 0xff800000, 0x3c00000},
2066{0x3c00000, 0xff800000, 0xff800000, 0xff800000, 0x3c00000},
2067{0x3c00000, 0xff800000, 0xff800001, 0x7fc00000, 0x3c00001},
2068{0x3c00000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3c00001},
2069{0x3c00000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3c00001},
2070{0x3c00000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3c00000},
2071{0x3c00000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
2072{0x3c00000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3c00000},
2073{0x3c00000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3c00000},
2074{0x3c00000, 0xff800000, 0xe73a5134, 0xff800000, 0x3c00000},
2075{0x3c00000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3c00000},
2076{0x3c00000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3c00000},
2077{0x3c00000, 0xff800000, 0x9503366, 0xff800000, 0x3c00000},
2078{0x3c00000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3c00000},
2079{0x3c00000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3c00000},
2080{0x3c00000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3c00000},
2081{0x3c00000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3c00000},
2082{0x3c00000, 0xff800000, 0x966320b, 0xff800000, 0x3c00000},
2083{0x3c00000, 0xff800000, 0xb26bddee, 0xff800000, 0x3c00000},
2084{0x3c00000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3c00000},
2085{0x3c00000, 0xff800000, 0x317285d3, 0xff800000, 0x3c00000},
2086{0x3c00000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3c00000},
2087{0x3c00000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3c00000},
2088{0x3c00000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3c00000},
2089{0x3c00000, 0xff800001, 0x0, 0x7fc00000, 0x3c00001},
2090{0x3c00000, 0xff800001, 0x1, 0x7fc00000, 0x3c00081},
2091{0x3c00000, 0xff800001, 0x76, 0x7fc00000, 0x3c00081},
2092{0x3c00000, 0xff800001, 0x2b94, 0x7fc00000, 0x3c00081},
2093{0x3c00000, 0xff800001, 0x636d24, 0x7fc00000, 0x3c00081},
2094{0x3c00000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3c00081},
2095{0x3c00000, 0xff800001, 0x800000, 0x7fc00000, 0x3c00001},
2096{0x3c00000, 0xff800001, 0x800002, 0x7fc00000, 0x3c00001},
2097{0x3c00000, 0xff800001, 0x1398437, 0x7fc00000, 0x3c00001},
2098{0x3c00000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3c00001},
2099{0x3c00000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3c00001},
2100{0x3c00000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3c00001},
2101{0x3c00000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
2102{0x3c00000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3c00001},
2103{0x3c00000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3c00001},
2104{0x3c00000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3c00001},
2105{0x3c00000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3c00001},
2106{0x3c00000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2107{0x3c00000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3c00001},
2108{0x3c00000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
2109{0x3c00000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3c00001},
2110{0x3c00000, 0xff800001, 0x80000000, 0x7fc00000, 0x3c00001},
2111{0x3c00000, 0xff800001, 0x80000001, 0x7fc00000, 0x3c00081},
2112{0x3c00000, 0xff800001, 0x80000076, 0x7fc00000, 0x3c00081},
2113{0x3c00000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3c00081},
2114{0x3c00000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3c00081},
2115{0x3c00000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3c00081},
2116{0x3c00000, 0xff800001, 0x80800000, 0x7fc00000, 0x3c00001},
2117{0x3c00000, 0xff800001, 0x80800002, 0x7fc00000, 0x3c00001},
2118{0x3c00000, 0xff800001, 0x81398437, 0x7fc00000, 0x3c00001},
2119{0x3c00000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3c00001},
2120{0x3c00000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
2121{0x3c00000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3c00001},
2122{0x3c00000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3c00001},
2123{0x3c00000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3c00001},
2124{0x3c00000, 0xff800001, 0xff800000, 0x7fc00000, 0x3c00001},
2125{0x3c00000, 0xff800001, 0xff800001, 0x7fc00000, 0x3c00001},
2126{0x3c00000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3c00001},
2127{0x3c00000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3c00001},
2128{0x3c00000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3c00001},
2129{0x3c00000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3c00001},
2130{0x3c00000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3c00001},
2131{0x3c00000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3c00001},
2132{0x3c00000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3c00001},
2133{0x3c00000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3c00001},
2134{0x3c00000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3c00001},
2135{0x3c00000, 0xff800001, 0x9503366, 0x7fc00000, 0x3c00001},
2136{0x3c00000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
2137{0x3c00000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
2138{0x3c00000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3c00001},
2139{0x3c00000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
2140{0x3c00000, 0xff800001, 0x966320b, 0x7fc00000, 0x3c00001},
2141{0x3c00000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3c00001},
2142{0x3c00000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
2143{0x3c00000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3c00001},
2144{0x3c00000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3c00001},
2145{0x3c00000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
2146{0x3c00000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3c00001},
2147{0x3c00000, 0xff984a37, 0x0, 0x7fc00000, 0x3c00001},
2148{0x3c00000, 0xff984a37, 0x1, 0x7fc00000, 0x3c00081},
2149{0x3c00000, 0xff984a37, 0x76, 0x7fc00000, 0x3c00081},
2150{0x3c00000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3c00081},
2151{0x3c00000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3c00081},
2152{0x3c00000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3c00081},
2153{0x3c00000, 0xff984a37, 0x800000, 0x7fc00000, 0x3c00001},
2154{0x3c00000, 0xff984a37, 0x800002, 0x7fc00000, 0x3c00001},
2155{0x3c00000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3c00001},
2156{0x3c00000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3c00001},
2157{0x3c00000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3c00001},
2158{0x3c00000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3c00001},
2159{0x3c00000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
2160{0x3c00000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3c00001},
2161{0x3c00000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3c00001},
2162{0x3c00000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3c00001},
2163{0x3c00000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3c00001},
2164{0x3c00000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2165{0x3c00000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3c00001},
2166{0x3c00000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
2167{0x3c00000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3c00001},
2168{0x3c00000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3c00001},
2169{0x3c00000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3c00081},
2170{0x3c00000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3c00081},
2171{0x3c00000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3c00081},
2172{0x3c00000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3c00081},
2173{0x3c00000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3c00081},
2174{0x3c00000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3c00001},
2175{0x3c00000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3c00001},
2176{0x3c00000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3c00001},
2177{0x3c00000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3c00001},
2178{0x3c00000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
2179{0x3c00000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3c00001},
2180{0x3c00000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3c00001},
2181{0x3c00000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3c00001},
2182{0x3c00000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3c00001},
2183{0x3c00000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3c00001},
2184{0x3c00000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3c00001},
2185{0x3c00000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3c00001},
2186{0x3c00000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3c00001},
2187{0x3c00000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3c00001},
2188{0x3c00000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3c00001},
2189{0x3c00000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3c00001},
2190{0x3c00000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3c00001},
2191{0x3c00000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3c00001},
2192{0x3c00000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3c00001},
2193{0x3c00000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3c00001},
2194{0x3c00000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
2195{0x3c00000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
2196{0x3c00000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3c00001},
2197{0x3c00000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
2198{0x3c00000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3c00001},
2199{0x3c00000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3c00001},
2200{0x3c00000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
2201{0x3c00000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3c00001},
2202{0x3c00000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3c00001},
2203{0x3c00000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
2204{0x3c00000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3c00001},
2205{0x3c00000, 0xffbfffff, 0x0, 0x7fc00000, 0x3c00001},
2206{0x3c00000, 0xffbfffff, 0x1, 0x7fc00000, 0x3c00081},
2207{0x3c00000, 0xffbfffff, 0x76, 0x7fc00000, 0x3c00081},
2208{0x3c00000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3c00081},
2209{0x3c00000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3c00081},
2210{0x3c00000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3c00081},
2211{0x3c00000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3c00001},
2212{0x3c00000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3c00001},
2213{0x3c00000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3c00001},
2214{0x3c00000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3c00001},
2215{0x3c00000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3c00001},
2216{0x3c00000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3c00001},
2217{0x3c00000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
2218{0x3c00000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3c00001},
2219{0x3c00000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3c00001},
2220{0x3c00000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3c00001},
2221{0x3c00000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
2222{0x3c00000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2223{0x3c00000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3c00001},
2224{0x3c00000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
2225{0x3c00000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3c00001},
2226{0x3c00000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3c00001},
2227{0x3c00000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3c00081},
2228{0x3c00000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3c00081},
2229{0x3c00000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3c00081},
2230{0x3c00000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3c00081},
2231{0x3c00000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3c00081},
2232{0x3c00000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3c00001},
2233{0x3c00000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3c00001},
2234{0x3c00000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3c00001},
2235{0x3c00000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3c00001},
2236{0x3c00000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
2237{0x3c00000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3c00001},
2238{0x3c00000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3c00001},
2239{0x3c00000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3c00001},
2240{0x3c00000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3c00001},
2241{0x3c00000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3c00001},
2242{0x3c00000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3c00001},
2243{0x3c00000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
2244{0x3c00000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3c00001},
2245{0x3c00000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3c00001},
2246{0x3c00000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3c00001},
2247{0x3c00000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3c00001},
2248{0x3c00000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3c00001},
2249{0x3c00000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3c00001},
2250{0x3c00000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3c00001},
2251{0x3c00000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3c00001},
2252{0x3c00000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
2253{0x3c00000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
2254{0x3c00000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3c00001},
2255{0x3c00000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
2256{0x3c00000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3c00001},
2257{0x3c00000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3c00001},
2258{0x3c00000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
2259{0x3c00000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3c00001},
2260{0x3c00000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3c00001},
2261{0x3c00000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
2262{0x3c00000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3c00001},
2263{0x3c00000, 0xffc00000, 0x0, 0x7fc00000, 0x3c00000},
2264{0x3c00000, 0xffc00000, 0x1, 0x7fc00000, 0x3c00080},
2265{0x3c00000, 0xffc00000, 0x76, 0x7fc00000, 0x3c00080},
2266{0x3c00000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3c00080},
2267{0x3c00000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3c00080},
2268{0x3c00000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3c00080},
2269{0x3c00000, 0xffc00000, 0x800000, 0x7fc00000, 0x3c00000},
2270{0x3c00000, 0xffc00000, 0x800002, 0x7fc00000, 0x3c00000},
2271{0x3c00000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3c00000},
2272{0x3c00000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3c00000},
2273{0x3c00000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3c00000},
2274{0x3c00000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3c00000},
2275{0x3c00000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
2276{0x3c00000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3c00000},
2277{0x3c00000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3c00000},
2278{0x3c00000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3c00001},
2279{0x3c00000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3c00001},
2280{0x3c00000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2281{0x3c00000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3c00000},
2282{0x3c00000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
2283{0x3c00000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3c00000},
2284{0x3c00000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3c00000},
2285{0x3c00000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3c00080},
2286{0x3c00000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3c00080},
2287{0x3c00000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3c00080},
2288{0x3c00000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3c00080},
2289{0x3c00000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3c00080},
2290{0x3c00000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3c00000},
2291{0x3c00000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3c00000},
2292{0x3c00000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3c00000},
2293{0x3c00000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3c00000},
2294{0x3c00000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
2295{0x3c00000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3c00000},
2296{0x3c00000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3c00000},
2297{0x3c00000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3c00000},
2298{0x3c00000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3c00000},
2299{0x3c00000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3c00001},
2300{0x3c00000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3c00001},
2301{0x3c00000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3c00001},
2302{0x3c00000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3c00000},
2303{0x3c00000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
2304{0x3c00000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3c00000},
2305{0x3c00000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3c00000},
2306{0x3c00000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3c00000},
2307{0x3c00000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3c00000},
2308{0x3c00000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3c00000},
2309{0x3c00000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3c00000},
2310{0x3c00000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
2311{0x3c00000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
2312{0x3c00000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3c00000},
2313{0x3c00000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
2314{0x3c00000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3c00000},
2315{0x3c00000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3c00000},
2316{0x3c00000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
2317{0x3c00000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3c00000},
2318{0x3c00000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3c00000},
2319{0x3c00000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
2320{0x3c00000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3c00000},
2321{0x3c00000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3c00000},
2322{0x3c00000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3c00080},
2323{0x3c00000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3c00080},
2324{0x3c00000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3c00080},
2325{0x3c00000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3c00080},
2326{0x3c00000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3c00080},
2327{0x3c00000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3c00000},
2328{0x3c00000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3c00000},
2329{0x3c00000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3c00000},
2330{0x3c00000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3c00000},
2331{0x3c00000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3c00000},
2332{0x3c00000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3c00000},
2333{0x3c00000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
2334{0x3c00000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3c00000},
2335{0x3c00000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3c00000},
2336{0x3c00000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3c00001},
2337{0x3c00000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3c00001},
2338{0x3c00000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2339{0x3c00000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3c00000},
2340{0x3c00000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
2341{0x3c00000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3c00000},
2342{0x3c00000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3c00000},
2343{0x3c00000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3c00080},
2344{0x3c00000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3c00080},
2345{0x3c00000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3c00080},
2346{0x3c00000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3c00080},
2347{0x3c00000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3c00080},
2348{0x3c00000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3c00000},
2349{0x3c00000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3c00000},
2350{0x3c00000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3c00000},
2351{0x3c00000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3c00000},
2352{0x3c00000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
2353{0x3c00000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3c00000},
2354{0x3c00000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3c00000},
2355{0x3c00000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3c00000},
2356{0x3c00000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3c00000},
2357{0x3c00000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3c00001},
2358{0x3c00000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3c00001},
2359{0x3c00000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3c00001},
2360{0x3c00000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3c00000},
2361{0x3c00000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3c00000},
2362{0x3c00000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3c00000},
2363{0x3c00000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3c00000},
2364{0x3c00000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3c00000},
2365{0x3c00000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3c00000},
2366{0x3c00000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3c00000},
2367{0x3c00000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3c00000},
2368{0x3c00000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
2369{0x3c00000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
2370{0x3c00000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3c00000},
2371{0x3c00000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
2372{0x3c00000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3c00000},
2373{0x3c00000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3c00000},
2374{0x3c00000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
2375{0x3c00000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3c00000},
2376{0x3c00000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3c00000},
2377{0x3c00000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
2378{0x3c00000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3c00000},
2379{0x3c00000, 0xffffffff, 0x0, 0x7fc00000, 0x3c00000},
2380{0x3c00000, 0xffffffff, 0x1, 0x7fc00000, 0x3c00080},
2381{0x3c00000, 0xffffffff, 0x76, 0x7fc00000, 0x3c00080},
2382{0x3c00000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3c00080},
2383{0x3c00000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3c00080},
2384{0x3c00000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3c00080},
2385{0x3c00000, 0xffffffff, 0x800000, 0x7fc00000, 0x3c00000},
2386{0x3c00000, 0xffffffff, 0x800002, 0x7fc00000, 0x3c00000},
2387{0x3c00000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3c00000},
2388{0x3c00000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3c00000},
2389{0x3c00000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3c00000},
2390{0x3c00000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3c00000},
2391{0x3c00000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
2392{0x3c00000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3c00000},
2393{0x3c00000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3c00000},
2394{0x3c00000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3c00001},
2395{0x3c00000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
2396{0x3c00000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2397{0x3c00000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3c00000},
2398{0x3c00000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
2399{0x3c00000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3c00000},
2400{0x3c00000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3c00000},
2401{0x3c00000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3c00080},
2402{0x3c00000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3c00080},
2403{0x3c00000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3c00080},
2404{0x3c00000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3c00080},
2405{0x3c00000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3c00080},
2406{0x3c00000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3c00000},
2407{0x3c00000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3c00000},
2408{0x3c00000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3c00000},
2409{0x3c00000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3c00000},
2410{0x3c00000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
2411{0x3c00000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3c00000},
2412{0x3c00000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3c00000},
2413{0x3c00000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3c00000},
2414{0x3c00000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3c00000},
2415{0x3c00000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3c00001},
2416{0x3c00000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3c00001},
2417{0x3c00000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
2418{0x3c00000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3c00000},
2419{0x3c00000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3c00000},
2420{0x3c00000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3c00000},
2421{0x3c00000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3c00000},
2422{0x3c00000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3c00000},
2423{0x3c00000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3c00000},
2424{0x3c00000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3c00000},
2425{0x3c00000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3c00000},
2426{0x3c00000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
2427{0x3c00000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
2428{0x3c00000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3c00000},
2429{0x3c00000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
2430{0x3c00000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3c00000},
2431{0x3c00000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3c00000},
2432{0x3c00000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
2433{0x3c00000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3c00000},
2434{0x3c00000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3c00000},
2435{0x3c00000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
2436{0x3c00000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3c00000},
2437{0x3c00000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3c00000},
2438{0x3c00000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3c00080},
2439{0x3c00000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3c00080},
2440{0x3c00000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3c00080},
2441{0x3c00000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3c00080},
2442{0x3c00000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3c00080},
2443{0x3c00000, 0x4f3495cb, 0x800000, 0x4f3495cb, 0x3c00010},
2444{0x3c00000, 0x4f3495cb, 0x800002, 0x4f3495cb, 0x3c00010},
2445{0x3c00000, 0x4f3495cb, 0x1398437, 0x4f3495cb, 0x3c00010},
2446{0x3c00000, 0x4f3495cb, 0xba98d27, 0x4f3495cb, 0x3c00010},
2447{0x3c00000, 0x4f3495cb, 0xba98d7a, 0x4f3495cb, 0x3c00010},
2448{0x3c00000, 0x4f3495cb, 0x751f853a, 0x751f853a, 0x3c00010},
2449{0x3c00000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
2450{0x3c00000, 0x4f3495cb, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
2451{0x3c00000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3c00000},
2452{0x3c00000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3c00001},
2453{0x3c00000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3c00001},
2454{0x3c00000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2455{0x3c00000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3c00000},
2456{0x3c00000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
2457{0x3c00000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3c00000},
2458{0x3c00000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3c00000},
2459{0x3c00000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3c00080},
2460{0x3c00000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3c00080},
2461{0x3c00000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3c00080},
2462{0x3c00000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3c00080},
2463{0x3c00000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3c00080},
2464{0x3c00000, 0x4f3495cb, 0x80800000, 0x4f3495ca, 0x3c00010},
2465{0x3c00000, 0x4f3495cb, 0x80800002, 0x4f3495ca, 0x3c00010},
2466{0x3c00000, 0x4f3495cb, 0x81398437, 0x4f3495ca, 0x3c00010},
2467{0x3c00000, 0x4f3495cb, 0x8ba98d27, 0x4f3495ca, 0x3c00010},
2468{0x3c00000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495ca, 0x3c00010},
2469{0x3c00000, 0x4f3495cb, 0xf51f853a, 0xf51f8539, 0x3c00010},
2470{0x3c00000, 0x4f3495cb, 0xff7ffff0, 0xff7fffef, 0x3c00010},
2471{0x3c00000, 0x4f3495cb, 0xff7fffff, 0xff7ffffe, 0x3c00010},
2472{0x3c00000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3c00000},
2473{0x3c00000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3c00001},
2474{0x3c00000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3c00001},
2475{0x3c00000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3c00001},
2476{0x3c00000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3c00000},
2477{0x3c00000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3c00000},
2478{0x3c00000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3c00000},
2479{0x3c00000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3c00000},
2480{0x3c00000, 0x4f3495cb, 0xe73a5134, 0xe73a5133, 0x3c00010},
2481{0x3c00000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
2482{0x3c00000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
2483{0x3c00000, 0x4f3495cb, 0x9503366, 0x4f3495cb, 0x3c00010},
2484{0x3c00000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495ca, 0x3c00010},
2485{0x3c00000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
2486{0x3c00000, 0x4f3495cb, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
2487{0x3c00000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495ca, 0x3c00010},
2488{0x3c00000, 0x4f3495cb, 0x966320b, 0x4f3495cb, 0x3c00010},
2489{0x3c00000, 0x4f3495cb, 0xb26bddee, 0x4f3495ca, 0x3c00010},
2490{0x3c00000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495ca, 0x3c00010},
2491{0x3c00000, 0x4f3495cb, 0x317285d3, 0x4f3495cb, 0x3c00010},
2492{0x3c00000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cb, 0x3c00010},
2493{0x3c00000, 0x4f3495cb, 0x51fd2c7c, 0x52016895, 0x3c00010},
2494{0x3c00000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
2495{0x3c00000, 0xe73a5134, 0x0, 0xe73a5134, 0x3c00000},
2496{0x3c00000, 0xe73a5134, 0x1, 0xe73a5134, 0x3c00080},
2497{0x3c00000, 0xe73a5134, 0x76, 0xe73a5134, 0x3c00080},
2498{0x3c00000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3c00080},
2499{0x3c00000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3c00080},
2500{0x3c00000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3c00080},
2501{0x3c00000, 0xe73a5134, 0x800000, 0xe73a5133, 0x3c00010},
2502{0x3c00000, 0xe73a5134, 0x800002, 0xe73a5133, 0x3c00010},
2503{0x3c00000, 0xe73a5134, 0x1398437, 0xe73a5133, 0x3c00010},
2504{0x3c00000, 0xe73a5134, 0xba98d27, 0xe73a5133, 0x3c00010},
2505{0x3c00000, 0xe73a5134, 0xba98d7a, 0xe73a5133, 0x3c00010},
2506{0x3c00000, 0xe73a5134, 0x751f853a, 0x751f8539, 0x3c00010},
2507{0x3c00000, 0xe73a5134, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
2508{0x3c00000, 0xe73a5134, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
2509{0x3c00000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3c00000},
2510{0x3c00000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3c00001},
2511{0x3c00000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3c00001},
2512{0x3c00000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2513{0x3c00000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3c00000},
2514{0x3c00000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
2515{0x3c00000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3c00000},
2516{0x3c00000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3c00000},
2517{0x3c00000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3c00080},
2518{0x3c00000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3c00080},
2519{0x3c00000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3c00080},
2520{0x3c00000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3c00080},
2521{0x3c00000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3c00080},
2522{0x3c00000, 0xe73a5134, 0x80800000, 0xe73a5134, 0x3c00010},
2523{0x3c00000, 0xe73a5134, 0x80800002, 0xe73a5134, 0x3c00010},
2524{0x3c00000, 0xe73a5134, 0x81398437, 0xe73a5134, 0x3c00010},
2525{0x3c00000, 0xe73a5134, 0x8ba98d27, 0xe73a5134, 0x3c00010},
2526{0x3c00000, 0xe73a5134, 0x8ba98d7a, 0xe73a5134, 0x3c00010},
2527{0x3c00000, 0xe73a5134, 0xf51f853a, 0xf51f853a, 0x3c00010},
2528{0x3c00000, 0xe73a5134, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
2529{0x3c00000, 0xe73a5134, 0xff7fffff, 0xff7fffff, 0x3c00010},
2530{0x3c00000, 0xe73a5134, 0xff800000, 0xff800000, 0x3c00000},
2531{0x3c00000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3c00001},
2532{0x3c00000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3c00001},
2533{0x3c00000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3c00001},
2534{0x3c00000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3c00000},
2535{0x3c00000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3c00000},
2536{0x3c00000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3c00000},
2537{0x3c00000, 0xe73a5134, 0x4f3495cb, 0xe73a5133, 0x3c00010},
2538{0x3c00000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3c00000},
2539{0x3c00000, 0xe73a5134, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
2540{0x3c00000, 0xe73a5134, 0x6164bd6c, 0xe73a42e8, 0x3c00010},
2541{0x3c00000, 0xe73a5134, 0x9503366, 0xe73a5133, 0x3c00010},
2542{0x3c00000, 0xe73a5134, 0xbf5a97c9, 0xe73a5134, 0x3c00010},
2543{0x3c00000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3c00000},
2544{0x3c00000, 0xe73a5134, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
2545{0x3c00000, 0xe73a5134, 0xaab4d7d8, 0xe73a5134, 0x3c00010},
2546{0x3c00000, 0xe73a5134, 0x966320b, 0xe73a5133, 0x3c00010},
2547{0x3c00000, 0xe73a5134, 0xb26bddee, 0xe73a5134, 0x3c00010},
2548{0x3c00000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5134, 0x3c00010},
2549{0x3c00000, 0xe73a5134, 0x317285d3, 0xe73a5133, 0x3c00010},
2550{0x3c00000, 0xe73a5134, 0x3c9623b1, 0xe73a5133, 0x3c00010},
2551{0x3c00000, 0xe73a5134, 0x51fd2c7c, 0xe73a5133, 0x3c00010},
2552{0x3c00000, 0xe73a5134, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
2553{0x3c00000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3c00000},
2554{0x3c00000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3c00080},
2555{0x3c00000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3c00080},
2556{0x3c00000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3c00080},
2557{0x3c00000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3c00080},
2558{0x3c00000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3c00080},
2559{0x3c00000, 0x7c994e9e, 0x800000, 0x7c994e9e, 0x3c00010},
2560{0x3c00000, 0x7c994e9e, 0x800002, 0x7c994e9e, 0x3c00010},
2561{0x3c00000, 0x7c994e9e, 0x1398437, 0x7c994e9e, 0x3c00010},
2562{0x3c00000, 0x7c994e9e, 0xba98d27, 0x7c994e9e, 0x3c00010},
2563{0x3c00000, 0x7c994e9e, 0xba98d7a, 0x7c994e9e, 0x3c00010},
2564{0x3c00000, 0x7c994e9e, 0x751f853a, 0x7c994fdd, 0x3c00010},
2565{0x3c00000, 0x7c994e9e, 0x7f7ffff0, 0x7f7fffff, 0x3c00014},
2566{0x3c00000, 0x7c994e9e, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
2567{0x3c00000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3c00000},
2568{0x3c00000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3c00001},
2569{0x3c00000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3c00001},
2570{0x3c00000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2571{0x3c00000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3c00000},
2572{0x3c00000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
2573{0x3c00000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3c00000},
2574{0x3c00000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3c00000},
2575{0x3c00000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3c00080},
2576{0x3c00000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3c00080},
2577{0x3c00000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3c00080},
2578{0x3c00000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3c00080},
2579{0x3c00000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3c00080},
2580{0x3c00000, 0x7c994e9e, 0x80800000, 0x7c994e9d, 0x3c00010},
2581{0x3c00000, 0x7c994e9e, 0x80800002, 0x7c994e9d, 0x3c00010},
2582{0x3c00000, 0x7c994e9e, 0x81398437, 0x7c994e9d, 0x3c00010},
2583{0x3c00000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9d, 0x3c00010},
2584{0x3c00000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9d, 0x3c00010},
2585{0x3c00000, 0x7c994e9e, 0xf51f853a, 0x7c994d5e, 0x3c00010},
2586{0x3c00000, 0x7c994e9e, 0xff7ffff0, 0xff7b357b, 0x3c00010},
2587{0x3c00000, 0x7c994e9e, 0xff7fffff, 0xff7b358a, 0x3c00010},
2588{0x3c00000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3c00000},
2589{0x3c00000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3c00001},
2590{0x3c00000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3c00001},
2591{0x3c00000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3c00001},
2592{0x3c00000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3c00000},
2593{0x3c00000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3c00000},
2594{0x3c00000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3c00000},
2595{0x3c00000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9e, 0x3c00010},
2596{0x3c00000, 0x7c994e9e, 0xe73a5134, 0x7c994e9d, 0x3c00010},
2597{0x3c00000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3c00000},
2598{0x3c00000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9e, 0x3c00010},
2599{0x3c00000, 0x7c994e9e, 0x9503366, 0x7c994e9e, 0x3c00010},
2600{0x3c00000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9d, 0x3c00010},
2601{0x3c00000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9d, 0x3c00010},
2602{0x3c00000, 0x7c994e9e, 0x77f31e2f, 0x7c998b65, 0x3c00010},
2603{0x3c00000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9d, 0x3c00010},
2604{0x3c00000, 0x7c994e9e, 0x966320b, 0x7c994e9e, 0x3c00010},
2605{0x3c00000, 0x7c994e9e, 0xb26bddee, 0x7c994e9d, 0x3c00010},
2606{0x3c00000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9d, 0x3c00010},
2607{0x3c00000, 0x7c994e9e, 0x317285d3, 0x7c994e9e, 0x3c00010},
2608{0x3c00000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9e, 0x3c00010},
2609{0x3c00000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9e, 0x3c00010},
2610{0x3c00000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3c00000},
2611{0x3c00000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3c00000},
2612{0x3c00000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3c00080},
2613{0x3c00000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3c00080},
2614{0x3c00000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3c00080},
2615{0x3c00000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3c00080},
2616{0x3c00000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3c00080},
2617{0x3c00000, 0x6164bd6c, 0x800000, 0x6164bd6c, 0x3c00010},
2618{0x3c00000, 0x6164bd6c, 0x800002, 0x6164bd6c, 0x3c00010},
2619{0x3c00000, 0x6164bd6c, 0x1398437, 0x6164bd6c, 0x3c00010},
2620{0x3c00000, 0x6164bd6c, 0xba98d27, 0x6164bd6c, 0x3c00010},
2621{0x3c00000, 0x6164bd6c, 0xba98d7a, 0x6164bd6c, 0x3c00010},
2622{0x3c00000, 0x6164bd6c, 0x751f853a, 0x751f853a, 0x3c00010},
2623{0x3c00000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
2624{0x3c00000, 0x6164bd6c, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
2625{0x3c00000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3c00000},
2626{0x3c00000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3c00001},
2627{0x3c00000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3c00001},
2628{0x3c00000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2629{0x3c00000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3c00000},
2630{0x3c00000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
2631{0x3c00000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3c00000},
2632{0x3c00000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3c00000},
2633{0x3c00000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3c00080},
2634{0x3c00000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3c00080},
2635{0x3c00000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3c00080},
2636{0x3c00000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3c00080},
2637{0x3c00000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3c00080},
2638{0x3c00000, 0x6164bd6c, 0x80800000, 0x6164bd6b, 0x3c00010},
2639{0x3c00000, 0x6164bd6c, 0x80800002, 0x6164bd6b, 0x3c00010},
2640{0x3c00000, 0x6164bd6c, 0x81398437, 0x6164bd6b, 0x3c00010},
2641{0x3c00000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6b, 0x3c00010},
2642{0x3c00000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6b, 0x3c00010},
2643{0x3c00000, 0x6164bd6c, 0xf51f853a, 0xf51f8539, 0x3c00010},
2644{0x3c00000, 0x6164bd6c, 0xff7ffff0, 0xff7fffef, 0x3c00010},
2645{0x3c00000, 0x6164bd6c, 0xff7fffff, 0xff7ffffe, 0x3c00010},
2646{0x3c00000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3c00000},
2647{0x3c00000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3c00001},
2648{0x3c00000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3c00001},
2649{0x3c00000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3c00001},
2650{0x3c00000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3c00000},
2651{0x3c00000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3c00000},
2652{0x3c00000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3c00000},
2653{0x3c00000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6c, 0x3c00010},
2654{0x3c00000, 0x6164bd6c, 0xe73a5134, 0xe73a42e8, 0x3c00010},
2655{0x3c00000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
2656{0x3c00000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3c00000},
2657{0x3c00000, 0x6164bd6c, 0x9503366, 0x6164bd6c, 0x3c00010},
2658{0x3c00000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6b, 0x3c00010},
2659{0x3c00000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7c, 0x3c00010},
2660{0x3c00000, 0x6164bd6c, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
2661{0x3c00000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6b, 0x3c00010},
2662{0x3c00000, 0x6164bd6c, 0x966320b, 0x6164bd6c, 0x3c00010},
2663{0x3c00000, 0x6164bd6c, 0xb26bddee, 0x6164bd6b, 0x3c00010},
2664{0x3c00000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6b, 0x3c00010},
2665{0x3c00000, 0x6164bd6c, 0x317285d3, 0x6164bd6c, 0x3c00010},
2666{0x3c00000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6c, 0x3c00010},
2667{0x3c00000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6c, 0x3c00010},
2668{0x3c00000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
2669{0x3c00000, 0x9503366, 0x0, 0x9503366, 0x3c00000},
2670{0x3c00000, 0x9503366, 0x1, 0x9503366, 0x3c00080},
2671{0x3c00000, 0x9503366, 0x76, 0x9503366, 0x3c00080},
2672{0x3c00000, 0x9503366, 0x2b94, 0x9503366, 0x3c00080},
2673{0x3c00000, 0x9503366, 0x636d24, 0x9503366, 0x3c00080},
2674{0x3c00000, 0x9503366, 0x7fffff, 0x9503366, 0x3c00080},
2675{0x3c00000, 0x9503366, 0x800000, 0x95033a6, 0x3c00000},
2676{0x3c00000, 0x9503366, 0x800002, 0x95033a6, 0x3c00010},
2677{0x3c00000, 0x9503366, 0x1398437, 0x950341f, 0x3c00010},
2678{0x3c00000, 0x9503366, 0xba98d27, 0xbb00ec2, 0x3c00010},
2679{0x3c00000, 0x9503366, 0xba98d7a, 0xbb00f15, 0x3c00010},
2680{0x3c00000, 0x9503366, 0x751f853a, 0x751f853a, 0x3c00010},
2681{0x3c00000, 0x9503366, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
2682{0x3c00000, 0x9503366, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
2683{0x3c00000, 0x9503366, 0x7f800000, 0x7f800000, 0x3c00000},
2684{0x3c00000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3c00001},
2685{0x3c00000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3c00001},
2686{0x3c00000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2687{0x3c00000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3c00000},
2688{0x3c00000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
2689{0x3c00000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3c00000},
2690{0x3c00000, 0x9503366, 0x80000000, 0x9503366, 0x3c00000},
2691{0x3c00000, 0x9503366, 0x80000001, 0x9503366, 0x3c00080},
2692{0x3c00000, 0x9503366, 0x80000076, 0x9503366, 0x3c00080},
2693{0x3c00000, 0x9503366, 0x80002b94, 0x9503366, 0x3c00080},
2694{0x3c00000, 0x9503366, 0x80636d24, 0x9503366, 0x3c00080},
2695{0x3c00000, 0x9503366, 0x807fffff, 0x9503366, 0x3c00080},
2696{0x3c00000, 0x9503366, 0x80800000, 0x9503326, 0x3c00000},
2697{0x3c00000, 0x9503366, 0x80800002, 0x9503325, 0x3c00010},
2698{0x3c00000, 0x9503366, 0x81398437, 0x95032ac, 0x3c00010},
2699{0x3c00000, 0x9503366, 0x8ba98d27, 0x8ba30b8b, 0x3c00010},
2700{0x3c00000, 0x9503366, 0x8ba98d7a, 0x8ba30bde, 0x3c00010},
2701{0x3c00000, 0x9503366, 0xf51f853a, 0xf51f8539, 0x3c00010},
2702{0x3c00000, 0x9503366, 0xff7ffff0, 0xff7fffef, 0x3c00010},
2703{0x3c00000, 0x9503366, 0xff7fffff, 0xff7ffffe, 0x3c00010},
2704{0x3c00000, 0x9503366, 0xff800000, 0xff800000, 0x3c00000},
2705{0x3c00000, 0x9503366, 0xff800001, 0x7fc00000, 0x3c00001},
2706{0x3c00000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3c00001},
2707{0x3c00000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3c00001},
2708{0x3c00000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3c00000},
2709{0x3c00000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3c00000},
2710{0x3c00000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3c00000},
2711{0x3c00000, 0x9503366, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
2712{0x3c00000, 0x9503366, 0xe73a5134, 0xe73a5133, 0x3c00010},
2713{0x3c00000, 0x9503366, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
2714{0x3c00000, 0x9503366, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
2715{0x3c00000, 0x9503366, 0x9503366, 0x9d03366, 0x3c00000},
2716{0x3c00000, 0x9503366, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
2717{0x3c00000, 0x9503366, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
2718{0x3c00000, 0x9503366, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
2719{0x3c00000, 0x9503366, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
2720{0x3c00000, 0x9503366, 0x966320b, 0x9db32b8, 0x3c00010},
2721{0x3c00000, 0x9503366, 0xb26bddee, 0xb26bdded, 0x3c00010},
2722{0x3c00000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
2723{0x3c00000, 0x9503366, 0x317285d3, 0x317285d3, 0x3c00010},
2724{0x3c00000, 0x9503366, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
2725{0x3c00000, 0x9503366, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
2726{0x3c00000, 0x9503366, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
2727{0x3c00000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3c00000},
2728{0x3c00000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3c00080},
2729{0x3c00000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3c00080},
2730{0x3c00000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3c00080},
2731{0x3c00000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3c00080},
2732{0x3c00000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3c00080},
2733{0x3c00000, 0xbf5a97c9, 0x800000, 0xbf5a97c8, 0x3c00010},
2734{0x3c00000, 0xbf5a97c9, 0x800002, 0xbf5a97c8, 0x3c00010},
2735{0x3c00000, 0xbf5a97c9, 0x1398437, 0xbf5a97c8, 0x3c00010},
2736{0x3c00000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c8, 0x3c00010},
2737{0x3c00000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c8, 0x3c00010},
2738{0x3c00000, 0xbf5a97c9, 0x751f853a, 0x751f8539, 0x3c00010},
2739{0x3c00000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
2740{0x3c00000, 0xbf5a97c9, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
2741{0x3c00000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3c00000},
2742{0x3c00000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3c00001},
2743{0x3c00000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3c00001},
2744{0x3c00000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2745{0x3c00000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3c00000},
2746{0x3c00000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
2747{0x3c00000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3c00000},
2748{0x3c00000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3c00000},
2749{0x3c00000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3c00080},
2750{0x3c00000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3c00080},
2751{0x3c00000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3c00080},
2752{0x3c00000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3c00080},
2753{0x3c00000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3c00080},
2754{0x3c00000, 0xbf5a97c9, 0x80800000, 0xbf5a97c9, 0x3c00010},
2755{0x3c00000, 0xbf5a97c9, 0x80800002, 0xbf5a97c9, 0x3c00010},
2756{0x3c00000, 0xbf5a97c9, 0x81398437, 0xbf5a97c9, 0x3c00010},
2757{0x3c00000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97c9, 0x3c00010},
2758{0x3c00000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97c9, 0x3c00010},
2759{0x3c00000, 0xbf5a97c9, 0xf51f853a, 0xf51f853a, 0x3c00010},
2760{0x3c00000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
2761{0x3c00000, 0xbf5a97c9, 0xff7fffff, 0xff7fffff, 0x3c00010},
2762{0x3c00000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3c00000},
2763{0x3c00000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3c00001},
2764{0x3c00000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3c00001},
2765{0x3c00000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3c00001},
2766{0x3c00000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3c00000},
2767{0x3c00000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3c00000},
2768{0x3c00000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3c00000},
2769{0x3c00000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
2770{0x3c00000, 0xbf5a97c9, 0xe73a5134, 0xe73a5134, 0x3c00010},
2771{0x3c00000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
2772{0x3c00000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
2773{0x3c00000, 0xbf5a97c9, 0x9503366, 0xbf5a97c8, 0x3c00010},
2774{0x3c00000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3c00000},
2775{0x3c00000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
2776{0x3c00000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
2777{0x3c00000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97c9, 0x3c00010},
2778{0x3c00000, 0xbf5a97c9, 0x966320b, 0xbf5a97c8, 0x3c00010},
2779{0x3c00000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97c9, 0x3c00010},
2780{0x3c00000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e2, 0x3c00010},
2781{0x3c00000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c8, 0x3c00010},
2782{0x3c00000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ab, 0x3c00010},
2783{0x3c00000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
2784{0x3c00000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
2785{0x3c00000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3c00000},
2786{0x3c00000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3c00080},
2787{0x3c00000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3c00080},
2788{0x3c00000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3c00080},
2789{0x3c00000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3c00080},
2790{0x3c00000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3c00080},
2791{0x3c00000, 0xe6ff1a14, 0x800000, 0xe6ff1a13, 0x3c00010},
2792{0x3c00000, 0xe6ff1a14, 0x800002, 0xe6ff1a13, 0x3c00010},
2793{0x3c00000, 0xe6ff1a14, 0x1398437, 0xe6ff1a13, 0x3c00010},
2794{0x3c00000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a13, 0x3c00010},
2795{0x3c00000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a13, 0x3c00010},
2796{0x3c00000, 0xe6ff1a14, 0x751f853a, 0x751f8539, 0x3c00010},
2797{0x3c00000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
2798{0x3c00000, 0xe6ff1a14, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
2799{0x3c00000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3c00000},
2800{0x3c00000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3c00001},
2801{0x3c00000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3c00001},
2802{0x3c00000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2803{0x3c00000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3c00000},
2804{0x3c00000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
2805{0x3c00000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3c00000},
2806{0x3c00000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3c00000},
2807{0x3c00000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3c00080},
2808{0x3c00000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3c00080},
2809{0x3c00000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3c00080},
2810{0x3c00000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3c00080},
2811{0x3c00000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3c00080},
2812{0x3c00000, 0xe6ff1a14, 0x80800000, 0xe6ff1a14, 0x3c00010},
2813{0x3c00000, 0xe6ff1a14, 0x80800002, 0xe6ff1a14, 0x3c00010},
2814{0x3c00000, 0xe6ff1a14, 0x81398437, 0xe6ff1a14, 0x3c00010},
2815{0x3c00000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a14, 0x3c00010},
2816{0x3c00000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a14, 0x3c00010},
2817{0x3c00000, 0xe6ff1a14, 0xf51f853a, 0xf51f853a, 0x3c00010},
2818{0x3c00000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
2819{0x3c00000, 0xe6ff1a14, 0xff7fffff, 0xff7fffff, 0x3c00010},
2820{0x3c00000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3c00000},
2821{0x3c00000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3c00001},
2822{0x3c00000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3c00001},
2823{0x3c00000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3c00001},
2824{0x3c00000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3c00000},
2825{0x3c00000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3c00000},
2826{0x3c00000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3c00000},
2827{0x3c00000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a13, 0x3c00010},
2828{0x3c00000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3c00000},
2829{0x3c00000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
2830{0x3c00000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7c, 0x3c00010},
2831{0x3c00000, 0xe6ff1a14, 0x9503366, 0xe6ff1a13, 0x3c00010},
2832{0x3c00000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a14, 0x3c00010},
2833{0x3c00000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3c00000},
2834{0x3c00000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
2835{0x3c00000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a14, 0x3c00010},
2836{0x3c00000, 0xe6ff1a14, 0x966320b, 0xe6ff1a13, 0x3c00010},
2837{0x3c00000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a14, 0x3c00010},
2838{0x3c00000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a14, 0x3c00010},
2839{0x3c00000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a13, 0x3c00010},
2840{0x3c00000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a13, 0x3c00010},
2841{0x3c00000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a13, 0x3c00010},
2842{0x3c00000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
2843{0x3c00000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3c00000},
2844{0x3c00000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3c00080},
2845{0x3c00000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3c00080},
2846{0x3c00000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3c00080},
2847{0x3c00000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3c00080},
2848{0x3c00000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3c00080},
2849{0x3c00000, 0x77f31e2f, 0x800000, 0x77f31e2f, 0x3c00010},
2850{0x3c00000, 0x77f31e2f, 0x800002, 0x77f31e2f, 0x3c00010},
2851{0x3c00000, 0x77f31e2f, 0x1398437, 0x77f31e2f, 0x3c00010},
2852{0x3c00000, 0x77f31e2f, 0xba98d27, 0x77f31e2f, 0x3c00010},
2853{0x3c00000, 0x77f31e2f, 0xba98d7a, 0x77f31e2f, 0x3c00010},
2854{0x3c00000, 0x77f31e2f, 0x751f853a, 0x77f81a58, 0x3c00010},
2855{0x3c00000, 0x77f31e2f, 0x7f7ffff0, 0x7f7fffff, 0x3c00014},
2856{0x3c00000, 0x77f31e2f, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
2857{0x3c00000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3c00000},
2858{0x3c00000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3c00001},
2859{0x3c00000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3c00001},
2860{0x3c00000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2861{0x3c00000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3c00000},
2862{0x3c00000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
2863{0x3c00000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3c00000},
2864{0x3c00000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3c00000},
2865{0x3c00000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3c00080},
2866{0x3c00000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3c00080},
2867{0x3c00000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3c00080},
2868{0x3c00000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3c00080},
2869{0x3c00000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3c00080},
2870{0x3c00000, 0x77f31e2f, 0x80800000, 0x77f31e2e, 0x3c00010},
2871{0x3c00000, 0x77f31e2f, 0x80800002, 0x77f31e2e, 0x3c00010},
2872{0x3c00000, 0x77f31e2f, 0x81398437, 0x77f31e2e, 0x3c00010},
2873{0x3c00000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2e, 0x3c00010},
2874{0x3c00000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2e, 0x3c00010},
2875{0x3c00000, 0x77f31e2f, 0xf51f853a, 0x77ee2205, 0x3c00010},
2876{0x3c00000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe09, 0x3c00010},
2877{0x3c00000, 0x77f31e2f, 0xff7fffff, 0xff7ffe18, 0x3c00010},
2878{0x3c00000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3c00000},
2879{0x3c00000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3c00001},
2880{0x3c00000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3c00001},
2881{0x3c00000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3c00001},
2882{0x3c00000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3c00000},
2883{0x3c00000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3c00000},
2884{0x3c00000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3c00000},
2885{0x3c00000, 0x77f31e2f, 0x4f3495cb, 0x77f31e2f, 0x3c00010},
2886{0x3c00000, 0x77f31e2f, 0xe73a5134, 0x77f31e2e, 0x3c00010},
2887{0x3c00000, 0x77f31e2f, 0x7c994e9e, 0x7c998b65, 0x3c00010},
2888{0x3c00000, 0x77f31e2f, 0x6164bd6c, 0x77f31e2f, 0x3c00010},
2889{0x3c00000, 0x77f31e2f, 0x9503366, 0x77f31e2f, 0x3c00010},
2890{0x3c00000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2e, 0x3c00010},
2891{0x3c00000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2e, 0x3c00010},
2892{0x3c00000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3c00000},
2893{0x3c00000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2e, 0x3c00010},
2894{0x3c00000, 0x77f31e2f, 0x966320b, 0x77f31e2f, 0x3c00010},
2895{0x3c00000, 0x77f31e2f, 0xb26bddee, 0x77f31e2e, 0x3c00010},
2896{0x3c00000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2e, 0x3c00010},
2897{0x3c00000, 0x77f31e2f, 0x317285d3, 0x77f31e2f, 0x3c00010},
2898{0x3c00000, 0x77f31e2f, 0x3c9623b1, 0x77f31e2f, 0x3c00010},
2899{0x3c00000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e2f, 0x3c00010},
2900{0x3c00000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8a, 0x3c00010},
2901{0x3c00000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3c00000},
2902{0x3c00000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3c00080},
2903{0x3c00000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3c00080},
2904{0x3c00000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3c00080},
2905{0x3c00000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3c00080},
2906{0x3c00000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3c00080},
2907{0x3c00000, 0xaab4d7d8, 0x800000, 0xaab4d7d7, 0x3c00010},
2908{0x3c00000, 0xaab4d7d8, 0x800002, 0xaab4d7d7, 0x3c00010},
2909{0x3c00000, 0xaab4d7d8, 0x1398437, 0xaab4d7d7, 0x3c00010},
2910{0x3c00000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d7, 0x3c00010},
2911{0x3c00000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d7, 0x3c00010},
2912{0x3c00000, 0xaab4d7d8, 0x751f853a, 0x751f8539, 0x3c00010},
2913{0x3c00000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
2914{0x3c00000, 0xaab4d7d8, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
2915{0x3c00000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3c00000},
2916{0x3c00000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3c00001},
2917{0x3c00000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3c00001},
2918{0x3c00000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2919{0x3c00000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3c00000},
2920{0x3c00000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
2921{0x3c00000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3c00000},
2922{0x3c00000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3c00000},
2923{0x3c00000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3c00080},
2924{0x3c00000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3c00080},
2925{0x3c00000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3c00080},
2926{0x3c00000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3c00080},
2927{0x3c00000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3c00080},
2928{0x3c00000, 0xaab4d7d8, 0x80800000, 0xaab4d7d8, 0x3c00010},
2929{0x3c00000, 0xaab4d7d8, 0x80800002, 0xaab4d7d8, 0x3c00010},
2930{0x3c00000, 0xaab4d7d8, 0x81398437, 0xaab4d7d8, 0x3c00010},
2931{0x3c00000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d8, 0x3c00010},
2932{0x3c00000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d8, 0x3c00010},
2933{0x3c00000, 0xaab4d7d8, 0xf51f853a, 0xf51f853a, 0x3c00010},
2934{0x3c00000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
2935{0x3c00000, 0xaab4d7d8, 0xff7fffff, 0xff7fffff, 0x3c00010},
2936{0x3c00000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3c00000},
2937{0x3c00000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3c00001},
2938{0x3c00000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3c00001},
2939{0x3c00000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3c00001},
2940{0x3c00000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3c00000},
2941{0x3c00000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3c00000},
2942{0x3c00000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3c00000},
2943{0x3c00000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
2944{0x3c00000, 0xaab4d7d8, 0xe73a5134, 0xe73a5134, 0x3c00010},
2945{0x3c00000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
2946{0x3c00000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
2947{0x3c00000, 0xaab4d7d8, 0x9503366, 0xaab4d7d7, 0x3c00010},
2948{0x3c00000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
2949{0x3c00000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
2950{0x3c00000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
2951{0x3c00000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3c00000},
2952{0x3c00000, 0xaab4d7d8, 0x966320b, 0xaab4d7d7, 0x3c00010},
2953{0x3c00000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf57, 0x3c00010},
2954{0x3c00000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d5, 0x3c00010},
2955{0x3c00000, 0xaab4d7d8, 0x317285d3, 0x3172802c, 0x3c00010},
2956{0x3c00000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
2957{0x3c00000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
2958{0x3c00000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
2959{0x3c00000, 0x966320b, 0x0, 0x966320b, 0x3c00000},
2960{0x3c00000, 0x966320b, 0x1, 0x966320b, 0x3c00080},
2961{0x3c00000, 0x966320b, 0x76, 0x966320b, 0x3c00080},
2962{0x3c00000, 0x966320b, 0x2b94, 0x966320b, 0x3c00080},
2963{0x3c00000, 0x966320b, 0x636d24, 0x966320b, 0x3c00080},
2964{0x3c00000, 0x966320b, 0x7fffff, 0x966320b, 0x3c00080},
2965{0x3c00000, 0x966320b, 0x800000, 0x966324b, 0x3c00000},
2966{0x3c00000, 0x966320b, 0x800002, 0x966324b, 0x3c00010},
2967{0x3c00000, 0x966320b, 0x1398437, 0x96632c4, 0x3c00010},
2968{0x3c00000, 0x966320b, 0xba98d27, 0xbb0beb7, 0x3c00010},
2969{0x3c00000, 0x966320b, 0xba98d7a, 0xbb0bf0a, 0x3c00010},
2970{0x3c00000, 0x966320b, 0x751f853a, 0x751f853a, 0x3c00010},
2971{0x3c00000, 0x966320b, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
2972{0x3c00000, 0x966320b, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
2973{0x3c00000, 0x966320b, 0x7f800000, 0x7f800000, 0x3c00000},
2974{0x3c00000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3c00001},
2975{0x3c00000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3c00001},
2976{0x3c00000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3c00001},
2977{0x3c00000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3c00000},
2978{0x3c00000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
2979{0x3c00000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3c00000},
2980{0x3c00000, 0x966320b, 0x80000000, 0x966320b, 0x3c00000},
2981{0x3c00000, 0x966320b, 0x80000001, 0x966320b, 0x3c00080},
2982{0x3c00000, 0x966320b, 0x80000076, 0x966320b, 0x3c00080},
2983{0x3c00000, 0x966320b, 0x80002b94, 0x966320b, 0x3c00080},
2984{0x3c00000, 0x966320b, 0x80636d24, 0x966320b, 0x3c00080},
2985{0x3c00000, 0x966320b, 0x807fffff, 0x966320b, 0x3c00080},
2986{0x3c00000, 0x966320b, 0x80800000, 0x96631cb, 0x3c00000},
2987{0x3c00000, 0x966320b, 0x80800002, 0x96631ca, 0x3c00010},
2988{0x3c00000, 0x966320b, 0x81398437, 0x9663151, 0x3c00010},
2989{0x3c00000, 0x966320b, 0x8ba98d27, 0x8ba25b96, 0x3c00010},
2990{0x3c00000, 0x966320b, 0x8ba98d7a, 0x8ba25be9, 0x3c00010},
2991{0x3c00000, 0x966320b, 0xf51f853a, 0xf51f8539, 0x3c00010},
2992{0x3c00000, 0x966320b, 0xff7ffff0, 0xff7fffef, 0x3c00010},
2993{0x3c00000, 0x966320b, 0xff7fffff, 0xff7ffffe, 0x3c00010},
2994{0x3c00000, 0x966320b, 0xff800000, 0xff800000, 0x3c00000},
2995{0x3c00000, 0x966320b, 0xff800001, 0x7fc00000, 0x3c00001},
2996{0x3c00000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3c00001},
2997{0x3c00000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3c00001},
2998{0x3c00000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3c00000},
2999{0x3c00000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3c00000},
3000{0x3c00000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3c00000},
3001{0x3c00000, 0x966320b, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
3002{0x3c00000, 0x966320b, 0xe73a5134, 0xe73a5133, 0x3c00010},
3003{0x3c00000, 0x966320b, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
3004{0x3c00000, 0x966320b, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
3005{0x3c00000, 0x966320b, 0x9503366, 0x9db32b8, 0x3c00010},
3006{0x3c00000, 0x966320b, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
3007{0x3c00000, 0x966320b, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
3008{0x3c00000, 0x966320b, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
3009{0x3c00000, 0x966320b, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
3010{0x3c00000, 0x966320b, 0x966320b, 0x9e6320b, 0x3c00000},
3011{0x3c00000, 0x966320b, 0xb26bddee, 0xb26bdded, 0x3c00010},
3012{0x3c00000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
3013{0x3c00000, 0x966320b, 0x317285d3, 0x317285d3, 0x3c00010},
3014{0x3c00000, 0x966320b, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
3015{0x3c00000, 0x966320b, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
3016{0x3c00000, 0x966320b, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
3017{0x3c00000, 0xb26bddee, 0x0, 0xb26bddee, 0x3c00000},
3018{0x3c00000, 0xb26bddee, 0x1, 0xb26bddee, 0x3c00080},
3019{0x3c00000, 0xb26bddee, 0x76, 0xb26bddee, 0x3c00080},
3020{0x3c00000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3c00080},
3021{0x3c00000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3c00080},
3022{0x3c00000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3c00080},
3023{0x3c00000, 0xb26bddee, 0x800000, 0xb26bdded, 0x3c00010},
3024{0x3c00000, 0xb26bddee, 0x800002, 0xb26bdded, 0x3c00010},
3025{0x3c00000, 0xb26bddee, 0x1398437, 0xb26bdded, 0x3c00010},
3026{0x3c00000, 0xb26bddee, 0xba98d27, 0xb26bdded, 0x3c00010},
3027{0x3c00000, 0xb26bddee, 0xba98d7a, 0xb26bdded, 0x3c00010},
3028{0x3c00000, 0xb26bddee, 0x751f853a, 0x751f8539, 0x3c00010},
3029{0x3c00000, 0xb26bddee, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
3030{0x3c00000, 0xb26bddee, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
3031{0x3c00000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3c00000},
3032{0x3c00000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3c00001},
3033{0x3c00000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3c00001},
3034{0x3c00000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3c00001},
3035{0x3c00000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3c00000},
3036{0x3c00000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
3037{0x3c00000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3c00000},
3038{0x3c00000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3c00000},
3039{0x3c00000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3c00080},
3040{0x3c00000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3c00080},
3041{0x3c00000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3c00080},
3042{0x3c00000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3c00080},
3043{0x3c00000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3c00080},
3044{0x3c00000, 0xb26bddee, 0x80800000, 0xb26bddee, 0x3c00010},
3045{0x3c00000, 0xb26bddee, 0x80800002, 0xb26bddee, 0x3c00010},
3046{0x3c00000, 0xb26bddee, 0x81398437, 0xb26bddee, 0x3c00010},
3047{0x3c00000, 0xb26bddee, 0x8ba98d27, 0xb26bddee, 0x3c00010},
3048{0x3c00000, 0xb26bddee, 0x8ba98d7a, 0xb26bddee, 0x3c00010},
3049{0x3c00000, 0xb26bddee, 0xf51f853a, 0xf51f853a, 0x3c00010},
3050{0x3c00000, 0xb26bddee, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
3051{0x3c00000, 0xb26bddee, 0xff7fffff, 0xff7fffff, 0x3c00010},
3052{0x3c00000, 0xb26bddee, 0xff800000, 0xff800000, 0x3c00000},
3053{0x3c00000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3c00001},
3054{0x3c00000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3c00001},
3055{0x3c00000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3c00001},
3056{0x3c00000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3c00000},
3057{0x3c00000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3c00000},
3058{0x3c00000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3c00000},
3059{0x3c00000, 0xb26bddee, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
3060{0x3c00000, 0xb26bddee, 0xe73a5134, 0xe73a5134, 0x3c00010},
3061{0x3c00000, 0xb26bddee, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
3062{0x3c00000, 0xb26bddee, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
3063{0x3c00000, 0xb26bddee, 0x9503366, 0xb26bdded, 0x3c00010},
3064{0x3c00000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
3065{0x3c00000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
3066{0x3c00000, 0xb26bddee, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
3067{0x3c00000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf57, 0x3c00010},
3068{0x3c00000, 0xb26bddee, 0x966320b, 0xb26bdded, 0x3c00010},
3069{0x3c00000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3c00000},
3070{0x3c00000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8e, 0x3c00010},
3071{0x3c00000, 0xb26bddee, 0x317285d3, 0xb22f3c79, 0x3c00010},
3072{0x3c00000, 0xb26bddee, 0x3c9623b1, 0x3c9623a9, 0x3c00010},
3073{0x3c00000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
3074{0x3c00000, 0xb26bddee, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
3075{0x3c00000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3c00000},
3076{0x3c00000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3c00080},
3077{0x3c00000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3c00080},
3078{0x3c00000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3c00080},
3079{0x3c00000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3c00080},
3080{0x3c00000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3c00080},
3081{0x3c00000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d2, 0x3c00010},
3082{0x3c00000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d2, 0x3c00010},
3083{0x3c00000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d2, 0x3c00010},
3084{0x3c00000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d2, 0x3c00010},
3085{0x3c00000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d2, 0x3c00010},
3086{0x3c00000, 0xb5c8e5d3, 0x751f853a, 0x751f8539, 0x3c00010},
3087{0x3c00000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
3088{0x3c00000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
3089{0x3c00000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3c00000},
3090{0x3c00000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3c00001},
3091{0x3c00000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3c00001},
3092{0x3c00000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3c00001},
3093{0x3c00000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3c00000},
3094{0x3c00000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
3095{0x3c00000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3c00000},
3096{0x3c00000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3c00000},
3097{0x3c00000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3c00080},
3098{0x3c00000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3c00080},
3099{0x3c00000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3c00080},
3100{0x3c00000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3c00080},
3101{0x3c00000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3c00080},
3102{0x3c00000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d3, 0x3c00010},
3103{0x3c00000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d3, 0x3c00010},
3104{0x3c00000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d3, 0x3c00010},
3105{0x3c00000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d3, 0x3c00010},
3106{0x3c00000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d3, 0x3c00010},
3107{0x3c00000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853a, 0x3c00010},
3108{0x3c00000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
3109{0x3c00000, 0xb5c8e5d3, 0xff7fffff, 0xff7fffff, 0x3c00010},
3110{0x3c00000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3c00000},
3111{0x3c00000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3c00001},
3112{0x3c00000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3c00001},
3113{0x3c00000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3c00001},
3114{0x3c00000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3c00000},
3115{0x3c00000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3c00000},
3116{0x3c00000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3c00000},
3117{0x3c00000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
3118{0x3c00000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5134, 0x3c00010},
3119{0x3c00000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
3120{0x3c00000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
3121{0x3c00000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d2, 0x3c00010},
3122{0x3c00000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e2, 0x3c00010},
3123{0x3c00000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
3124{0x3c00000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
3125{0x3c00000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d5, 0x3c00010},
3126{0x3c00000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d2, 0x3c00010},
3127{0x3c00000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8e, 0x3c00010},
3128{0x3c00000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3c00000},
3129{0x3c00000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c90, 0x3c00010},
3130{0x3c00000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208d, 0x3c00010},
3131{0x3c00000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
3132{0x3c00000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
3133{0x3c00000, 0x317285d3, 0x0, 0x317285d3, 0x3c00000},
3134{0x3c00000, 0x317285d3, 0x1, 0x317285d3, 0x3c00080},
3135{0x3c00000, 0x317285d3, 0x76, 0x317285d3, 0x3c00080},
3136{0x3c00000, 0x317285d3, 0x2b94, 0x317285d3, 0x3c00080},
3137{0x3c00000, 0x317285d3, 0x636d24, 0x317285d3, 0x3c00080},
3138{0x3c00000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3c00080},
3139{0x3c00000, 0x317285d3, 0x800000, 0x317285d3, 0x3c00010},
3140{0x3c00000, 0x317285d3, 0x800002, 0x317285d3, 0x3c00010},
3141{0x3c00000, 0x317285d3, 0x1398437, 0x317285d3, 0x3c00010},
3142{0x3c00000, 0x317285d3, 0xba98d27, 0x317285d3, 0x3c00010},
3143{0x3c00000, 0x317285d3, 0xba98d7a, 0x317285d3, 0x3c00010},
3144{0x3c00000, 0x317285d3, 0x751f853a, 0x751f853a, 0x3c00010},
3145{0x3c00000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
3146{0x3c00000, 0x317285d3, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
3147{0x3c00000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3c00000},
3148{0x3c00000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3c00001},
3149{0x3c00000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3c00001},
3150{0x3c00000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3c00001},
3151{0x3c00000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3c00000},
3152{0x3c00000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
3153{0x3c00000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3c00000},
3154{0x3c00000, 0x317285d3, 0x80000000, 0x317285d3, 0x3c00000},
3155{0x3c00000, 0x317285d3, 0x80000001, 0x317285d3, 0x3c00080},
3156{0x3c00000, 0x317285d3, 0x80000076, 0x317285d3, 0x3c00080},
3157{0x3c00000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3c00080},
3158{0x3c00000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3c00080},
3159{0x3c00000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3c00080},
3160{0x3c00000, 0x317285d3, 0x80800000, 0x317285d2, 0x3c00010},
3161{0x3c00000, 0x317285d3, 0x80800002, 0x317285d2, 0x3c00010},
3162{0x3c00000, 0x317285d3, 0x81398437, 0x317285d2, 0x3c00010},
3163{0x3c00000, 0x317285d3, 0x8ba98d27, 0x317285d2, 0x3c00010},
3164{0x3c00000, 0x317285d3, 0x8ba98d7a, 0x317285d2, 0x3c00010},
3165{0x3c00000, 0x317285d3, 0xf51f853a, 0xf51f8539, 0x3c00010},
3166{0x3c00000, 0x317285d3, 0xff7ffff0, 0xff7fffef, 0x3c00010},
3167{0x3c00000, 0x317285d3, 0xff7fffff, 0xff7ffffe, 0x3c00010},
3168{0x3c00000, 0x317285d3, 0xff800000, 0xff800000, 0x3c00000},
3169{0x3c00000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3c00001},
3170{0x3c00000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3c00001},
3171{0x3c00000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3c00001},
3172{0x3c00000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3c00000},
3173{0x3c00000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3c00000},
3174{0x3c00000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3c00000},
3175{0x3c00000, 0x317285d3, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
3176{0x3c00000, 0x317285d3, 0xe73a5134, 0xe73a5133, 0x3c00010},
3177{0x3c00000, 0x317285d3, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
3178{0x3c00000, 0x317285d3, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
3179{0x3c00000, 0x317285d3, 0x9503366, 0x317285d3, 0x3c00010},
3180{0x3c00000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
3181{0x3c00000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
3182{0x3c00000, 0x317285d3, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
3183{0x3c00000, 0x317285d3, 0xaab4d7d8, 0x3172802c, 0x3c00010},
3184{0x3c00000, 0x317285d3, 0x966320b, 0x317285d3, 0x3c00010},
3185{0x3c00000, 0x317285d3, 0xb26bddee, 0xb22f3c79, 0x3c00010},
3186{0x3c00000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c90, 0x3c00010},
3187{0x3c00000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3c00000},
3188{0x3c00000, 0x317285d3, 0x3c9623b1, 0x3c9623b2, 0x3c00010},
3189{0x3c00000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
3190{0x3c00000, 0x317285d3, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
3191{0x3c00000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3c00000},
3192{0x3c00000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3c00080},
3193{0x3c00000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3c00080},
3194{0x3c00000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3c00080},
3195{0x3c00000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3c00080},
3196{0x3c00000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3c00080},
3197{0x3c00000, 0x3c9623b1, 0x800000, 0x3c9623b1, 0x3c00010},
3198{0x3c00000, 0x3c9623b1, 0x800002, 0x3c9623b1, 0x3c00010},
3199{0x3c00000, 0x3c9623b1, 0x1398437, 0x3c9623b1, 0x3c00010},
3200{0x3c00000, 0x3c9623b1, 0xba98d27, 0x3c9623b1, 0x3c00010},
3201{0x3c00000, 0x3c9623b1, 0xba98d7a, 0x3c9623b1, 0x3c00010},
3202{0x3c00000, 0x3c9623b1, 0x751f853a, 0x751f853a, 0x3c00010},
3203{0x3c00000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
3204{0x3c00000, 0x3c9623b1, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
3205{0x3c00000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3c00000},
3206{0x3c00000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3c00001},
3207{0x3c00000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3c00001},
3208{0x3c00000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3c00001},
3209{0x3c00000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3c00000},
3210{0x3c00000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
3211{0x3c00000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3c00000},
3212{0x3c00000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3c00000},
3213{0x3c00000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3c00080},
3214{0x3c00000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3c00080},
3215{0x3c00000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3c00080},
3216{0x3c00000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3c00080},
3217{0x3c00000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3c00080},
3218{0x3c00000, 0x3c9623b1, 0x80800000, 0x3c9623b0, 0x3c00010},
3219{0x3c00000, 0x3c9623b1, 0x80800002, 0x3c9623b0, 0x3c00010},
3220{0x3c00000, 0x3c9623b1, 0x81398437, 0x3c9623b0, 0x3c00010},
3221{0x3c00000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b0, 0x3c00010},
3222{0x3c00000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b0, 0x3c00010},
3223{0x3c00000, 0x3c9623b1, 0xf51f853a, 0xf51f8539, 0x3c00010},
3224{0x3c00000, 0x3c9623b1, 0xff7ffff0, 0xff7fffef, 0x3c00010},
3225{0x3c00000, 0x3c9623b1, 0xff7fffff, 0xff7ffffe, 0x3c00010},
3226{0x3c00000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3c00000},
3227{0x3c00000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3c00001},
3228{0x3c00000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3c00001},
3229{0x3c00000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3c00001},
3230{0x3c00000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3c00000},
3231{0x3c00000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3c00000},
3232{0x3c00000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3c00000},
3233{0x3c00000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
3234{0x3c00000, 0x3c9623b1, 0xe73a5134, 0xe73a5133, 0x3c00010},
3235{0x3c00000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
3236{0x3c00000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
3237{0x3c00000, 0x3c9623b1, 0x9503366, 0x3c9623b1, 0x3c00010},
3238{0x3c00000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ab, 0x3c00010},
3239{0x3c00000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
3240{0x3c00000, 0x3c9623b1, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
3241{0x3c00000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b0, 0x3c00010},
3242{0x3c00000, 0x3c9623b1, 0x966320b, 0x3c9623b1, 0x3c00010},
3243{0x3c00000, 0x3c9623b1, 0xb26bddee, 0x3c9623a9, 0x3c00010},
3244{0x3c00000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208d, 0x3c00010},
3245{0x3c00000, 0x3c9623b1, 0x317285d3, 0x3c9623b2, 0x3c00010},
3246{0x3c00000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3c00000},
3247{0x3c00000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
3248{0x3c00000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
3249{0x3c00000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3c00000},
3250{0x3c00000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3c00080},
3251{0x3c00000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3c00080},
3252{0x3c00000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3c00080},
3253{0x3c00000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3c00080},
3254{0x3c00000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3c00080},
3255{0x3c00000, 0x51fd2c7c, 0x800000, 0x51fd2c7c, 0x3c00010},
3256{0x3c00000, 0x51fd2c7c, 0x800002, 0x51fd2c7c, 0x3c00010},
3257{0x3c00000, 0x51fd2c7c, 0x1398437, 0x51fd2c7c, 0x3c00010},
3258{0x3c00000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7c, 0x3c00010},
3259{0x3c00000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7c, 0x3c00010},
3260{0x3c00000, 0x51fd2c7c, 0x751f853a, 0x751f853a, 0x3c00010},
3261{0x3c00000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
3262{0x3c00000, 0x51fd2c7c, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
3263{0x3c00000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3c00000},
3264{0x3c00000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3c00001},
3265{0x3c00000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3c00001},
3266{0x3c00000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3c00001},
3267{0x3c00000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3c00000},
3268{0x3c00000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
3269{0x3c00000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3c00000},
3270{0x3c00000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3c00000},
3271{0x3c00000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3c00080},
3272{0x3c00000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3c00080},
3273{0x3c00000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3c00080},
3274{0x3c00000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3c00080},
3275{0x3c00000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3c00080},
3276{0x3c00000, 0x51fd2c7c, 0x80800000, 0x51fd2c7b, 0x3c00010},
3277{0x3c00000, 0x51fd2c7c, 0x80800002, 0x51fd2c7b, 0x3c00010},
3278{0x3c00000, 0x51fd2c7c, 0x81398437, 0x51fd2c7b, 0x3c00010},
3279{0x3c00000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7b, 0x3c00010},
3280{0x3c00000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7b, 0x3c00010},
3281{0x3c00000, 0x51fd2c7c, 0xf51f853a, 0xf51f8539, 0x3c00010},
3282{0x3c00000, 0x51fd2c7c, 0xff7ffff0, 0xff7fffef, 0x3c00010},
3283{0x3c00000, 0x51fd2c7c, 0xff7fffff, 0xff7ffffe, 0x3c00010},
3284{0x3c00000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3c00000},
3285{0x3c00000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3c00001},
3286{0x3c00000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3c00001},
3287{0x3c00000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3c00001},
3288{0x3c00000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3c00000},
3289{0x3c00000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3c00000},
3290{0x3c00000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3c00000},
3291{0x3c00000, 0x51fd2c7c, 0x4f3495cb, 0x52016895, 0x3c00010},
3292{0x3c00000, 0x51fd2c7c, 0xe73a5134, 0xe73a5133, 0x3c00010},
3293{0x3c00000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
3294{0x3c00000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
3295{0x3c00000, 0x51fd2c7c, 0x9503366, 0x51fd2c7c, 0x3c00010},
3296{0x3c00000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7b, 0x3c00010},
3297{0x3c00000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
3298{0x3c00000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
3299{0x3c00000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7b, 0x3c00010},
3300{0x3c00000, 0x51fd2c7c, 0x966320b, 0x51fd2c7c, 0x3c00010},
3301{0x3c00000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7b, 0x3c00010},
3302{0x3c00000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7b, 0x3c00010},
3303{0x3c00000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7c, 0x3c00010},
3304{0x3c00000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7c, 0x3c00010},
3305{0x3c00000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3c00000},
3306{0x3c00000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
3307{0x3c00000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3c00000},
3308{0x3c00000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3c00080},
3309{0x3c00000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3c00080},
3310{0x3c00000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3c00080},
3311{0x3c00000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3c00080},
3312{0x3c00000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3c00080},
3313{0x3c00000, 0x7b906a6c, 0x800000, 0x7b906a6c, 0x3c00010},
3314{0x3c00000, 0x7b906a6c, 0x800002, 0x7b906a6c, 0x3c00010},
3315{0x3c00000, 0x7b906a6c, 0x1398437, 0x7b906a6c, 0x3c00010},
3316{0x3c00000, 0x7b906a6c, 0xba98d27, 0x7b906a6c, 0x3c00010},
3317{0x3c00000, 0x7b906a6c, 0xba98d7a, 0x7b906a6c, 0x3c00010},
3318{0x3c00000, 0x7b906a6c, 0x751f853a, 0x7b906f68, 0x3c00010},
3319{0x3c00000, 0x7b906a6c, 0x7f7ffff0, 0x7f7fffff, 0x3c00014},
3320{0x3c00000, 0x7b906a6c, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
3321{0x3c00000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3c00000},
3322{0x3c00000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3c00001},
3323{0x3c00000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3c00001},
3324{0x3c00000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3c00001},
3325{0x3c00000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3c00000},
3326{0x3c00000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
3327{0x3c00000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3c00000},
3328{0x3c00000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3c00000},
3329{0x3c00000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3c00080},
3330{0x3c00000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3c00080},
3331{0x3c00000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3c00080},
3332{0x3c00000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3c00080},
3333{0x3c00000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3c00080},
3334{0x3c00000, 0x7b906a6c, 0x80800000, 0x7b906a6b, 0x3c00010},
3335{0x3c00000, 0x7b906a6c, 0x80800002, 0x7b906a6b, 0x3c00010},
3336{0x3c00000, 0x7b906a6c, 0x81398437, 0x7b906a6b, 0x3c00010},
3337{0x3c00000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6b, 0x3c00010},
3338{0x3c00000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6b, 0x3c00010},
3339{0x3c00000, 0x7b906a6c, 0xf51f853a, 0x7b90656f, 0x3c00010},
3340{0x3c00000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1b, 0x3c00010},
3341{0x3c00000, 0x7b906a6c, 0xff7fffff, 0xff7edf2a, 0x3c00010},
3342{0x3c00000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3c00000},
3343{0x3c00000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3c00001},
3344{0x3c00000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3c00001},
3345{0x3c00000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3c00001},
3346{0x3c00000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3c00000},
3347{0x3c00000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3c00000},
3348{0x3c00000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3c00000},
3349{0x3c00000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6c, 0x3c00010},
3350{0x3c00000, 0x7b906a6c, 0xe73a5134, 0x7b906a6b, 0x3c00010},
3351{0x3c00000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3c00000},
3352{0x3c00000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6c, 0x3c00010},
3353{0x3c00000, 0x7b906a6c, 0x9503366, 0x7b906a6c, 0x3c00010},
3354{0x3c00000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6b, 0x3c00010},
3355{0x3c00000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6b, 0x3c00010},
3356{0x3c00000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8a, 0x3c00010},
3357{0x3c00000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6b, 0x3c00010},
3358{0x3c00000, 0x7b906a6c, 0x966320b, 0x7b906a6c, 0x3c00010},
3359{0x3c00000, 0x7b906a6c, 0xb26bddee, 0x7b906a6b, 0x3c00010},
3360{0x3c00000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6b, 0x3c00010},
3361{0x3c00000, 0x7b906a6c, 0x317285d3, 0x7b906a6c, 0x3c00010},
3362{0x3c00000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6c, 0x3c00010},
3363{0x3c00000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6c, 0x3c00010},
3364{0x3c00000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3c00000},
3365{0x3800000, 0x0, 0x0, 0x0, 0x3800000},
3366{0x3800000, 0x0, 0x1, 0x0, 0x3800080},
3367{0x3800000, 0x0, 0x76, 0x0, 0x3800080},
3368{0x3800000, 0x0, 0x2b94, 0x0, 0x3800080},
3369{0x3800000, 0x0, 0x636d24, 0x0, 0x3800080},
3370{0x3800000, 0x0, 0x7fffff, 0x0, 0x3800080},
3371{0x3800000, 0x0, 0x800000, 0x800000, 0x3800000},
3372{0x3800000, 0x0, 0x800002, 0x800002, 0x3800000},
3373{0x3800000, 0x0, 0x1398437, 0x1398437, 0x3800000},
3374{0x3800000, 0x0, 0xba98d27, 0xba98d27, 0x3800000},
3375{0x3800000, 0x0, 0xba98d7a, 0xba98d7a, 0x3800000},
3376{0x3800000, 0x0, 0x751f853a, 0x751f853a, 0x3800000},
3377{0x3800000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3800000},
3378{0x3800000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3800000},
3379{0x3800000, 0x0, 0x7f800000, 0x7f800000, 0x3800000},
3380{0x3800000, 0x0, 0x7f800001, 0x7fc00000, 0x3800001},
3381{0x3800000, 0x0, 0x7f984a37, 0x7fc00000, 0x3800001},
3382{0x3800000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3800001},
3383{0x3800000, 0x0, 0x7fc00000, 0x7fc00000, 0x3800000},
3384{0x3800000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3800000},
3385{0x3800000, 0x0, 0x7fffffff, 0x7fc00000, 0x3800000},
3386{0x3800000, 0x0, 0x80000000, 0x80000000, 0x3800000},
3387{0x3800000, 0x0, 0x80000001, 0x0, 0x3800080},
3388{0x3800000, 0x0, 0x80000076, 0x0, 0x3800080},
3389{0x3800000, 0x0, 0x80002b94, 0x0, 0x3800080},
3390{0x3800000, 0x0, 0x80636d24, 0x0, 0x3800080},
3391{0x3800000, 0x0, 0x807fffff, 0x0, 0x3800080},
3392{0x3800000, 0x0, 0x80800000, 0x80800000, 0x3800000},
3393{0x3800000, 0x0, 0x80800002, 0x80800002, 0x3800000},
3394{0x3800000, 0x0, 0x81398437, 0x81398437, 0x3800000},
3395{0x3800000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3800000},
3396{0x3800000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3800000},
3397{0x3800000, 0x0, 0xf51f853a, 0xf51f853a, 0x3800000},
3398{0x3800000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3800000},
3399{0x3800000, 0x0, 0xff7fffff, 0xff7fffff, 0x3800000},
3400{0x3800000, 0x0, 0xff800000, 0xff800000, 0x3800000},
3401{0x3800000, 0x0, 0xff800001, 0x7fc00000, 0x3800001},
3402{0x3800000, 0x0, 0xff984a37, 0x7fc00000, 0x3800001},
3403{0x3800000, 0x0, 0xffbfffff, 0x7fc00000, 0x3800001},
3404{0x3800000, 0x0, 0xffc00000, 0x7fc00000, 0x3800000},
3405{0x3800000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3800000},
3406{0x3800000, 0x0, 0xffffffff, 0x7fc00000, 0x3800000},
3407{0x3800000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3800000},
3408{0x3800000, 0x0, 0xe73a5134, 0xe73a5134, 0x3800000},
3409{0x3800000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3800000},
3410{0x3800000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3800000},
3411{0x3800000, 0x0, 0x9503366, 0x9503366, 0x3800000},
3412{0x3800000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3800000},
3413{0x3800000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3800000},
3414{0x3800000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3800000},
3415{0x3800000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3800000},
3416{0x3800000, 0x0, 0x966320b, 0x966320b, 0x3800000},
3417{0x3800000, 0x0, 0xb26bddee, 0xb26bddee, 0x3800000},
3418{0x3800000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800000},
3419{0x3800000, 0x0, 0x317285d3, 0x317285d3, 0x3800000},
3420{0x3800000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3800000},
3421{0x3800000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3800000},
3422{0x3800000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3800000},
3423{0x3800000, 0x1, 0x0, 0x0, 0x3800080},
3424{0x3800000, 0x1, 0x1, 0x0, 0x3800080},
3425{0x3800000, 0x1, 0x76, 0x0, 0x3800080},
3426{0x3800000, 0x1, 0x2b94, 0x0, 0x3800080},
3427{0x3800000, 0x1, 0x636d24, 0x0, 0x3800080},
3428{0x3800000, 0x1, 0x7fffff, 0x0, 0x3800080},
3429{0x3800000, 0x1, 0x800000, 0x800000, 0x3800080},
3430{0x3800000, 0x1, 0x800002, 0x800002, 0x3800080},
3431{0x3800000, 0x1, 0x1398437, 0x1398437, 0x3800080},
3432{0x3800000, 0x1, 0xba98d27, 0xba98d27, 0x3800080},
3433{0x3800000, 0x1, 0xba98d7a, 0xba98d7a, 0x3800080},
3434{0x3800000, 0x1, 0x751f853a, 0x751f853a, 0x3800080},
3435{0x3800000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
3436{0x3800000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3800080},
3437{0x3800000, 0x1, 0x7f800000, 0x7f800000, 0x3800080},
3438{0x3800000, 0x1, 0x7f800001, 0x7fc00000, 0x3800081},
3439{0x3800000, 0x1, 0x7f984a37, 0x7fc00000, 0x3800081},
3440{0x3800000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3800081},
3441{0x3800000, 0x1, 0x7fc00000, 0x7fc00000, 0x3800080},
3442{0x3800000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3800080},
3443{0x3800000, 0x1, 0x7fffffff, 0x7fc00000, 0x3800080},
3444{0x3800000, 0x1, 0x80000000, 0x80000000, 0x3800080},
3445{0x3800000, 0x1, 0x80000001, 0x0, 0x3800080},
3446{0x3800000, 0x1, 0x80000076, 0x0, 0x3800080},
3447{0x3800000, 0x1, 0x80002b94, 0x0, 0x3800080},
3448{0x3800000, 0x1, 0x80636d24, 0x0, 0x3800080},
3449{0x3800000, 0x1, 0x807fffff, 0x0, 0x3800080},
3450{0x3800000, 0x1, 0x80800000, 0x80800000, 0x3800080},
3451{0x3800000, 0x1, 0x80800002, 0x80800002, 0x3800080},
3452{0x3800000, 0x1, 0x81398437, 0x81398437, 0x3800080},
3453{0x3800000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3800080},
3454{0x3800000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
3455{0x3800000, 0x1, 0xf51f853a, 0xf51f853a, 0x3800080},
3456{0x3800000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3800080},
3457{0x3800000, 0x1, 0xff7fffff, 0xff7fffff, 0x3800080},
3458{0x3800000, 0x1, 0xff800000, 0xff800000, 0x3800080},
3459{0x3800000, 0x1, 0xff800001, 0x7fc00000, 0x3800081},
3460{0x3800000, 0x1, 0xff984a37, 0x7fc00000, 0x3800081},
3461{0x3800000, 0x1, 0xffbfffff, 0x7fc00000, 0x3800081},
3462{0x3800000, 0x1, 0xffc00000, 0x7fc00000, 0x3800080},
3463{0x3800000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3800080},
3464{0x3800000, 0x1, 0xffffffff, 0x7fc00000, 0x3800080},
3465{0x3800000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3800080},
3466{0x3800000, 0x1, 0xe73a5134, 0xe73a5134, 0x3800080},
3467{0x3800000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3800080},
3468{0x3800000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3800080},
3469{0x3800000, 0x1, 0x9503366, 0x9503366, 0x3800080},
3470{0x3800000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
3471{0x3800000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
3472{0x3800000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3800080},
3473{0x3800000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
3474{0x3800000, 0x1, 0x966320b, 0x966320b, 0x3800080},
3475{0x3800000, 0x1, 0xb26bddee, 0xb26bddee, 0x3800080},
3476{0x3800000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
3477{0x3800000, 0x1, 0x317285d3, 0x317285d3, 0x3800080},
3478{0x3800000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3800080},
3479{0x3800000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
3480{0x3800000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3800080},
3481{0x3800000, 0x76, 0x0, 0x0, 0x3800080},
3482{0x3800000, 0x76, 0x1, 0x0, 0x3800080},
3483{0x3800000, 0x76, 0x76, 0x0, 0x3800080},
3484{0x3800000, 0x76, 0x2b94, 0x0, 0x3800080},
3485{0x3800000, 0x76, 0x636d24, 0x0, 0x3800080},
3486{0x3800000, 0x76, 0x7fffff, 0x0, 0x3800080},
3487{0x3800000, 0x76, 0x800000, 0x800000, 0x3800080},
3488{0x3800000, 0x76, 0x800002, 0x800002, 0x3800080},
3489{0x3800000, 0x76, 0x1398437, 0x1398437, 0x3800080},
3490{0x3800000, 0x76, 0xba98d27, 0xba98d27, 0x3800080},
3491{0x3800000, 0x76, 0xba98d7a, 0xba98d7a, 0x3800080},
3492{0x3800000, 0x76, 0x751f853a, 0x751f853a, 0x3800080},
3493{0x3800000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
3494{0x3800000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3800080},
3495{0x3800000, 0x76, 0x7f800000, 0x7f800000, 0x3800080},
3496{0x3800000, 0x76, 0x7f800001, 0x7fc00000, 0x3800081},
3497{0x3800000, 0x76, 0x7f984a37, 0x7fc00000, 0x3800081},
3498{0x3800000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3800081},
3499{0x3800000, 0x76, 0x7fc00000, 0x7fc00000, 0x3800080},
3500{0x3800000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3800080},
3501{0x3800000, 0x76, 0x7fffffff, 0x7fc00000, 0x3800080},
3502{0x3800000, 0x76, 0x80000000, 0x80000000, 0x3800080},
3503{0x3800000, 0x76, 0x80000001, 0x0, 0x3800080},
3504{0x3800000, 0x76, 0x80000076, 0x0, 0x3800080},
3505{0x3800000, 0x76, 0x80002b94, 0x0, 0x3800080},
3506{0x3800000, 0x76, 0x80636d24, 0x0, 0x3800080},
3507{0x3800000, 0x76, 0x807fffff, 0x0, 0x3800080},
3508{0x3800000, 0x76, 0x80800000, 0x80800000, 0x3800080},
3509{0x3800000, 0x76, 0x80800002, 0x80800002, 0x3800080},
3510{0x3800000, 0x76, 0x81398437, 0x81398437, 0x3800080},
3511{0x3800000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3800080},
3512{0x3800000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
3513{0x3800000, 0x76, 0xf51f853a, 0xf51f853a, 0x3800080},
3514{0x3800000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3800080},
3515{0x3800000, 0x76, 0xff7fffff, 0xff7fffff, 0x3800080},
3516{0x3800000, 0x76, 0xff800000, 0xff800000, 0x3800080},
3517{0x3800000, 0x76, 0xff800001, 0x7fc00000, 0x3800081},
3518{0x3800000, 0x76, 0xff984a37, 0x7fc00000, 0x3800081},
3519{0x3800000, 0x76, 0xffbfffff, 0x7fc00000, 0x3800081},
3520{0x3800000, 0x76, 0xffc00000, 0x7fc00000, 0x3800080},
3521{0x3800000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3800080},
3522{0x3800000, 0x76, 0xffffffff, 0x7fc00000, 0x3800080},
3523{0x3800000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3800080},
3524{0x3800000, 0x76, 0xe73a5134, 0xe73a5134, 0x3800080},
3525{0x3800000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3800080},
3526{0x3800000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3800080},
3527{0x3800000, 0x76, 0x9503366, 0x9503366, 0x3800080},
3528{0x3800000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
3529{0x3800000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
3530{0x3800000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3800080},
3531{0x3800000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
3532{0x3800000, 0x76, 0x966320b, 0x966320b, 0x3800080},
3533{0x3800000, 0x76, 0xb26bddee, 0xb26bddee, 0x3800080},
3534{0x3800000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
3535{0x3800000, 0x76, 0x317285d3, 0x317285d3, 0x3800080},
3536{0x3800000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3800080},
3537{0x3800000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
3538{0x3800000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3800080},
3539{0x3800000, 0x2b94, 0x0, 0x0, 0x3800080},
3540{0x3800000, 0x2b94, 0x1, 0x0, 0x3800080},
3541{0x3800000, 0x2b94, 0x76, 0x0, 0x3800080},
3542{0x3800000, 0x2b94, 0x2b94, 0x0, 0x3800080},
3543{0x3800000, 0x2b94, 0x636d24, 0x0, 0x3800080},
3544{0x3800000, 0x2b94, 0x7fffff, 0x0, 0x3800080},
3545{0x3800000, 0x2b94, 0x800000, 0x800000, 0x3800080},
3546{0x3800000, 0x2b94, 0x800002, 0x800002, 0x3800080},
3547{0x3800000, 0x2b94, 0x1398437, 0x1398437, 0x3800080},
3548{0x3800000, 0x2b94, 0xba98d27, 0xba98d27, 0x3800080},
3549{0x3800000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3800080},
3550{0x3800000, 0x2b94, 0x751f853a, 0x751f853a, 0x3800080},
3551{0x3800000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
3552{0x3800000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3800080},
3553{0x3800000, 0x2b94, 0x7f800000, 0x7f800000, 0x3800080},
3554{0x3800000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3800081},
3555{0x3800000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3800081},
3556{0x3800000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3800081},
3557{0x3800000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3800080},
3558{0x3800000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3800080},
3559{0x3800000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3800080},
3560{0x3800000, 0x2b94, 0x80000000, 0x80000000, 0x3800080},
3561{0x3800000, 0x2b94, 0x80000001, 0x0, 0x3800080},
3562{0x3800000, 0x2b94, 0x80000076, 0x0, 0x3800080},
3563{0x3800000, 0x2b94, 0x80002b94, 0x0, 0x3800080},
3564{0x3800000, 0x2b94, 0x80636d24, 0x0, 0x3800080},
3565{0x3800000, 0x2b94, 0x807fffff, 0x0, 0x3800080},
3566{0x3800000, 0x2b94, 0x80800000, 0x80800000, 0x3800080},
3567{0x3800000, 0x2b94, 0x80800002, 0x80800002, 0x3800080},
3568{0x3800000, 0x2b94, 0x81398437, 0x81398437, 0x3800080},
3569{0x3800000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3800080},
3570{0x3800000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
3571{0x3800000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3800080},
3572{0x3800000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3800080},
3573{0x3800000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3800080},
3574{0x3800000, 0x2b94, 0xff800000, 0xff800000, 0x3800080},
3575{0x3800000, 0x2b94, 0xff800001, 0x7fc00000, 0x3800081},
3576{0x3800000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3800081},
3577{0x3800000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3800081},
3578{0x3800000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3800080},
3579{0x3800000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3800080},
3580{0x3800000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3800080},
3581{0x3800000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3800080},
3582{0x3800000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3800080},
3583{0x3800000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3800080},
3584{0x3800000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3800080},
3585{0x3800000, 0x2b94, 0x9503366, 0x9503366, 0x3800080},
3586{0x3800000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
3587{0x3800000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
3588{0x3800000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3800080},
3589{0x3800000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
3590{0x3800000, 0x2b94, 0x966320b, 0x966320b, 0x3800080},
3591{0x3800000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3800080},
3592{0x3800000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
3593{0x3800000, 0x2b94, 0x317285d3, 0x317285d3, 0x3800080},
3594{0x3800000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3800080},
3595{0x3800000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
3596{0x3800000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3800080},
3597{0x3800000, 0x636d24, 0x0, 0x0, 0x3800080},
3598{0x3800000, 0x636d24, 0x1, 0x0, 0x3800080},
3599{0x3800000, 0x636d24, 0x76, 0x0, 0x3800080},
3600{0x3800000, 0x636d24, 0x2b94, 0x0, 0x3800080},
3601{0x3800000, 0x636d24, 0x636d24, 0x0, 0x3800080},
3602{0x3800000, 0x636d24, 0x7fffff, 0x0, 0x3800080},
3603{0x3800000, 0x636d24, 0x800000, 0x800000, 0x3800080},
3604{0x3800000, 0x636d24, 0x800002, 0x800002, 0x3800080},
3605{0x3800000, 0x636d24, 0x1398437, 0x1398437, 0x3800080},
3606{0x3800000, 0x636d24, 0xba98d27, 0xba98d27, 0x3800080},
3607{0x3800000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3800080},
3608{0x3800000, 0x636d24, 0x751f853a, 0x751f853a, 0x3800080},
3609{0x3800000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
3610{0x3800000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3800080},
3611{0x3800000, 0x636d24, 0x7f800000, 0x7f800000, 0x3800080},
3612{0x3800000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3800081},
3613{0x3800000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3800081},
3614{0x3800000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3800081},
3615{0x3800000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3800080},
3616{0x3800000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3800080},
3617{0x3800000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3800080},
3618{0x3800000, 0x636d24, 0x80000000, 0x80000000, 0x3800080},
3619{0x3800000, 0x636d24, 0x80000001, 0x0, 0x3800080},
3620{0x3800000, 0x636d24, 0x80000076, 0x0, 0x3800080},
3621{0x3800000, 0x636d24, 0x80002b94, 0x0, 0x3800080},
3622{0x3800000, 0x636d24, 0x80636d24, 0x0, 0x3800080},
3623{0x3800000, 0x636d24, 0x807fffff, 0x0, 0x3800080},
3624{0x3800000, 0x636d24, 0x80800000, 0x80800000, 0x3800080},
3625{0x3800000, 0x636d24, 0x80800002, 0x80800002, 0x3800080},
3626{0x3800000, 0x636d24, 0x81398437, 0x81398437, 0x3800080},
3627{0x3800000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3800080},
3628{0x3800000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
3629{0x3800000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3800080},
3630{0x3800000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3800080},
3631{0x3800000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3800080},
3632{0x3800000, 0x636d24, 0xff800000, 0xff800000, 0x3800080},
3633{0x3800000, 0x636d24, 0xff800001, 0x7fc00000, 0x3800081},
3634{0x3800000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3800081},
3635{0x3800000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3800081},
3636{0x3800000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3800080},
3637{0x3800000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3800080},
3638{0x3800000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3800080},
3639{0x3800000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3800080},
3640{0x3800000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3800080},
3641{0x3800000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3800080},
3642{0x3800000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3800080},
3643{0x3800000, 0x636d24, 0x9503366, 0x9503366, 0x3800080},
3644{0x3800000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
3645{0x3800000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
3646{0x3800000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3800080},
3647{0x3800000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
3648{0x3800000, 0x636d24, 0x966320b, 0x966320b, 0x3800080},
3649{0x3800000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3800080},
3650{0x3800000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
3651{0x3800000, 0x636d24, 0x317285d3, 0x317285d3, 0x3800080},
3652{0x3800000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3800080},
3653{0x3800000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
3654{0x3800000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3800080},
3655{0x3800000, 0x7fffff, 0x0, 0x0, 0x3800080},
3656{0x3800000, 0x7fffff, 0x1, 0x0, 0x3800080},
3657{0x3800000, 0x7fffff, 0x76, 0x0, 0x3800080},
3658{0x3800000, 0x7fffff, 0x2b94, 0x0, 0x3800080},
3659{0x3800000, 0x7fffff, 0x636d24, 0x0, 0x3800080},
3660{0x3800000, 0x7fffff, 0x7fffff, 0x0, 0x3800080},
3661{0x3800000, 0x7fffff, 0x800000, 0x800000, 0x3800080},
3662{0x3800000, 0x7fffff, 0x800002, 0x800002, 0x3800080},
3663{0x3800000, 0x7fffff, 0x1398437, 0x1398437, 0x3800080},
3664{0x3800000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3800080},
3665{0x3800000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3800080},
3666{0x3800000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3800080},
3667{0x3800000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
3668{0x3800000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3800080},
3669{0x3800000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3800080},
3670{0x3800000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3800081},
3671{0x3800000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3800081},
3672{0x3800000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3800081},
3673{0x3800000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3800080},
3674{0x3800000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3800080},
3675{0x3800000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3800080},
3676{0x3800000, 0x7fffff, 0x80000000, 0x80000000, 0x3800080},
3677{0x3800000, 0x7fffff, 0x80000001, 0x0, 0x3800080},
3678{0x3800000, 0x7fffff, 0x80000076, 0x0, 0x3800080},
3679{0x3800000, 0x7fffff, 0x80002b94, 0x0, 0x3800080},
3680{0x3800000, 0x7fffff, 0x80636d24, 0x0, 0x3800080},
3681{0x3800000, 0x7fffff, 0x807fffff, 0x0, 0x3800080},
3682{0x3800000, 0x7fffff, 0x80800000, 0x80800000, 0x3800080},
3683{0x3800000, 0x7fffff, 0x80800002, 0x80800002, 0x3800080},
3684{0x3800000, 0x7fffff, 0x81398437, 0x81398437, 0x3800080},
3685{0x3800000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3800080},
3686{0x3800000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
3687{0x3800000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3800080},
3688{0x3800000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3800080},
3689{0x3800000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3800080},
3690{0x3800000, 0x7fffff, 0xff800000, 0xff800000, 0x3800080},
3691{0x3800000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3800081},
3692{0x3800000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3800081},
3693{0x3800000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3800081},
3694{0x3800000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3800080},
3695{0x3800000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3800080},
3696{0x3800000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3800080},
3697{0x3800000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3800080},
3698{0x3800000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3800080},
3699{0x3800000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3800080},
3700{0x3800000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3800080},
3701{0x3800000, 0x7fffff, 0x9503366, 0x9503366, 0x3800080},
3702{0x3800000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
3703{0x3800000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
3704{0x3800000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3800080},
3705{0x3800000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
3706{0x3800000, 0x7fffff, 0x966320b, 0x966320b, 0x3800080},
3707{0x3800000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3800080},
3708{0x3800000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
3709{0x3800000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3800080},
3710{0x3800000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3800080},
3711{0x3800000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
3712{0x3800000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3800080},
3713{0x3800000, 0x800000, 0x0, 0x800000, 0x3800000},
3714{0x3800000, 0x800000, 0x1, 0x800000, 0x3800080},
3715{0x3800000, 0x800000, 0x76, 0x800000, 0x3800080},
3716{0x3800000, 0x800000, 0x2b94, 0x800000, 0x3800080},
3717{0x3800000, 0x800000, 0x636d24, 0x800000, 0x3800080},
3718{0x3800000, 0x800000, 0x7fffff, 0x800000, 0x3800080},
3719{0x3800000, 0x800000, 0x800000, 0x1000000, 0x3800000},
3720{0x3800000, 0x800000, 0x800002, 0x1000001, 0x3800000},
3721{0x3800000, 0x800000, 0x1398437, 0x1798437, 0x3800000},
3722{0x3800000, 0x800000, 0xba98d27, 0xba98d29, 0x3800000},
3723{0x3800000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3800000},
3724{0x3800000, 0x800000, 0x751f853a, 0x751f853a, 0x3800010},
3725{0x3800000, 0x800000, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
3726{0x3800000, 0x800000, 0x7f7fffff, 0x7f7fffff, 0x3800010},
3727{0x3800000, 0x800000, 0x7f800000, 0x7f800000, 0x3800000},
3728{0x3800000, 0x800000, 0x7f800001, 0x7fc00000, 0x3800001},
3729{0x3800000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3800001},
3730{0x3800000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3800001},
3731{0x3800000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3800000},
3732{0x3800000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
3733{0x3800000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3800000},
3734{0x3800000, 0x800000, 0x80000000, 0x800000, 0x3800000},
3735{0x3800000, 0x800000, 0x80000001, 0x800000, 0x3800080},
3736{0x3800000, 0x800000, 0x80000076, 0x800000, 0x3800080},
3737{0x3800000, 0x800000, 0x80002b94, 0x800000, 0x3800080},
3738{0x3800000, 0x800000, 0x80636d24, 0x800000, 0x3800080},
3739{0x3800000, 0x800000, 0x807fffff, 0x800000, 0x3800080},
3740{0x3800000, 0x800000, 0x80800000, 0x80000000, 0x3800000},
3741{0x3800000, 0x800000, 0x80800002, 0x0, 0x3800008},
3742{0x3800000, 0x800000, 0x81398437, 0x80f3086e, 0x3800000},
3743{0x3800000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3800000},
3744{0x3800000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3800000},
3745{0x3800000, 0x800000, 0xf51f853a, 0xf51f853a, 0x3800010},
3746{0x3800000, 0x800000, 0xff7ffff0, 0xff7ffff0, 0x3800010},
3747{0x3800000, 0x800000, 0xff7fffff, 0xff7fffff, 0x3800010},
3748{0x3800000, 0x800000, 0xff800000, 0xff800000, 0x3800000},
3749{0x3800000, 0x800000, 0xff800001, 0x7fc00000, 0x3800001},
3750{0x3800000, 0x800000, 0xff984a37, 0x7fc00000, 0x3800001},
3751{0x3800000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3800001},
3752{0x3800000, 0x800000, 0xffc00000, 0x7fc00000, 0x3800000},
3753{0x3800000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3800000},
3754{0x3800000, 0x800000, 0xffffffff, 0x7fc00000, 0x3800000},
3755{0x3800000, 0x800000, 0x4f3495cb, 0x4f3495cb, 0x3800010},
3756{0x3800000, 0x800000, 0xe73a5134, 0xe73a5134, 0x3800010},
3757{0x3800000, 0x800000, 0x7c994e9e, 0x7c994e9e, 0x3800010},
3758{0x3800000, 0x800000, 0x6164bd6c, 0x6164bd6c, 0x3800010},
3759{0x3800000, 0x800000, 0x9503366, 0x95033a6, 0x3800000},
3760{0x3800000, 0x800000, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
3761{0x3800000, 0x800000, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
3762{0x3800000, 0x800000, 0x77f31e2f, 0x77f31e2f, 0x3800010},
3763{0x3800000, 0x800000, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
3764{0x3800000, 0x800000, 0x966320b, 0x966324b, 0x3800000},
3765{0x3800000, 0x800000, 0xb26bddee, 0xb26bddee, 0x3800010},
3766{0x3800000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
3767{0x3800000, 0x800000, 0x317285d3, 0x317285d3, 0x3800010},
3768{0x3800000, 0x800000, 0x3c9623b1, 0x3c9623b1, 0x3800010},
3769{0x3800000, 0x800000, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
3770{0x3800000, 0x800000, 0x7b906a6c, 0x7b906a6c, 0x3800010},
3771{0x3800000, 0x800002, 0x0, 0x800002, 0x3800000},
3772{0x3800000, 0x800002, 0x1, 0x800002, 0x3800080},
3773{0x3800000, 0x800002, 0x76, 0x800002, 0x3800080},
3774{0x3800000, 0x800002, 0x2b94, 0x800002, 0x3800080},
3775{0x3800000, 0x800002, 0x636d24, 0x800002, 0x3800080},
3776{0x3800000, 0x800002, 0x7fffff, 0x800002, 0x3800080},
3777{0x3800000, 0x800002, 0x800000, 0x1000001, 0x3800000},
3778{0x3800000, 0x800002, 0x800002, 0x1000002, 0x3800000},
3779{0x3800000, 0x800002, 0x1398437, 0x1798438, 0x3800000},
3780{0x3800000, 0x800002, 0xba98d27, 0xba98d29, 0x3800010},
3781{0x3800000, 0x800002, 0xba98d7a, 0xba98d7c, 0x3800010},
3782{0x3800000, 0x800002, 0x751f853a, 0x751f853a, 0x3800010},
3783{0x3800000, 0x800002, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
3784{0x3800000, 0x800002, 0x7f7fffff, 0x7f7fffff, 0x3800010},
3785{0x3800000, 0x800002, 0x7f800000, 0x7f800000, 0x3800000},
3786{0x3800000, 0x800002, 0x7f800001, 0x7fc00000, 0x3800001},
3787{0x3800000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3800001},
3788{0x3800000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3800001},
3789{0x3800000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3800000},
3790{0x3800000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3800000},
3791{0x3800000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3800000},
3792{0x3800000, 0x800002, 0x80000000, 0x800002, 0x3800000},
3793{0x3800000, 0x800002, 0x80000001, 0x800002, 0x3800080},
3794{0x3800000, 0x800002, 0x80000076, 0x800002, 0x3800080},
3795{0x3800000, 0x800002, 0x80002b94, 0x800002, 0x3800080},
3796{0x3800000, 0x800002, 0x80636d24, 0x800002, 0x3800080},
3797{0x3800000, 0x800002, 0x807fffff, 0x800002, 0x3800080},
3798{0x3800000, 0x800002, 0x80800000, 0x0, 0x3800008},
3799{0x3800000, 0x800002, 0x80800002, 0x80000000, 0x3800000},
3800{0x3800000, 0x800002, 0x81398437, 0x80f3086c, 0x3800000},
3801{0x3800000, 0x800002, 0x8ba98d27, 0x8ba98d25, 0x3800010},
3802{0x3800000, 0x800002, 0x8ba98d7a, 0x8ba98d78, 0x3800010},
3803{0x3800000, 0x800002, 0xf51f853a, 0xf51f853a, 0x3800010},
3804{0x3800000, 0x800002, 0xff7ffff0, 0xff7ffff0, 0x3800010},
3805{0x3800000, 0x800002, 0xff7fffff, 0xff7fffff, 0x3800010},
3806{0x3800000, 0x800002, 0xff800000, 0xff800000, 0x3800000},
3807{0x3800000, 0x800002, 0xff800001, 0x7fc00000, 0x3800001},
3808{0x3800000, 0x800002, 0xff984a37, 0x7fc00000, 0x3800001},
3809{0x3800000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3800001},
3810{0x3800000, 0x800002, 0xffc00000, 0x7fc00000, 0x3800000},
3811{0x3800000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3800000},
3812{0x3800000, 0x800002, 0xffffffff, 0x7fc00000, 0x3800000},
3813{0x3800000, 0x800002, 0x4f3495cb, 0x4f3495cb, 0x3800010},
3814{0x3800000, 0x800002, 0xe73a5134, 0xe73a5134, 0x3800010},
3815{0x3800000, 0x800002, 0x7c994e9e, 0x7c994e9e, 0x3800010},
3816{0x3800000, 0x800002, 0x6164bd6c, 0x6164bd6c, 0x3800010},
3817{0x3800000, 0x800002, 0x9503366, 0x95033a6, 0x3800010},
3818{0x3800000, 0x800002, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
3819{0x3800000, 0x800002, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
3820{0x3800000, 0x800002, 0x77f31e2f, 0x77f31e2f, 0x3800010},
3821{0x3800000, 0x800002, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
3822{0x3800000, 0x800002, 0x966320b, 0x966324b, 0x3800010},
3823{0x3800000, 0x800002, 0xb26bddee, 0xb26bddee, 0x3800010},
3824{0x3800000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
3825{0x3800000, 0x800002, 0x317285d3, 0x317285d3, 0x3800010},
3826{0x3800000, 0x800002, 0x3c9623b1, 0x3c9623b1, 0x3800010},
3827{0x3800000, 0x800002, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
3828{0x3800000, 0x800002, 0x7b906a6c, 0x7b906a6c, 0x3800010},
3829{0x3800000, 0x1398437, 0x0, 0x1398437, 0x3800000},
3830{0x3800000, 0x1398437, 0x1, 0x1398437, 0x3800080},
3831{0x3800000, 0x1398437, 0x76, 0x1398437, 0x3800080},
3832{0x3800000, 0x1398437, 0x2b94, 0x1398437, 0x3800080},
3833{0x3800000, 0x1398437, 0x636d24, 0x1398437, 0x3800080},
3834{0x3800000, 0x1398437, 0x7fffff, 0x1398437, 0x3800080},
3835{0x3800000, 0x1398437, 0x800000, 0x1798437, 0x3800000},
3836{0x3800000, 0x1398437, 0x800002, 0x1798438, 0x3800000},
3837{0x3800000, 0x1398437, 0x1398437, 0x1b98437, 0x3800000},
3838{0x3800000, 0x1398437, 0xba98d27, 0xba98d2c, 0x3800010},
3839{0x3800000, 0x1398437, 0xba98d7a, 0xba98d7f, 0x3800010},
3840{0x3800000, 0x1398437, 0x751f853a, 0x751f853a, 0x3800010},
3841{0x3800000, 0x1398437, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
3842{0x3800000, 0x1398437, 0x7f7fffff, 0x7f7fffff, 0x3800010},
3843{0x3800000, 0x1398437, 0x7f800000, 0x7f800000, 0x3800000},
3844{0x3800000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3800001},
3845{0x3800000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3800001},
3846{0x3800000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3800001},
3847{0x3800000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3800000},
3848{0x3800000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3800000},
3849{0x3800000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3800000},
3850{0x3800000, 0x1398437, 0x80000000, 0x1398437, 0x3800000},
3851{0x3800000, 0x1398437, 0x80000001, 0x1398437, 0x3800080},
3852{0x3800000, 0x1398437, 0x80000076, 0x1398437, 0x3800080},
3853{0x3800000, 0x1398437, 0x80002b94, 0x1398437, 0x3800080},
3854{0x3800000, 0x1398437, 0x80636d24, 0x1398437, 0x3800080},
3855{0x3800000, 0x1398437, 0x807fffff, 0x1398437, 0x3800080},
3856{0x3800000, 0x1398437, 0x80800000, 0xf3086e, 0x3800000},
3857{0x3800000, 0x1398437, 0x80800002, 0xf3086c, 0x3800000},
3858{0x3800000, 0x1398437, 0x81398437, 0x80000000, 0x3800000},
3859{0x3800000, 0x1398437, 0x8ba98d27, 0x8ba98d22, 0x3800010},
3860{0x3800000, 0x1398437, 0x8ba98d7a, 0x8ba98d75, 0x3800010},
3861{0x3800000, 0x1398437, 0xf51f853a, 0xf51f853a, 0x3800010},
3862{0x3800000, 0x1398437, 0xff7ffff0, 0xff7ffff0, 0x3800010},
3863{0x3800000, 0x1398437, 0xff7fffff, 0xff7fffff, 0x3800010},
3864{0x3800000, 0x1398437, 0xff800000, 0xff800000, 0x3800000},
3865{0x3800000, 0x1398437, 0xff800001, 0x7fc00000, 0x3800001},
3866{0x3800000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3800001},
3867{0x3800000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3800001},
3868{0x3800000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3800000},
3869{0x3800000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3800000},
3870{0x3800000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3800000},
3871{0x3800000, 0x1398437, 0x4f3495cb, 0x4f3495cb, 0x3800010},
3872{0x3800000, 0x1398437, 0xe73a5134, 0xe73a5134, 0x3800010},
3873{0x3800000, 0x1398437, 0x7c994e9e, 0x7c994e9e, 0x3800010},
3874{0x3800000, 0x1398437, 0x6164bd6c, 0x6164bd6c, 0x3800010},
3875{0x3800000, 0x1398437, 0x9503366, 0x950341f, 0x3800010},
3876{0x3800000, 0x1398437, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
3877{0x3800000, 0x1398437, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
3878{0x3800000, 0x1398437, 0x77f31e2f, 0x77f31e2f, 0x3800010},
3879{0x3800000, 0x1398437, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
3880{0x3800000, 0x1398437, 0x966320b, 0x96632c4, 0x3800010},
3881{0x3800000, 0x1398437, 0xb26bddee, 0xb26bddee, 0x3800010},
3882{0x3800000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
3883{0x3800000, 0x1398437, 0x317285d3, 0x317285d3, 0x3800010},
3884{0x3800000, 0x1398437, 0x3c9623b1, 0x3c9623b1, 0x3800010},
3885{0x3800000, 0x1398437, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
3886{0x3800000, 0x1398437, 0x7b906a6c, 0x7b906a6c, 0x3800010},
3887{0x3800000, 0xba98d27, 0x0, 0xba98d27, 0x3800000},
3888{0x3800000, 0xba98d27, 0x1, 0xba98d27, 0x3800080},
3889{0x3800000, 0xba98d27, 0x76, 0xba98d27, 0x3800080},
3890{0x3800000, 0xba98d27, 0x2b94, 0xba98d27, 0x3800080},
3891{0x3800000, 0xba98d27, 0x636d24, 0xba98d27, 0x3800080},
3892{0x3800000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3800080},
3893{0x3800000, 0xba98d27, 0x800000, 0xba98d29, 0x3800000},
3894{0x3800000, 0xba98d27, 0x800002, 0xba98d29, 0x3800010},
3895{0x3800000, 0xba98d27, 0x1398437, 0xba98d2c, 0x3800010},
3896{0x3800000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3800000},
3897{0x3800000, 0xba98d27, 0xba98d7a, 0xc298d50, 0x3800010},
3898{0x3800000, 0xba98d27, 0x751f853a, 0x751f853a, 0x3800010},
3899{0x3800000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
3900{0x3800000, 0xba98d27, 0x7f7fffff, 0x7f7fffff, 0x3800010},
3901{0x3800000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3800000},
3902{0x3800000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3800001},
3903{0x3800000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3800001},
3904{0x3800000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3800001},
3905{0x3800000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3800000},
3906{0x3800000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3800000},
3907{0x3800000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3800000},
3908{0x3800000, 0xba98d27, 0x80000000, 0xba98d27, 0x3800000},
3909{0x3800000, 0xba98d27, 0x80000001, 0xba98d27, 0x3800080},
3910{0x3800000, 0xba98d27, 0x80000076, 0xba98d27, 0x3800080},
3911{0x3800000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3800080},
3912{0x3800000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3800080},
3913{0x3800000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3800080},
3914{0x3800000, 0xba98d27, 0x80800000, 0xba98d25, 0x3800000},
3915{0x3800000, 0xba98d27, 0x80800002, 0xba98d24, 0x3800010},
3916{0x3800000, 0xba98d27, 0x81398437, 0xba98d21, 0x3800010},
3917{0x3800000, 0xba98d27, 0x8ba98d27, 0x80000000, 0x3800000},
3918{0x3800000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3800000},
3919{0x3800000, 0xba98d27, 0xf51f853a, 0xf51f853a, 0x3800010},
3920{0x3800000, 0xba98d27, 0xff7ffff0, 0xff7ffff0, 0x3800010},
3921{0x3800000, 0xba98d27, 0xff7fffff, 0xff7fffff, 0x3800010},
3922{0x3800000, 0xba98d27, 0xff800000, 0xff800000, 0x3800000},
3923{0x3800000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3800001},
3924{0x3800000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3800001},
3925{0x3800000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3800001},
3926{0x3800000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3800000},
3927{0x3800000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3800000},
3928{0x3800000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3800000},
3929{0x3800000, 0xba98d27, 0x4f3495cb, 0x4f3495cb, 0x3800010},
3930{0x3800000, 0xba98d27, 0xe73a5134, 0xe73a5134, 0x3800010},
3931{0x3800000, 0xba98d27, 0x7c994e9e, 0x7c994e9e, 0x3800010},
3932{0x3800000, 0xba98d27, 0x6164bd6c, 0x6164bd6c, 0x3800010},
3933{0x3800000, 0xba98d27, 0x9503366, 0xbb00ec2, 0x3800010},
3934{0x3800000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
3935{0x3800000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
3936{0x3800000, 0xba98d27, 0x77f31e2f, 0x77f31e2f, 0x3800010},
3937{0x3800000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
3938{0x3800000, 0xba98d27, 0x966320b, 0xbb0beb7, 0x3800010},
3939{0x3800000, 0xba98d27, 0xb26bddee, 0xb26bddee, 0x3800010},
3940{0x3800000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
3941{0x3800000, 0xba98d27, 0x317285d3, 0x317285d3, 0x3800010},
3942{0x3800000, 0xba98d27, 0x3c9623b1, 0x3c9623b1, 0x3800010},
3943{0x3800000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
3944{0x3800000, 0xba98d27, 0x7b906a6c, 0x7b906a6c, 0x3800010},
3945{0x3800000, 0xba98d7a, 0x0, 0xba98d7a, 0x3800000},
3946{0x3800000, 0xba98d7a, 0x1, 0xba98d7a, 0x3800080},
3947{0x3800000, 0xba98d7a, 0x76, 0xba98d7a, 0x3800080},
3948{0x3800000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3800080},
3949{0x3800000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3800080},
3950{0x3800000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3800080},
3951{0x3800000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3800000},
3952{0x3800000, 0xba98d7a, 0x800002, 0xba98d7c, 0x3800010},
3953{0x3800000, 0xba98d7a, 0x1398437, 0xba98d7f, 0x3800010},
3954{0x3800000, 0xba98d7a, 0xba98d27, 0xc298d50, 0x3800010},
3955{0x3800000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3800000},
3956{0x3800000, 0xba98d7a, 0x751f853a, 0x751f853a, 0x3800010},
3957{0x3800000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
3958{0x3800000, 0xba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3800010},
3959{0x3800000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3800000},
3960{0x3800000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3800001},
3961{0x3800000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3800001},
3962{0x3800000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3800001},
3963{0x3800000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3800000},
3964{0x3800000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3800000},
3965{0x3800000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3800000},
3966{0x3800000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3800000},
3967{0x3800000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3800080},
3968{0x3800000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3800080},
3969{0x3800000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3800080},
3970{0x3800000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3800080},
3971{0x3800000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3800080},
3972{0x3800000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3800000},
3973{0x3800000, 0xba98d7a, 0x80800002, 0xba98d77, 0x3800010},
3974{0x3800000, 0xba98d7a, 0x81398437, 0xba98d74, 0x3800010},
3975{0x3800000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3800000},
3976{0x3800000, 0xba98d7a, 0x8ba98d7a, 0x80000000, 0x3800000},
3977{0x3800000, 0xba98d7a, 0xf51f853a, 0xf51f853a, 0x3800010},
3978{0x3800000, 0xba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3800010},
3979{0x3800000, 0xba98d7a, 0xff7fffff, 0xff7fffff, 0x3800010},
3980{0x3800000, 0xba98d7a, 0xff800000, 0xff800000, 0x3800000},
3981{0x3800000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3800001},
3982{0x3800000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3800001},
3983{0x3800000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3800001},
3984{0x3800000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3800000},
3985{0x3800000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3800000},
3986{0x3800000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3800000},
3987{0x3800000, 0xba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3800010},
3988{0x3800000, 0xba98d7a, 0xe73a5134, 0xe73a5134, 0x3800010},
3989{0x3800000, 0xba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3800010},
3990{0x3800000, 0xba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3800010},
3991{0x3800000, 0xba98d7a, 0x9503366, 0xbb00f15, 0x3800010},
3992{0x3800000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
3993{0x3800000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
3994{0x3800000, 0xba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3800010},
3995{0x3800000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
3996{0x3800000, 0xba98d7a, 0x966320b, 0xbb0bf0a, 0x3800010},
3997{0x3800000, 0xba98d7a, 0xb26bddee, 0xb26bddee, 0x3800010},
3998{0x3800000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
3999{0x3800000, 0xba98d7a, 0x317285d3, 0x317285d3, 0x3800010},
4000{0x3800000, 0xba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3800010},
4001{0x3800000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
4002{0x3800000, 0xba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3800010},
4003{0x3800000, 0x751f853a, 0x0, 0x751f853a, 0x3800000},
4004{0x3800000, 0x751f853a, 0x1, 0x751f853a, 0x3800080},
4005{0x3800000, 0x751f853a, 0x76, 0x751f853a, 0x3800080},
4006{0x3800000, 0x751f853a, 0x2b94, 0x751f853a, 0x3800080},
4007{0x3800000, 0x751f853a, 0x636d24, 0x751f853a, 0x3800080},
4008{0x3800000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3800080},
4009{0x3800000, 0x751f853a, 0x800000, 0x751f853a, 0x3800010},
4010{0x3800000, 0x751f853a, 0x800002, 0x751f853a, 0x3800010},
4011{0x3800000, 0x751f853a, 0x1398437, 0x751f853a, 0x3800010},
4012{0x3800000, 0x751f853a, 0xba98d27, 0x751f853a, 0x3800010},
4013{0x3800000, 0x751f853a, 0xba98d7a, 0x751f853a, 0x3800010},
4014{0x3800000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3800000},
4015{0x3800000, 0x751f853a, 0x7f7ffff0, 0x7f7ffff9, 0x3800010},
4016{0x3800000, 0x751f853a, 0x7f7fffff, 0x7f7fffff, 0x3800014},
4017{0x3800000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3800000},
4018{0x3800000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3800001},
4019{0x3800000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3800001},
4020{0x3800000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3800001},
4021{0x3800000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3800000},
4022{0x3800000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3800000},
4023{0x3800000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3800000},
4024{0x3800000, 0x751f853a, 0x80000000, 0x751f853a, 0x3800000},
4025{0x3800000, 0x751f853a, 0x80000001, 0x751f853a, 0x3800080},
4026{0x3800000, 0x751f853a, 0x80000076, 0x751f853a, 0x3800080},
4027{0x3800000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3800080},
4028{0x3800000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3800080},
4029{0x3800000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3800080},
4030{0x3800000, 0x751f853a, 0x80800000, 0x751f8539, 0x3800010},
4031{0x3800000, 0x751f853a, 0x80800002, 0x751f8539, 0x3800010},
4032{0x3800000, 0x751f853a, 0x81398437, 0x751f8539, 0x3800010},
4033{0x3800000, 0x751f853a, 0x8ba98d27, 0x751f8539, 0x3800010},
4034{0x3800000, 0x751f853a, 0x8ba98d7a, 0x751f8539, 0x3800010},
4035{0x3800000, 0x751f853a, 0xf51f853a, 0x80000000, 0x3800000},
4036{0x3800000, 0x751f853a, 0xff7ffff0, 0xff7fffe7, 0x3800010},
4037{0x3800000, 0x751f853a, 0xff7fffff, 0xff7ffff6, 0x3800010},
4038{0x3800000, 0x751f853a, 0xff800000, 0xff800000, 0x3800000},
4039{0x3800000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3800001},
4040{0x3800000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3800001},
4041{0x3800000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3800001},
4042{0x3800000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3800000},
4043{0x3800000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3800000},
4044{0x3800000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3800000},
4045{0x3800000, 0x751f853a, 0x4f3495cb, 0x751f853a, 0x3800010},
4046{0x3800000, 0x751f853a, 0xe73a5134, 0x751f8539, 0x3800010},
4047{0x3800000, 0x751f853a, 0x7c994e9e, 0x7c994fdd, 0x3800010},
4048{0x3800000, 0x751f853a, 0x6164bd6c, 0x751f853a, 0x3800010},
4049{0x3800000, 0x751f853a, 0x9503366, 0x751f853a, 0x3800010},
4050{0x3800000, 0x751f853a, 0xbf5a97c9, 0x751f8539, 0x3800010},
4051{0x3800000, 0x751f853a, 0xe6ff1a14, 0x751f8539, 0x3800010},
4052{0x3800000, 0x751f853a, 0x77f31e2f, 0x77f81a58, 0x3800010},
4053{0x3800000, 0x751f853a, 0xaab4d7d8, 0x751f8539, 0x3800010},
4054{0x3800000, 0x751f853a, 0x966320b, 0x751f853a, 0x3800010},
4055{0x3800000, 0x751f853a, 0xb26bddee, 0x751f8539, 0x3800010},
4056{0x3800000, 0x751f853a, 0xb5c8e5d3, 0x751f8539, 0x3800010},
4057{0x3800000, 0x751f853a, 0x317285d3, 0x751f853a, 0x3800010},
4058{0x3800000, 0x751f853a, 0x3c9623b1, 0x751f853a, 0x3800010},
4059{0x3800000, 0x751f853a, 0x51fd2c7c, 0x751f853a, 0x3800010},
4060{0x3800000, 0x751f853a, 0x7b906a6c, 0x7b906f68, 0x3800010},
4061{0x3800000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3800000},
4062{0x3800000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3800080},
4063{0x3800000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3800080},
4064{0x3800000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3800080},
4065{0x3800000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3800080},
4066{0x3800000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3800080},
4067{0x3800000, 0x7f7ffff0, 0x800000, 0x7f7ffff0, 0x3800010},
4068{0x3800000, 0x7f7ffff0, 0x800002, 0x7f7ffff0, 0x3800010},
4069{0x3800000, 0x7f7ffff0, 0x1398437, 0x7f7ffff0, 0x3800010},
4070{0x3800000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff0, 0x3800010},
4071{0x3800000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff0, 0x3800010},
4072{0x3800000, 0x7f7ffff0, 0x751f853a, 0x7f7ffff9, 0x3800010},
4073{0x3800000, 0x7f7ffff0, 0x7f7ffff0, 0x7f7fffff, 0x3800014},
4074{0x3800000, 0x7f7ffff0, 0x7f7fffff, 0x7f7fffff, 0x3800014},
4075{0x3800000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3800000},
4076{0x3800000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3800001},
4077{0x3800000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3800001},
4078{0x3800000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3800001},
4079{0x3800000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3800000},
4080{0x3800000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3800000},
4081{0x3800000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3800000},
4082{0x3800000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3800000},
4083{0x3800000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3800080},
4084{0x3800000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3800080},
4085{0x3800000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3800080},
4086{0x3800000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3800080},
4087{0x3800000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3800080},
4088{0x3800000, 0x7f7ffff0, 0x80800000, 0x7f7fffef, 0x3800010},
4089{0x3800000, 0x7f7ffff0, 0x80800002, 0x7f7fffef, 0x3800010},
4090{0x3800000, 0x7f7ffff0, 0x81398437, 0x7f7fffef, 0x3800010},
4091{0x3800000, 0x7f7ffff0, 0x8ba98d27, 0x7f7fffef, 0x3800010},
4092{0x3800000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7fffef, 0x3800010},
4093{0x3800000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe6, 0x3800010},
4094{0x3800000, 0x7f7ffff0, 0xff7ffff0, 0x80000000, 0x3800000},
4095{0x3800000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3800000},
4096{0x3800000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3800000},
4097{0x3800000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3800001},
4098{0x3800000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3800001},
4099{0x3800000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3800001},
4100{0x3800000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3800000},
4101{0x3800000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3800000},
4102{0x3800000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3800000},
4103{0x3800000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff0, 0x3800010},
4104{0x3800000, 0x7f7ffff0, 0xe73a5134, 0x7f7fffef, 0x3800010},
4105{0x3800000, 0x7f7ffff0, 0x7c994e9e, 0x7f7fffff, 0x3800014},
4106{0x3800000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff0, 0x3800010},
4107{0x3800000, 0x7f7ffff0, 0x9503366, 0x7f7ffff0, 0x3800010},
4108{0x3800000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7fffef, 0x3800010},
4109{0x3800000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7fffef, 0x3800010},
4110{0x3800000, 0x7f7ffff0, 0x77f31e2f, 0x7f7fffff, 0x3800014},
4111{0x3800000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7fffef, 0x3800010},
4112{0x3800000, 0x7f7ffff0, 0x966320b, 0x7f7ffff0, 0x3800010},
4113{0x3800000, 0x7f7ffff0, 0xb26bddee, 0x7f7fffef, 0x3800010},
4114{0x3800000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7fffef, 0x3800010},
4115{0x3800000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff0, 0x3800010},
4116{0x3800000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff0, 0x3800010},
4117{0x3800000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff0, 0x3800010},
4118{0x3800000, 0x7f7ffff0, 0x7b906a6c, 0x7f7fffff, 0x3800014},
4119{0x3800000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3800000},
4120{0x3800000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3800080},
4121{0x3800000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3800080},
4122{0x3800000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3800080},
4123{0x3800000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3800080},
4124{0x3800000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3800080},
4125{0x3800000, 0x7f7fffff, 0x800000, 0x7f7fffff, 0x3800010},
4126{0x3800000, 0x7f7fffff, 0x800002, 0x7f7fffff, 0x3800010},
4127{0x3800000, 0x7f7fffff, 0x1398437, 0x7f7fffff, 0x3800010},
4128{0x3800000, 0x7f7fffff, 0xba98d27, 0x7f7fffff, 0x3800010},
4129{0x3800000, 0x7f7fffff, 0xba98d7a, 0x7f7fffff, 0x3800010},
4130{0x3800000, 0x7f7fffff, 0x751f853a, 0x7f7fffff, 0x3800014},
4131{0x3800000, 0x7f7fffff, 0x7f7ffff0, 0x7f7fffff, 0x3800014},
4132{0x3800000, 0x7f7fffff, 0x7f7fffff, 0x7f7fffff, 0x3800014},
4133{0x3800000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3800000},
4134{0x3800000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3800001},
4135{0x3800000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3800001},
4136{0x3800000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
4137{0x3800000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3800000},
4138{0x3800000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3800000},
4139{0x3800000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3800000},
4140{0x3800000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3800000},
4141{0x3800000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3800080},
4142{0x3800000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3800080},
4143{0x3800000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3800080},
4144{0x3800000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3800080},
4145{0x3800000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3800080},
4146{0x3800000, 0x7f7fffff, 0x80800000, 0x7f7ffffe, 0x3800010},
4147{0x3800000, 0x7f7fffff, 0x80800002, 0x7f7ffffe, 0x3800010},
4148{0x3800000, 0x7f7fffff, 0x81398437, 0x7f7ffffe, 0x3800010},
4149{0x3800000, 0x7f7fffff, 0x8ba98d27, 0x7f7ffffe, 0x3800010},
4150{0x3800000, 0x7f7fffff, 0x8ba98d7a, 0x7f7ffffe, 0x3800010},
4151{0x3800000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff5, 0x3800010},
4152{0x3800000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3800000},
4153{0x3800000, 0x7f7fffff, 0xff7fffff, 0x80000000, 0x3800000},
4154{0x3800000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3800000},
4155{0x3800000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3800001},
4156{0x3800000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3800001},
4157{0x3800000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3800001},
4158{0x3800000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3800000},
4159{0x3800000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3800000},
4160{0x3800000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3800000},
4161{0x3800000, 0x7f7fffff, 0x4f3495cb, 0x7f7fffff, 0x3800010},
4162{0x3800000, 0x7f7fffff, 0xe73a5134, 0x7f7ffffe, 0x3800010},
4163{0x3800000, 0x7f7fffff, 0x7c994e9e, 0x7f7fffff, 0x3800014},
4164{0x3800000, 0x7f7fffff, 0x6164bd6c, 0x7f7fffff, 0x3800010},
4165{0x3800000, 0x7f7fffff, 0x9503366, 0x7f7fffff, 0x3800010},
4166{0x3800000, 0x7f7fffff, 0xbf5a97c9, 0x7f7ffffe, 0x3800010},
4167{0x3800000, 0x7f7fffff, 0xe6ff1a14, 0x7f7ffffe, 0x3800010},
4168{0x3800000, 0x7f7fffff, 0x77f31e2f, 0x7f7fffff, 0x3800014},
4169{0x3800000, 0x7f7fffff, 0xaab4d7d8, 0x7f7ffffe, 0x3800010},
4170{0x3800000, 0x7f7fffff, 0x966320b, 0x7f7fffff, 0x3800010},
4171{0x3800000, 0x7f7fffff, 0xb26bddee, 0x7f7ffffe, 0x3800010},
4172{0x3800000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7ffffe, 0x3800010},
4173{0x3800000, 0x7f7fffff, 0x317285d3, 0x7f7fffff, 0x3800010},
4174{0x3800000, 0x7f7fffff, 0x3c9623b1, 0x7f7fffff, 0x3800010},
4175{0x3800000, 0x7f7fffff, 0x51fd2c7c, 0x7f7fffff, 0x3800010},
4176{0x3800000, 0x7f7fffff, 0x7b906a6c, 0x7f7fffff, 0x3800014},
4177{0x3800000, 0x7f800000, 0x0, 0x7f800000, 0x3800000},
4178{0x3800000, 0x7f800000, 0x1, 0x7f800000, 0x3800080},
4179{0x3800000, 0x7f800000, 0x76, 0x7f800000, 0x3800080},
4180{0x3800000, 0x7f800000, 0x2b94, 0x7f800000, 0x3800080},
4181{0x3800000, 0x7f800000, 0x636d24, 0x7f800000, 0x3800080},
4182{0x3800000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3800080},
4183{0x3800000, 0x7f800000, 0x800000, 0x7f800000, 0x3800000},
4184{0x3800000, 0x7f800000, 0x800002, 0x7f800000, 0x3800000},
4185{0x3800000, 0x7f800000, 0x1398437, 0x7f800000, 0x3800000},
4186{0x3800000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3800000},
4187{0x3800000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3800000},
4188{0x3800000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3800000},
4189{0x3800000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3800000},
4190{0x3800000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3800000},
4191{0x3800000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3800000},
4192{0x3800000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3800001},
4193{0x3800000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3800001},
4194{0x3800000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3800001},
4195{0x3800000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3800000},
4196{0x3800000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
4197{0x3800000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3800000},
4198{0x3800000, 0x7f800000, 0x80000000, 0x7f800000, 0x3800000},
4199{0x3800000, 0x7f800000, 0x80000001, 0x7f800000, 0x3800080},
4200{0x3800000, 0x7f800000, 0x80000076, 0x7f800000, 0x3800080},
4201{0x3800000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3800080},
4202{0x3800000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3800080},
4203{0x3800000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3800080},
4204{0x3800000, 0x7f800000, 0x80800000, 0x7f800000, 0x3800000},
4205{0x3800000, 0x7f800000, 0x80800002, 0x7f800000, 0x3800000},
4206{0x3800000, 0x7f800000, 0x81398437, 0x7f800000, 0x3800000},
4207{0x3800000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3800000},
4208{0x3800000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3800000},
4209{0x3800000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3800000},
4210{0x3800000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3800000},
4211{0x3800000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3800000},
4212{0x3800000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3800001},
4213{0x3800000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3800001},
4214{0x3800000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3800001},
4215{0x3800000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3800001},
4216{0x3800000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3800000},
4217{0x3800000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3800000},
4218{0x3800000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3800000},
4219{0x3800000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3800000},
4220{0x3800000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3800000},
4221{0x3800000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3800000},
4222{0x3800000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3800000},
4223{0x3800000, 0x7f800000, 0x9503366, 0x7f800000, 0x3800000},
4224{0x3800000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3800000},
4225{0x3800000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3800000},
4226{0x3800000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3800000},
4227{0x3800000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3800000},
4228{0x3800000, 0x7f800000, 0x966320b, 0x7f800000, 0x3800000},
4229{0x3800000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3800000},
4230{0x3800000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3800000},
4231{0x3800000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3800000},
4232{0x3800000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3800000},
4233{0x3800000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3800000},
4234{0x3800000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3800000},
4235{0x3800000, 0x7f800001, 0x0, 0x7fc00000, 0x3800001},
4236{0x3800000, 0x7f800001, 0x1, 0x7fc00000, 0x3800081},
4237{0x3800000, 0x7f800001, 0x76, 0x7fc00000, 0x3800081},
4238{0x3800000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3800081},
4239{0x3800000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3800081},
4240{0x3800000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3800081},
4241{0x3800000, 0x7f800001, 0x800000, 0x7fc00000, 0x3800001},
4242{0x3800000, 0x7f800001, 0x800002, 0x7fc00000, 0x3800001},
4243{0x3800000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3800001},
4244{0x3800000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3800001},
4245{0x3800000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3800001},
4246{0x3800000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3800001},
4247{0x3800000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3800001},
4248{0x3800000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3800001},
4249{0x3800000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3800001},
4250{0x3800000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3800001},
4251{0x3800000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3800001},
4252{0x3800000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3800001},
4253{0x3800000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3800001},
4254{0x3800000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3800001},
4255{0x3800000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3800001},
4256{0x3800000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3800001},
4257{0x3800000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3800081},
4258{0x3800000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3800081},
4259{0x3800000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3800081},
4260{0x3800000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3800081},
4261{0x3800000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3800081},
4262{0x3800000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3800001},
4263{0x3800000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3800001},
4264{0x3800000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3800001},
4265{0x3800000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3800001},
4266{0x3800000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3800001},
4267{0x3800000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3800001},
4268{0x3800000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3800001},
4269{0x3800000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3800001},
4270{0x3800000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3800001},
4271{0x3800000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3800001},
4272{0x3800000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3800001},
4273{0x3800000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3800001},
4274{0x3800000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3800001},
4275{0x3800000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3800001},
4276{0x3800000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3800001},
4277{0x3800000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3800001},
4278{0x3800000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3800001},
4279{0x3800000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3800001},
4280{0x3800000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3800001},
4281{0x3800000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3800001},
4282{0x3800000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3800001},
4283{0x3800000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3800001},
4284{0x3800000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3800001},
4285{0x3800000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3800001},
4286{0x3800000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3800001},
4287{0x3800000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3800001},
4288{0x3800000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
4289{0x3800000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3800001},
4290{0x3800000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3800001},
4291{0x3800000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3800001},
4292{0x3800000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3800001},
4293{0x3800000, 0x7f984a37, 0x0, 0x7fc00000, 0x3800001},
4294{0x3800000, 0x7f984a37, 0x1, 0x7fc00000, 0x3800081},
4295{0x3800000, 0x7f984a37, 0x76, 0x7fc00000, 0x3800081},
4296{0x3800000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3800081},
4297{0x3800000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3800081},
4298{0x3800000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3800081},
4299{0x3800000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3800001},
4300{0x3800000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3800001},
4301{0x3800000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3800001},
4302{0x3800000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3800001},
4303{0x3800000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3800001},
4304{0x3800000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3800001},
4305{0x3800000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3800001},
4306{0x3800000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3800001},
4307{0x3800000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3800001},
4308{0x3800000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3800001},
4309{0x3800000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3800001},
4310{0x3800000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3800001},
4311{0x3800000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3800001},
4312{0x3800000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3800001},
4313{0x3800000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3800001},
4314{0x3800000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3800001},
4315{0x3800000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3800081},
4316{0x3800000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3800081},
4317{0x3800000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3800081},
4318{0x3800000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3800081},
4319{0x3800000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3800081},
4320{0x3800000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3800001},
4321{0x3800000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3800001},
4322{0x3800000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3800001},
4323{0x3800000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3800001},
4324{0x3800000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3800001},
4325{0x3800000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3800001},
4326{0x3800000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3800001},
4327{0x3800000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3800001},
4328{0x3800000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3800001},
4329{0x3800000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3800001},
4330{0x3800000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3800001},
4331{0x3800000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3800001},
4332{0x3800000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3800001},
4333{0x3800000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3800001},
4334{0x3800000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3800001},
4335{0x3800000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3800001},
4336{0x3800000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3800001},
4337{0x3800000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3800001},
4338{0x3800000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3800001},
4339{0x3800000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3800001},
4340{0x3800000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3800001},
4341{0x3800000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3800001},
4342{0x3800000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3800001},
4343{0x3800000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3800001},
4344{0x3800000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3800001},
4345{0x3800000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3800001},
4346{0x3800000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
4347{0x3800000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3800001},
4348{0x3800000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3800001},
4349{0x3800000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3800001},
4350{0x3800000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3800001},
4351{0x3800000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3800001},
4352{0x3800000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3800081},
4353{0x3800000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3800081},
4354{0x3800000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3800081},
4355{0x3800000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3800081},
4356{0x3800000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3800081},
4357{0x3800000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3800001},
4358{0x3800000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3800001},
4359{0x3800000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3800001},
4360{0x3800000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3800001},
4361{0x3800000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3800001},
4362{0x3800000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3800001},
4363{0x3800000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3800001},
4364{0x3800000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3800001},
4365{0x3800000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3800001},
4366{0x3800000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3800001},
4367{0x3800000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3800001},
4368{0x3800000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
4369{0x3800000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3800001},
4370{0x3800000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3800001},
4371{0x3800000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3800001},
4372{0x3800000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3800001},
4373{0x3800000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3800081},
4374{0x3800000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3800081},
4375{0x3800000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3800081},
4376{0x3800000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3800081},
4377{0x3800000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3800081},
4378{0x3800000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3800001},
4379{0x3800000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3800001},
4380{0x3800000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3800001},
4381{0x3800000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3800001},
4382{0x3800000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3800001},
4383{0x3800000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3800001},
4384{0x3800000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3800001},
4385{0x3800000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3800001},
4386{0x3800000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3800001},
4387{0x3800000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3800001},
4388{0x3800000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3800001},
4389{0x3800000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3800001},
4390{0x3800000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3800001},
4391{0x3800000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3800001},
4392{0x3800000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3800001},
4393{0x3800000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3800001},
4394{0x3800000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3800001},
4395{0x3800000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3800001},
4396{0x3800000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3800001},
4397{0x3800000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3800001},
4398{0x3800000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3800001},
4399{0x3800000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3800001},
4400{0x3800000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3800001},
4401{0x3800000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3800001},
4402{0x3800000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3800001},
4403{0x3800000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3800001},
4404{0x3800000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
4405{0x3800000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3800001},
4406{0x3800000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3800001},
4407{0x3800000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3800001},
4408{0x3800000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3800001},
4409{0x3800000, 0x7fc00000, 0x0, 0x7fc00000, 0x3800000},
4410{0x3800000, 0x7fc00000, 0x1, 0x7fc00000, 0x3800080},
4411{0x3800000, 0x7fc00000, 0x76, 0x7fc00000, 0x3800080},
4412{0x3800000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3800080},
4413{0x3800000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3800080},
4414{0x3800000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3800080},
4415{0x3800000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3800000},
4416{0x3800000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3800000},
4417{0x3800000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3800000},
4418{0x3800000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3800000},
4419{0x3800000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3800000},
4420{0x3800000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3800000},
4421{0x3800000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3800000},
4422{0x3800000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3800000},
4423{0x3800000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3800000},
4424{0x3800000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3800001},
4425{0x3800000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3800001},
4426{0x3800000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3800001},
4427{0x3800000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3800000},
4428{0x3800000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
4429{0x3800000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3800000},
4430{0x3800000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3800000},
4431{0x3800000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3800080},
4432{0x3800000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3800080},
4433{0x3800000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3800080},
4434{0x3800000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3800080},
4435{0x3800000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3800080},
4436{0x3800000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3800000},
4437{0x3800000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3800000},
4438{0x3800000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3800000},
4439{0x3800000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3800000},
4440{0x3800000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3800000},
4441{0x3800000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3800000},
4442{0x3800000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3800000},
4443{0x3800000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3800000},
4444{0x3800000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3800000},
4445{0x3800000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3800001},
4446{0x3800000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3800001},
4447{0x3800000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3800001},
4448{0x3800000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3800000},
4449{0x3800000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3800000},
4450{0x3800000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3800000},
4451{0x3800000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3800000},
4452{0x3800000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3800000},
4453{0x3800000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3800000},
4454{0x3800000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3800000},
4455{0x3800000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3800000},
4456{0x3800000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3800000},
4457{0x3800000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3800000},
4458{0x3800000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3800000},
4459{0x3800000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3800000},
4460{0x3800000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3800000},
4461{0x3800000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3800000},
4462{0x3800000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
4463{0x3800000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3800000},
4464{0x3800000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3800000},
4465{0x3800000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3800000},
4466{0x3800000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3800000},
4467{0x3800000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3800000},
4468{0x3800000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3800080},
4469{0x3800000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3800080},
4470{0x3800000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3800080},
4471{0x3800000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3800080},
4472{0x3800000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3800080},
4473{0x3800000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3800000},
4474{0x3800000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3800000},
4475{0x3800000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3800000},
4476{0x3800000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3800000},
4477{0x3800000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3800000},
4478{0x3800000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3800000},
4479{0x3800000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3800000},
4480{0x3800000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3800000},
4481{0x3800000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3800000},
4482{0x3800000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3800001},
4483{0x3800000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3800001},
4484{0x3800000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3800001},
4485{0x3800000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3800000},
4486{0x3800000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3800000},
4487{0x3800000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3800000},
4488{0x3800000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3800000},
4489{0x3800000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3800080},
4490{0x3800000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3800080},
4491{0x3800000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3800080},
4492{0x3800000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3800080},
4493{0x3800000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3800080},
4494{0x3800000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3800000},
4495{0x3800000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3800000},
4496{0x3800000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3800000},
4497{0x3800000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3800000},
4498{0x3800000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3800000},
4499{0x3800000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3800000},
4500{0x3800000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3800000},
4501{0x3800000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3800000},
4502{0x3800000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3800000},
4503{0x3800000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3800001},
4504{0x3800000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3800001},
4505{0x3800000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3800001},
4506{0x3800000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3800000},
4507{0x3800000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3800000},
4508{0x3800000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3800000},
4509{0x3800000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3800000},
4510{0x3800000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3800000},
4511{0x3800000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3800000},
4512{0x3800000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3800000},
4513{0x3800000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3800000},
4514{0x3800000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3800000},
4515{0x3800000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3800000},
4516{0x3800000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3800000},
4517{0x3800000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3800000},
4518{0x3800000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3800000},
4519{0x3800000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3800000},
4520{0x3800000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
4521{0x3800000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3800000},
4522{0x3800000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3800000},
4523{0x3800000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3800000},
4524{0x3800000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3800000},
4525{0x3800000, 0x7fffffff, 0x0, 0x7fc00000, 0x3800000},
4526{0x3800000, 0x7fffffff, 0x1, 0x7fc00000, 0x3800080},
4527{0x3800000, 0x7fffffff, 0x76, 0x7fc00000, 0x3800080},
4528{0x3800000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3800080},
4529{0x3800000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3800080},
4530{0x3800000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3800080},
4531{0x3800000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3800000},
4532{0x3800000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3800000},
4533{0x3800000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3800000},
4534{0x3800000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3800000},
4535{0x3800000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3800000},
4536{0x3800000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3800000},
4537{0x3800000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3800000},
4538{0x3800000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3800000},
4539{0x3800000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3800000},
4540{0x3800000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3800001},
4541{0x3800000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3800001},
4542{0x3800000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
4543{0x3800000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3800000},
4544{0x3800000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3800000},
4545{0x3800000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3800000},
4546{0x3800000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3800000},
4547{0x3800000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3800080},
4548{0x3800000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3800080},
4549{0x3800000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3800080},
4550{0x3800000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3800080},
4551{0x3800000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3800080},
4552{0x3800000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3800000},
4553{0x3800000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3800000},
4554{0x3800000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3800000},
4555{0x3800000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3800000},
4556{0x3800000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3800000},
4557{0x3800000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3800000},
4558{0x3800000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3800000},
4559{0x3800000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3800000},
4560{0x3800000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3800000},
4561{0x3800000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3800001},
4562{0x3800000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3800001},
4563{0x3800000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3800001},
4564{0x3800000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3800000},
4565{0x3800000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3800000},
4566{0x3800000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3800000},
4567{0x3800000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3800000},
4568{0x3800000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3800000},
4569{0x3800000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3800000},
4570{0x3800000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3800000},
4571{0x3800000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3800000},
4572{0x3800000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3800000},
4573{0x3800000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3800000},
4574{0x3800000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3800000},
4575{0x3800000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3800000},
4576{0x3800000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3800000},
4577{0x3800000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3800000},
4578{0x3800000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
4579{0x3800000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3800000},
4580{0x3800000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3800000},
4581{0x3800000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3800000},
4582{0x3800000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3800000},
4583{0x3800000, 0x80000000, 0x0, 0x80000000, 0x3800000},
4584{0x3800000, 0x80000000, 0x1, 0x80000000, 0x3800080},
4585{0x3800000, 0x80000000, 0x76, 0x80000000, 0x3800080},
4586{0x3800000, 0x80000000, 0x2b94, 0x80000000, 0x3800080},
4587{0x3800000, 0x80000000, 0x636d24, 0x80000000, 0x3800080},
4588{0x3800000, 0x80000000, 0x7fffff, 0x80000000, 0x3800080},
4589{0x3800000, 0x80000000, 0x800000, 0x800000, 0x3800000},
4590{0x3800000, 0x80000000, 0x800002, 0x800002, 0x3800000},
4591{0x3800000, 0x80000000, 0x1398437, 0x1398437, 0x3800000},
4592{0x3800000, 0x80000000, 0xba98d27, 0xba98d27, 0x3800000},
4593{0x3800000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3800000},
4594{0x3800000, 0x80000000, 0x751f853a, 0x751f853a, 0x3800000},
4595{0x3800000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3800000},
4596{0x3800000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3800000},
4597{0x3800000, 0x80000000, 0x7f800000, 0x7f800000, 0x3800000},
4598{0x3800000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3800001},
4599{0x3800000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3800001},
4600{0x3800000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3800001},
4601{0x3800000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3800000},
4602{0x3800000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
4603{0x3800000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3800000},
4604{0x3800000, 0x80000000, 0x80000000, 0x80000000, 0x3800000},
4605{0x3800000, 0x80000000, 0x80000001, 0x80000000, 0x3800080},
4606{0x3800000, 0x80000000, 0x80000076, 0x80000000, 0x3800080},
4607{0x3800000, 0x80000000, 0x80002b94, 0x80000000, 0x3800080},
4608{0x3800000, 0x80000000, 0x80636d24, 0x80000000, 0x3800080},
4609{0x3800000, 0x80000000, 0x807fffff, 0x80000000, 0x3800080},
4610{0x3800000, 0x80000000, 0x80800000, 0x80800000, 0x3800000},
4611{0x3800000, 0x80000000, 0x80800002, 0x80800002, 0x3800000},
4612{0x3800000, 0x80000000, 0x81398437, 0x81398437, 0x3800000},
4613{0x3800000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3800000},
4614{0x3800000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3800000},
4615{0x3800000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3800000},
4616{0x3800000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3800000},
4617{0x3800000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3800000},
4618{0x3800000, 0x80000000, 0xff800000, 0xff800000, 0x3800000},
4619{0x3800000, 0x80000000, 0xff800001, 0x7fc00000, 0x3800001},
4620{0x3800000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3800001},
4621{0x3800000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3800001},
4622{0x3800000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3800000},
4623{0x3800000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3800000},
4624{0x3800000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3800000},
4625{0x3800000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3800000},
4626{0x3800000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3800000},
4627{0x3800000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3800000},
4628{0x3800000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3800000},
4629{0x3800000, 0x80000000, 0x9503366, 0x9503366, 0x3800000},
4630{0x3800000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3800000},
4631{0x3800000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3800000},
4632{0x3800000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3800000},
4633{0x3800000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3800000},
4634{0x3800000, 0x80000000, 0x966320b, 0x966320b, 0x3800000},
4635{0x3800000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3800000},
4636{0x3800000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800000},
4637{0x3800000, 0x80000000, 0x317285d3, 0x317285d3, 0x3800000},
4638{0x3800000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3800000},
4639{0x3800000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3800000},
4640{0x3800000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3800000},
4641{0x3800000, 0x80000001, 0x0, 0x0, 0x3800080},
4642{0x3800000, 0x80000001, 0x1, 0x0, 0x3800080},
4643{0x3800000, 0x80000001, 0x76, 0x0, 0x3800080},
4644{0x3800000, 0x80000001, 0x2b94, 0x0, 0x3800080},
4645{0x3800000, 0x80000001, 0x636d24, 0x0, 0x3800080},
4646{0x3800000, 0x80000001, 0x7fffff, 0x0, 0x3800080},
4647{0x3800000, 0x80000001, 0x800000, 0x800000, 0x3800080},
4648{0x3800000, 0x80000001, 0x800002, 0x800002, 0x3800080},
4649{0x3800000, 0x80000001, 0x1398437, 0x1398437, 0x3800080},
4650{0x3800000, 0x80000001, 0xba98d27, 0xba98d27, 0x3800080},
4651{0x3800000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3800080},
4652{0x3800000, 0x80000001, 0x751f853a, 0x751f853a, 0x3800080},
4653{0x3800000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
4654{0x3800000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3800080},
4655{0x3800000, 0x80000001, 0x7f800000, 0x7f800000, 0x3800080},
4656{0x3800000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3800081},
4657{0x3800000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3800081},
4658{0x3800000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3800081},
4659{0x3800000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3800080},
4660{0x3800000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3800080},
4661{0x3800000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3800080},
4662{0x3800000, 0x80000001, 0x80000000, 0x80000000, 0x3800080},
4663{0x3800000, 0x80000001, 0x80000001, 0x0, 0x3800080},
4664{0x3800000, 0x80000001, 0x80000076, 0x0, 0x3800080},
4665{0x3800000, 0x80000001, 0x80002b94, 0x0, 0x3800080},
4666{0x3800000, 0x80000001, 0x80636d24, 0x0, 0x3800080},
4667{0x3800000, 0x80000001, 0x807fffff, 0x0, 0x3800080},
4668{0x3800000, 0x80000001, 0x80800000, 0x80800000, 0x3800080},
4669{0x3800000, 0x80000001, 0x80800002, 0x80800002, 0x3800080},
4670{0x3800000, 0x80000001, 0x81398437, 0x81398437, 0x3800080},
4671{0x3800000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3800080},
4672{0x3800000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
4673{0x3800000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3800080},
4674{0x3800000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3800080},
4675{0x3800000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3800080},
4676{0x3800000, 0x80000001, 0xff800000, 0xff800000, 0x3800080},
4677{0x3800000, 0x80000001, 0xff800001, 0x7fc00000, 0x3800081},
4678{0x3800000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3800081},
4679{0x3800000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3800081},
4680{0x3800000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3800080},
4681{0x3800000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3800080},
4682{0x3800000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3800080},
4683{0x3800000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3800080},
4684{0x3800000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3800080},
4685{0x3800000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3800080},
4686{0x3800000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3800080},
4687{0x3800000, 0x80000001, 0x9503366, 0x9503366, 0x3800080},
4688{0x3800000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
4689{0x3800000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
4690{0x3800000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3800080},
4691{0x3800000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
4692{0x3800000, 0x80000001, 0x966320b, 0x966320b, 0x3800080},
4693{0x3800000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3800080},
4694{0x3800000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
4695{0x3800000, 0x80000001, 0x317285d3, 0x317285d3, 0x3800080},
4696{0x3800000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3800080},
4697{0x3800000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
4698{0x3800000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3800080},
4699{0x3800000, 0x80000076, 0x0, 0x0, 0x3800080},
4700{0x3800000, 0x80000076, 0x1, 0x0, 0x3800080},
4701{0x3800000, 0x80000076, 0x76, 0x0, 0x3800080},
4702{0x3800000, 0x80000076, 0x2b94, 0x0, 0x3800080},
4703{0x3800000, 0x80000076, 0x636d24, 0x0, 0x3800080},
4704{0x3800000, 0x80000076, 0x7fffff, 0x0, 0x3800080},
4705{0x3800000, 0x80000076, 0x800000, 0x800000, 0x3800080},
4706{0x3800000, 0x80000076, 0x800002, 0x800002, 0x3800080},
4707{0x3800000, 0x80000076, 0x1398437, 0x1398437, 0x3800080},
4708{0x3800000, 0x80000076, 0xba98d27, 0xba98d27, 0x3800080},
4709{0x3800000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3800080},
4710{0x3800000, 0x80000076, 0x751f853a, 0x751f853a, 0x3800080},
4711{0x3800000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
4712{0x3800000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3800080},
4713{0x3800000, 0x80000076, 0x7f800000, 0x7f800000, 0x3800080},
4714{0x3800000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3800081},
4715{0x3800000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3800081},
4716{0x3800000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3800081},
4717{0x3800000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3800080},
4718{0x3800000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3800080},
4719{0x3800000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3800080},
4720{0x3800000, 0x80000076, 0x80000000, 0x80000000, 0x3800080},
4721{0x3800000, 0x80000076, 0x80000001, 0x0, 0x3800080},
4722{0x3800000, 0x80000076, 0x80000076, 0x0, 0x3800080},
4723{0x3800000, 0x80000076, 0x80002b94, 0x0, 0x3800080},
4724{0x3800000, 0x80000076, 0x80636d24, 0x0, 0x3800080},
4725{0x3800000, 0x80000076, 0x807fffff, 0x0, 0x3800080},
4726{0x3800000, 0x80000076, 0x80800000, 0x80800000, 0x3800080},
4727{0x3800000, 0x80000076, 0x80800002, 0x80800002, 0x3800080},
4728{0x3800000, 0x80000076, 0x81398437, 0x81398437, 0x3800080},
4729{0x3800000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3800080},
4730{0x3800000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
4731{0x3800000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3800080},
4732{0x3800000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3800080},
4733{0x3800000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3800080},
4734{0x3800000, 0x80000076, 0xff800000, 0xff800000, 0x3800080},
4735{0x3800000, 0x80000076, 0xff800001, 0x7fc00000, 0x3800081},
4736{0x3800000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3800081},
4737{0x3800000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3800081},
4738{0x3800000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3800080},
4739{0x3800000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3800080},
4740{0x3800000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3800080},
4741{0x3800000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3800080},
4742{0x3800000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3800080},
4743{0x3800000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3800080},
4744{0x3800000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3800080},
4745{0x3800000, 0x80000076, 0x9503366, 0x9503366, 0x3800080},
4746{0x3800000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
4747{0x3800000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
4748{0x3800000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3800080},
4749{0x3800000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
4750{0x3800000, 0x80000076, 0x966320b, 0x966320b, 0x3800080},
4751{0x3800000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3800080},
4752{0x3800000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
4753{0x3800000, 0x80000076, 0x317285d3, 0x317285d3, 0x3800080},
4754{0x3800000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3800080},
4755{0x3800000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
4756{0x3800000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3800080},
4757{0x3800000, 0x80002b94, 0x0, 0x0, 0x3800080},
4758{0x3800000, 0x80002b94, 0x1, 0x0, 0x3800080},
4759{0x3800000, 0x80002b94, 0x76, 0x0, 0x3800080},
4760{0x3800000, 0x80002b94, 0x2b94, 0x0, 0x3800080},
4761{0x3800000, 0x80002b94, 0x636d24, 0x0, 0x3800080},
4762{0x3800000, 0x80002b94, 0x7fffff, 0x0, 0x3800080},
4763{0x3800000, 0x80002b94, 0x800000, 0x800000, 0x3800080},
4764{0x3800000, 0x80002b94, 0x800002, 0x800002, 0x3800080},
4765{0x3800000, 0x80002b94, 0x1398437, 0x1398437, 0x3800080},
4766{0x3800000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3800080},
4767{0x3800000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3800080},
4768{0x3800000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3800080},
4769{0x3800000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
4770{0x3800000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3800080},
4771{0x3800000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3800080},
4772{0x3800000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3800081},
4773{0x3800000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3800081},
4774{0x3800000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3800081},
4775{0x3800000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3800080},
4776{0x3800000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3800080},
4777{0x3800000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3800080},
4778{0x3800000, 0x80002b94, 0x80000000, 0x80000000, 0x3800080},
4779{0x3800000, 0x80002b94, 0x80000001, 0x0, 0x3800080},
4780{0x3800000, 0x80002b94, 0x80000076, 0x0, 0x3800080},
4781{0x3800000, 0x80002b94, 0x80002b94, 0x0, 0x3800080},
4782{0x3800000, 0x80002b94, 0x80636d24, 0x0, 0x3800080},
4783{0x3800000, 0x80002b94, 0x807fffff, 0x0, 0x3800080},
4784{0x3800000, 0x80002b94, 0x80800000, 0x80800000, 0x3800080},
4785{0x3800000, 0x80002b94, 0x80800002, 0x80800002, 0x3800080},
4786{0x3800000, 0x80002b94, 0x81398437, 0x81398437, 0x3800080},
4787{0x3800000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3800080},
4788{0x3800000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
4789{0x3800000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3800080},
4790{0x3800000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3800080},
4791{0x3800000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3800080},
4792{0x3800000, 0x80002b94, 0xff800000, 0xff800000, 0x3800080},
4793{0x3800000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3800081},
4794{0x3800000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3800081},
4795{0x3800000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3800081},
4796{0x3800000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3800080},
4797{0x3800000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3800080},
4798{0x3800000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3800080},
4799{0x3800000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3800080},
4800{0x3800000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3800080},
4801{0x3800000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3800080},
4802{0x3800000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3800080},
4803{0x3800000, 0x80002b94, 0x9503366, 0x9503366, 0x3800080},
4804{0x3800000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
4805{0x3800000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
4806{0x3800000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3800080},
4807{0x3800000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
4808{0x3800000, 0x80002b94, 0x966320b, 0x966320b, 0x3800080},
4809{0x3800000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3800080},
4810{0x3800000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
4811{0x3800000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3800080},
4812{0x3800000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3800080},
4813{0x3800000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
4814{0x3800000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3800080},
4815{0x3800000, 0x80636d24, 0x0, 0x0, 0x3800080},
4816{0x3800000, 0x80636d24, 0x1, 0x0, 0x3800080},
4817{0x3800000, 0x80636d24, 0x76, 0x0, 0x3800080},
4818{0x3800000, 0x80636d24, 0x2b94, 0x0, 0x3800080},
4819{0x3800000, 0x80636d24, 0x636d24, 0x0, 0x3800080},
4820{0x3800000, 0x80636d24, 0x7fffff, 0x0, 0x3800080},
4821{0x3800000, 0x80636d24, 0x800000, 0x800000, 0x3800080},
4822{0x3800000, 0x80636d24, 0x800002, 0x800002, 0x3800080},
4823{0x3800000, 0x80636d24, 0x1398437, 0x1398437, 0x3800080},
4824{0x3800000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3800080},
4825{0x3800000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3800080},
4826{0x3800000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3800080},
4827{0x3800000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
4828{0x3800000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3800080},
4829{0x3800000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3800080},
4830{0x3800000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3800081},
4831{0x3800000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3800081},
4832{0x3800000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3800081},
4833{0x3800000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3800080},
4834{0x3800000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3800080},
4835{0x3800000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3800080},
4836{0x3800000, 0x80636d24, 0x80000000, 0x80000000, 0x3800080},
4837{0x3800000, 0x80636d24, 0x80000001, 0x0, 0x3800080},
4838{0x3800000, 0x80636d24, 0x80000076, 0x0, 0x3800080},
4839{0x3800000, 0x80636d24, 0x80002b94, 0x0, 0x3800080},
4840{0x3800000, 0x80636d24, 0x80636d24, 0x0, 0x3800080},
4841{0x3800000, 0x80636d24, 0x807fffff, 0x0, 0x3800080},
4842{0x3800000, 0x80636d24, 0x80800000, 0x80800000, 0x3800080},
4843{0x3800000, 0x80636d24, 0x80800002, 0x80800002, 0x3800080},
4844{0x3800000, 0x80636d24, 0x81398437, 0x81398437, 0x3800080},
4845{0x3800000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3800080},
4846{0x3800000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
4847{0x3800000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3800080},
4848{0x3800000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3800080},
4849{0x3800000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3800080},
4850{0x3800000, 0x80636d24, 0xff800000, 0xff800000, 0x3800080},
4851{0x3800000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3800081},
4852{0x3800000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3800081},
4853{0x3800000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3800081},
4854{0x3800000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3800080},
4855{0x3800000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3800080},
4856{0x3800000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3800080},
4857{0x3800000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3800080},
4858{0x3800000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3800080},
4859{0x3800000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3800080},
4860{0x3800000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3800080},
4861{0x3800000, 0x80636d24, 0x9503366, 0x9503366, 0x3800080},
4862{0x3800000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
4863{0x3800000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
4864{0x3800000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3800080},
4865{0x3800000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
4866{0x3800000, 0x80636d24, 0x966320b, 0x966320b, 0x3800080},
4867{0x3800000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3800080},
4868{0x3800000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
4869{0x3800000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3800080},
4870{0x3800000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3800080},
4871{0x3800000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
4872{0x3800000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3800080},
4873{0x3800000, 0x807fffff, 0x0, 0x0, 0x3800080},
4874{0x3800000, 0x807fffff, 0x1, 0x0, 0x3800080},
4875{0x3800000, 0x807fffff, 0x76, 0x0, 0x3800080},
4876{0x3800000, 0x807fffff, 0x2b94, 0x0, 0x3800080},
4877{0x3800000, 0x807fffff, 0x636d24, 0x0, 0x3800080},
4878{0x3800000, 0x807fffff, 0x7fffff, 0x0, 0x3800080},
4879{0x3800000, 0x807fffff, 0x800000, 0x800000, 0x3800080},
4880{0x3800000, 0x807fffff, 0x800002, 0x800002, 0x3800080},
4881{0x3800000, 0x807fffff, 0x1398437, 0x1398437, 0x3800080},
4882{0x3800000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3800080},
4883{0x3800000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3800080},
4884{0x3800000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3800080},
4885{0x3800000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
4886{0x3800000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3800080},
4887{0x3800000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3800080},
4888{0x3800000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3800081},
4889{0x3800000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3800081},
4890{0x3800000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3800081},
4891{0x3800000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3800080},
4892{0x3800000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3800080},
4893{0x3800000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3800080},
4894{0x3800000, 0x807fffff, 0x80000000, 0x80000000, 0x3800080},
4895{0x3800000, 0x807fffff, 0x80000001, 0x0, 0x3800080},
4896{0x3800000, 0x807fffff, 0x80000076, 0x0, 0x3800080},
4897{0x3800000, 0x807fffff, 0x80002b94, 0x0, 0x3800080},
4898{0x3800000, 0x807fffff, 0x80636d24, 0x0, 0x3800080},
4899{0x3800000, 0x807fffff, 0x807fffff, 0x0, 0x3800080},
4900{0x3800000, 0x807fffff, 0x80800000, 0x80800000, 0x3800080},
4901{0x3800000, 0x807fffff, 0x80800002, 0x80800002, 0x3800080},
4902{0x3800000, 0x807fffff, 0x81398437, 0x81398437, 0x3800080},
4903{0x3800000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3800080},
4904{0x3800000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
4905{0x3800000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3800080},
4906{0x3800000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3800080},
4907{0x3800000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3800080},
4908{0x3800000, 0x807fffff, 0xff800000, 0xff800000, 0x3800080},
4909{0x3800000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3800081},
4910{0x3800000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3800081},
4911{0x3800000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3800081},
4912{0x3800000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3800080},
4913{0x3800000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3800080},
4914{0x3800000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3800080},
4915{0x3800000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3800080},
4916{0x3800000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3800080},
4917{0x3800000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3800080},
4918{0x3800000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3800080},
4919{0x3800000, 0x807fffff, 0x9503366, 0x9503366, 0x3800080},
4920{0x3800000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
4921{0x3800000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
4922{0x3800000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3800080},
4923{0x3800000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
4924{0x3800000, 0x807fffff, 0x966320b, 0x966320b, 0x3800080},
4925{0x3800000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3800080},
4926{0x3800000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
4927{0x3800000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3800080},
4928{0x3800000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3800080},
4929{0x3800000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
4930{0x3800000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3800080},
4931{0x3800000, 0x80800000, 0x0, 0x80800000, 0x3800000},
4932{0x3800000, 0x80800000, 0x1, 0x80800000, 0x3800080},
4933{0x3800000, 0x80800000, 0x76, 0x80800000, 0x3800080},
4934{0x3800000, 0x80800000, 0x2b94, 0x80800000, 0x3800080},
4935{0x3800000, 0x80800000, 0x636d24, 0x80800000, 0x3800080},
4936{0x3800000, 0x80800000, 0x7fffff, 0x80800000, 0x3800080},
4937{0x3800000, 0x80800000, 0x800000, 0x80000000, 0x3800000},
4938{0x3800000, 0x80800000, 0x800002, 0x0, 0x3800008},
4939{0x3800000, 0x80800000, 0x1398437, 0xf3086e, 0x3800000},
4940{0x3800000, 0x80800000, 0xba98d27, 0xba98d25, 0x3800000},
4941{0x3800000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3800000},
4942{0x3800000, 0x80800000, 0x751f853a, 0x751f8539, 0x3800010},
4943{0x3800000, 0x80800000, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
4944{0x3800000, 0x80800000, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
4945{0x3800000, 0x80800000, 0x7f800000, 0x7f800000, 0x3800000},
4946{0x3800000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3800001},
4947{0x3800000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3800001},
4948{0x3800000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3800001},
4949{0x3800000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3800000},
4950{0x3800000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
4951{0x3800000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3800000},
4952{0x3800000, 0x80800000, 0x80000000, 0x80800000, 0x3800000},
4953{0x3800000, 0x80800000, 0x80000001, 0x80800000, 0x3800080},
4954{0x3800000, 0x80800000, 0x80000076, 0x80800000, 0x3800080},
4955{0x3800000, 0x80800000, 0x80002b94, 0x80800000, 0x3800080},
4956{0x3800000, 0x80800000, 0x80636d24, 0x80800000, 0x3800080},
4957{0x3800000, 0x80800000, 0x807fffff, 0x80800000, 0x3800080},
4958{0x3800000, 0x80800000, 0x80800000, 0x81000000, 0x3800000},
4959{0x3800000, 0x80800000, 0x80800002, 0x81000001, 0x3800000},
4960{0x3800000, 0x80800000, 0x81398437, 0x81798437, 0x3800000},
4961{0x3800000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3800000},
4962{0x3800000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3800000},
4963{0x3800000, 0x80800000, 0xf51f853a, 0xf51f853b, 0x3800010},
4964{0x3800000, 0x80800000, 0xff7ffff0, 0xff7ffff1, 0x3800010},
4965{0x3800000, 0x80800000, 0xff7fffff, 0xff800000, 0x3800014},
4966{0x3800000, 0x80800000, 0xff800000, 0xff800000, 0x3800000},
4967{0x3800000, 0x80800000, 0xff800001, 0x7fc00000, 0x3800001},
4968{0x3800000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3800001},
4969{0x3800000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3800001},
4970{0x3800000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3800000},
4971{0x3800000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3800000},
4972{0x3800000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3800000},
4973{0x3800000, 0x80800000, 0x4f3495cb, 0x4f3495ca, 0x3800010},
4974{0x3800000, 0x80800000, 0xe73a5134, 0xe73a5135, 0x3800010},
4975{0x3800000, 0x80800000, 0x7c994e9e, 0x7c994e9d, 0x3800010},
4976{0x3800000, 0x80800000, 0x6164bd6c, 0x6164bd6b, 0x3800010},
4977{0x3800000, 0x80800000, 0x9503366, 0x9503326, 0x3800000},
4978{0x3800000, 0x80800000, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
4979{0x3800000, 0x80800000, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
4980{0x3800000, 0x80800000, 0x77f31e2f, 0x77f31e2e, 0x3800010},
4981{0x3800000, 0x80800000, 0xaab4d7d8, 0xaab4d7d9, 0x3800010},
4982{0x3800000, 0x80800000, 0x966320b, 0x96631cb, 0x3800000},
4983{0x3800000, 0x80800000, 0xb26bddee, 0xb26bddef, 0x3800010},
4984{0x3800000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010},
4985{0x3800000, 0x80800000, 0x317285d3, 0x317285d2, 0x3800010},
4986{0x3800000, 0x80800000, 0x3c9623b1, 0x3c9623b0, 0x3800010},
4987{0x3800000, 0x80800000, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
4988{0x3800000, 0x80800000, 0x7b906a6c, 0x7b906a6b, 0x3800010},
4989{0x3800000, 0x80800002, 0x0, 0x80800002, 0x3800000},
4990{0x3800000, 0x80800002, 0x1, 0x80800002, 0x3800080},
4991{0x3800000, 0x80800002, 0x76, 0x80800002, 0x3800080},
4992{0x3800000, 0x80800002, 0x2b94, 0x80800002, 0x3800080},
4993{0x3800000, 0x80800002, 0x636d24, 0x80800002, 0x3800080},
4994{0x3800000, 0x80800002, 0x7fffff, 0x80800002, 0x3800080},
4995{0x3800000, 0x80800002, 0x800000, 0x0, 0x3800008},
4996{0x3800000, 0x80800002, 0x800002, 0x80000000, 0x3800000},
4997{0x3800000, 0x80800002, 0x1398437, 0xf3086c, 0x3800000},
4998{0x3800000, 0x80800002, 0xba98d27, 0xba98d24, 0x3800010},
4999{0x3800000, 0x80800002, 0xba98d7a, 0xba98d77, 0x3800010},
5000{0x3800000, 0x80800002, 0x751f853a, 0x751f8539, 0x3800010},
5001{0x3800000, 0x80800002, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
5002{0x3800000, 0x80800002, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
5003{0x3800000, 0x80800002, 0x7f800000, 0x7f800000, 0x3800000},
5004{0x3800000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3800001},
5005{0x3800000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3800001},
5006{0x3800000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3800001},
5007{0x3800000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3800000},
5008{0x3800000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3800000},
5009{0x3800000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3800000},
5010{0x3800000, 0x80800002, 0x80000000, 0x80800002, 0x3800000},
5011{0x3800000, 0x80800002, 0x80000001, 0x80800002, 0x3800080},
5012{0x3800000, 0x80800002, 0x80000076, 0x80800002, 0x3800080},
5013{0x3800000, 0x80800002, 0x80002b94, 0x80800002, 0x3800080},
5014{0x3800000, 0x80800002, 0x80636d24, 0x80800002, 0x3800080},
5015{0x3800000, 0x80800002, 0x807fffff, 0x80800002, 0x3800080},
5016{0x3800000, 0x80800002, 0x80800000, 0x81000001, 0x3800000},
5017{0x3800000, 0x80800002, 0x80800002, 0x81000002, 0x3800000},
5018{0x3800000, 0x80800002, 0x81398437, 0x81798438, 0x3800000},
5019{0x3800000, 0x80800002, 0x8ba98d27, 0x8ba98d2a, 0x3800010},
5020{0x3800000, 0x80800002, 0x8ba98d7a, 0x8ba98d7d, 0x3800010},
5021{0x3800000, 0x80800002, 0xf51f853a, 0xf51f853b, 0x3800010},
5022{0x3800000, 0x80800002, 0xff7ffff0, 0xff7ffff1, 0x3800010},
5023{0x3800000, 0x80800002, 0xff7fffff, 0xff800000, 0x3800014},
5024{0x3800000, 0x80800002, 0xff800000, 0xff800000, 0x3800000},
5025{0x3800000, 0x80800002, 0xff800001, 0x7fc00000, 0x3800001},
5026{0x3800000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3800001},
5027{0x3800000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3800001},
5028{0x3800000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3800000},
5029{0x3800000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3800000},
5030{0x3800000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3800000},
5031{0x3800000, 0x80800002, 0x4f3495cb, 0x4f3495ca, 0x3800010},
5032{0x3800000, 0x80800002, 0xe73a5134, 0xe73a5135, 0x3800010},
5033{0x3800000, 0x80800002, 0x7c994e9e, 0x7c994e9d, 0x3800010},
5034{0x3800000, 0x80800002, 0x6164bd6c, 0x6164bd6b, 0x3800010},
5035{0x3800000, 0x80800002, 0x9503366, 0x9503325, 0x3800010},
5036{0x3800000, 0x80800002, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
5037{0x3800000, 0x80800002, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
5038{0x3800000, 0x80800002, 0x77f31e2f, 0x77f31e2e, 0x3800010},
5039{0x3800000, 0x80800002, 0xaab4d7d8, 0xaab4d7d9, 0x3800010},
5040{0x3800000, 0x80800002, 0x966320b, 0x96631ca, 0x3800010},
5041{0x3800000, 0x80800002, 0xb26bddee, 0xb26bddef, 0x3800010},
5042{0x3800000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010},
5043{0x3800000, 0x80800002, 0x317285d3, 0x317285d2, 0x3800010},
5044{0x3800000, 0x80800002, 0x3c9623b1, 0x3c9623b0, 0x3800010},
5045{0x3800000, 0x80800002, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
5046{0x3800000, 0x80800002, 0x7b906a6c, 0x7b906a6b, 0x3800010},
5047{0x3800000, 0x81398437, 0x0, 0x81398437, 0x3800000},
5048{0x3800000, 0x81398437, 0x1, 0x81398437, 0x3800080},
5049{0x3800000, 0x81398437, 0x76, 0x81398437, 0x3800080},
5050{0x3800000, 0x81398437, 0x2b94, 0x81398437, 0x3800080},
5051{0x3800000, 0x81398437, 0x636d24, 0x81398437, 0x3800080},
5052{0x3800000, 0x81398437, 0x7fffff, 0x81398437, 0x3800080},
5053{0x3800000, 0x81398437, 0x800000, 0x80f3086e, 0x3800000},
5054{0x3800000, 0x81398437, 0x800002, 0x80f3086c, 0x3800000},
5055{0x3800000, 0x81398437, 0x1398437, 0x80000000, 0x3800000},
5056{0x3800000, 0x81398437, 0xba98d27, 0xba98d21, 0x3800010},
5057{0x3800000, 0x81398437, 0xba98d7a, 0xba98d74, 0x3800010},
5058{0x3800000, 0x81398437, 0x751f853a, 0x751f8539, 0x3800010},
5059{0x3800000, 0x81398437, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
5060{0x3800000, 0x81398437, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
5061{0x3800000, 0x81398437, 0x7f800000, 0x7f800000, 0x3800000},
5062{0x3800000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3800001},
5063{0x3800000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3800001},
5064{0x3800000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3800001},
5065{0x3800000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3800000},
5066{0x3800000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3800000},
5067{0x3800000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3800000},
5068{0x3800000, 0x81398437, 0x80000000, 0x81398437, 0x3800000},
5069{0x3800000, 0x81398437, 0x80000001, 0x81398437, 0x3800080},
5070{0x3800000, 0x81398437, 0x80000076, 0x81398437, 0x3800080},
5071{0x3800000, 0x81398437, 0x80002b94, 0x81398437, 0x3800080},
5072{0x3800000, 0x81398437, 0x80636d24, 0x81398437, 0x3800080},
5073{0x3800000, 0x81398437, 0x807fffff, 0x81398437, 0x3800080},
5074{0x3800000, 0x81398437, 0x80800000, 0x81798437, 0x3800000},
5075{0x3800000, 0x81398437, 0x80800002, 0x81798438, 0x3800000},
5076{0x3800000, 0x81398437, 0x81398437, 0x81b98437, 0x3800000},
5077{0x3800000, 0x81398437, 0x8ba98d27, 0x8ba98d2d, 0x3800010},
5078{0x3800000, 0x81398437, 0x8ba98d7a, 0x8ba98d80, 0x3800010},
5079{0x3800000, 0x81398437, 0xf51f853a, 0xf51f853b, 0x3800010},
5080{0x3800000, 0x81398437, 0xff7ffff0, 0xff7ffff1, 0x3800010},
5081{0x3800000, 0x81398437, 0xff7fffff, 0xff800000, 0x3800014},
5082{0x3800000, 0x81398437, 0xff800000, 0xff800000, 0x3800000},
5083{0x3800000, 0x81398437, 0xff800001, 0x7fc00000, 0x3800001},
5084{0x3800000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3800001},
5085{0x3800000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3800001},
5086{0x3800000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3800000},
5087{0x3800000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3800000},
5088{0x3800000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3800000},
5089{0x3800000, 0x81398437, 0x4f3495cb, 0x4f3495ca, 0x3800010},
5090{0x3800000, 0x81398437, 0xe73a5134, 0xe73a5135, 0x3800010},
5091{0x3800000, 0x81398437, 0x7c994e9e, 0x7c994e9d, 0x3800010},
5092{0x3800000, 0x81398437, 0x6164bd6c, 0x6164bd6b, 0x3800010},
5093{0x3800000, 0x81398437, 0x9503366, 0x95032ac, 0x3800010},
5094{0x3800000, 0x81398437, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
5095{0x3800000, 0x81398437, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
5096{0x3800000, 0x81398437, 0x77f31e2f, 0x77f31e2e, 0x3800010},
5097{0x3800000, 0x81398437, 0xaab4d7d8, 0xaab4d7d9, 0x3800010},
5098{0x3800000, 0x81398437, 0x966320b, 0x9663151, 0x3800010},
5099{0x3800000, 0x81398437, 0xb26bddee, 0xb26bddef, 0x3800010},
5100{0x3800000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010},
5101{0x3800000, 0x81398437, 0x317285d3, 0x317285d2, 0x3800010},
5102{0x3800000, 0x81398437, 0x3c9623b1, 0x3c9623b0, 0x3800010},
5103{0x3800000, 0x81398437, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
5104{0x3800000, 0x81398437, 0x7b906a6c, 0x7b906a6b, 0x3800010},
5105{0x3800000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3800000},
5106{0x3800000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3800080},
5107{0x3800000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3800080},
5108{0x3800000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3800080},
5109{0x3800000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3800080},
5110{0x3800000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3800080},
5111{0x3800000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3800000},
5112{0x3800000, 0x8ba98d27, 0x800002, 0x8ba98d25, 0x3800010},
5113{0x3800000, 0x8ba98d27, 0x1398437, 0x8ba98d22, 0x3800010},
5114{0x3800000, 0x8ba98d27, 0xba98d27, 0x80000000, 0x3800000},
5115{0x3800000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3800000},
5116{0x3800000, 0x8ba98d27, 0x751f853a, 0x751f8539, 0x3800010},
5117{0x3800000, 0x8ba98d27, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
5118{0x3800000, 0x8ba98d27, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
5119{0x3800000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3800000},
5120{0x3800000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3800001},
5121{0x3800000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3800001},
5122{0x3800000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3800001},
5123{0x3800000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3800000},
5124{0x3800000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3800000},
5125{0x3800000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3800000},
5126{0x3800000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3800000},
5127{0x3800000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3800080},
5128{0x3800000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3800080},
5129{0x3800000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3800080},
5130{0x3800000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3800080},
5131{0x3800000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3800080},
5132{0x3800000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3800000},
5133{0x3800000, 0x8ba98d27, 0x80800002, 0x8ba98d2a, 0x3800010},
5134{0x3800000, 0x8ba98d27, 0x81398437, 0x8ba98d2d, 0x3800010},
5135{0x3800000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3800000},
5136{0x3800000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d51, 0x3800010},
5137{0x3800000, 0x8ba98d27, 0xf51f853a, 0xf51f853b, 0x3800010},
5138{0x3800000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff1, 0x3800010},
5139{0x3800000, 0x8ba98d27, 0xff7fffff, 0xff800000, 0x3800014},
5140{0x3800000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3800000},
5141{0x3800000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3800001},
5142{0x3800000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3800001},
5143{0x3800000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3800001},
5144{0x3800000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3800000},
5145{0x3800000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3800000},
5146{0x3800000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3800000},
5147{0x3800000, 0x8ba98d27, 0x4f3495cb, 0x4f3495ca, 0x3800010},
5148{0x3800000, 0x8ba98d27, 0xe73a5134, 0xe73a5135, 0x3800010},
5149{0x3800000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9d, 0x3800010},
5150{0x3800000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6b, 0x3800010},
5151{0x3800000, 0x8ba98d27, 0x9503366, 0x8ba30b8c, 0x3800010},
5152{0x3800000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
5153{0x3800000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
5154{0x3800000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2e, 0x3800010},
5155{0x3800000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d9, 0x3800010},
5156{0x3800000, 0x8ba98d27, 0x966320b, 0x8ba25b97, 0x3800010},
5157{0x3800000, 0x8ba98d27, 0xb26bddee, 0xb26bddef, 0x3800010},
5158{0x3800000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010},
5159{0x3800000, 0x8ba98d27, 0x317285d3, 0x317285d2, 0x3800010},
5160{0x3800000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b0, 0x3800010},
5161{0x3800000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
5162{0x3800000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6b, 0x3800010},
5163{0x3800000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3800000},
5164{0x3800000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3800080},
5165{0x3800000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3800080},
5166{0x3800000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3800080},
5167{0x3800000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3800080},
5168{0x3800000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3800080},
5169{0x3800000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3800000},
5170{0x3800000, 0x8ba98d7a, 0x800002, 0x8ba98d78, 0x3800010},
5171{0x3800000, 0x8ba98d7a, 0x1398437, 0x8ba98d75, 0x3800010},
5172{0x3800000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3800000},
5173{0x3800000, 0x8ba98d7a, 0xba98d7a, 0x80000000, 0x3800000},
5174{0x3800000, 0x8ba98d7a, 0x751f853a, 0x751f8539, 0x3800010},
5175{0x3800000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
5176{0x3800000, 0x8ba98d7a, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
5177{0x3800000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3800000},
5178{0x3800000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3800001},
5179{0x3800000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3800001},
5180{0x3800000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3800001},
5181{0x3800000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3800000},
5182{0x3800000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3800000},
5183{0x3800000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3800000},
5184{0x3800000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3800000},
5185{0x3800000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3800080},
5186{0x3800000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3800080},
5187{0x3800000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3800080},
5188{0x3800000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3800080},
5189{0x3800000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3800080},
5190{0x3800000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3800000},
5191{0x3800000, 0x8ba98d7a, 0x80800002, 0x8ba98d7d, 0x3800010},
5192{0x3800000, 0x8ba98d7a, 0x81398437, 0x8ba98d80, 0x3800010},
5193{0x3800000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d51, 0x3800010},
5194{0x3800000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3800000},
5195{0x3800000, 0x8ba98d7a, 0xf51f853a, 0xf51f853b, 0x3800010},
5196{0x3800000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff1, 0x3800010},
5197{0x3800000, 0x8ba98d7a, 0xff7fffff, 0xff800000, 0x3800014},
5198{0x3800000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3800000},
5199{0x3800000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3800001},
5200{0x3800000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3800001},
5201{0x3800000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3800001},
5202{0x3800000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3800000},
5203{0x3800000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3800000},
5204{0x3800000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3800000},
5205{0x3800000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495ca, 0x3800010},
5206{0x3800000, 0x8ba98d7a, 0xe73a5134, 0xe73a5135, 0x3800010},
5207{0x3800000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9d, 0x3800010},
5208{0x3800000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6b, 0x3800010},
5209{0x3800000, 0x8ba98d7a, 0x9503366, 0x8ba30bdf, 0x3800010},
5210{0x3800000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
5211{0x3800000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
5212{0x3800000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2e, 0x3800010},
5213{0x3800000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d9, 0x3800010},
5214{0x3800000, 0x8ba98d7a, 0x966320b, 0x8ba25bea, 0x3800010},
5215{0x3800000, 0x8ba98d7a, 0xb26bddee, 0xb26bddef, 0x3800010},
5216{0x3800000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010},
5217{0x3800000, 0x8ba98d7a, 0x317285d3, 0x317285d2, 0x3800010},
5218{0x3800000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b0, 0x3800010},
5219{0x3800000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
5220{0x3800000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6b, 0x3800010},
5221{0x3800000, 0xf51f853a, 0x0, 0xf51f853a, 0x3800000},
5222{0x3800000, 0xf51f853a, 0x1, 0xf51f853a, 0x3800080},
5223{0x3800000, 0xf51f853a, 0x76, 0xf51f853a, 0x3800080},
5224{0x3800000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3800080},
5225{0x3800000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3800080},
5226{0x3800000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3800080},
5227{0x3800000, 0xf51f853a, 0x800000, 0xf51f853a, 0x3800010},
5228{0x3800000, 0xf51f853a, 0x800002, 0xf51f853a, 0x3800010},
5229{0x3800000, 0xf51f853a, 0x1398437, 0xf51f853a, 0x3800010},
5230{0x3800000, 0xf51f853a, 0xba98d27, 0xf51f853a, 0x3800010},
5231{0x3800000, 0xf51f853a, 0xba98d7a, 0xf51f853a, 0x3800010},
5232{0x3800000, 0xf51f853a, 0x751f853a, 0x80000000, 0x3800000},
5233{0x3800000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe6, 0x3800010},
5234{0x3800000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff5, 0x3800010},
5235{0x3800000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3800000},
5236{0x3800000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3800001},
5237{0x3800000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3800001},
5238{0x3800000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3800001},
5239{0x3800000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3800000},
5240{0x3800000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3800000},
5241{0x3800000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3800000},
5242{0x3800000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3800000},
5243{0x3800000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3800080},
5244{0x3800000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3800080},
5245{0x3800000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3800080},
5246{0x3800000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3800080},
5247{0x3800000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3800080},
5248{0x3800000, 0xf51f853a, 0x80800000, 0xf51f853b, 0x3800010},
5249{0x3800000, 0xf51f853a, 0x80800002, 0xf51f853b, 0x3800010},
5250{0x3800000, 0xf51f853a, 0x81398437, 0xf51f853b, 0x3800010},
5251{0x3800000, 0xf51f853a, 0x8ba98d27, 0xf51f853b, 0x3800010},
5252{0x3800000, 0xf51f853a, 0x8ba98d7a, 0xf51f853b, 0x3800010},
5253{0x3800000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3800000},
5254{0x3800000, 0xf51f853a, 0xff7ffff0, 0xff7ffffa, 0x3800010},
5255{0x3800000, 0xf51f853a, 0xff7fffff, 0xff800000, 0x3800014},
5256{0x3800000, 0xf51f853a, 0xff800000, 0xff800000, 0x3800000},
5257{0x3800000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3800001},
5258{0x3800000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3800001},
5259{0x3800000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3800001},
5260{0x3800000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3800000},
5261{0x3800000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3800000},
5262{0x3800000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3800000},
5263{0x3800000, 0xf51f853a, 0x4f3495cb, 0xf51f853a, 0x3800010},
5264{0x3800000, 0xf51f853a, 0xe73a5134, 0xf51f853b, 0x3800010},
5265{0x3800000, 0xf51f853a, 0x7c994e9e, 0x7c994d5e, 0x3800010},
5266{0x3800000, 0xf51f853a, 0x6164bd6c, 0xf51f853a, 0x3800010},
5267{0x3800000, 0xf51f853a, 0x9503366, 0xf51f853a, 0x3800010},
5268{0x3800000, 0xf51f853a, 0xbf5a97c9, 0xf51f853b, 0x3800010},
5269{0x3800000, 0xf51f853a, 0xe6ff1a14, 0xf51f853b, 0x3800010},
5270{0x3800000, 0xf51f853a, 0x77f31e2f, 0x77ee2205, 0x3800010},
5271{0x3800000, 0xf51f853a, 0xaab4d7d8, 0xf51f853b, 0x3800010},
5272{0x3800000, 0xf51f853a, 0x966320b, 0xf51f853a, 0x3800010},
5273{0x3800000, 0xf51f853a, 0xb26bddee, 0xf51f853b, 0x3800010},
5274{0x3800000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853b, 0x3800010},
5275{0x3800000, 0xf51f853a, 0x317285d3, 0xf51f853a, 0x3800010},
5276{0x3800000, 0xf51f853a, 0x3c9623b1, 0xf51f853a, 0x3800010},
5277{0x3800000, 0xf51f853a, 0x51fd2c7c, 0xf51f853a, 0x3800010},
5278{0x3800000, 0xf51f853a, 0x7b906a6c, 0x7b90656f, 0x3800010},
5279{0x3800000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3800000},
5280{0x3800000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3800080},
5281{0x3800000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3800080},
5282{0x3800000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3800080},
5283{0x3800000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3800080},
5284{0x3800000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3800080},
5285{0x3800000, 0xff7ffff0, 0x800000, 0xff7ffff0, 0x3800010},
5286{0x3800000, 0xff7ffff0, 0x800002, 0xff7ffff0, 0x3800010},
5287{0x3800000, 0xff7ffff0, 0x1398437, 0xff7ffff0, 0x3800010},
5288{0x3800000, 0xff7ffff0, 0xba98d27, 0xff7ffff0, 0x3800010},
5289{0x3800000, 0xff7ffff0, 0xba98d7a, 0xff7ffff0, 0x3800010},
5290{0x3800000, 0xff7ffff0, 0x751f853a, 0xff7fffe7, 0x3800010},
5291{0x3800000, 0xff7ffff0, 0x7f7ffff0, 0x80000000, 0x3800000},
5292{0x3800000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3800000},
5293{0x3800000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3800000},
5294{0x3800000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3800001},
5295{0x3800000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3800001},
5296{0x3800000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3800001},
5297{0x3800000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3800000},
5298{0x3800000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3800000},
5299{0x3800000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3800000},
5300{0x3800000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3800000},
5301{0x3800000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3800080},
5302{0x3800000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3800080},
5303{0x3800000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3800080},
5304{0x3800000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3800080},
5305{0x3800000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3800080},
5306{0x3800000, 0xff7ffff0, 0x80800000, 0xff7ffff1, 0x3800010},
5307{0x3800000, 0xff7ffff0, 0x80800002, 0xff7ffff1, 0x3800010},
5308{0x3800000, 0xff7ffff0, 0x81398437, 0xff7ffff1, 0x3800010},
5309{0x3800000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff1, 0x3800010},
5310{0x3800000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff1, 0x3800010},
5311{0x3800000, 0xff7ffff0, 0xf51f853a, 0xff7ffffa, 0x3800010},
5312{0x3800000, 0xff7ffff0, 0xff7ffff0, 0xff800000, 0x3800014},
5313{0x3800000, 0xff7ffff0, 0xff7fffff, 0xff800000, 0x3800014},
5314{0x3800000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3800000},
5315{0x3800000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3800001},
5316{0x3800000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3800001},
5317{0x3800000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3800001},
5318{0x3800000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3800000},
5319{0x3800000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3800000},
5320{0x3800000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3800000},
5321{0x3800000, 0xff7ffff0, 0x4f3495cb, 0xff7ffff0, 0x3800010},
5322{0x3800000, 0xff7ffff0, 0xe73a5134, 0xff7ffff1, 0x3800010},
5323{0x3800000, 0xff7ffff0, 0x7c994e9e, 0xff7b357c, 0x3800010},
5324{0x3800000, 0xff7ffff0, 0x6164bd6c, 0xff7ffff0, 0x3800010},
5325{0x3800000, 0xff7ffff0, 0x9503366, 0xff7ffff0, 0x3800010},
5326{0x3800000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff1, 0x3800010},
5327{0x3800000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff1, 0x3800010},
5328{0x3800000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe0a, 0x3800010},
5329{0x3800000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff1, 0x3800010},
5330{0x3800000, 0xff7ffff0, 0x966320b, 0xff7ffff0, 0x3800010},
5331{0x3800000, 0xff7ffff0, 0xb26bddee, 0xff7ffff1, 0x3800010},
5332{0x3800000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff1, 0x3800010},
5333{0x3800000, 0xff7ffff0, 0x317285d3, 0xff7ffff0, 0x3800010},
5334{0x3800000, 0xff7ffff0, 0x3c9623b1, 0xff7ffff0, 0x3800010},
5335{0x3800000, 0xff7ffff0, 0x51fd2c7c, 0xff7ffff0, 0x3800010},
5336{0x3800000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1c, 0x3800010},
5337{0x3800000, 0xff7fffff, 0x0, 0xff7fffff, 0x3800000},
5338{0x3800000, 0xff7fffff, 0x1, 0xff7fffff, 0x3800080},
5339{0x3800000, 0xff7fffff, 0x76, 0xff7fffff, 0x3800080},
5340{0x3800000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3800080},
5341{0x3800000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3800080},
5342{0x3800000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3800080},
5343{0x3800000, 0xff7fffff, 0x800000, 0xff7fffff, 0x3800010},
5344{0x3800000, 0xff7fffff, 0x800002, 0xff7fffff, 0x3800010},
5345{0x3800000, 0xff7fffff, 0x1398437, 0xff7fffff, 0x3800010},
5346{0x3800000, 0xff7fffff, 0xba98d27, 0xff7fffff, 0x3800010},
5347{0x3800000, 0xff7fffff, 0xba98d7a, 0xff7fffff, 0x3800010},
5348{0x3800000, 0xff7fffff, 0x751f853a, 0xff7ffff6, 0x3800010},
5349{0x3800000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3800000},
5350{0x3800000, 0xff7fffff, 0x7f7fffff, 0x80000000, 0x3800000},
5351{0x3800000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3800000},
5352{0x3800000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3800001},
5353{0x3800000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3800001},
5354{0x3800000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
5355{0x3800000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3800000},
5356{0x3800000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3800000},
5357{0x3800000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3800000},
5358{0x3800000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3800000},
5359{0x3800000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3800080},
5360{0x3800000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3800080},
5361{0x3800000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3800080},
5362{0x3800000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3800080},
5363{0x3800000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3800080},
5364{0x3800000, 0xff7fffff, 0x80800000, 0xff800000, 0x3800014},
5365{0x3800000, 0xff7fffff, 0x80800002, 0xff800000, 0x3800014},
5366{0x3800000, 0xff7fffff, 0x81398437, 0xff800000, 0x3800014},
5367{0x3800000, 0xff7fffff, 0x8ba98d27, 0xff800000, 0x3800014},
5368{0x3800000, 0xff7fffff, 0x8ba98d7a, 0xff800000, 0x3800014},
5369{0x3800000, 0xff7fffff, 0xf51f853a, 0xff800000, 0x3800014},
5370{0x3800000, 0xff7fffff, 0xff7ffff0, 0xff800000, 0x3800014},
5371{0x3800000, 0xff7fffff, 0xff7fffff, 0xff800000, 0x3800014},
5372{0x3800000, 0xff7fffff, 0xff800000, 0xff800000, 0x3800000},
5373{0x3800000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3800001},
5374{0x3800000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3800001},
5375{0x3800000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3800001},
5376{0x3800000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3800000},
5377{0x3800000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3800000},
5378{0x3800000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3800000},
5379{0x3800000, 0xff7fffff, 0x4f3495cb, 0xff7fffff, 0x3800010},
5380{0x3800000, 0xff7fffff, 0xe73a5134, 0xff800000, 0x3800014},
5381{0x3800000, 0xff7fffff, 0x7c994e9e, 0xff7b358b, 0x3800010},
5382{0x3800000, 0xff7fffff, 0x6164bd6c, 0xff7fffff, 0x3800010},
5383{0x3800000, 0xff7fffff, 0x9503366, 0xff7fffff, 0x3800010},
5384{0x3800000, 0xff7fffff, 0xbf5a97c9, 0xff800000, 0x3800014},
5385{0x3800000, 0xff7fffff, 0xe6ff1a14, 0xff800000, 0x3800014},
5386{0x3800000, 0xff7fffff, 0x77f31e2f, 0xff7ffe19, 0x3800010},
5387{0x3800000, 0xff7fffff, 0xaab4d7d8, 0xff800000, 0x3800014},
5388{0x3800000, 0xff7fffff, 0x966320b, 0xff7fffff, 0x3800010},
5389{0x3800000, 0xff7fffff, 0xb26bddee, 0xff800000, 0x3800014},
5390{0x3800000, 0xff7fffff, 0xb5c8e5d3, 0xff800000, 0x3800014},
5391{0x3800000, 0xff7fffff, 0x317285d3, 0xff7fffff, 0x3800010},
5392{0x3800000, 0xff7fffff, 0x3c9623b1, 0xff7fffff, 0x3800010},
5393{0x3800000, 0xff7fffff, 0x51fd2c7c, 0xff7fffff, 0x3800010},
5394{0x3800000, 0xff7fffff, 0x7b906a6c, 0xff7edf2b, 0x3800010},
5395{0x3800000, 0xff800000, 0x0, 0xff800000, 0x3800000},
5396{0x3800000, 0xff800000, 0x1, 0xff800000, 0x3800080},
5397{0x3800000, 0xff800000, 0x76, 0xff800000, 0x3800080},
5398{0x3800000, 0xff800000, 0x2b94, 0xff800000, 0x3800080},
5399{0x3800000, 0xff800000, 0x636d24, 0xff800000, 0x3800080},
5400{0x3800000, 0xff800000, 0x7fffff, 0xff800000, 0x3800080},
5401{0x3800000, 0xff800000, 0x800000, 0xff800000, 0x3800000},
5402{0x3800000, 0xff800000, 0x800002, 0xff800000, 0x3800000},
5403{0x3800000, 0xff800000, 0x1398437, 0xff800000, 0x3800000},
5404{0x3800000, 0xff800000, 0xba98d27, 0xff800000, 0x3800000},
5405{0x3800000, 0xff800000, 0xba98d7a, 0xff800000, 0x3800000},
5406{0x3800000, 0xff800000, 0x751f853a, 0xff800000, 0x3800000},
5407{0x3800000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3800000},
5408{0x3800000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3800000},
5409{0x3800000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3800001},
5410{0x3800000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3800001},
5411{0x3800000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3800001},
5412{0x3800000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3800001},
5413{0x3800000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3800000},
5414{0x3800000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
5415{0x3800000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3800000},
5416{0x3800000, 0xff800000, 0x80000000, 0xff800000, 0x3800000},
5417{0x3800000, 0xff800000, 0x80000001, 0xff800000, 0x3800080},
5418{0x3800000, 0xff800000, 0x80000076, 0xff800000, 0x3800080},
5419{0x3800000, 0xff800000, 0x80002b94, 0xff800000, 0x3800080},
5420{0x3800000, 0xff800000, 0x80636d24, 0xff800000, 0x3800080},
5421{0x3800000, 0xff800000, 0x807fffff, 0xff800000, 0x3800080},
5422{0x3800000, 0xff800000, 0x80800000, 0xff800000, 0x3800000},
5423{0x3800000, 0xff800000, 0x80800002, 0xff800000, 0x3800000},
5424{0x3800000, 0xff800000, 0x81398437, 0xff800000, 0x3800000},
5425{0x3800000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3800000},
5426{0x3800000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3800000},
5427{0x3800000, 0xff800000, 0xf51f853a, 0xff800000, 0x3800000},
5428{0x3800000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3800000},
5429{0x3800000, 0xff800000, 0xff7fffff, 0xff800000, 0x3800000},
5430{0x3800000, 0xff800000, 0xff800000, 0xff800000, 0x3800000},
5431{0x3800000, 0xff800000, 0xff800001, 0x7fc00000, 0x3800001},
5432{0x3800000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3800001},
5433{0x3800000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3800001},
5434{0x3800000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3800000},
5435{0x3800000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3800000},
5436{0x3800000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3800000},
5437{0x3800000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3800000},
5438{0x3800000, 0xff800000, 0xe73a5134, 0xff800000, 0x3800000},
5439{0x3800000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3800000},
5440{0x3800000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3800000},
5441{0x3800000, 0xff800000, 0x9503366, 0xff800000, 0x3800000},
5442{0x3800000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3800000},
5443{0x3800000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3800000},
5444{0x3800000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3800000},
5445{0x3800000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3800000},
5446{0x3800000, 0xff800000, 0x966320b, 0xff800000, 0x3800000},
5447{0x3800000, 0xff800000, 0xb26bddee, 0xff800000, 0x3800000},
5448{0x3800000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3800000},
5449{0x3800000, 0xff800000, 0x317285d3, 0xff800000, 0x3800000},
5450{0x3800000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3800000},
5451{0x3800000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3800000},
5452{0x3800000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3800000},
5453{0x3800000, 0xff800001, 0x0, 0x7fc00000, 0x3800001},
5454{0x3800000, 0xff800001, 0x1, 0x7fc00000, 0x3800081},
5455{0x3800000, 0xff800001, 0x76, 0x7fc00000, 0x3800081},
5456{0x3800000, 0xff800001, 0x2b94, 0x7fc00000, 0x3800081},
5457{0x3800000, 0xff800001, 0x636d24, 0x7fc00000, 0x3800081},
5458{0x3800000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3800081},
5459{0x3800000, 0xff800001, 0x800000, 0x7fc00000, 0x3800001},
5460{0x3800000, 0xff800001, 0x800002, 0x7fc00000, 0x3800001},
5461{0x3800000, 0xff800001, 0x1398437, 0x7fc00000, 0x3800001},
5462{0x3800000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3800001},
5463{0x3800000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3800001},
5464{0x3800000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3800001},
5465{0x3800000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3800001},
5466{0x3800000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3800001},
5467{0x3800000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3800001},
5468{0x3800000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3800001},
5469{0x3800000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3800001},
5470{0x3800000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3800001},
5471{0x3800000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3800001},
5472{0x3800000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3800001},
5473{0x3800000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3800001},
5474{0x3800000, 0xff800001, 0x80000000, 0x7fc00000, 0x3800001},
5475{0x3800000, 0xff800001, 0x80000001, 0x7fc00000, 0x3800081},
5476{0x3800000, 0xff800001, 0x80000076, 0x7fc00000, 0x3800081},
5477{0x3800000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3800081},
5478{0x3800000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3800081},
5479{0x3800000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3800081},
5480{0x3800000, 0xff800001, 0x80800000, 0x7fc00000, 0x3800001},
5481{0x3800000, 0xff800001, 0x80800002, 0x7fc00000, 0x3800001},
5482{0x3800000, 0xff800001, 0x81398437, 0x7fc00000, 0x3800001},
5483{0x3800000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3800001},
5484{0x3800000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3800001},
5485{0x3800000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3800001},
5486{0x3800000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3800001},
5487{0x3800000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3800001},
5488{0x3800000, 0xff800001, 0xff800000, 0x7fc00000, 0x3800001},
5489{0x3800000, 0xff800001, 0xff800001, 0x7fc00000, 0x3800001},
5490{0x3800000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3800001},
5491{0x3800000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3800001},
5492{0x3800000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3800001},
5493{0x3800000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3800001},
5494{0x3800000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3800001},
5495{0x3800000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3800001},
5496{0x3800000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3800001},
5497{0x3800000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3800001},
5498{0x3800000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3800001},
5499{0x3800000, 0xff800001, 0x9503366, 0x7fc00000, 0x3800001},
5500{0x3800000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3800001},
5501{0x3800000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3800001},
5502{0x3800000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3800001},
5503{0x3800000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3800001},
5504{0x3800000, 0xff800001, 0x966320b, 0x7fc00000, 0x3800001},
5505{0x3800000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3800001},
5506{0x3800000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
5507{0x3800000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3800001},
5508{0x3800000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3800001},
5509{0x3800000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3800001},
5510{0x3800000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3800001},
5511{0x3800000, 0xff984a37, 0x0, 0x7fc00000, 0x3800001},
5512{0x3800000, 0xff984a37, 0x1, 0x7fc00000, 0x3800081},
5513{0x3800000, 0xff984a37, 0x76, 0x7fc00000, 0x3800081},
5514{0x3800000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3800081},
5515{0x3800000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3800081},
5516{0x3800000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3800081},
5517{0x3800000, 0xff984a37, 0x800000, 0x7fc00000, 0x3800001},
5518{0x3800000, 0xff984a37, 0x800002, 0x7fc00000, 0x3800001},
5519{0x3800000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3800001},
5520{0x3800000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3800001},
5521{0x3800000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3800001},
5522{0x3800000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3800001},
5523{0x3800000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3800001},
5524{0x3800000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3800001},
5525{0x3800000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3800001},
5526{0x3800000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3800001},
5527{0x3800000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3800001},
5528{0x3800000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3800001},
5529{0x3800000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3800001},
5530{0x3800000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3800001},
5531{0x3800000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3800001},
5532{0x3800000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3800001},
5533{0x3800000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3800081},
5534{0x3800000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3800081},
5535{0x3800000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3800081},
5536{0x3800000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3800081},
5537{0x3800000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3800081},
5538{0x3800000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3800001},
5539{0x3800000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3800001},
5540{0x3800000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3800001},
5541{0x3800000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3800001},
5542{0x3800000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3800001},
5543{0x3800000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3800001},
5544{0x3800000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3800001},
5545{0x3800000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3800001},
5546{0x3800000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3800001},
5547{0x3800000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3800001},
5548{0x3800000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3800001},
5549{0x3800000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3800001},
5550{0x3800000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3800001},
5551{0x3800000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3800001},
5552{0x3800000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3800001},
5553{0x3800000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3800001},
5554{0x3800000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3800001},
5555{0x3800000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3800001},
5556{0x3800000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3800001},
5557{0x3800000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3800001},
5558{0x3800000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3800001},
5559{0x3800000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3800001},
5560{0x3800000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3800001},
5561{0x3800000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3800001},
5562{0x3800000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3800001},
5563{0x3800000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3800001},
5564{0x3800000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
5565{0x3800000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3800001},
5566{0x3800000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3800001},
5567{0x3800000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3800001},
5568{0x3800000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3800001},
5569{0x3800000, 0xffbfffff, 0x0, 0x7fc00000, 0x3800001},
5570{0x3800000, 0xffbfffff, 0x1, 0x7fc00000, 0x3800081},
5571{0x3800000, 0xffbfffff, 0x76, 0x7fc00000, 0x3800081},
5572{0x3800000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3800081},
5573{0x3800000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3800081},
5574{0x3800000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3800081},
5575{0x3800000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3800001},
5576{0x3800000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3800001},
5577{0x3800000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3800001},
5578{0x3800000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3800001},
5579{0x3800000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3800001},
5580{0x3800000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3800001},
5581{0x3800000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3800001},
5582{0x3800000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3800001},
5583{0x3800000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3800001},
5584{0x3800000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3800001},
5585{0x3800000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3800001},
5586{0x3800000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
5587{0x3800000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3800001},
5588{0x3800000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3800001},
5589{0x3800000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3800001},
5590{0x3800000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3800001},
5591{0x3800000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3800081},
5592{0x3800000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3800081},
5593{0x3800000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3800081},
5594{0x3800000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3800081},
5595{0x3800000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3800081},
5596{0x3800000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3800001},
5597{0x3800000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3800001},
5598{0x3800000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3800001},
5599{0x3800000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3800001},
5600{0x3800000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3800001},
5601{0x3800000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3800001},
5602{0x3800000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3800001},
5603{0x3800000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3800001},
5604{0x3800000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3800001},
5605{0x3800000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3800001},
5606{0x3800000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3800001},
5607{0x3800000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3800001},
5608{0x3800000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3800001},
5609{0x3800000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3800001},
5610{0x3800000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3800001},
5611{0x3800000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3800001},
5612{0x3800000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3800001},
5613{0x3800000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3800001},
5614{0x3800000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3800001},
5615{0x3800000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3800001},
5616{0x3800000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3800001},
5617{0x3800000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3800001},
5618{0x3800000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3800001},
5619{0x3800000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3800001},
5620{0x3800000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3800001},
5621{0x3800000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3800001},
5622{0x3800000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
5623{0x3800000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3800001},
5624{0x3800000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3800001},
5625{0x3800000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3800001},
5626{0x3800000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3800001},
5627{0x3800000, 0xffc00000, 0x0, 0x7fc00000, 0x3800000},
5628{0x3800000, 0xffc00000, 0x1, 0x7fc00000, 0x3800080},
5629{0x3800000, 0xffc00000, 0x76, 0x7fc00000, 0x3800080},
5630{0x3800000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3800080},
5631{0x3800000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3800080},
5632{0x3800000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3800080},
5633{0x3800000, 0xffc00000, 0x800000, 0x7fc00000, 0x3800000},
5634{0x3800000, 0xffc00000, 0x800002, 0x7fc00000, 0x3800000},
5635{0x3800000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3800000},
5636{0x3800000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3800000},
5637{0x3800000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3800000},
5638{0x3800000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3800000},
5639{0x3800000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3800000},
5640{0x3800000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3800000},
5641{0x3800000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3800000},
5642{0x3800000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3800001},
5643{0x3800000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3800001},
5644{0x3800000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3800001},
5645{0x3800000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3800000},
5646{0x3800000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
5647{0x3800000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3800000},
5648{0x3800000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3800000},
5649{0x3800000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3800080},
5650{0x3800000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3800080},
5651{0x3800000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3800080},
5652{0x3800000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3800080},
5653{0x3800000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3800080},
5654{0x3800000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3800000},
5655{0x3800000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3800000},
5656{0x3800000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3800000},
5657{0x3800000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3800000},
5658{0x3800000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3800000},
5659{0x3800000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3800000},
5660{0x3800000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3800000},
5661{0x3800000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3800000},
5662{0x3800000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3800000},
5663{0x3800000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3800001},
5664{0x3800000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3800001},
5665{0x3800000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3800001},
5666{0x3800000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3800000},
5667{0x3800000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3800000},
5668{0x3800000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3800000},
5669{0x3800000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3800000},
5670{0x3800000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3800000},
5671{0x3800000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3800000},
5672{0x3800000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3800000},
5673{0x3800000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3800000},
5674{0x3800000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3800000},
5675{0x3800000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3800000},
5676{0x3800000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3800000},
5677{0x3800000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3800000},
5678{0x3800000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3800000},
5679{0x3800000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3800000},
5680{0x3800000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
5681{0x3800000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3800000},
5682{0x3800000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3800000},
5683{0x3800000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3800000},
5684{0x3800000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3800000},
5685{0x3800000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3800000},
5686{0x3800000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3800080},
5687{0x3800000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3800080},
5688{0x3800000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3800080},
5689{0x3800000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3800080},
5690{0x3800000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3800080},
5691{0x3800000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3800000},
5692{0x3800000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3800000},
5693{0x3800000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3800000},
5694{0x3800000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3800000},
5695{0x3800000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3800000},
5696{0x3800000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3800000},
5697{0x3800000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3800000},
5698{0x3800000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3800000},
5699{0x3800000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3800000},
5700{0x3800000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3800001},
5701{0x3800000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3800001},
5702{0x3800000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3800001},
5703{0x3800000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3800000},
5704{0x3800000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3800000},
5705{0x3800000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3800000},
5706{0x3800000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3800000},
5707{0x3800000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3800080},
5708{0x3800000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3800080},
5709{0x3800000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3800080},
5710{0x3800000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3800080},
5711{0x3800000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3800080},
5712{0x3800000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3800000},
5713{0x3800000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3800000},
5714{0x3800000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3800000},
5715{0x3800000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3800000},
5716{0x3800000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3800000},
5717{0x3800000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3800000},
5718{0x3800000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3800000},
5719{0x3800000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3800000},
5720{0x3800000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3800000},
5721{0x3800000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3800001},
5722{0x3800000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3800001},
5723{0x3800000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3800001},
5724{0x3800000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3800000},
5725{0x3800000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3800000},
5726{0x3800000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3800000},
5727{0x3800000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3800000},
5728{0x3800000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3800000},
5729{0x3800000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3800000},
5730{0x3800000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3800000},
5731{0x3800000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3800000},
5732{0x3800000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3800000},
5733{0x3800000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3800000},
5734{0x3800000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3800000},
5735{0x3800000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3800000},
5736{0x3800000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3800000},
5737{0x3800000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3800000},
5738{0x3800000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
5739{0x3800000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3800000},
5740{0x3800000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3800000},
5741{0x3800000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3800000},
5742{0x3800000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3800000},
5743{0x3800000, 0xffffffff, 0x0, 0x7fc00000, 0x3800000},
5744{0x3800000, 0xffffffff, 0x1, 0x7fc00000, 0x3800080},
5745{0x3800000, 0xffffffff, 0x76, 0x7fc00000, 0x3800080},
5746{0x3800000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3800080},
5747{0x3800000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3800080},
5748{0x3800000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3800080},
5749{0x3800000, 0xffffffff, 0x800000, 0x7fc00000, 0x3800000},
5750{0x3800000, 0xffffffff, 0x800002, 0x7fc00000, 0x3800000},
5751{0x3800000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3800000},
5752{0x3800000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3800000},
5753{0x3800000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3800000},
5754{0x3800000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3800000},
5755{0x3800000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3800000},
5756{0x3800000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3800000},
5757{0x3800000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3800000},
5758{0x3800000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3800001},
5759{0x3800000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3800001},
5760{0x3800000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
5761{0x3800000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3800000},
5762{0x3800000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3800000},
5763{0x3800000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3800000},
5764{0x3800000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3800000},
5765{0x3800000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3800080},
5766{0x3800000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3800080},
5767{0x3800000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3800080},
5768{0x3800000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3800080},
5769{0x3800000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3800080},
5770{0x3800000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3800000},
5771{0x3800000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3800000},
5772{0x3800000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3800000},
5773{0x3800000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3800000},
5774{0x3800000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3800000},
5775{0x3800000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3800000},
5776{0x3800000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3800000},
5777{0x3800000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3800000},
5778{0x3800000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3800000},
5779{0x3800000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3800001},
5780{0x3800000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3800001},
5781{0x3800000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3800001},
5782{0x3800000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3800000},
5783{0x3800000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3800000},
5784{0x3800000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3800000},
5785{0x3800000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3800000},
5786{0x3800000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3800000},
5787{0x3800000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3800000},
5788{0x3800000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3800000},
5789{0x3800000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3800000},
5790{0x3800000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3800000},
5791{0x3800000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3800000},
5792{0x3800000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3800000},
5793{0x3800000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3800000},
5794{0x3800000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3800000},
5795{0x3800000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3800000},
5796{0x3800000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
5797{0x3800000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3800000},
5798{0x3800000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3800000},
5799{0x3800000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3800000},
5800{0x3800000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3800000},
5801{0x3800000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3800000},
5802{0x3800000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3800080},
5803{0x3800000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3800080},
5804{0x3800000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3800080},
5805{0x3800000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3800080},
5806{0x3800000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3800080},
5807{0x3800000, 0x4f3495cb, 0x800000, 0x4f3495cb, 0x3800010},
5808{0x3800000, 0x4f3495cb, 0x800002, 0x4f3495cb, 0x3800010},
5809{0x3800000, 0x4f3495cb, 0x1398437, 0x4f3495cb, 0x3800010},
5810{0x3800000, 0x4f3495cb, 0xba98d27, 0x4f3495cb, 0x3800010},
5811{0x3800000, 0x4f3495cb, 0xba98d7a, 0x4f3495cb, 0x3800010},
5812{0x3800000, 0x4f3495cb, 0x751f853a, 0x751f853a, 0x3800010},
5813{0x3800000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
5814{0x3800000, 0x4f3495cb, 0x7f7fffff, 0x7f7fffff, 0x3800010},
5815{0x3800000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3800000},
5816{0x3800000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3800001},
5817{0x3800000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3800001},
5818{0x3800000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3800001},
5819{0x3800000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3800000},
5820{0x3800000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3800000},
5821{0x3800000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3800000},
5822{0x3800000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3800000},
5823{0x3800000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3800080},
5824{0x3800000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3800080},
5825{0x3800000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3800080},
5826{0x3800000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3800080},
5827{0x3800000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3800080},
5828{0x3800000, 0x4f3495cb, 0x80800000, 0x4f3495ca, 0x3800010},
5829{0x3800000, 0x4f3495cb, 0x80800002, 0x4f3495ca, 0x3800010},
5830{0x3800000, 0x4f3495cb, 0x81398437, 0x4f3495ca, 0x3800010},
5831{0x3800000, 0x4f3495cb, 0x8ba98d27, 0x4f3495ca, 0x3800010},
5832{0x3800000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495ca, 0x3800010},
5833{0x3800000, 0x4f3495cb, 0xf51f853a, 0xf51f853a, 0x3800010},
5834{0x3800000, 0x4f3495cb, 0xff7ffff0, 0xff7ffff0, 0x3800010},
5835{0x3800000, 0x4f3495cb, 0xff7fffff, 0xff7fffff, 0x3800010},
5836{0x3800000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3800000},
5837{0x3800000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3800001},
5838{0x3800000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3800001},
5839{0x3800000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3800001},
5840{0x3800000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3800000},
5841{0x3800000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3800000},
5842{0x3800000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3800000},
5843{0x3800000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3800000},
5844{0x3800000, 0x4f3495cb, 0xe73a5134, 0xe73a5134, 0x3800010},
5845{0x3800000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9e, 0x3800010},
5846{0x3800000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6c, 0x3800010},
5847{0x3800000, 0x4f3495cb, 0x9503366, 0x4f3495cb, 0x3800010},
5848{0x3800000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495ca, 0x3800010},
5849{0x3800000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
5850{0x3800000, 0x4f3495cb, 0x77f31e2f, 0x77f31e2f, 0x3800010},
5851{0x3800000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495ca, 0x3800010},
5852{0x3800000, 0x4f3495cb, 0x966320b, 0x4f3495cb, 0x3800010},
5853{0x3800000, 0x4f3495cb, 0xb26bddee, 0x4f3495ca, 0x3800010},
5854{0x3800000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495ca, 0x3800010},
5855{0x3800000, 0x4f3495cb, 0x317285d3, 0x4f3495cb, 0x3800010},
5856{0x3800000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cb, 0x3800010},
5857{0x3800000, 0x4f3495cb, 0x51fd2c7c, 0x52016895, 0x3800010},
5858{0x3800000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6c, 0x3800010},
5859{0x3800000, 0xe73a5134, 0x0, 0xe73a5134, 0x3800000},
5860{0x3800000, 0xe73a5134, 0x1, 0xe73a5134, 0x3800080},
5861{0x3800000, 0xe73a5134, 0x76, 0xe73a5134, 0x3800080},
5862{0x3800000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3800080},
5863{0x3800000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3800080},
5864{0x3800000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3800080},
5865{0x3800000, 0xe73a5134, 0x800000, 0xe73a5134, 0x3800010},
5866{0x3800000, 0xe73a5134, 0x800002, 0xe73a5134, 0x3800010},
5867{0x3800000, 0xe73a5134, 0x1398437, 0xe73a5134, 0x3800010},
5868{0x3800000, 0xe73a5134, 0xba98d27, 0xe73a5134, 0x3800010},
5869{0x3800000, 0xe73a5134, 0xba98d7a, 0xe73a5134, 0x3800010},
5870{0x3800000, 0xe73a5134, 0x751f853a, 0x751f8539, 0x3800010},
5871{0x3800000, 0xe73a5134, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
5872{0x3800000, 0xe73a5134, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
5873{0x3800000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3800000},
5874{0x3800000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3800001},
5875{0x3800000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3800001},
5876{0x3800000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3800001},
5877{0x3800000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3800000},
5878{0x3800000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3800000},
5879{0x3800000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3800000},
5880{0x3800000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3800000},
5881{0x3800000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3800080},
5882{0x3800000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3800080},
5883{0x3800000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3800080},
5884{0x3800000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3800080},
5885{0x3800000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3800080},
5886{0x3800000, 0xe73a5134, 0x80800000, 0xe73a5135, 0x3800010},
5887{0x3800000, 0xe73a5134, 0x80800002, 0xe73a5135, 0x3800010},
5888{0x3800000, 0xe73a5134, 0x81398437, 0xe73a5135, 0x3800010},
5889{0x3800000, 0xe73a5134, 0x8ba98d27, 0xe73a5135, 0x3800010},
5890{0x3800000, 0xe73a5134, 0x8ba98d7a, 0xe73a5135, 0x3800010},
5891{0x3800000, 0xe73a5134, 0xf51f853a, 0xf51f853b, 0x3800010},
5892{0x3800000, 0xe73a5134, 0xff7ffff0, 0xff7ffff1, 0x3800010},
5893{0x3800000, 0xe73a5134, 0xff7fffff, 0xff800000, 0x3800014},
5894{0x3800000, 0xe73a5134, 0xff800000, 0xff800000, 0x3800000},
5895{0x3800000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3800001},
5896{0x3800000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3800001},
5897{0x3800000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3800001},
5898{0x3800000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3800000},
5899{0x3800000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3800000},
5900{0x3800000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3800000},
5901{0x3800000, 0xe73a5134, 0x4f3495cb, 0xe73a5134, 0x3800010},
5902{0x3800000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3800000},
5903{0x3800000, 0xe73a5134, 0x7c994e9e, 0x7c994e9d, 0x3800010},
5904{0x3800000, 0xe73a5134, 0x6164bd6c, 0xe73a42e9, 0x3800010},
5905{0x3800000, 0xe73a5134, 0x9503366, 0xe73a5134, 0x3800010},
5906{0x3800000, 0xe73a5134, 0xbf5a97c9, 0xe73a5135, 0x3800010},
5907{0x3800000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3800000},
5908{0x3800000, 0xe73a5134, 0x77f31e2f, 0x77f31e2e, 0x3800010},
5909{0x3800000, 0xe73a5134, 0xaab4d7d8, 0xe73a5135, 0x3800010},
5910{0x3800000, 0xe73a5134, 0x966320b, 0xe73a5134, 0x3800010},
5911{0x3800000, 0xe73a5134, 0xb26bddee, 0xe73a5135, 0x3800010},
5912{0x3800000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5135, 0x3800010},
5913{0x3800000, 0xe73a5134, 0x317285d3, 0xe73a5134, 0x3800010},
5914{0x3800000, 0xe73a5134, 0x3c9623b1, 0xe73a5134, 0x3800010},
5915{0x3800000, 0xe73a5134, 0x51fd2c7c, 0xe73a5134, 0x3800010},
5916{0x3800000, 0xe73a5134, 0x7b906a6c, 0x7b906a6b, 0x3800010},
5917{0x3800000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3800000},
5918{0x3800000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3800080},
5919{0x3800000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3800080},
5920{0x3800000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3800080},
5921{0x3800000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3800080},
5922{0x3800000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3800080},
5923{0x3800000, 0x7c994e9e, 0x800000, 0x7c994e9e, 0x3800010},
5924{0x3800000, 0x7c994e9e, 0x800002, 0x7c994e9e, 0x3800010},
5925{0x3800000, 0x7c994e9e, 0x1398437, 0x7c994e9e, 0x3800010},
5926{0x3800000, 0x7c994e9e, 0xba98d27, 0x7c994e9e, 0x3800010},
5927{0x3800000, 0x7c994e9e, 0xba98d7a, 0x7c994e9e, 0x3800010},
5928{0x3800000, 0x7c994e9e, 0x751f853a, 0x7c994fdd, 0x3800010},
5929{0x3800000, 0x7c994e9e, 0x7f7ffff0, 0x7f7fffff, 0x3800014},
5930{0x3800000, 0x7c994e9e, 0x7f7fffff, 0x7f7fffff, 0x3800014},
5931{0x3800000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3800000},
5932{0x3800000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3800001},
5933{0x3800000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3800001},
5934{0x3800000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3800001},
5935{0x3800000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3800000},
5936{0x3800000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3800000},
5937{0x3800000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3800000},
5938{0x3800000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3800000},
5939{0x3800000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3800080},
5940{0x3800000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3800080},
5941{0x3800000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3800080},
5942{0x3800000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3800080},
5943{0x3800000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3800080},
5944{0x3800000, 0x7c994e9e, 0x80800000, 0x7c994e9d, 0x3800010},
5945{0x3800000, 0x7c994e9e, 0x80800002, 0x7c994e9d, 0x3800010},
5946{0x3800000, 0x7c994e9e, 0x81398437, 0x7c994e9d, 0x3800010},
5947{0x3800000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9d, 0x3800010},
5948{0x3800000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9d, 0x3800010},
5949{0x3800000, 0x7c994e9e, 0xf51f853a, 0x7c994d5e, 0x3800010},
5950{0x3800000, 0x7c994e9e, 0xff7ffff0, 0xff7b357c, 0x3800010},
5951{0x3800000, 0x7c994e9e, 0xff7fffff, 0xff7b358b, 0x3800010},
5952{0x3800000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3800000},
5953{0x3800000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3800001},
5954{0x3800000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3800001},
5955{0x3800000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3800001},
5956{0x3800000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3800000},
5957{0x3800000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3800000},
5958{0x3800000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3800000},
5959{0x3800000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9e, 0x3800010},
5960{0x3800000, 0x7c994e9e, 0xe73a5134, 0x7c994e9d, 0x3800010},
5961{0x3800000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3800000},
5962{0x3800000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9e, 0x3800010},
5963{0x3800000, 0x7c994e9e, 0x9503366, 0x7c994e9e, 0x3800010},
5964{0x3800000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9d, 0x3800010},
5965{0x3800000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9d, 0x3800010},
5966{0x3800000, 0x7c994e9e, 0x77f31e2f, 0x7c998b65, 0x3800010},
5967{0x3800000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9d, 0x3800010},
5968{0x3800000, 0x7c994e9e, 0x966320b, 0x7c994e9e, 0x3800010},
5969{0x3800000, 0x7c994e9e, 0xb26bddee, 0x7c994e9d, 0x3800010},
5970{0x3800000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9d, 0x3800010},
5971{0x3800000, 0x7c994e9e, 0x317285d3, 0x7c994e9e, 0x3800010},
5972{0x3800000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9e, 0x3800010},
5973{0x3800000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9e, 0x3800010},
5974{0x3800000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3800000},
5975{0x3800000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3800000},
5976{0x3800000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3800080},
5977{0x3800000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3800080},
5978{0x3800000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3800080},
5979{0x3800000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3800080},
5980{0x3800000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3800080},
5981{0x3800000, 0x6164bd6c, 0x800000, 0x6164bd6c, 0x3800010},
5982{0x3800000, 0x6164bd6c, 0x800002, 0x6164bd6c, 0x3800010},
5983{0x3800000, 0x6164bd6c, 0x1398437, 0x6164bd6c, 0x3800010},
5984{0x3800000, 0x6164bd6c, 0xba98d27, 0x6164bd6c, 0x3800010},
5985{0x3800000, 0x6164bd6c, 0xba98d7a, 0x6164bd6c, 0x3800010},
5986{0x3800000, 0x6164bd6c, 0x751f853a, 0x751f853a, 0x3800010},
5987{0x3800000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
5988{0x3800000, 0x6164bd6c, 0x7f7fffff, 0x7f7fffff, 0x3800010},
5989{0x3800000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3800000},
5990{0x3800000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3800001},
5991{0x3800000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3800001},
5992{0x3800000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3800001},
5993{0x3800000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3800000},
5994{0x3800000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3800000},
5995{0x3800000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3800000},
5996{0x3800000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3800000},
5997{0x3800000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3800080},
5998{0x3800000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3800080},
5999{0x3800000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3800080},
6000{0x3800000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3800080},
6001{0x3800000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3800080},
6002{0x3800000, 0x6164bd6c, 0x80800000, 0x6164bd6b, 0x3800010},
6003{0x3800000, 0x6164bd6c, 0x80800002, 0x6164bd6b, 0x3800010},
6004{0x3800000, 0x6164bd6c, 0x81398437, 0x6164bd6b, 0x3800010},
6005{0x3800000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6b, 0x3800010},
6006{0x3800000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6b, 0x3800010},
6007{0x3800000, 0x6164bd6c, 0xf51f853a, 0xf51f853a, 0x3800010},
6008{0x3800000, 0x6164bd6c, 0xff7ffff0, 0xff7ffff0, 0x3800010},
6009{0x3800000, 0x6164bd6c, 0xff7fffff, 0xff7fffff, 0x3800010},
6010{0x3800000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3800000},
6011{0x3800000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3800001},
6012{0x3800000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3800001},
6013{0x3800000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3800001},
6014{0x3800000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3800000},
6015{0x3800000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3800000},
6016{0x3800000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3800000},
6017{0x3800000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6c, 0x3800010},
6018{0x3800000, 0x6164bd6c, 0xe73a5134, 0xe73a42e9, 0x3800010},
6019{0x3800000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9e, 0x3800010},
6020{0x3800000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3800000},
6021{0x3800000, 0x6164bd6c, 0x9503366, 0x6164bd6c, 0x3800010},
6022{0x3800000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6b, 0x3800010},
6023{0x3800000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7d, 0x3800010},
6024{0x3800000, 0x6164bd6c, 0x77f31e2f, 0x77f31e2f, 0x3800010},
6025{0x3800000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6b, 0x3800010},
6026{0x3800000, 0x6164bd6c, 0x966320b, 0x6164bd6c, 0x3800010},
6027{0x3800000, 0x6164bd6c, 0xb26bddee, 0x6164bd6b, 0x3800010},
6028{0x3800000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6b, 0x3800010},
6029{0x3800000, 0x6164bd6c, 0x317285d3, 0x6164bd6c, 0x3800010},
6030{0x3800000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6c, 0x3800010},
6031{0x3800000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6c, 0x3800010},
6032{0x3800000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6c, 0x3800010},
6033{0x3800000, 0x9503366, 0x0, 0x9503366, 0x3800000},
6034{0x3800000, 0x9503366, 0x1, 0x9503366, 0x3800080},
6035{0x3800000, 0x9503366, 0x76, 0x9503366, 0x3800080},
6036{0x3800000, 0x9503366, 0x2b94, 0x9503366, 0x3800080},
6037{0x3800000, 0x9503366, 0x636d24, 0x9503366, 0x3800080},
6038{0x3800000, 0x9503366, 0x7fffff, 0x9503366, 0x3800080},
6039{0x3800000, 0x9503366, 0x800000, 0x95033a6, 0x3800000},
6040{0x3800000, 0x9503366, 0x800002, 0x95033a6, 0x3800010},
6041{0x3800000, 0x9503366, 0x1398437, 0x950341f, 0x3800010},
6042{0x3800000, 0x9503366, 0xba98d27, 0xbb00ec2, 0x3800010},
6043{0x3800000, 0x9503366, 0xba98d7a, 0xbb00f15, 0x3800010},
6044{0x3800000, 0x9503366, 0x751f853a, 0x751f853a, 0x3800010},
6045{0x3800000, 0x9503366, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
6046{0x3800000, 0x9503366, 0x7f7fffff, 0x7f7fffff, 0x3800010},
6047{0x3800000, 0x9503366, 0x7f800000, 0x7f800000, 0x3800000},
6048{0x3800000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3800001},
6049{0x3800000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3800001},
6050{0x3800000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3800001},
6051{0x3800000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3800000},
6052{0x3800000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3800000},
6053{0x3800000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3800000},
6054{0x3800000, 0x9503366, 0x80000000, 0x9503366, 0x3800000},
6055{0x3800000, 0x9503366, 0x80000001, 0x9503366, 0x3800080},
6056{0x3800000, 0x9503366, 0x80000076, 0x9503366, 0x3800080},
6057{0x3800000, 0x9503366, 0x80002b94, 0x9503366, 0x3800080},
6058{0x3800000, 0x9503366, 0x80636d24, 0x9503366, 0x3800080},
6059{0x3800000, 0x9503366, 0x807fffff, 0x9503366, 0x3800080},
6060{0x3800000, 0x9503366, 0x80800000, 0x9503326, 0x3800000},
6061{0x3800000, 0x9503366, 0x80800002, 0x9503325, 0x3800010},
6062{0x3800000, 0x9503366, 0x81398437, 0x95032ac, 0x3800010},
6063{0x3800000, 0x9503366, 0x8ba98d27, 0x8ba30b8c, 0x3800010},
6064{0x3800000, 0x9503366, 0x8ba98d7a, 0x8ba30bdf, 0x3800010},
6065{0x3800000, 0x9503366, 0xf51f853a, 0xf51f853a, 0x3800010},
6066{0x3800000, 0x9503366, 0xff7ffff0, 0xff7ffff0, 0x3800010},
6067{0x3800000, 0x9503366, 0xff7fffff, 0xff7fffff, 0x3800010},
6068{0x3800000, 0x9503366, 0xff800000, 0xff800000, 0x3800000},
6069{0x3800000, 0x9503366, 0xff800001, 0x7fc00000, 0x3800001},
6070{0x3800000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3800001},
6071{0x3800000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3800001},
6072{0x3800000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3800000},
6073{0x3800000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3800000},
6074{0x3800000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3800000},
6075{0x3800000, 0x9503366, 0x4f3495cb, 0x4f3495cb, 0x3800010},
6076{0x3800000, 0x9503366, 0xe73a5134, 0xe73a5134, 0x3800010},
6077{0x3800000, 0x9503366, 0x7c994e9e, 0x7c994e9e, 0x3800010},
6078{0x3800000, 0x9503366, 0x6164bd6c, 0x6164bd6c, 0x3800010},
6079{0x3800000, 0x9503366, 0x9503366, 0x9d03366, 0x3800000},
6080{0x3800000, 0x9503366, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
6081{0x3800000, 0x9503366, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
6082{0x3800000, 0x9503366, 0x77f31e2f, 0x77f31e2f, 0x3800010},
6083{0x3800000, 0x9503366, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
6084{0x3800000, 0x9503366, 0x966320b, 0x9db32b8, 0x3800010},
6085{0x3800000, 0x9503366, 0xb26bddee, 0xb26bddee, 0x3800010},
6086{0x3800000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
6087{0x3800000, 0x9503366, 0x317285d3, 0x317285d3, 0x3800010},
6088{0x3800000, 0x9503366, 0x3c9623b1, 0x3c9623b1, 0x3800010},
6089{0x3800000, 0x9503366, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
6090{0x3800000, 0x9503366, 0x7b906a6c, 0x7b906a6c, 0x3800010},
6091{0x3800000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3800000},
6092{0x3800000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3800080},
6093{0x3800000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3800080},
6094{0x3800000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3800080},
6095{0x3800000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3800080},
6096{0x3800000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3800080},
6097{0x3800000, 0xbf5a97c9, 0x800000, 0xbf5a97c9, 0x3800010},
6098{0x3800000, 0xbf5a97c9, 0x800002, 0xbf5a97c9, 0x3800010},
6099{0x3800000, 0xbf5a97c9, 0x1398437, 0xbf5a97c9, 0x3800010},
6100{0x3800000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c9, 0x3800010},
6101{0x3800000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c9, 0x3800010},
6102{0x3800000, 0xbf5a97c9, 0x751f853a, 0x751f8539, 0x3800010},
6103{0x3800000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
6104{0x3800000, 0xbf5a97c9, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
6105{0x3800000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3800000},
6106{0x3800000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3800001},
6107{0x3800000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3800001},
6108{0x3800000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3800001},
6109{0x3800000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3800000},
6110{0x3800000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3800000},
6111{0x3800000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3800000},
6112{0x3800000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3800000},
6113{0x3800000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3800080},
6114{0x3800000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3800080},
6115{0x3800000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3800080},
6116{0x3800000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3800080},
6117{0x3800000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3800080},
6118{0x3800000, 0xbf5a97c9, 0x80800000, 0xbf5a97ca, 0x3800010},
6119{0x3800000, 0xbf5a97c9, 0x80800002, 0xbf5a97ca, 0x3800010},
6120{0x3800000, 0xbf5a97c9, 0x81398437, 0xbf5a97ca, 0x3800010},
6121{0x3800000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97ca, 0x3800010},
6122{0x3800000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97ca, 0x3800010},
6123{0x3800000, 0xbf5a97c9, 0xf51f853a, 0xf51f853b, 0x3800010},
6124{0x3800000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff1, 0x3800010},
6125{0x3800000, 0xbf5a97c9, 0xff7fffff, 0xff800000, 0x3800014},
6126{0x3800000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3800000},
6127{0x3800000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3800001},
6128{0x3800000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3800001},
6129{0x3800000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3800001},
6130{0x3800000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3800000},
6131{0x3800000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3800000},
6132{0x3800000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3800000},
6133{0x3800000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495ca, 0x3800010},
6134{0x3800000, 0xbf5a97c9, 0xe73a5134, 0xe73a5135, 0x3800010},
6135{0x3800000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9d, 0x3800010},
6136{0x3800000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6b, 0x3800010},
6137{0x3800000, 0xbf5a97c9, 0x9503366, 0xbf5a97c9, 0x3800010},
6138{0x3800000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3800000},
6139{0x3800000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
6140{0x3800000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2e, 0x3800010},
6141{0x3800000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97ca, 0x3800010},
6142{0x3800000, 0xbf5a97c9, 0x966320b, 0xbf5a97c9, 0x3800010},
6143{0x3800000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97ca, 0x3800010},
6144{0x3800000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e3, 0x3800010},
6145{0x3800000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c9, 0x3800010},
6146{0x3800000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ac, 0x3800010},
6147{0x3800000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
6148{0x3800000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6b, 0x3800010},
6149{0x3800000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3800000},
6150{0x3800000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3800080},
6151{0x3800000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3800080},
6152{0x3800000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3800080},
6153{0x3800000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3800080},
6154{0x3800000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3800080},
6155{0x3800000, 0xe6ff1a14, 0x800000, 0xe6ff1a14, 0x3800010},
6156{0x3800000, 0xe6ff1a14, 0x800002, 0xe6ff1a14, 0x3800010},
6157{0x3800000, 0xe6ff1a14, 0x1398437, 0xe6ff1a14, 0x3800010},
6158{0x3800000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a14, 0x3800010},
6159{0x3800000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a14, 0x3800010},
6160{0x3800000, 0xe6ff1a14, 0x751f853a, 0x751f8539, 0x3800010},
6161{0x3800000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
6162{0x3800000, 0xe6ff1a14, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
6163{0x3800000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3800000},
6164{0x3800000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3800001},
6165{0x3800000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3800001},
6166{0x3800000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3800001},
6167{0x3800000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3800000},
6168{0x3800000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3800000},
6169{0x3800000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3800000},
6170{0x3800000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3800000},
6171{0x3800000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3800080},
6172{0x3800000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3800080},
6173{0x3800000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3800080},
6174{0x3800000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3800080},
6175{0x3800000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3800080},
6176{0x3800000, 0xe6ff1a14, 0x80800000, 0xe6ff1a15, 0x3800010},
6177{0x3800000, 0xe6ff1a14, 0x80800002, 0xe6ff1a15, 0x3800010},
6178{0x3800000, 0xe6ff1a14, 0x81398437, 0xe6ff1a15, 0x3800010},
6179{0x3800000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a15, 0x3800010},
6180{0x3800000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a15, 0x3800010},
6181{0x3800000, 0xe6ff1a14, 0xf51f853a, 0xf51f853b, 0x3800010},
6182{0x3800000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff1, 0x3800010},
6183{0x3800000, 0xe6ff1a14, 0xff7fffff, 0xff800000, 0x3800014},
6184{0x3800000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3800000},
6185{0x3800000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3800001},
6186{0x3800000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3800001},
6187{0x3800000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3800001},
6188{0x3800000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3800000},
6189{0x3800000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3800000},
6190{0x3800000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3800000},
6191{0x3800000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a14, 0x3800010},
6192{0x3800000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3800000},
6193{0x3800000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9d, 0x3800010},
6194{0x3800000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7d, 0x3800010},
6195{0x3800000, 0xe6ff1a14, 0x9503366, 0xe6ff1a14, 0x3800010},
6196{0x3800000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a15, 0x3800010},
6197{0x3800000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3800000},
6198{0x3800000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2e, 0x3800010},
6199{0x3800000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a15, 0x3800010},
6200{0x3800000, 0xe6ff1a14, 0x966320b, 0xe6ff1a14, 0x3800010},
6201{0x3800000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a15, 0x3800010},
6202{0x3800000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a15, 0x3800010},
6203{0x3800000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a14, 0x3800010},
6204{0x3800000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a14, 0x3800010},
6205{0x3800000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a14, 0x3800010},
6206{0x3800000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6b, 0x3800010},
6207{0x3800000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3800000},
6208{0x3800000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3800080},
6209{0x3800000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3800080},
6210{0x3800000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3800080},
6211{0x3800000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3800080},
6212{0x3800000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3800080},
6213{0x3800000, 0x77f31e2f, 0x800000, 0x77f31e2f, 0x3800010},
6214{0x3800000, 0x77f31e2f, 0x800002, 0x77f31e2f, 0x3800010},
6215{0x3800000, 0x77f31e2f, 0x1398437, 0x77f31e2f, 0x3800010},
6216{0x3800000, 0x77f31e2f, 0xba98d27, 0x77f31e2f, 0x3800010},
6217{0x3800000, 0x77f31e2f, 0xba98d7a, 0x77f31e2f, 0x3800010},
6218{0x3800000, 0x77f31e2f, 0x751f853a, 0x77f81a58, 0x3800010},
6219{0x3800000, 0x77f31e2f, 0x7f7ffff0, 0x7f7fffff, 0x3800014},
6220{0x3800000, 0x77f31e2f, 0x7f7fffff, 0x7f7fffff, 0x3800014},
6221{0x3800000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3800000},
6222{0x3800000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3800001},
6223{0x3800000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3800001},
6224{0x3800000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3800001},
6225{0x3800000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3800000},
6226{0x3800000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3800000},
6227{0x3800000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3800000},
6228{0x3800000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3800000},
6229{0x3800000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3800080},
6230{0x3800000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3800080},
6231{0x3800000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3800080},
6232{0x3800000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3800080},
6233{0x3800000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3800080},
6234{0x3800000, 0x77f31e2f, 0x80800000, 0x77f31e2e, 0x3800010},
6235{0x3800000, 0x77f31e2f, 0x80800002, 0x77f31e2e, 0x3800010},
6236{0x3800000, 0x77f31e2f, 0x81398437, 0x77f31e2e, 0x3800010},
6237{0x3800000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2e, 0x3800010},
6238{0x3800000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2e, 0x3800010},
6239{0x3800000, 0x77f31e2f, 0xf51f853a, 0x77ee2205, 0x3800010},
6240{0x3800000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe0a, 0x3800010},
6241{0x3800000, 0x77f31e2f, 0xff7fffff, 0xff7ffe19, 0x3800010},
6242{0x3800000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3800000},
6243{0x3800000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3800001},
6244{0x3800000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3800001},
6245{0x3800000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3800001},
6246{0x3800000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3800000},
6247{0x3800000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3800000},
6248{0x3800000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3800000},
6249{0x3800000, 0x77f31e2f, 0x4f3495cb, 0x77f31e2f, 0x3800010},
6250{0x3800000, 0x77f31e2f, 0xe73a5134, 0x77f31e2e, 0x3800010},
6251{0x3800000, 0x77f31e2f, 0x7c994e9e, 0x7c998b65, 0x3800010},
6252{0x3800000, 0x77f31e2f, 0x6164bd6c, 0x77f31e2f, 0x3800010},
6253{0x3800000, 0x77f31e2f, 0x9503366, 0x77f31e2f, 0x3800010},
6254{0x3800000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2e, 0x3800010},
6255{0x3800000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2e, 0x3800010},
6256{0x3800000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3800000},
6257{0x3800000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2e, 0x3800010},
6258{0x3800000, 0x77f31e2f, 0x966320b, 0x77f31e2f, 0x3800010},
6259{0x3800000, 0x77f31e2f, 0xb26bddee, 0x77f31e2e, 0x3800010},
6260{0x3800000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2e, 0x3800010},
6261{0x3800000, 0x77f31e2f, 0x317285d3, 0x77f31e2f, 0x3800010},
6262{0x3800000, 0x77f31e2f, 0x3c9623b1, 0x77f31e2f, 0x3800010},
6263{0x3800000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e2f, 0x3800010},
6264{0x3800000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8a, 0x3800010},
6265{0x3800000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3800000},
6266{0x3800000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3800080},
6267{0x3800000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3800080},
6268{0x3800000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3800080},
6269{0x3800000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3800080},
6270{0x3800000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3800080},
6271{0x3800000, 0xaab4d7d8, 0x800000, 0xaab4d7d8, 0x3800010},
6272{0x3800000, 0xaab4d7d8, 0x800002, 0xaab4d7d8, 0x3800010},
6273{0x3800000, 0xaab4d7d8, 0x1398437, 0xaab4d7d8, 0x3800010},
6274{0x3800000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d8, 0x3800010},
6275{0x3800000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d8, 0x3800010},
6276{0x3800000, 0xaab4d7d8, 0x751f853a, 0x751f8539, 0x3800010},
6277{0x3800000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
6278{0x3800000, 0xaab4d7d8, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
6279{0x3800000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3800000},
6280{0x3800000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3800001},
6281{0x3800000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3800001},
6282{0x3800000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3800001},
6283{0x3800000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3800000},
6284{0x3800000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3800000},
6285{0x3800000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3800000},
6286{0x3800000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3800000},
6287{0x3800000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3800080},
6288{0x3800000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3800080},
6289{0x3800000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3800080},
6290{0x3800000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3800080},
6291{0x3800000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3800080},
6292{0x3800000, 0xaab4d7d8, 0x80800000, 0xaab4d7d9, 0x3800010},
6293{0x3800000, 0xaab4d7d8, 0x80800002, 0xaab4d7d9, 0x3800010},
6294{0x3800000, 0xaab4d7d8, 0x81398437, 0xaab4d7d9, 0x3800010},
6295{0x3800000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d9, 0x3800010},
6296{0x3800000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d9, 0x3800010},
6297{0x3800000, 0xaab4d7d8, 0xf51f853a, 0xf51f853b, 0x3800010},
6298{0x3800000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff1, 0x3800010},
6299{0x3800000, 0xaab4d7d8, 0xff7fffff, 0xff800000, 0x3800014},
6300{0x3800000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3800000},
6301{0x3800000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3800001},
6302{0x3800000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3800001},
6303{0x3800000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3800001},
6304{0x3800000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3800000},
6305{0x3800000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3800000},
6306{0x3800000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3800000},
6307{0x3800000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495ca, 0x3800010},
6308{0x3800000, 0xaab4d7d8, 0xe73a5134, 0xe73a5135, 0x3800010},
6309{0x3800000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9d, 0x3800010},
6310{0x3800000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6b, 0x3800010},
6311{0x3800000, 0xaab4d7d8, 0x9503366, 0xaab4d7d8, 0x3800010},
6312{0x3800000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
6313{0x3800000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
6314{0x3800000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2e, 0x3800010},
6315{0x3800000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3800000},
6316{0x3800000, 0xaab4d7d8, 0x966320b, 0xaab4d7d8, 0x3800010},
6317{0x3800000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf58, 0x3800010},
6318{0x3800000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d6, 0x3800010},
6319{0x3800000, 0xaab4d7d8, 0x317285d3, 0x3172802c, 0x3800010},
6320{0x3800000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b0, 0x3800010},
6321{0x3800000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
6322{0x3800000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6b, 0x3800010},
6323{0x3800000, 0x966320b, 0x0, 0x966320b, 0x3800000},
6324{0x3800000, 0x966320b, 0x1, 0x966320b, 0x3800080},
6325{0x3800000, 0x966320b, 0x76, 0x966320b, 0x3800080},
6326{0x3800000, 0x966320b, 0x2b94, 0x966320b, 0x3800080},
6327{0x3800000, 0x966320b, 0x636d24, 0x966320b, 0x3800080},
6328{0x3800000, 0x966320b, 0x7fffff, 0x966320b, 0x3800080},
6329{0x3800000, 0x966320b, 0x800000, 0x966324b, 0x3800000},
6330{0x3800000, 0x966320b, 0x800002, 0x966324b, 0x3800010},
6331{0x3800000, 0x966320b, 0x1398437, 0x96632c4, 0x3800010},
6332{0x3800000, 0x966320b, 0xba98d27, 0xbb0beb7, 0x3800010},
6333{0x3800000, 0x966320b, 0xba98d7a, 0xbb0bf0a, 0x3800010},
6334{0x3800000, 0x966320b, 0x751f853a, 0x751f853a, 0x3800010},
6335{0x3800000, 0x966320b, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
6336{0x3800000, 0x966320b, 0x7f7fffff, 0x7f7fffff, 0x3800010},
6337{0x3800000, 0x966320b, 0x7f800000, 0x7f800000, 0x3800000},
6338{0x3800000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3800001},
6339{0x3800000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3800001},
6340{0x3800000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3800001},
6341{0x3800000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3800000},
6342{0x3800000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3800000},
6343{0x3800000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3800000},
6344{0x3800000, 0x966320b, 0x80000000, 0x966320b, 0x3800000},
6345{0x3800000, 0x966320b, 0x80000001, 0x966320b, 0x3800080},
6346{0x3800000, 0x966320b, 0x80000076, 0x966320b, 0x3800080},
6347{0x3800000, 0x966320b, 0x80002b94, 0x966320b, 0x3800080},
6348{0x3800000, 0x966320b, 0x80636d24, 0x966320b, 0x3800080},
6349{0x3800000, 0x966320b, 0x807fffff, 0x966320b, 0x3800080},
6350{0x3800000, 0x966320b, 0x80800000, 0x96631cb, 0x3800000},
6351{0x3800000, 0x966320b, 0x80800002, 0x96631ca, 0x3800010},
6352{0x3800000, 0x966320b, 0x81398437, 0x9663151, 0x3800010},
6353{0x3800000, 0x966320b, 0x8ba98d27, 0x8ba25b97, 0x3800010},
6354{0x3800000, 0x966320b, 0x8ba98d7a, 0x8ba25bea, 0x3800010},
6355{0x3800000, 0x966320b, 0xf51f853a, 0xf51f853a, 0x3800010},
6356{0x3800000, 0x966320b, 0xff7ffff0, 0xff7ffff0, 0x3800010},
6357{0x3800000, 0x966320b, 0xff7fffff, 0xff7fffff, 0x3800010},
6358{0x3800000, 0x966320b, 0xff800000, 0xff800000, 0x3800000},
6359{0x3800000, 0x966320b, 0xff800001, 0x7fc00000, 0x3800001},
6360{0x3800000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3800001},
6361{0x3800000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3800001},
6362{0x3800000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3800000},
6363{0x3800000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3800000},
6364{0x3800000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3800000},
6365{0x3800000, 0x966320b, 0x4f3495cb, 0x4f3495cb, 0x3800010},
6366{0x3800000, 0x966320b, 0xe73a5134, 0xe73a5134, 0x3800010},
6367{0x3800000, 0x966320b, 0x7c994e9e, 0x7c994e9e, 0x3800010},
6368{0x3800000, 0x966320b, 0x6164bd6c, 0x6164bd6c, 0x3800010},
6369{0x3800000, 0x966320b, 0x9503366, 0x9db32b8, 0x3800010},
6370{0x3800000, 0x966320b, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
6371{0x3800000, 0x966320b, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
6372{0x3800000, 0x966320b, 0x77f31e2f, 0x77f31e2f, 0x3800010},
6373{0x3800000, 0x966320b, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
6374{0x3800000, 0x966320b, 0x966320b, 0x9e6320b, 0x3800000},
6375{0x3800000, 0x966320b, 0xb26bddee, 0xb26bddee, 0x3800010},
6376{0x3800000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
6377{0x3800000, 0x966320b, 0x317285d3, 0x317285d3, 0x3800010},
6378{0x3800000, 0x966320b, 0x3c9623b1, 0x3c9623b1, 0x3800010},
6379{0x3800000, 0x966320b, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
6380{0x3800000, 0x966320b, 0x7b906a6c, 0x7b906a6c, 0x3800010},
6381{0x3800000, 0xb26bddee, 0x0, 0xb26bddee, 0x3800000},
6382{0x3800000, 0xb26bddee, 0x1, 0xb26bddee, 0x3800080},
6383{0x3800000, 0xb26bddee, 0x76, 0xb26bddee, 0x3800080},
6384{0x3800000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3800080},
6385{0x3800000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3800080},
6386{0x3800000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3800080},
6387{0x3800000, 0xb26bddee, 0x800000, 0xb26bddee, 0x3800010},
6388{0x3800000, 0xb26bddee, 0x800002, 0xb26bddee, 0x3800010},
6389{0x3800000, 0xb26bddee, 0x1398437, 0xb26bddee, 0x3800010},
6390{0x3800000, 0xb26bddee, 0xba98d27, 0xb26bddee, 0x3800010},
6391{0x3800000, 0xb26bddee, 0xba98d7a, 0xb26bddee, 0x3800010},
6392{0x3800000, 0xb26bddee, 0x751f853a, 0x751f8539, 0x3800010},
6393{0x3800000, 0xb26bddee, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
6394{0x3800000, 0xb26bddee, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
6395{0x3800000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3800000},
6396{0x3800000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3800001},
6397{0x3800000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3800001},
6398{0x3800000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3800001},
6399{0x3800000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3800000},
6400{0x3800000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3800000},
6401{0x3800000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3800000},
6402{0x3800000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3800000},
6403{0x3800000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3800080},
6404{0x3800000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3800080},
6405{0x3800000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3800080},
6406{0x3800000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3800080},
6407{0x3800000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3800080},
6408{0x3800000, 0xb26bddee, 0x80800000, 0xb26bddef, 0x3800010},
6409{0x3800000, 0xb26bddee, 0x80800002, 0xb26bddef, 0x3800010},
6410{0x3800000, 0xb26bddee, 0x81398437, 0xb26bddef, 0x3800010},
6411{0x3800000, 0xb26bddee, 0x8ba98d27, 0xb26bddef, 0x3800010},
6412{0x3800000, 0xb26bddee, 0x8ba98d7a, 0xb26bddef, 0x3800010},
6413{0x3800000, 0xb26bddee, 0xf51f853a, 0xf51f853b, 0x3800010},
6414{0x3800000, 0xb26bddee, 0xff7ffff0, 0xff7ffff1, 0x3800010},
6415{0x3800000, 0xb26bddee, 0xff7fffff, 0xff800000, 0x3800014},
6416{0x3800000, 0xb26bddee, 0xff800000, 0xff800000, 0x3800000},
6417{0x3800000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3800001},
6418{0x3800000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3800001},
6419{0x3800000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3800001},
6420{0x3800000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3800000},
6421{0x3800000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3800000},
6422{0x3800000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3800000},
6423{0x3800000, 0xb26bddee, 0x4f3495cb, 0x4f3495ca, 0x3800010},
6424{0x3800000, 0xb26bddee, 0xe73a5134, 0xe73a5135, 0x3800010},
6425{0x3800000, 0xb26bddee, 0x7c994e9e, 0x7c994e9d, 0x3800010},
6426{0x3800000, 0xb26bddee, 0x6164bd6c, 0x6164bd6b, 0x3800010},
6427{0x3800000, 0xb26bddee, 0x9503366, 0xb26bddee, 0x3800010},
6428{0x3800000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
6429{0x3800000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
6430{0x3800000, 0xb26bddee, 0x77f31e2f, 0x77f31e2e, 0x3800010},
6431{0x3800000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf58, 0x3800010},
6432{0x3800000, 0xb26bddee, 0x966320b, 0xb26bddee, 0x3800010},
6433{0x3800000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3800000},
6434{0x3800000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8f, 0x3800010},
6435{0x3800000, 0xb26bddee, 0x317285d3, 0xb22f3c7a, 0x3800010},
6436{0x3800000, 0xb26bddee, 0x3c9623b1, 0x3c9623a9, 0x3800010},
6437{0x3800000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
6438{0x3800000, 0xb26bddee, 0x7b906a6c, 0x7b906a6b, 0x3800010},
6439{0x3800000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3800000},
6440{0x3800000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3800080},
6441{0x3800000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3800080},
6442{0x3800000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3800080},
6443{0x3800000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3800080},
6444{0x3800000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3800080},
6445{0x3800000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d3, 0x3800010},
6446{0x3800000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d3, 0x3800010},
6447{0x3800000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d3, 0x3800010},
6448{0x3800000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d3, 0x3800010},
6449{0x3800000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d3, 0x3800010},
6450{0x3800000, 0xb5c8e5d3, 0x751f853a, 0x751f8539, 0x3800010},
6451{0x3800000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
6452{0x3800000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
6453{0x3800000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3800000},
6454{0x3800000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3800001},
6455{0x3800000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3800001},
6456{0x3800000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3800001},
6457{0x3800000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3800000},
6458{0x3800000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3800000},
6459{0x3800000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3800000},
6460{0x3800000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3800000},
6461{0x3800000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3800080},
6462{0x3800000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3800080},
6463{0x3800000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3800080},
6464{0x3800000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3800080},
6465{0x3800000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3800080},
6466{0x3800000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d4, 0x3800010},
6467{0x3800000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d4, 0x3800010},
6468{0x3800000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d4, 0x3800010},
6469{0x3800000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d4, 0x3800010},
6470{0x3800000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d4, 0x3800010},
6471{0x3800000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853b, 0x3800010},
6472{0x3800000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff1, 0x3800010},
6473{0x3800000, 0xb5c8e5d3, 0xff7fffff, 0xff800000, 0x3800014},
6474{0x3800000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3800000},
6475{0x3800000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3800001},
6476{0x3800000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3800001},
6477{0x3800000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3800001},
6478{0x3800000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3800000},
6479{0x3800000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3800000},
6480{0x3800000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3800000},
6481{0x3800000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495ca, 0x3800010},
6482{0x3800000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5135, 0x3800010},
6483{0x3800000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9d, 0x3800010},
6484{0x3800000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6b, 0x3800010},
6485{0x3800000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d3, 0x3800010},
6486{0x3800000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e3, 0x3800010},
6487{0x3800000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
6488{0x3800000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2e, 0x3800010},
6489{0x3800000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d6, 0x3800010},
6490{0x3800000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d3, 0x3800010},
6491{0x3800000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8f, 0x3800010},
6492{0x3800000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3800000},
6493{0x3800000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c91, 0x3800010},
6494{0x3800000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208d, 0x3800010},
6495{0x3800000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
6496{0x3800000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6b, 0x3800010},
6497{0x3800000, 0x317285d3, 0x0, 0x317285d3, 0x3800000},
6498{0x3800000, 0x317285d3, 0x1, 0x317285d3, 0x3800080},
6499{0x3800000, 0x317285d3, 0x76, 0x317285d3, 0x3800080},
6500{0x3800000, 0x317285d3, 0x2b94, 0x317285d3, 0x3800080},
6501{0x3800000, 0x317285d3, 0x636d24, 0x317285d3, 0x3800080},
6502{0x3800000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3800080},
6503{0x3800000, 0x317285d3, 0x800000, 0x317285d3, 0x3800010},
6504{0x3800000, 0x317285d3, 0x800002, 0x317285d3, 0x3800010},
6505{0x3800000, 0x317285d3, 0x1398437, 0x317285d3, 0x3800010},
6506{0x3800000, 0x317285d3, 0xba98d27, 0x317285d3, 0x3800010},
6507{0x3800000, 0x317285d3, 0xba98d7a, 0x317285d3, 0x3800010},
6508{0x3800000, 0x317285d3, 0x751f853a, 0x751f853a, 0x3800010},
6509{0x3800000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
6510{0x3800000, 0x317285d3, 0x7f7fffff, 0x7f7fffff, 0x3800010},
6511{0x3800000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3800000},
6512{0x3800000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3800001},
6513{0x3800000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3800001},
6514{0x3800000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3800001},
6515{0x3800000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3800000},
6516{0x3800000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3800000},
6517{0x3800000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3800000},
6518{0x3800000, 0x317285d3, 0x80000000, 0x317285d3, 0x3800000},
6519{0x3800000, 0x317285d3, 0x80000001, 0x317285d3, 0x3800080},
6520{0x3800000, 0x317285d3, 0x80000076, 0x317285d3, 0x3800080},
6521{0x3800000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3800080},
6522{0x3800000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3800080},
6523{0x3800000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3800080},
6524{0x3800000, 0x317285d3, 0x80800000, 0x317285d2, 0x3800010},
6525{0x3800000, 0x317285d3, 0x80800002, 0x317285d2, 0x3800010},
6526{0x3800000, 0x317285d3, 0x81398437, 0x317285d2, 0x3800010},
6527{0x3800000, 0x317285d3, 0x8ba98d27, 0x317285d2, 0x3800010},
6528{0x3800000, 0x317285d3, 0x8ba98d7a, 0x317285d2, 0x3800010},
6529{0x3800000, 0x317285d3, 0xf51f853a, 0xf51f853a, 0x3800010},
6530{0x3800000, 0x317285d3, 0xff7ffff0, 0xff7ffff0, 0x3800010},
6531{0x3800000, 0x317285d3, 0xff7fffff, 0xff7fffff, 0x3800010},
6532{0x3800000, 0x317285d3, 0xff800000, 0xff800000, 0x3800000},
6533{0x3800000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3800001},
6534{0x3800000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3800001},
6535{0x3800000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3800001},
6536{0x3800000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3800000},
6537{0x3800000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3800000},
6538{0x3800000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3800000},
6539{0x3800000, 0x317285d3, 0x4f3495cb, 0x4f3495cb, 0x3800010},
6540{0x3800000, 0x317285d3, 0xe73a5134, 0xe73a5134, 0x3800010},
6541{0x3800000, 0x317285d3, 0x7c994e9e, 0x7c994e9e, 0x3800010},
6542{0x3800000, 0x317285d3, 0x6164bd6c, 0x6164bd6c, 0x3800010},
6543{0x3800000, 0x317285d3, 0x9503366, 0x317285d3, 0x3800010},
6544{0x3800000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
6545{0x3800000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
6546{0x3800000, 0x317285d3, 0x77f31e2f, 0x77f31e2f, 0x3800010},
6547{0x3800000, 0x317285d3, 0xaab4d7d8, 0x3172802c, 0x3800010},
6548{0x3800000, 0x317285d3, 0x966320b, 0x317285d3, 0x3800010},
6549{0x3800000, 0x317285d3, 0xb26bddee, 0xb22f3c7a, 0x3800010},
6550{0x3800000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c91, 0x3800010},
6551{0x3800000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3800000},
6552{0x3800000, 0x317285d3, 0x3c9623b1, 0x3c9623b2, 0x3800010},
6553{0x3800000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
6554{0x3800000, 0x317285d3, 0x7b906a6c, 0x7b906a6c, 0x3800010},
6555{0x3800000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3800000},
6556{0x3800000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3800080},
6557{0x3800000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3800080},
6558{0x3800000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3800080},
6559{0x3800000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3800080},
6560{0x3800000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3800080},
6561{0x3800000, 0x3c9623b1, 0x800000, 0x3c9623b1, 0x3800010},
6562{0x3800000, 0x3c9623b1, 0x800002, 0x3c9623b1, 0x3800010},
6563{0x3800000, 0x3c9623b1, 0x1398437, 0x3c9623b1, 0x3800010},
6564{0x3800000, 0x3c9623b1, 0xba98d27, 0x3c9623b1, 0x3800010},
6565{0x3800000, 0x3c9623b1, 0xba98d7a, 0x3c9623b1, 0x3800010},
6566{0x3800000, 0x3c9623b1, 0x751f853a, 0x751f853a, 0x3800010},
6567{0x3800000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
6568{0x3800000, 0x3c9623b1, 0x7f7fffff, 0x7f7fffff, 0x3800010},
6569{0x3800000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3800000},
6570{0x3800000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3800001},
6571{0x3800000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3800001},
6572{0x3800000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3800001},
6573{0x3800000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3800000},
6574{0x3800000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3800000},
6575{0x3800000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3800000},
6576{0x3800000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3800000},
6577{0x3800000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3800080},
6578{0x3800000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3800080},
6579{0x3800000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3800080},
6580{0x3800000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3800080},
6581{0x3800000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3800080},
6582{0x3800000, 0x3c9623b1, 0x80800000, 0x3c9623b0, 0x3800010},
6583{0x3800000, 0x3c9623b1, 0x80800002, 0x3c9623b0, 0x3800010},
6584{0x3800000, 0x3c9623b1, 0x81398437, 0x3c9623b0, 0x3800010},
6585{0x3800000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b0, 0x3800010},
6586{0x3800000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b0, 0x3800010},
6587{0x3800000, 0x3c9623b1, 0xf51f853a, 0xf51f853a, 0x3800010},
6588{0x3800000, 0x3c9623b1, 0xff7ffff0, 0xff7ffff0, 0x3800010},
6589{0x3800000, 0x3c9623b1, 0xff7fffff, 0xff7fffff, 0x3800010},
6590{0x3800000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3800000},
6591{0x3800000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3800001},
6592{0x3800000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3800001},
6593{0x3800000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3800001},
6594{0x3800000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3800000},
6595{0x3800000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3800000},
6596{0x3800000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3800000},
6597{0x3800000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cb, 0x3800010},
6598{0x3800000, 0x3c9623b1, 0xe73a5134, 0xe73a5134, 0x3800010},
6599{0x3800000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9e, 0x3800010},
6600{0x3800000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6c, 0x3800010},
6601{0x3800000, 0x3c9623b1, 0x9503366, 0x3c9623b1, 0x3800010},
6602{0x3800000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ac, 0x3800010},
6603{0x3800000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
6604{0x3800000, 0x3c9623b1, 0x77f31e2f, 0x77f31e2f, 0x3800010},
6605{0x3800000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b0, 0x3800010},
6606{0x3800000, 0x3c9623b1, 0x966320b, 0x3c9623b1, 0x3800010},
6607{0x3800000, 0x3c9623b1, 0xb26bddee, 0x3c9623a9, 0x3800010},
6608{0x3800000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208d, 0x3800010},
6609{0x3800000, 0x3c9623b1, 0x317285d3, 0x3c9623b2, 0x3800010},
6610{0x3800000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3800000},
6611{0x3800000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
6612{0x3800000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6c, 0x3800010},
6613{0x3800000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3800000},
6614{0x3800000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3800080},
6615{0x3800000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3800080},
6616{0x3800000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3800080},
6617{0x3800000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3800080},
6618{0x3800000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3800080},
6619{0x3800000, 0x51fd2c7c, 0x800000, 0x51fd2c7c, 0x3800010},
6620{0x3800000, 0x51fd2c7c, 0x800002, 0x51fd2c7c, 0x3800010},
6621{0x3800000, 0x51fd2c7c, 0x1398437, 0x51fd2c7c, 0x3800010},
6622{0x3800000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7c, 0x3800010},
6623{0x3800000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7c, 0x3800010},
6624{0x3800000, 0x51fd2c7c, 0x751f853a, 0x751f853a, 0x3800010},
6625{0x3800000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
6626{0x3800000, 0x51fd2c7c, 0x7f7fffff, 0x7f7fffff, 0x3800010},
6627{0x3800000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3800000},
6628{0x3800000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3800001},
6629{0x3800000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3800001},
6630{0x3800000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3800001},
6631{0x3800000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3800000},
6632{0x3800000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3800000},
6633{0x3800000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3800000},
6634{0x3800000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3800000},
6635{0x3800000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3800080},
6636{0x3800000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3800080},
6637{0x3800000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3800080},
6638{0x3800000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3800080},
6639{0x3800000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3800080},
6640{0x3800000, 0x51fd2c7c, 0x80800000, 0x51fd2c7b, 0x3800010},
6641{0x3800000, 0x51fd2c7c, 0x80800002, 0x51fd2c7b, 0x3800010},
6642{0x3800000, 0x51fd2c7c, 0x81398437, 0x51fd2c7b, 0x3800010},
6643{0x3800000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7b, 0x3800010},
6644{0x3800000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7b, 0x3800010},
6645{0x3800000, 0x51fd2c7c, 0xf51f853a, 0xf51f853a, 0x3800010},
6646{0x3800000, 0x51fd2c7c, 0xff7ffff0, 0xff7ffff0, 0x3800010},
6647{0x3800000, 0x51fd2c7c, 0xff7fffff, 0xff7fffff, 0x3800010},
6648{0x3800000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3800000},
6649{0x3800000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3800001},
6650{0x3800000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3800001},
6651{0x3800000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3800001},
6652{0x3800000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3800000},
6653{0x3800000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3800000},
6654{0x3800000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3800000},
6655{0x3800000, 0x51fd2c7c, 0x4f3495cb, 0x52016895, 0x3800010},
6656{0x3800000, 0x51fd2c7c, 0xe73a5134, 0xe73a5134, 0x3800010},
6657{0x3800000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9e, 0x3800010},
6658{0x3800000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6c, 0x3800010},
6659{0x3800000, 0x51fd2c7c, 0x9503366, 0x51fd2c7c, 0x3800010},
6660{0x3800000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7b, 0x3800010},
6661{0x3800000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
6662{0x3800000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e2f, 0x3800010},
6663{0x3800000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7b, 0x3800010},
6664{0x3800000, 0x51fd2c7c, 0x966320b, 0x51fd2c7c, 0x3800010},
6665{0x3800000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7b, 0x3800010},
6666{0x3800000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7b, 0x3800010},
6667{0x3800000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7c, 0x3800010},
6668{0x3800000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7c, 0x3800010},
6669{0x3800000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3800000},
6670{0x3800000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6c, 0x3800010},
6671{0x3800000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3800000},
6672{0x3800000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3800080},
6673{0x3800000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3800080},
6674{0x3800000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3800080},
6675{0x3800000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3800080},
6676{0x3800000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3800080},
6677{0x3800000, 0x7b906a6c, 0x800000, 0x7b906a6c, 0x3800010},
6678{0x3800000, 0x7b906a6c, 0x800002, 0x7b906a6c, 0x3800010},
6679{0x3800000, 0x7b906a6c, 0x1398437, 0x7b906a6c, 0x3800010},
6680{0x3800000, 0x7b906a6c, 0xba98d27, 0x7b906a6c, 0x3800010},
6681{0x3800000, 0x7b906a6c, 0xba98d7a, 0x7b906a6c, 0x3800010},
6682{0x3800000, 0x7b906a6c, 0x751f853a, 0x7b906f68, 0x3800010},
6683{0x3800000, 0x7b906a6c, 0x7f7ffff0, 0x7f7fffff, 0x3800014},
6684{0x3800000, 0x7b906a6c, 0x7f7fffff, 0x7f7fffff, 0x3800014},
6685{0x3800000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3800000},
6686{0x3800000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3800001},
6687{0x3800000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3800001},
6688{0x3800000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3800001},
6689{0x3800000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3800000},
6690{0x3800000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3800000},
6691{0x3800000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3800000},
6692{0x3800000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3800000},
6693{0x3800000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3800080},
6694{0x3800000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3800080},
6695{0x3800000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3800080},
6696{0x3800000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3800080},
6697{0x3800000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3800080},
6698{0x3800000, 0x7b906a6c, 0x80800000, 0x7b906a6b, 0x3800010},
6699{0x3800000, 0x7b906a6c, 0x80800002, 0x7b906a6b, 0x3800010},
6700{0x3800000, 0x7b906a6c, 0x81398437, 0x7b906a6b, 0x3800010},
6701{0x3800000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6b, 0x3800010},
6702{0x3800000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6b, 0x3800010},
6703{0x3800000, 0x7b906a6c, 0xf51f853a, 0x7b90656f, 0x3800010},
6704{0x3800000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1c, 0x3800010},
6705{0x3800000, 0x7b906a6c, 0xff7fffff, 0xff7edf2b, 0x3800010},
6706{0x3800000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3800000},
6707{0x3800000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3800001},
6708{0x3800000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3800001},
6709{0x3800000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3800001},
6710{0x3800000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3800000},
6711{0x3800000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3800000},
6712{0x3800000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3800000},
6713{0x3800000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6c, 0x3800010},
6714{0x3800000, 0x7b906a6c, 0xe73a5134, 0x7b906a6b, 0x3800010},
6715{0x3800000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3800000},
6716{0x3800000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6c, 0x3800010},
6717{0x3800000, 0x7b906a6c, 0x9503366, 0x7b906a6c, 0x3800010},
6718{0x3800000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6b, 0x3800010},
6719{0x3800000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6b, 0x3800010},
6720{0x3800000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8a, 0x3800010},
6721{0x3800000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6b, 0x3800010},
6722{0x3800000, 0x7b906a6c, 0x966320b, 0x7b906a6c, 0x3800010},
6723{0x3800000, 0x7b906a6c, 0xb26bddee, 0x7b906a6b, 0x3800010},
6724{0x3800000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6b, 0x3800010},
6725{0x3800000, 0x7b906a6c, 0x317285d3, 0x7b906a6c, 0x3800010},
6726{0x3800000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6c, 0x3800010},
6727{0x3800000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6c, 0x3800010},
6728{0x3800000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3800000},
6729{0x3400000, 0x0, 0x0, 0x0, 0x3400000},
6730{0x3400000, 0x0, 0x1, 0x0, 0x3400080},
6731{0x3400000, 0x0, 0x76, 0x0, 0x3400080},
6732{0x3400000, 0x0, 0x2b94, 0x0, 0x3400080},
6733{0x3400000, 0x0, 0x636d24, 0x0, 0x3400080},
6734{0x3400000, 0x0, 0x7fffff, 0x0, 0x3400080},
6735{0x3400000, 0x0, 0x800000, 0x800000, 0x3400000},
6736{0x3400000, 0x0, 0x800002, 0x800002, 0x3400000},
6737{0x3400000, 0x0, 0x1398437, 0x1398437, 0x3400000},
6738{0x3400000, 0x0, 0xba98d27, 0xba98d27, 0x3400000},
6739{0x3400000, 0x0, 0xba98d7a, 0xba98d7a, 0x3400000},
6740{0x3400000, 0x0, 0x751f853a, 0x751f853a, 0x3400000},
6741{0x3400000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3400000},
6742{0x3400000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3400000},
6743{0x3400000, 0x0, 0x7f800000, 0x7f800000, 0x3400000},
6744{0x3400000, 0x0, 0x7f800001, 0x7fc00000, 0x3400001},
6745{0x3400000, 0x0, 0x7f984a37, 0x7fc00000, 0x3400001},
6746{0x3400000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3400001},
6747{0x3400000, 0x0, 0x7fc00000, 0x7fc00000, 0x3400000},
6748{0x3400000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3400000},
6749{0x3400000, 0x0, 0x7fffffff, 0x7fc00000, 0x3400000},
6750{0x3400000, 0x0, 0x80000000, 0x0, 0x3400000},
6751{0x3400000, 0x0, 0x80000001, 0x0, 0x3400080},
6752{0x3400000, 0x0, 0x80000076, 0x0, 0x3400080},
6753{0x3400000, 0x0, 0x80002b94, 0x0, 0x3400080},
6754{0x3400000, 0x0, 0x80636d24, 0x0, 0x3400080},
6755{0x3400000, 0x0, 0x807fffff, 0x0, 0x3400080},
6756{0x3400000, 0x0, 0x80800000, 0x80800000, 0x3400000},
6757{0x3400000, 0x0, 0x80800002, 0x80800002, 0x3400000},
6758{0x3400000, 0x0, 0x81398437, 0x81398437, 0x3400000},
6759{0x3400000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3400000},
6760{0x3400000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3400000},
6761{0x3400000, 0x0, 0xf51f853a, 0xf51f853a, 0x3400000},
6762{0x3400000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3400000},
6763{0x3400000, 0x0, 0xff7fffff, 0xff7fffff, 0x3400000},
6764{0x3400000, 0x0, 0xff800000, 0xff800000, 0x3400000},
6765{0x3400000, 0x0, 0xff800001, 0x7fc00000, 0x3400001},
6766{0x3400000, 0x0, 0xff984a37, 0x7fc00000, 0x3400001},
6767{0x3400000, 0x0, 0xffbfffff, 0x7fc00000, 0x3400001},
6768{0x3400000, 0x0, 0xffc00000, 0x7fc00000, 0x3400000},
6769{0x3400000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3400000},
6770{0x3400000, 0x0, 0xffffffff, 0x7fc00000, 0x3400000},
6771{0x3400000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3400000},
6772{0x3400000, 0x0, 0xe73a5134, 0xe73a5134, 0x3400000},
6773{0x3400000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3400000},
6774{0x3400000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3400000},
6775{0x3400000, 0x0, 0x9503366, 0x9503366, 0x3400000},
6776{0x3400000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3400000},
6777{0x3400000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3400000},
6778{0x3400000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3400000},
6779{0x3400000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3400000},
6780{0x3400000, 0x0, 0x966320b, 0x966320b, 0x3400000},
6781{0x3400000, 0x0, 0xb26bddee, 0xb26bddee, 0x3400000},
6782{0x3400000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400000},
6783{0x3400000, 0x0, 0x317285d3, 0x317285d3, 0x3400000},
6784{0x3400000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3400000},
6785{0x3400000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3400000},
6786{0x3400000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3400000},
6787{0x3400000, 0x1, 0x0, 0x0, 0x3400080},
6788{0x3400000, 0x1, 0x1, 0x0, 0x3400080},
6789{0x3400000, 0x1, 0x76, 0x0, 0x3400080},
6790{0x3400000, 0x1, 0x2b94, 0x0, 0x3400080},
6791{0x3400000, 0x1, 0x636d24, 0x0, 0x3400080},
6792{0x3400000, 0x1, 0x7fffff, 0x0, 0x3400080},
6793{0x3400000, 0x1, 0x800000, 0x800000, 0x3400080},
6794{0x3400000, 0x1, 0x800002, 0x800002, 0x3400080},
6795{0x3400000, 0x1, 0x1398437, 0x1398437, 0x3400080},
6796{0x3400000, 0x1, 0xba98d27, 0xba98d27, 0x3400080},
6797{0x3400000, 0x1, 0xba98d7a, 0xba98d7a, 0x3400080},
6798{0x3400000, 0x1, 0x751f853a, 0x751f853a, 0x3400080},
6799{0x3400000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
6800{0x3400000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3400080},
6801{0x3400000, 0x1, 0x7f800000, 0x7f800000, 0x3400080},
6802{0x3400000, 0x1, 0x7f800001, 0x7fc00000, 0x3400081},
6803{0x3400000, 0x1, 0x7f984a37, 0x7fc00000, 0x3400081},
6804{0x3400000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3400081},
6805{0x3400000, 0x1, 0x7fc00000, 0x7fc00000, 0x3400080},
6806{0x3400000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3400080},
6807{0x3400000, 0x1, 0x7fffffff, 0x7fc00000, 0x3400080},
6808{0x3400000, 0x1, 0x80000000, 0x0, 0x3400080},
6809{0x3400000, 0x1, 0x80000001, 0x0, 0x3400080},
6810{0x3400000, 0x1, 0x80000076, 0x0, 0x3400080},
6811{0x3400000, 0x1, 0x80002b94, 0x0, 0x3400080},
6812{0x3400000, 0x1, 0x80636d24, 0x0, 0x3400080},
6813{0x3400000, 0x1, 0x807fffff, 0x0, 0x3400080},
6814{0x3400000, 0x1, 0x80800000, 0x80800000, 0x3400080},
6815{0x3400000, 0x1, 0x80800002, 0x80800002, 0x3400080},
6816{0x3400000, 0x1, 0x81398437, 0x81398437, 0x3400080},
6817{0x3400000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3400080},
6818{0x3400000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
6819{0x3400000, 0x1, 0xf51f853a, 0xf51f853a, 0x3400080},
6820{0x3400000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3400080},
6821{0x3400000, 0x1, 0xff7fffff, 0xff7fffff, 0x3400080},
6822{0x3400000, 0x1, 0xff800000, 0xff800000, 0x3400080},
6823{0x3400000, 0x1, 0xff800001, 0x7fc00000, 0x3400081},
6824{0x3400000, 0x1, 0xff984a37, 0x7fc00000, 0x3400081},
6825{0x3400000, 0x1, 0xffbfffff, 0x7fc00000, 0x3400081},
6826{0x3400000, 0x1, 0xffc00000, 0x7fc00000, 0x3400080},
6827{0x3400000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3400080},
6828{0x3400000, 0x1, 0xffffffff, 0x7fc00000, 0x3400080},
6829{0x3400000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3400080},
6830{0x3400000, 0x1, 0xe73a5134, 0xe73a5134, 0x3400080},
6831{0x3400000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3400080},
6832{0x3400000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3400080},
6833{0x3400000, 0x1, 0x9503366, 0x9503366, 0x3400080},
6834{0x3400000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
6835{0x3400000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
6836{0x3400000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3400080},
6837{0x3400000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
6838{0x3400000, 0x1, 0x966320b, 0x966320b, 0x3400080},
6839{0x3400000, 0x1, 0xb26bddee, 0xb26bddee, 0x3400080},
6840{0x3400000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
6841{0x3400000, 0x1, 0x317285d3, 0x317285d3, 0x3400080},
6842{0x3400000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3400080},
6843{0x3400000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
6844{0x3400000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3400080},
6845{0x3400000, 0x76, 0x0, 0x0, 0x3400080},
6846{0x3400000, 0x76, 0x1, 0x0, 0x3400080},
6847{0x3400000, 0x76, 0x76, 0x0, 0x3400080},
6848{0x3400000, 0x76, 0x2b94, 0x0, 0x3400080},
6849{0x3400000, 0x76, 0x636d24, 0x0, 0x3400080},
6850{0x3400000, 0x76, 0x7fffff, 0x0, 0x3400080},
6851{0x3400000, 0x76, 0x800000, 0x800000, 0x3400080},
6852{0x3400000, 0x76, 0x800002, 0x800002, 0x3400080},
6853{0x3400000, 0x76, 0x1398437, 0x1398437, 0x3400080},
6854{0x3400000, 0x76, 0xba98d27, 0xba98d27, 0x3400080},
6855{0x3400000, 0x76, 0xba98d7a, 0xba98d7a, 0x3400080},
6856{0x3400000, 0x76, 0x751f853a, 0x751f853a, 0x3400080},
6857{0x3400000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
6858{0x3400000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3400080},
6859{0x3400000, 0x76, 0x7f800000, 0x7f800000, 0x3400080},
6860{0x3400000, 0x76, 0x7f800001, 0x7fc00000, 0x3400081},
6861{0x3400000, 0x76, 0x7f984a37, 0x7fc00000, 0x3400081},
6862{0x3400000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3400081},
6863{0x3400000, 0x76, 0x7fc00000, 0x7fc00000, 0x3400080},
6864{0x3400000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3400080},
6865{0x3400000, 0x76, 0x7fffffff, 0x7fc00000, 0x3400080},
6866{0x3400000, 0x76, 0x80000000, 0x0, 0x3400080},
6867{0x3400000, 0x76, 0x80000001, 0x0, 0x3400080},
6868{0x3400000, 0x76, 0x80000076, 0x0, 0x3400080},
6869{0x3400000, 0x76, 0x80002b94, 0x0, 0x3400080},
6870{0x3400000, 0x76, 0x80636d24, 0x0, 0x3400080},
6871{0x3400000, 0x76, 0x807fffff, 0x0, 0x3400080},
6872{0x3400000, 0x76, 0x80800000, 0x80800000, 0x3400080},
6873{0x3400000, 0x76, 0x80800002, 0x80800002, 0x3400080},
6874{0x3400000, 0x76, 0x81398437, 0x81398437, 0x3400080},
6875{0x3400000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3400080},
6876{0x3400000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
6877{0x3400000, 0x76, 0xf51f853a, 0xf51f853a, 0x3400080},
6878{0x3400000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3400080},
6879{0x3400000, 0x76, 0xff7fffff, 0xff7fffff, 0x3400080},
6880{0x3400000, 0x76, 0xff800000, 0xff800000, 0x3400080},
6881{0x3400000, 0x76, 0xff800001, 0x7fc00000, 0x3400081},
6882{0x3400000, 0x76, 0xff984a37, 0x7fc00000, 0x3400081},
6883{0x3400000, 0x76, 0xffbfffff, 0x7fc00000, 0x3400081},
6884{0x3400000, 0x76, 0xffc00000, 0x7fc00000, 0x3400080},
6885{0x3400000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3400080},
6886{0x3400000, 0x76, 0xffffffff, 0x7fc00000, 0x3400080},
6887{0x3400000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3400080},
6888{0x3400000, 0x76, 0xe73a5134, 0xe73a5134, 0x3400080},
6889{0x3400000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3400080},
6890{0x3400000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3400080},
6891{0x3400000, 0x76, 0x9503366, 0x9503366, 0x3400080},
6892{0x3400000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
6893{0x3400000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
6894{0x3400000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3400080},
6895{0x3400000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
6896{0x3400000, 0x76, 0x966320b, 0x966320b, 0x3400080},
6897{0x3400000, 0x76, 0xb26bddee, 0xb26bddee, 0x3400080},
6898{0x3400000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
6899{0x3400000, 0x76, 0x317285d3, 0x317285d3, 0x3400080},
6900{0x3400000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3400080},
6901{0x3400000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
6902{0x3400000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3400080},
6903{0x3400000, 0x2b94, 0x0, 0x0, 0x3400080},
6904{0x3400000, 0x2b94, 0x1, 0x0, 0x3400080},
6905{0x3400000, 0x2b94, 0x76, 0x0, 0x3400080},
6906{0x3400000, 0x2b94, 0x2b94, 0x0, 0x3400080},
6907{0x3400000, 0x2b94, 0x636d24, 0x0, 0x3400080},
6908{0x3400000, 0x2b94, 0x7fffff, 0x0, 0x3400080},
6909{0x3400000, 0x2b94, 0x800000, 0x800000, 0x3400080},
6910{0x3400000, 0x2b94, 0x800002, 0x800002, 0x3400080},
6911{0x3400000, 0x2b94, 0x1398437, 0x1398437, 0x3400080},
6912{0x3400000, 0x2b94, 0xba98d27, 0xba98d27, 0x3400080},
6913{0x3400000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3400080},
6914{0x3400000, 0x2b94, 0x751f853a, 0x751f853a, 0x3400080},
6915{0x3400000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
6916{0x3400000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3400080},
6917{0x3400000, 0x2b94, 0x7f800000, 0x7f800000, 0x3400080},
6918{0x3400000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3400081},
6919{0x3400000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3400081},
6920{0x3400000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3400081},
6921{0x3400000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3400080},
6922{0x3400000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3400080},
6923{0x3400000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3400080},
6924{0x3400000, 0x2b94, 0x80000000, 0x0, 0x3400080},
6925{0x3400000, 0x2b94, 0x80000001, 0x0, 0x3400080},
6926{0x3400000, 0x2b94, 0x80000076, 0x0, 0x3400080},
6927{0x3400000, 0x2b94, 0x80002b94, 0x0, 0x3400080},
6928{0x3400000, 0x2b94, 0x80636d24, 0x0, 0x3400080},
6929{0x3400000, 0x2b94, 0x807fffff, 0x0, 0x3400080},
6930{0x3400000, 0x2b94, 0x80800000, 0x80800000, 0x3400080},
6931{0x3400000, 0x2b94, 0x80800002, 0x80800002, 0x3400080},
6932{0x3400000, 0x2b94, 0x81398437, 0x81398437, 0x3400080},
6933{0x3400000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3400080},
6934{0x3400000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
6935{0x3400000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3400080},
6936{0x3400000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3400080},
6937{0x3400000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3400080},
6938{0x3400000, 0x2b94, 0xff800000, 0xff800000, 0x3400080},
6939{0x3400000, 0x2b94, 0xff800001, 0x7fc00000, 0x3400081},
6940{0x3400000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3400081},
6941{0x3400000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3400081},
6942{0x3400000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3400080},
6943{0x3400000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3400080},
6944{0x3400000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3400080},
6945{0x3400000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3400080},
6946{0x3400000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3400080},
6947{0x3400000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3400080},
6948{0x3400000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3400080},
6949{0x3400000, 0x2b94, 0x9503366, 0x9503366, 0x3400080},
6950{0x3400000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
6951{0x3400000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
6952{0x3400000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3400080},
6953{0x3400000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
6954{0x3400000, 0x2b94, 0x966320b, 0x966320b, 0x3400080},
6955{0x3400000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3400080},
6956{0x3400000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
6957{0x3400000, 0x2b94, 0x317285d3, 0x317285d3, 0x3400080},
6958{0x3400000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3400080},
6959{0x3400000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
6960{0x3400000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3400080},
6961{0x3400000, 0x636d24, 0x0, 0x0, 0x3400080},
6962{0x3400000, 0x636d24, 0x1, 0x0, 0x3400080},
6963{0x3400000, 0x636d24, 0x76, 0x0, 0x3400080},
6964{0x3400000, 0x636d24, 0x2b94, 0x0, 0x3400080},
6965{0x3400000, 0x636d24, 0x636d24, 0x0, 0x3400080},
6966{0x3400000, 0x636d24, 0x7fffff, 0x0, 0x3400080},
6967{0x3400000, 0x636d24, 0x800000, 0x800000, 0x3400080},
6968{0x3400000, 0x636d24, 0x800002, 0x800002, 0x3400080},
6969{0x3400000, 0x636d24, 0x1398437, 0x1398437, 0x3400080},
6970{0x3400000, 0x636d24, 0xba98d27, 0xba98d27, 0x3400080},
6971{0x3400000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3400080},
6972{0x3400000, 0x636d24, 0x751f853a, 0x751f853a, 0x3400080},
6973{0x3400000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
6974{0x3400000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3400080},
6975{0x3400000, 0x636d24, 0x7f800000, 0x7f800000, 0x3400080},
6976{0x3400000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3400081},
6977{0x3400000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3400081},
6978{0x3400000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3400081},
6979{0x3400000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3400080},
6980{0x3400000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3400080},
6981{0x3400000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3400080},
6982{0x3400000, 0x636d24, 0x80000000, 0x0, 0x3400080},
6983{0x3400000, 0x636d24, 0x80000001, 0x0, 0x3400080},
6984{0x3400000, 0x636d24, 0x80000076, 0x0, 0x3400080},
6985{0x3400000, 0x636d24, 0x80002b94, 0x0, 0x3400080},
6986{0x3400000, 0x636d24, 0x80636d24, 0x0, 0x3400080},
6987{0x3400000, 0x636d24, 0x807fffff, 0x0, 0x3400080},
6988{0x3400000, 0x636d24, 0x80800000, 0x80800000, 0x3400080},
6989{0x3400000, 0x636d24, 0x80800002, 0x80800002, 0x3400080},
6990{0x3400000, 0x636d24, 0x81398437, 0x81398437, 0x3400080},
6991{0x3400000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3400080},
6992{0x3400000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
6993{0x3400000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3400080},
6994{0x3400000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3400080},
6995{0x3400000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3400080},
6996{0x3400000, 0x636d24, 0xff800000, 0xff800000, 0x3400080},
6997{0x3400000, 0x636d24, 0xff800001, 0x7fc00000, 0x3400081},
6998{0x3400000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3400081},
6999{0x3400000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3400081},
7000{0x3400000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3400080},
7001{0x3400000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3400080},
7002{0x3400000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3400080},
7003{0x3400000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3400080},
7004{0x3400000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3400080},
7005{0x3400000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3400080},
7006{0x3400000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3400080},
7007{0x3400000, 0x636d24, 0x9503366, 0x9503366, 0x3400080},
7008{0x3400000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
7009{0x3400000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
7010{0x3400000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3400080},
7011{0x3400000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
7012{0x3400000, 0x636d24, 0x966320b, 0x966320b, 0x3400080},
7013{0x3400000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3400080},
7014{0x3400000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
7015{0x3400000, 0x636d24, 0x317285d3, 0x317285d3, 0x3400080},
7016{0x3400000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3400080},
7017{0x3400000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
7018{0x3400000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3400080},
7019{0x3400000, 0x7fffff, 0x0, 0x0, 0x3400080},
7020{0x3400000, 0x7fffff, 0x1, 0x0, 0x3400080},
7021{0x3400000, 0x7fffff, 0x76, 0x0, 0x3400080},
7022{0x3400000, 0x7fffff, 0x2b94, 0x0, 0x3400080},
7023{0x3400000, 0x7fffff, 0x636d24, 0x0, 0x3400080},
7024{0x3400000, 0x7fffff, 0x7fffff, 0x0, 0x3400080},
7025{0x3400000, 0x7fffff, 0x800000, 0x800000, 0x3400080},
7026{0x3400000, 0x7fffff, 0x800002, 0x800002, 0x3400080},
7027{0x3400000, 0x7fffff, 0x1398437, 0x1398437, 0x3400080},
7028{0x3400000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3400080},
7029{0x3400000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3400080},
7030{0x3400000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3400080},
7031{0x3400000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
7032{0x3400000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3400080},
7033{0x3400000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3400080},
7034{0x3400000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3400081},
7035{0x3400000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3400081},
7036{0x3400000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3400081},
7037{0x3400000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3400080},
7038{0x3400000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3400080},
7039{0x3400000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3400080},
7040{0x3400000, 0x7fffff, 0x80000000, 0x0, 0x3400080},
7041{0x3400000, 0x7fffff, 0x80000001, 0x0, 0x3400080},
7042{0x3400000, 0x7fffff, 0x80000076, 0x0, 0x3400080},
7043{0x3400000, 0x7fffff, 0x80002b94, 0x0, 0x3400080},
7044{0x3400000, 0x7fffff, 0x80636d24, 0x0, 0x3400080},
7045{0x3400000, 0x7fffff, 0x807fffff, 0x0, 0x3400080},
7046{0x3400000, 0x7fffff, 0x80800000, 0x80800000, 0x3400080},
7047{0x3400000, 0x7fffff, 0x80800002, 0x80800002, 0x3400080},
7048{0x3400000, 0x7fffff, 0x81398437, 0x81398437, 0x3400080},
7049{0x3400000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3400080},
7050{0x3400000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
7051{0x3400000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3400080},
7052{0x3400000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3400080},
7053{0x3400000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3400080},
7054{0x3400000, 0x7fffff, 0xff800000, 0xff800000, 0x3400080},
7055{0x3400000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3400081},
7056{0x3400000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3400081},
7057{0x3400000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3400081},
7058{0x3400000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3400080},
7059{0x3400000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3400080},
7060{0x3400000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3400080},
7061{0x3400000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3400080},
7062{0x3400000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3400080},
7063{0x3400000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3400080},
7064{0x3400000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3400080},
7065{0x3400000, 0x7fffff, 0x9503366, 0x9503366, 0x3400080},
7066{0x3400000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
7067{0x3400000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
7068{0x3400000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3400080},
7069{0x3400000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
7070{0x3400000, 0x7fffff, 0x966320b, 0x966320b, 0x3400080},
7071{0x3400000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3400080},
7072{0x3400000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
7073{0x3400000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3400080},
7074{0x3400000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3400080},
7075{0x3400000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
7076{0x3400000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3400080},
7077{0x3400000, 0x800000, 0x0, 0x800000, 0x3400000},
7078{0x3400000, 0x800000, 0x1, 0x800000, 0x3400080},
7079{0x3400000, 0x800000, 0x76, 0x800000, 0x3400080},
7080{0x3400000, 0x800000, 0x2b94, 0x800000, 0x3400080},
7081{0x3400000, 0x800000, 0x636d24, 0x800000, 0x3400080},
7082{0x3400000, 0x800000, 0x7fffff, 0x800000, 0x3400080},
7083{0x3400000, 0x800000, 0x800000, 0x1000000, 0x3400000},
7084{0x3400000, 0x800000, 0x800002, 0x1000001, 0x3400000},
7085{0x3400000, 0x800000, 0x1398437, 0x1798437, 0x3400000},
7086{0x3400000, 0x800000, 0xba98d27, 0xba98d29, 0x3400000},
7087{0x3400000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3400000},
7088{0x3400000, 0x800000, 0x751f853a, 0x751f853b, 0x3400010},
7089{0x3400000, 0x800000, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
7090{0x3400000, 0x800000, 0x7f7fffff, 0x7f800000, 0x3400014},
7091{0x3400000, 0x800000, 0x7f800000, 0x7f800000, 0x3400000},
7092{0x3400000, 0x800000, 0x7f800001, 0x7fc00000, 0x3400001},
7093{0x3400000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3400001},
7094{0x3400000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3400001},
7095{0x3400000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3400000},
7096{0x3400000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
7097{0x3400000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3400000},
7098{0x3400000, 0x800000, 0x80000000, 0x800000, 0x3400000},
7099{0x3400000, 0x800000, 0x80000001, 0x800000, 0x3400080},
7100{0x3400000, 0x800000, 0x80000076, 0x800000, 0x3400080},
7101{0x3400000, 0x800000, 0x80002b94, 0x800000, 0x3400080},
7102{0x3400000, 0x800000, 0x80636d24, 0x800000, 0x3400080},
7103{0x3400000, 0x800000, 0x807fffff, 0x800000, 0x3400080},
7104{0x3400000, 0x800000, 0x80800000, 0x0, 0x3400000},
7105{0x3400000, 0x800000, 0x80800002, 0x0, 0x3400008},
7106{0x3400000, 0x800000, 0x81398437, 0x80f3086e, 0x3400000},
7107{0x3400000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3400000},
7108{0x3400000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3400000},
7109{0x3400000, 0x800000, 0xf51f853a, 0xf51f8539, 0x3400010},
7110{0x3400000, 0x800000, 0xff7ffff0, 0xff7fffef, 0x3400010},
7111{0x3400000, 0x800000, 0xff7fffff, 0xff7ffffe, 0x3400010},
7112{0x3400000, 0x800000, 0xff800000, 0xff800000, 0x3400000},
7113{0x3400000, 0x800000, 0xff800001, 0x7fc00000, 0x3400001},
7114{0x3400000, 0x800000, 0xff984a37, 0x7fc00000, 0x3400001},
7115{0x3400000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3400001},
7116{0x3400000, 0x800000, 0xffc00000, 0x7fc00000, 0x3400000},
7117{0x3400000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3400000},
7118{0x3400000, 0x800000, 0xffffffff, 0x7fc00000, 0x3400000},
7119{0x3400000, 0x800000, 0x4f3495cb, 0x4f3495cc, 0x3400010},
7120{0x3400000, 0x800000, 0xe73a5134, 0xe73a5133, 0x3400010},
7121{0x3400000, 0x800000, 0x7c994e9e, 0x7c994e9f, 0x3400010},
7122{0x3400000, 0x800000, 0x6164bd6c, 0x6164bd6d, 0x3400010},
7123{0x3400000, 0x800000, 0x9503366, 0x95033a6, 0x3400000},
7124{0x3400000, 0x800000, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
7125{0x3400000, 0x800000, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
7126{0x3400000, 0x800000, 0x77f31e2f, 0x77f31e30, 0x3400010},
7127{0x3400000, 0x800000, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
7128{0x3400000, 0x800000, 0x966320b, 0x966324b, 0x3400000},
7129{0x3400000, 0x800000, 0xb26bddee, 0xb26bdded, 0x3400010},
7130{0x3400000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
7131{0x3400000, 0x800000, 0x317285d3, 0x317285d4, 0x3400010},
7132{0x3400000, 0x800000, 0x3c9623b1, 0x3c9623b2, 0x3400010},
7133{0x3400000, 0x800000, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
7134{0x3400000, 0x800000, 0x7b906a6c, 0x7b906a6d, 0x3400010},
7135{0x3400000, 0x800002, 0x0, 0x800002, 0x3400000},
7136{0x3400000, 0x800002, 0x1, 0x800002, 0x3400080},
7137{0x3400000, 0x800002, 0x76, 0x800002, 0x3400080},
7138{0x3400000, 0x800002, 0x2b94, 0x800002, 0x3400080},
7139{0x3400000, 0x800002, 0x636d24, 0x800002, 0x3400080},
7140{0x3400000, 0x800002, 0x7fffff, 0x800002, 0x3400080},
7141{0x3400000, 0x800002, 0x800000, 0x1000001, 0x3400000},
7142{0x3400000, 0x800002, 0x800002, 0x1000002, 0x3400000},
7143{0x3400000, 0x800002, 0x1398437, 0x1798438, 0x3400000},
7144{0x3400000, 0x800002, 0xba98d27, 0xba98d2a, 0x3400010},
7145{0x3400000, 0x800002, 0xba98d7a, 0xba98d7d, 0x3400010},
7146{0x3400000, 0x800002, 0x751f853a, 0x751f853b, 0x3400010},
7147{0x3400000, 0x800002, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
7148{0x3400000, 0x800002, 0x7f7fffff, 0x7f800000, 0x3400014},
7149{0x3400000, 0x800002, 0x7f800000, 0x7f800000, 0x3400000},
7150{0x3400000, 0x800002, 0x7f800001, 0x7fc00000, 0x3400001},
7151{0x3400000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3400001},
7152{0x3400000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3400001},
7153{0x3400000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3400000},
7154{0x3400000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3400000},
7155{0x3400000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3400000},
7156{0x3400000, 0x800002, 0x80000000, 0x800002, 0x3400000},
7157{0x3400000, 0x800002, 0x80000001, 0x800002, 0x3400080},
7158{0x3400000, 0x800002, 0x80000076, 0x800002, 0x3400080},
7159{0x3400000, 0x800002, 0x80002b94, 0x800002, 0x3400080},
7160{0x3400000, 0x800002, 0x80636d24, 0x800002, 0x3400080},
7161{0x3400000, 0x800002, 0x807fffff, 0x800002, 0x3400080},
7162{0x3400000, 0x800002, 0x80800000, 0x0, 0x3400008},
7163{0x3400000, 0x800002, 0x80800002, 0x0, 0x3400000},
7164{0x3400000, 0x800002, 0x81398437, 0x80f3086c, 0x3400000},
7165{0x3400000, 0x800002, 0x8ba98d27, 0x8ba98d24, 0x3400010},
7166{0x3400000, 0x800002, 0x8ba98d7a, 0x8ba98d77, 0x3400010},
7167{0x3400000, 0x800002, 0xf51f853a, 0xf51f8539, 0x3400010},
7168{0x3400000, 0x800002, 0xff7ffff0, 0xff7fffef, 0x3400010},
7169{0x3400000, 0x800002, 0xff7fffff, 0xff7ffffe, 0x3400010},
7170{0x3400000, 0x800002, 0xff800000, 0xff800000, 0x3400000},
7171{0x3400000, 0x800002, 0xff800001, 0x7fc00000, 0x3400001},
7172{0x3400000, 0x800002, 0xff984a37, 0x7fc00000, 0x3400001},
7173{0x3400000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3400001},
7174{0x3400000, 0x800002, 0xffc00000, 0x7fc00000, 0x3400000},
7175{0x3400000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3400000},
7176{0x3400000, 0x800002, 0xffffffff, 0x7fc00000, 0x3400000},
7177{0x3400000, 0x800002, 0x4f3495cb, 0x4f3495cc, 0x3400010},
7178{0x3400000, 0x800002, 0xe73a5134, 0xe73a5133, 0x3400010},
7179{0x3400000, 0x800002, 0x7c994e9e, 0x7c994e9f, 0x3400010},
7180{0x3400000, 0x800002, 0x6164bd6c, 0x6164bd6d, 0x3400010},
7181{0x3400000, 0x800002, 0x9503366, 0x95033a7, 0x3400010},
7182{0x3400000, 0x800002, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
7183{0x3400000, 0x800002, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
7184{0x3400000, 0x800002, 0x77f31e2f, 0x77f31e30, 0x3400010},
7185{0x3400000, 0x800002, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
7186{0x3400000, 0x800002, 0x966320b, 0x966324c, 0x3400010},
7187{0x3400000, 0x800002, 0xb26bddee, 0xb26bdded, 0x3400010},
7188{0x3400000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
7189{0x3400000, 0x800002, 0x317285d3, 0x317285d4, 0x3400010},
7190{0x3400000, 0x800002, 0x3c9623b1, 0x3c9623b2, 0x3400010},
7191{0x3400000, 0x800002, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
7192{0x3400000, 0x800002, 0x7b906a6c, 0x7b906a6d, 0x3400010},
7193{0x3400000, 0x1398437, 0x0, 0x1398437, 0x3400000},
7194{0x3400000, 0x1398437, 0x1, 0x1398437, 0x3400080},
7195{0x3400000, 0x1398437, 0x76, 0x1398437, 0x3400080},
7196{0x3400000, 0x1398437, 0x2b94, 0x1398437, 0x3400080},
7197{0x3400000, 0x1398437, 0x636d24, 0x1398437, 0x3400080},
7198{0x3400000, 0x1398437, 0x7fffff, 0x1398437, 0x3400080},
7199{0x3400000, 0x1398437, 0x800000, 0x1798437, 0x3400000},
7200{0x3400000, 0x1398437, 0x800002, 0x1798438, 0x3400000},
7201{0x3400000, 0x1398437, 0x1398437, 0x1b98437, 0x3400000},
7202{0x3400000, 0x1398437, 0xba98d27, 0xba98d2d, 0x3400010},
7203{0x3400000, 0x1398437, 0xba98d7a, 0xba98d80, 0x3400010},
7204{0x3400000, 0x1398437, 0x751f853a, 0x751f853b, 0x3400010},
7205{0x3400000, 0x1398437, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
7206{0x3400000, 0x1398437, 0x7f7fffff, 0x7f800000, 0x3400014},
7207{0x3400000, 0x1398437, 0x7f800000, 0x7f800000, 0x3400000},
7208{0x3400000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3400001},
7209{0x3400000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3400001},
7210{0x3400000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3400001},
7211{0x3400000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3400000},
7212{0x3400000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3400000},
7213{0x3400000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3400000},
7214{0x3400000, 0x1398437, 0x80000000, 0x1398437, 0x3400000},
7215{0x3400000, 0x1398437, 0x80000001, 0x1398437, 0x3400080},
7216{0x3400000, 0x1398437, 0x80000076, 0x1398437, 0x3400080},
7217{0x3400000, 0x1398437, 0x80002b94, 0x1398437, 0x3400080},
7218{0x3400000, 0x1398437, 0x80636d24, 0x1398437, 0x3400080},
7219{0x3400000, 0x1398437, 0x807fffff, 0x1398437, 0x3400080},
7220{0x3400000, 0x1398437, 0x80800000, 0xf3086e, 0x3400000},
7221{0x3400000, 0x1398437, 0x80800002, 0xf3086c, 0x3400000},
7222{0x3400000, 0x1398437, 0x81398437, 0x0, 0x3400000},
7223{0x3400000, 0x1398437, 0x8ba98d27, 0x8ba98d21, 0x3400010},
7224{0x3400000, 0x1398437, 0x8ba98d7a, 0x8ba98d74, 0x3400010},
7225{0x3400000, 0x1398437, 0xf51f853a, 0xf51f8539, 0x3400010},
7226{0x3400000, 0x1398437, 0xff7ffff0, 0xff7fffef, 0x3400010},
7227{0x3400000, 0x1398437, 0xff7fffff, 0xff7ffffe, 0x3400010},
7228{0x3400000, 0x1398437, 0xff800000, 0xff800000, 0x3400000},
7229{0x3400000, 0x1398437, 0xff800001, 0x7fc00000, 0x3400001},
7230{0x3400000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3400001},
7231{0x3400000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3400001},
7232{0x3400000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3400000},
7233{0x3400000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3400000},
7234{0x3400000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3400000},
7235{0x3400000, 0x1398437, 0x4f3495cb, 0x4f3495cc, 0x3400010},
7236{0x3400000, 0x1398437, 0xe73a5134, 0xe73a5133, 0x3400010},
7237{0x3400000, 0x1398437, 0x7c994e9e, 0x7c994e9f, 0x3400010},
7238{0x3400000, 0x1398437, 0x6164bd6c, 0x6164bd6d, 0x3400010},
7239{0x3400000, 0x1398437, 0x9503366, 0x9503420, 0x3400010},
7240{0x3400000, 0x1398437, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
7241{0x3400000, 0x1398437, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
7242{0x3400000, 0x1398437, 0x77f31e2f, 0x77f31e30, 0x3400010},
7243{0x3400000, 0x1398437, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
7244{0x3400000, 0x1398437, 0x966320b, 0x96632c5, 0x3400010},
7245{0x3400000, 0x1398437, 0xb26bddee, 0xb26bdded, 0x3400010},
7246{0x3400000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
7247{0x3400000, 0x1398437, 0x317285d3, 0x317285d4, 0x3400010},
7248{0x3400000, 0x1398437, 0x3c9623b1, 0x3c9623b2, 0x3400010},
7249{0x3400000, 0x1398437, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
7250{0x3400000, 0x1398437, 0x7b906a6c, 0x7b906a6d, 0x3400010},
7251{0x3400000, 0xba98d27, 0x0, 0xba98d27, 0x3400000},
7252{0x3400000, 0xba98d27, 0x1, 0xba98d27, 0x3400080},
7253{0x3400000, 0xba98d27, 0x76, 0xba98d27, 0x3400080},
7254{0x3400000, 0xba98d27, 0x2b94, 0xba98d27, 0x3400080},
7255{0x3400000, 0xba98d27, 0x636d24, 0xba98d27, 0x3400080},
7256{0x3400000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3400080},
7257{0x3400000, 0xba98d27, 0x800000, 0xba98d29, 0x3400000},
7258{0x3400000, 0xba98d27, 0x800002, 0xba98d2a, 0x3400010},
7259{0x3400000, 0xba98d27, 0x1398437, 0xba98d2d, 0x3400010},
7260{0x3400000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3400000},
7261{0x3400000, 0xba98d27, 0xba98d7a, 0xc298d51, 0x3400010},
7262{0x3400000, 0xba98d27, 0x751f853a, 0x751f853b, 0x3400010},
7263{0x3400000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
7264{0x3400000, 0xba98d27, 0x7f7fffff, 0x7f800000, 0x3400014},
7265{0x3400000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3400000},
7266{0x3400000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3400001},
7267{0x3400000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3400001},
7268{0x3400000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3400001},
7269{0x3400000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3400000},
7270{0x3400000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3400000},
7271{0x3400000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3400000},
7272{0x3400000, 0xba98d27, 0x80000000, 0xba98d27, 0x3400000},
7273{0x3400000, 0xba98d27, 0x80000001, 0xba98d27, 0x3400080},
7274{0x3400000, 0xba98d27, 0x80000076, 0xba98d27, 0x3400080},
7275{0x3400000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3400080},
7276{0x3400000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3400080},
7277{0x3400000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3400080},
7278{0x3400000, 0xba98d27, 0x80800000, 0xba98d25, 0x3400000},
7279{0x3400000, 0xba98d27, 0x80800002, 0xba98d25, 0x3400010},
7280{0x3400000, 0xba98d27, 0x81398437, 0xba98d22, 0x3400010},
7281{0x3400000, 0xba98d27, 0x8ba98d27, 0x0, 0x3400000},
7282{0x3400000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3400000},
7283{0x3400000, 0xba98d27, 0xf51f853a, 0xf51f8539, 0x3400010},
7284{0x3400000, 0xba98d27, 0xff7ffff0, 0xff7fffef, 0x3400010},
7285{0x3400000, 0xba98d27, 0xff7fffff, 0xff7ffffe, 0x3400010},
7286{0x3400000, 0xba98d27, 0xff800000, 0xff800000, 0x3400000},
7287{0x3400000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3400001},
7288{0x3400000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3400001},
7289{0x3400000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3400001},
7290{0x3400000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3400000},
7291{0x3400000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3400000},
7292{0x3400000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3400000},
7293{0x3400000, 0xba98d27, 0x4f3495cb, 0x4f3495cc, 0x3400010},
7294{0x3400000, 0xba98d27, 0xe73a5134, 0xe73a5133, 0x3400010},
7295{0x3400000, 0xba98d27, 0x7c994e9e, 0x7c994e9f, 0x3400010},
7296{0x3400000, 0xba98d27, 0x6164bd6c, 0x6164bd6d, 0x3400010},
7297{0x3400000, 0xba98d27, 0x9503366, 0xbb00ec3, 0x3400010},
7298{0x3400000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
7299{0x3400000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
7300{0x3400000, 0xba98d27, 0x77f31e2f, 0x77f31e30, 0x3400010},
7301{0x3400000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
7302{0x3400000, 0xba98d27, 0x966320b, 0xbb0beb8, 0x3400010},
7303{0x3400000, 0xba98d27, 0xb26bddee, 0xb26bdded, 0x3400010},
7304{0x3400000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
7305{0x3400000, 0xba98d27, 0x317285d3, 0x317285d4, 0x3400010},
7306{0x3400000, 0xba98d27, 0x3c9623b1, 0x3c9623b2, 0x3400010},
7307{0x3400000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
7308{0x3400000, 0xba98d27, 0x7b906a6c, 0x7b906a6d, 0x3400010},
7309{0x3400000, 0xba98d7a, 0x0, 0xba98d7a, 0x3400000},
7310{0x3400000, 0xba98d7a, 0x1, 0xba98d7a, 0x3400080},
7311{0x3400000, 0xba98d7a, 0x76, 0xba98d7a, 0x3400080},
7312{0x3400000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3400080},
7313{0x3400000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3400080},
7314{0x3400000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3400080},
7315{0x3400000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3400000},
7316{0x3400000, 0xba98d7a, 0x800002, 0xba98d7d, 0x3400010},
7317{0x3400000, 0xba98d7a, 0x1398437, 0xba98d80, 0x3400010},
7318{0x3400000, 0xba98d7a, 0xba98d27, 0xc298d51, 0x3400010},
7319{0x3400000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3400000},
7320{0x3400000, 0xba98d7a, 0x751f853a, 0x751f853b, 0x3400010},
7321{0x3400000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
7322{0x3400000, 0xba98d7a, 0x7f7fffff, 0x7f800000, 0x3400014},
7323{0x3400000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3400000},
7324{0x3400000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3400001},
7325{0x3400000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3400001},
7326{0x3400000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3400001},
7327{0x3400000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3400000},
7328{0x3400000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3400000},
7329{0x3400000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3400000},
7330{0x3400000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3400000},
7331{0x3400000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3400080},
7332{0x3400000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3400080},
7333{0x3400000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3400080},
7334{0x3400000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3400080},
7335{0x3400000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3400080},
7336{0x3400000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3400000},
7337{0x3400000, 0xba98d7a, 0x80800002, 0xba98d78, 0x3400010},
7338{0x3400000, 0xba98d7a, 0x81398437, 0xba98d75, 0x3400010},
7339{0x3400000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3400000},
7340{0x3400000, 0xba98d7a, 0x8ba98d7a, 0x0, 0x3400000},
7341{0x3400000, 0xba98d7a, 0xf51f853a, 0xf51f8539, 0x3400010},
7342{0x3400000, 0xba98d7a, 0xff7ffff0, 0xff7fffef, 0x3400010},
7343{0x3400000, 0xba98d7a, 0xff7fffff, 0xff7ffffe, 0x3400010},
7344{0x3400000, 0xba98d7a, 0xff800000, 0xff800000, 0x3400000},
7345{0x3400000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3400001},
7346{0x3400000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3400001},
7347{0x3400000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3400001},
7348{0x3400000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3400000},
7349{0x3400000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3400000},
7350{0x3400000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3400000},
7351{0x3400000, 0xba98d7a, 0x4f3495cb, 0x4f3495cc, 0x3400010},
7352{0x3400000, 0xba98d7a, 0xe73a5134, 0xe73a5133, 0x3400010},
7353{0x3400000, 0xba98d7a, 0x7c994e9e, 0x7c994e9f, 0x3400010},
7354{0x3400000, 0xba98d7a, 0x6164bd6c, 0x6164bd6d, 0x3400010},
7355{0x3400000, 0xba98d7a, 0x9503366, 0xbb00f16, 0x3400010},
7356{0x3400000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
7357{0x3400000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
7358{0x3400000, 0xba98d7a, 0x77f31e2f, 0x77f31e30, 0x3400010},
7359{0x3400000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
7360{0x3400000, 0xba98d7a, 0x966320b, 0xbb0bf0b, 0x3400010},
7361{0x3400000, 0xba98d7a, 0xb26bddee, 0xb26bdded, 0x3400010},
7362{0x3400000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
7363{0x3400000, 0xba98d7a, 0x317285d3, 0x317285d4, 0x3400010},
7364{0x3400000, 0xba98d7a, 0x3c9623b1, 0x3c9623b2, 0x3400010},
7365{0x3400000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
7366{0x3400000, 0xba98d7a, 0x7b906a6c, 0x7b906a6d, 0x3400010},
7367{0x3400000, 0x751f853a, 0x0, 0x751f853a, 0x3400000},
7368{0x3400000, 0x751f853a, 0x1, 0x751f853a, 0x3400080},
7369{0x3400000, 0x751f853a, 0x76, 0x751f853a, 0x3400080},
7370{0x3400000, 0x751f853a, 0x2b94, 0x751f853a, 0x3400080},
7371{0x3400000, 0x751f853a, 0x636d24, 0x751f853a, 0x3400080},
7372{0x3400000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3400080},
7373{0x3400000, 0x751f853a, 0x800000, 0x751f853b, 0x3400010},
7374{0x3400000, 0x751f853a, 0x800002, 0x751f853b, 0x3400010},
7375{0x3400000, 0x751f853a, 0x1398437, 0x751f853b, 0x3400010},
7376{0x3400000, 0x751f853a, 0xba98d27, 0x751f853b, 0x3400010},
7377{0x3400000, 0x751f853a, 0xba98d7a, 0x751f853b, 0x3400010},
7378{0x3400000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3400000},
7379{0x3400000, 0x751f853a, 0x7f7ffff0, 0x7f7ffffa, 0x3400010},
7380{0x3400000, 0x751f853a, 0x7f7fffff, 0x7f800000, 0x3400014},
7381{0x3400000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3400000},
7382{0x3400000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3400001},
7383{0x3400000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3400001},
7384{0x3400000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3400001},
7385{0x3400000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3400000},
7386{0x3400000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3400000},
7387{0x3400000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3400000},
7388{0x3400000, 0x751f853a, 0x80000000, 0x751f853a, 0x3400000},
7389{0x3400000, 0x751f853a, 0x80000001, 0x751f853a, 0x3400080},
7390{0x3400000, 0x751f853a, 0x80000076, 0x751f853a, 0x3400080},
7391{0x3400000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3400080},
7392{0x3400000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3400080},
7393{0x3400000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3400080},
7394{0x3400000, 0x751f853a, 0x80800000, 0x751f853a, 0x3400010},
7395{0x3400000, 0x751f853a, 0x80800002, 0x751f853a, 0x3400010},
7396{0x3400000, 0x751f853a, 0x81398437, 0x751f853a, 0x3400010},
7397{0x3400000, 0x751f853a, 0x8ba98d27, 0x751f853a, 0x3400010},
7398{0x3400000, 0x751f853a, 0x8ba98d7a, 0x751f853a, 0x3400010},
7399{0x3400000, 0x751f853a, 0xf51f853a, 0x0, 0x3400000},
7400{0x3400000, 0x751f853a, 0xff7ffff0, 0xff7fffe6, 0x3400010},
7401{0x3400000, 0x751f853a, 0xff7fffff, 0xff7ffff5, 0x3400010},
7402{0x3400000, 0x751f853a, 0xff800000, 0xff800000, 0x3400000},
7403{0x3400000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3400001},
7404{0x3400000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3400001},
7405{0x3400000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3400001},
7406{0x3400000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3400000},
7407{0x3400000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3400000},
7408{0x3400000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3400000},
7409{0x3400000, 0x751f853a, 0x4f3495cb, 0x751f853b, 0x3400010},
7410{0x3400000, 0x751f853a, 0xe73a5134, 0x751f853a, 0x3400010},
7411{0x3400000, 0x751f853a, 0x7c994e9e, 0x7c994fde, 0x3400010},
7412{0x3400000, 0x751f853a, 0x6164bd6c, 0x751f853b, 0x3400010},
7413{0x3400000, 0x751f853a, 0x9503366, 0x751f853b, 0x3400010},
7414{0x3400000, 0x751f853a, 0xbf5a97c9, 0x751f853a, 0x3400010},
7415{0x3400000, 0x751f853a, 0xe6ff1a14, 0x751f853a, 0x3400010},
7416{0x3400000, 0x751f853a, 0x77f31e2f, 0x77f81a59, 0x3400010},
7417{0x3400000, 0x751f853a, 0xaab4d7d8, 0x751f853a, 0x3400010},
7418{0x3400000, 0x751f853a, 0x966320b, 0x751f853b, 0x3400010},
7419{0x3400000, 0x751f853a, 0xb26bddee, 0x751f853a, 0x3400010},
7420{0x3400000, 0x751f853a, 0xb5c8e5d3, 0x751f853a, 0x3400010},
7421{0x3400000, 0x751f853a, 0x317285d3, 0x751f853b, 0x3400010},
7422{0x3400000, 0x751f853a, 0x3c9623b1, 0x751f853b, 0x3400010},
7423{0x3400000, 0x751f853a, 0x51fd2c7c, 0x751f853b, 0x3400010},
7424{0x3400000, 0x751f853a, 0x7b906a6c, 0x7b906f69, 0x3400010},
7425{0x3400000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3400000},
7426{0x3400000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3400080},
7427{0x3400000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3400080},
7428{0x3400000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3400080},
7429{0x3400000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3400080},
7430{0x3400000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3400080},
7431{0x3400000, 0x7f7ffff0, 0x800000, 0x7f7ffff1, 0x3400010},
7432{0x3400000, 0x7f7ffff0, 0x800002, 0x7f7ffff1, 0x3400010},
7433{0x3400000, 0x7f7ffff0, 0x1398437, 0x7f7ffff1, 0x3400010},
7434{0x3400000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff1, 0x3400010},
7435{0x3400000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff1, 0x3400010},
7436{0x3400000, 0x7f7ffff0, 0x751f853a, 0x7f7ffffa, 0x3400010},
7437{0x3400000, 0x7f7ffff0, 0x7f7ffff0, 0x7f800000, 0x3400014},
7438{0x3400000, 0x7f7ffff0, 0x7f7fffff, 0x7f800000, 0x3400014},
7439{0x3400000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3400000},
7440{0x3400000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3400001},
7441{0x3400000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3400001},
7442{0x3400000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3400001},
7443{0x3400000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3400000},
7444{0x3400000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3400000},
7445{0x3400000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3400000},
7446{0x3400000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3400000},
7447{0x3400000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3400080},
7448{0x3400000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3400080},
7449{0x3400000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3400080},
7450{0x3400000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3400080},
7451{0x3400000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3400080},
7452{0x3400000, 0x7f7ffff0, 0x80800000, 0x7f7ffff0, 0x3400010},
7453{0x3400000, 0x7f7ffff0, 0x80800002, 0x7f7ffff0, 0x3400010},
7454{0x3400000, 0x7f7ffff0, 0x81398437, 0x7f7ffff0, 0x3400010},
7455{0x3400000, 0x7f7ffff0, 0x8ba98d27, 0x7f7ffff0, 0x3400010},
7456{0x3400000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7ffff0, 0x3400010},
7457{0x3400000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe7, 0x3400010},
7458{0x3400000, 0x7f7ffff0, 0xff7ffff0, 0x0, 0x3400000},
7459{0x3400000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3400000},
7460{0x3400000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3400000},
7461{0x3400000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3400001},
7462{0x3400000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3400001},
7463{0x3400000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3400001},
7464{0x3400000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3400000},
7465{0x3400000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3400000},
7466{0x3400000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3400000},
7467{0x3400000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff1, 0x3400010},
7468{0x3400000, 0x7f7ffff0, 0xe73a5134, 0x7f7ffff0, 0x3400010},
7469{0x3400000, 0x7f7ffff0, 0x7c994e9e, 0x7f800000, 0x3400014},
7470{0x3400000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff1, 0x3400010},
7471{0x3400000, 0x7f7ffff0, 0x9503366, 0x7f7ffff1, 0x3400010},
7472{0x3400000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7ffff0, 0x3400010},
7473{0x3400000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7ffff0, 0x3400010},
7474{0x3400000, 0x7f7ffff0, 0x77f31e2f, 0x7f800000, 0x3400014},
7475{0x3400000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7ffff0, 0x3400010},
7476{0x3400000, 0x7f7ffff0, 0x966320b, 0x7f7ffff1, 0x3400010},
7477{0x3400000, 0x7f7ffff0, 0xb26bddee, 0x7f7ffff0, 0x3400010},
7478{0x3400000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7ffff0, 0x3400010},
7479{0x3400000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff1, 0x3400010},
7480{0x3400000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff1, 0x3400010},
7481{0x3400000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff1, 0x3400010},
7482{0x3400000, 0x7f7ffff0, 0x7b906a6c, 0x7f800000, 0x3400014},
7483{0x3400000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3400000},
7484{0x3400000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3400080},
7485{0x3400000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3400080},
7486{0x3400000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3400080},
7487{0x3400000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3400080},
7488{0x3400000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3400080},
7489{0x3400000, 0x7f7fffff, 0x800000, 0x7f800000, 0x3400014},
7490{0x3400000, 0x7f7fffff, 0x800002, 0x7f800000, 0x3400014},
7491{0x3400000, 0x7f7fffff, 0x1398437, 0x7f800000, 0x3400014},
7492{0x3400000, 0x7f7fffff, 0xba98d27, 0x7f800000, 0x3400014},
7493{0x3400000, 0x7f7fffff, 0xba98d7a, 0x7f800000, 0x3400014},
7494{0x3400000, 0x7f7fffff, 0x751f853a, 0x7f800000, 0x3400014},
7495{0x3400000, 0x7f7fffff, 0x7f7ffff0, 0x7f800000, 0x3400014},
7496{0x3400000, 0x7f7fffff, 0x7f7fffff, 0x7f800000, 0x3400014},
7497{0x3400000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3400000},
7498{0x3400000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3400001},
7499{0x3400000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3400001},
7500{0x3400000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
7501{0x3400000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3400000},
7502{0x3400000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3400000},
7503{0x3400000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3400000},
7504{0x3400000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3400000},
7505{0x3400000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3400080},
7506{0x3400000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3400080},
7507{0x3400000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3400080},
7508{0x3400000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3400080},
7509{0x3400000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3400080},
7510{0x3400000, 0x7f7fffff, 0x80800000, 0x7f7fffff, 0x3400010},
7511{0x3400000, 0x7f7fffff, 0x80800002, 0x7f7fffff, 0x3400010},
7512{0x3400000, 0x7f7fffff, 0x81398437, 0x7f7fffff, 0x3400010},
7513{0x3400000, 0x7f7fffff, 0x8ba98d27, 0x7f7fffff, 0x3400010},
7514{0x3400000, 0x7f7fffff, 0x8ba98d7a, 0x7f7fffff, 0x3400010},
7515{0x3400000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff6, 0x3400010},
7516{0x3400000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3400000},
7517{0x3400000, 0x7f7fffff, 0xff7fffff, 0x0, 0x3400000},
7518{0x3400000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3400000},
7519{0x3400000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3400001},
7520{0x3400000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3400001},
7521{0x3400000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3400001},
7522{0x3400000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3400000},
7523{0x3400000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3400000},
7524{0x3400000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3400000},
7525{0x3400000, 0x7f7fffff, 0x4f3495cb, 0x7f800000, 0x3400014},
7526{0x3400000, 0x7f7fffff, 0xe73a5134, 0x7f7fffff, 0x3400010},
7527{0x3400000, 0x7f7fffff, 0x7c994e9e, 0x7f800000, 0x3400014},
7528{0x3400000, 0x7f7fffff, 0x6164bd6c, 0x7f800000, 0x3400014},
7529{0x3400000, 0x7f7fffff, 0x9503366, 0x7f800000, 0x3400014},
7530{0x3400000, 0x7f7fffff, 0xbf5a97c9, 0x7f7fffff, 0x3400010},
7531{0x3400000, 0x7f7fffff, 0xe6ff1a14, 0x7f7fffff, 0x3400010},
7532{0x3400000, 0x7f7fffff, 0x77f31e2f, 0x7f800000, 0x3400014},
7533{0x3400000, 0x7f7fffff, 0xaab4d7d8, 0x7f7fffff, 0x3400010},
7534{0x3400000, 0x7f7fffff, 0x966320b, 0x7f800000, 0x3400014},
7535{0x3400000, 0x7f7fffff, 0xb26bddee, 0x7f7fffff, 0x3400010},
7536{0x3400000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7fffff, 0x3400010},
7537{0x3400000, 0x7f7fffff, 0x317285d3, 0x7f800000, 0x3400014},
7538{0x3400000, 0x7f7fffff, 0x3c9623b1, 0x7f800000, 0x3400014},
7539{0x3400000, 0x7f7fffff, 0x51fd2c7c, 0x7f800000, 0x3400014},
7540{0x3400000, 0x7f7fffff, 0x7b906a6c, 0x7f800000, 0x3400014},
7541{0x3400000, 0x7f800000, 0x0, 0x7f800000, 0x3400000},
7542{0x3400000, 0x7f800000, 0x1, 0x7f800000, 0x3400080},
7543{0x3400000, 0x7f800000, 0x76, 0x7f800000, 0x3400080},
7544{0x3400000, 0x7f800000, 0x2b94, 0x7f800000, 0x3400080},
7545{0x3400000, 0x7f800000, 0x636d24, 0x7f800000, 0x3400080},
7546{0x3400000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3400080},
7547{0x3400000, 0x7f800000, 0x800000, 0x7f800000, 0x3400000},
7548{0x3400000, 0x7f800000, 0x800002, 0x7f800000, 0x3400000},
7549{0x3400000, 0x7f800000, 0x1398437, 0x7f800000, 0x3400000},
7550{0x3400000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3400000},
7551{0x3400000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3400000},
7552{0x3400000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3400000},
7553{0x3400000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3400000},
7554{0x3400000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3400000},
7555{0x3400000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3400000},
7556{0x3400000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3400001},
7557{0x3400000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3400001},
7558{0x3400000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3400001},
7559{0x3400000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3400000},
7560{0x3400000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
7561{0x3400000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3400000},
7562{0x3400000, 0x7f800000, 0x80000000, 0x7f800000, 0x3400000},
7563{0x3400000, 0x7f800000, 0x80000001, 0x7f800000, 0x3400080},
7564{0x3400000, 0x7f800000, 0x80000076, 0x7f800000, 0x3400080},
7565{0x3400000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3400080},
7566{0x3400000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3400080},
7567{0x3400000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3400080},
7568{0x3400000, 0x7f800000, 0x80800000, 0x7f800000, 0x3400000},
7569{0x3400000, 0x7f800000, 0x80800002, 0x7f800000, 0x3400000},
7570{0x3400000, 0x7f800000, 0x81398437, 0x7f800000, 0x3400000},
7571{0x3400000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3400000},
7572{0x3400000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3400000},
7573{0x3400000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3400000},
7574{0x3400000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3400000},
7575{0x3400000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3400000},
7576{0x3400000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3400001},
7577{0x3400000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3400001},
7578{0x3400000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3400001},
7579{0x3400000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3400001},
7580{0x3400000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3400000},
7581{0x3400000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3400000},
7582{0x3400000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3400000},
7583{0x3400000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3400000},
7584{0x3400000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3400000},
7585{0x3400000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3400000},
7586{0x3400000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3400000},
7587{0x3400000, 0x7f800000, 0x9503366, 0x7f800000, 0x3400000},
7588{0x3400000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3400000},
7589{0x3400000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3400000},
7590{0x3400000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3400000},
7591{0x3400000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3400000},
7592{0x3400000, 0x7f800000, 0x966320b, 0x7f800000, 0x3400000},
7593{0x3400000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3400000},
7594{0x3400000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3400000},
7595{0x3400000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3400000},
7596{0x3400000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3400000},
7597{0x3400000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3400000},
7598{0x3400000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3400000},
7599{0x3400000, 0x7f800001, 0x0, 0x7fc00000, 0x3400001},
7600{0x3400000, 0x7f800001, 0x1, 0x7fc00000, 0x3400081},
7601{0x3400000, 0x7f800001, 0x76, 0x7fc00000, 0x3400081},
7602{0x3400000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3400081},
7603{0x3400000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3400081},
7604{0x3400000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3400081},
7605{0x3400000, 0x7f800001, 0x800000, 0x7fc00000, 0x3400001},
7606{0x3400000, 0x7f800001, 0x800002, 0x7fc00000, 0x3400001},
7607{0x3400000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3400001},
7608{0x3400000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3400001},
7609{0x3400000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3400001},
7610{0x3400000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3400001},
7611{0x3400000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3400001},
7612{0x3400000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3400001},
7613{0x3400000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3400001},
7614{0x3400000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3400001},
7615{0x3400000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3400001},
7616{0x3400000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3400001},
7617{0x3400000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3400001},
7618{0x3400000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3400001},
7619{0x3400000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3400001},
7620{0x3400000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3400001},
7621{0x3400000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3400081},
7622{0x3400000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3400081},
7623{0x3400000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3400081},
7624{0x3400000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3400081},
7625{0x3400000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3400081},
7626{0x3400000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3400001},
7627{0x3400000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3400001},
7628{0x3400000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3400001},
7629{0x3400000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3400001},
7630{0x3400000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3400001},
7631{0x3400000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3400001},
7632{0x3400000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3400001},
7633{0x3400000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3400001},
7634{0x3400000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3400001},
7635{0x3400000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3400001},
7636{0x3400000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3400001},
7637{0x3400000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3400001},
7638{0x3400000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3400001},
7639{0x3400000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3400001},
7640{0x3400000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3400001},
7641{0x3400000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3400001},
7642{0x3400000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3400001},
7643{0x3400000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3400001},
7644{0x3400000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3400001},
7645{0x3400000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3400001},
7646{0x3400000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3400001},
7647{0x3400000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3400001},
7648{0x3400000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3400001},
7649{0x3400000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3400001},
7650{0x3400000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3400001},
7651{0x3400000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3400001},
7652{0x3400000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
7653{0x3400000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3400001},
7654{0x3400000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3400001},
7655{0x3400000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3400001},
7656{0x3400000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3400001},
7657{0x3400000, 0x7f984a37, 0x0, 0x7fc00000, 0x3400001},
7658{0x3400000, 0x7f984a37, 0x1, 0x7fc00000, 0x3400081},
7659{0x3400000, 0x7f984a37, 0x76, 0x7fc00000, 0x3400081},
7660{0x3400000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3400081},
7661{0x3400000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3400081},
7662{0x3400000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3400081},
7663{0x3400000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3400001},
7664{0x3400000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3400001},
7665{0x3400000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3400001},
7666{0x3400000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3400001},
7667{0x3400000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3400001},
7668{0x3400000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3400001},
7669{0x3400000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3400001},
7670{0x3400000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3400001},
7671{0x3400000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3400001},
7672{0x3400000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3400001},
7673{0x3400000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3400001},
7674{0x3400000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3400001},
7675{0x3400000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3400001},
7676{0x3400000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3400001},
7677{0x3400000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3400001},
7678{0x3400000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3400001},
7679{0x3400000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3400081},
7680{0x3400000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3400081},
7681{0x3400000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3400081},
7682{0x3400000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3400081},
7683{0x3400000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3400081},
7684{0x3400000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3400001},
7685{0x3400000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3400001},
7686{0x3400000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3400001},
7687{0x3400000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3400001},
7688{0x3400000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3400001},
7689{0x3400000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3400001},
7690{0x3400000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3400001},
7691{0x3400000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3400001},
7692{0x3400000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3400001},
7693{0x3400000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3400001},
7694{0x3400000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3400001},
7695{0x3400000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3400001},
7696{0x3400000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3400001},
7697{0x3400000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3400001},
7698{0x3400000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3400001},
7699{0x3400000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3400001},
7700{0x3400000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3400001},
7701{0x3400000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3400001},
7702{0x3400000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3400001},
7703{0x3400000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3400001},
7704{0x3400000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3400001},
7705{0x3400000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3400001},
7706{0x3400000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3400001},
7707{0x3400000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3400001},
7708{0x3400000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3400001},
7709{0x3400000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3400001},
7710{0x3400000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
7711{0x3400000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3400001},
7712{0x3400000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3400001},
7713{0x3400000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3400001},
7714{0x3400000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3400001},
7715{0x3400000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3400001},
7716{0x3400000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3400081},
7717{0x3400000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3400081},
7718{0x3400000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3400081},
7719{0x3400000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3400081},
7720{0x3400000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3400081},
7721{0x3400000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3400001},
7722{0x3400000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3400001},
7723{0x3400000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3400001},
7724{0x3400000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3400001},
7725{0x3400000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3400001},
7726{0x3400000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3400001},
7727{0x3400000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3400001},
7728{0x3400000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3400001},
7729{0x3400000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3400001},
7730{0x3400000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3400001},
7731{0x3400000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3400001},
7732{0x3400000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
7733{0x3400000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3400001},
7734{0x3400000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3400001},
7735{0x3400000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3400001},
7736{0x3400000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3400001},
7737{0x3400000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3400081},
7738{0x3400000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3400081},
7739{0x3400000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3400081},
7740{0x3400000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3400081},
7741{0x3400000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3400081},
7742{0x3400000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3400001},
7743{0x3400000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3400001},
7744{0x3400000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3400001},
7745{0x3400000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3400001},
7746{0x3400000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3400001},
7747{0x3400000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3400001},
7748{0x3400000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3400001},
7749{0x3400000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3400001},
7750{0x3400000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3400001},
7751{0x3400000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3400001},
7752{0x3400000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3400001},
7753{0x3400000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3400001},
7754{0x3400000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3400001},
7755{0x3400000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3400001},
7756{0x3400000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3400001},
7757{0x3400000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3400001},
7758{0x3400000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3400001},
7759{0x3400000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3400001},
7760{0x3400000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3400001},
7761{0x3400000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3400001},
7762{0x3400000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3400001},
7763{0x3400000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3400001},
7764{0x3400000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3400001},
7765{0x3400000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3400001},
7766{0x3400000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3400001},
7767{0x3400000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3400001},
7768{0x3400000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
7769{0x3400000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3400001},
7770{0x3400000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3400001},
7771{0x3400000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3400001},
7772{0x3400000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3400001},
7773{0x3400000, 0x7fc00000, 0x0, 0x7fc00000, 0x3400000},
7774{0x3400000, 0x7fc00000, 0x1, 0x7fc00000, 0x3400080},
7775{0x3400000, 0x7fc00000, 0x76, 0x7fc00000, 0x3400080},
7776{0x3400000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3400080},
7777{0x3400000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3400080},
7778{0x3400000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3400080},
7779{0x3400000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3400000},
7780{0x3400000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3400000},
7781{0x3400000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3400000},
7782{0x3400000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3400000},
7783{0x3400000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3400000},
7784{0x3400000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3400000},
7785{0x3400000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3400000},
7786{0x3400000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3400000},
7787{0x3400000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3400000},
7788{0x3400000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3400001},
7789{0x3400000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3400001},
7790{0x3400000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3400001},
7791{0x3400000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3400000},
7792{0x3400000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
7793{0x3400000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3400000},
7794{0x3400000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3400000},
7795{0x3400000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3400080},
7796{0x3400000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3400080},
7797{0x3400000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3400080},
7798{0x3400000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3400080},
7799{0x3400000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3400080},
7800{0x3400000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3400000},
7801{0x3400000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3400000},
7802{0x3400000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3400000},
7803{0x3400000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3400000},
7804{0x3400000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3400000},
7805{0x3400000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3400000},
7806{0x3400000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3400000},
7807{0x3400000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3400000},
7808{0x3400000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3400000},
7809{0x3400000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3400001},
7810{0x3400000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3400001},
7811{0x3400000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3400001},
7812{0x3400000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3400000},
7813{0x3400000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3400000},
7814{0x3400000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3400000},
7815{0x3400000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3400000},
7816{0x3400000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3400000},
7817{0x3400000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3400000},
7818{0x3400000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3400000},
7819{0x3400000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3400000},
7820{0x3400000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3400000},
7821{0x3400000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3400000},
7822{0x3400000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3400000},
7823{0x3400000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3400000},
7824{0x3400000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3400000},
7825{0x3400000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3400000},
7826{0x3400000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
7827{0x3400000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3400000},
7828{0x3400000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3400000},
7829{0x3400000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3400000},
7830{0x3400000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3400000},
7831{0x3400000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3400000},
7832{0x3400000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3400080},
7833{0x3400000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3400080},
7834{0x3400000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3400080},
7835{0x3400000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3400080},
7836{0x3400000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3400080},
7837{0x3400000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3400000},
7838{0x3400000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3400000},
7839{0x3400000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3400000},
7840{0x3400000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3400000},
7841{0x3400000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3400000},
7842{0x3400000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3400000},
7843{0x3400000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3400000},
7844{0x3400000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3400000},
7845{0x3400000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3400000},
7846{0x3400000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3400001},
7847{0x3400000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3400001},
7848{0x3400000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3400001},
7849{0x3400000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3400000},
7850{0x3400000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3400000},
7851{0x3400000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3400000},
7852{0x3400000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3400000},
7853{0x3400000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3400080},
7854{0x3400000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3400080},
7855{0x3400000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3400080},
7856{0x3400000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3400080},
7857{0x3400000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3400080},
7858{0x3400000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3400000},
7859{0x3400000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3400000},
7860{0x3400000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3400000},
7861{0x3400000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3400000},
7862{0x3400000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3400000},
7863{0x3400000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3400000},
7864{0x3400000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3400000},
7865{0x3400000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3400000},
7866{0x3400000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3400000},
7867{0x3400000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3400001},
7868{0x3400000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3400001},
7869{0x3400000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3400001},
7870{0x3400000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3400000},
7871{0x3400000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3400000},
7872{0x3400000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3400000},
7873{0x3400000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3400000},
7874{0x3400000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3400000},
7875{0x3400000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3400000},
7876{0x3400000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3400000},
7877{0x3400000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3400000},
7878{0x3400000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3400000},
7879{0x3400000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3400000},
7880{0x3400000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3400000},
7881{0x3400000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3400000},
7882{0x3400000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3400000},
7883{0x3400000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3400000},
7884{0x3400000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
7885{0x3400000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3400000},
7886{0x3400000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3400000},
7887{0x3400000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3400000},
7888{0x3400000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3400000},
7889{0x3400000, 0x7fffffff, 0x0, 0x7fc00000, 0x3400000},
7890{0x3400000, 0x7fffffff, 0x1, 0x7fc00000, 0x3400080},
7891{0x3400000, 0x7fffffff, 0x76, 0x7fc00000, 0x3400080},
7892{0x3400000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3400080},
7893{0x3400000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3400080},
7894{0x3400000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3400080},
7895{0x3400000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3400000},
7896{0x3400000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3400000},
7897{0x3400000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3400000},
7898{0x3400000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3400000},
7899{0x3400000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3400000},
7900{0x3400000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3400000},
7901{0x3400000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3400000},
7902{0x3400000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3400000},
7903{0x3400000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3400000},
7904{0x3400000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3400001},
7905{0x3400000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3400001},
7906{0x3400000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
7907{0x3400000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3400000},
7908{0x3400000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3400000},
7909{0x3400000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3400000},
7910{0x3400000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3400000},
7911{0x3400000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3400080},
7912{0x3400000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3400080},
7913{0x3400000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3400080},
7914{0x3400000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3400080},
7915{0x3400000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3400080},
7916{0x3400000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3400000},
7917{0x3400000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3400000},
7918{0x3400000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3400000},
7919{0x3400000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3400000},
7920{0x3400000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3400000},
7921{0x3400000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3400000},
7922{0x3400000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3400000},
7923{0x3400000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3400000},
7924{0x3400000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3400000},
7925{0x3400000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3400001},
7926{0x3400000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3400001},
7927{0x3400000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3400001},
7928{0x3400000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3400000},
7929{0x3400000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3400000},
7930{0x3400000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3400000},
7931{0x3400000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3400000},
7932{0x3400000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3400000},
7933{0x3400000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3400000},
7934{0x3400000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3400000},
7935{0x3400000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3400000},
7936{0x3400000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3400000},
7937{0x3400000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3400000},
7938{0x3400000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3400000},
7939{0x3400000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3400000},
7940{0x3400000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3400000},
7941{0x3400000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3400000},
7942{0x3400000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
7943{0x3400000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3400000},
7944{0x3400000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3400000},
7945{0x3400000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3400000},
7946{0x3400000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3400000},
7947{0x3400000, 0x80000000, 0x0, 0x0, 0x3400000},
7948{0x3400000, 0x80000000, 0x1, 0x0, 0x3400080},
7949{0x3400000, 0x80000000, 0x76, 0x0, 0x3400080},
7950{0x3400000, 0x80000000, 0x2b94, 0x0, 0x3400080},
7951{0x3400000, 0x80000000, 0x636d24, 0x0, 0x3400080},
7952{0x3400000, 0x80000000, 0x7fffff, 0x0, 0x3400080},
7953{0x3400000, 0x80000000, 0x800000, 0x800000, 0x3400000},
7954{0x3400000, 0x80000000, 0x800002, 0x800002, 0x3400000},
7955{0x3400000, 0x80000000, 0x1398437, 0x1398437, 0x3400000},
7956{0x3400000, 0x80000000, 0xba98d27, 0xba98d27, 0x3400000},
7957{0x3400000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3400000},
7958{0x3400000, 0x80000000, 0x751f853a, 0x751f853a, 0x3400000},
7959{0x3400000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3400000},
7960{0x3400000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3400000},
7961{0x3400000, 0x80000000, 0x7f800000, 0x7f800000, 0x3400000},
7962{0x3400000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3400001},
7963{0x3400000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3400001},
7964{0x3400000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3400001},
7965{0x3400000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3400000},
7966{0x3400000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
7967{0x3400000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3400000},
7968{0x3400000, 0x80000000, 0x80000000, 0x80000000, 0x3400000},
7969{0x3400000, 0x80000000, 0x80000001, 0x0, 0x3400080},
7970{0x3400000, 0x80000000, 0x80000076, 0x0, 0x3400080},
7971{0x3400000, 0x80000000, 0x80002b94, 0x0, 0x3400080},
7972{0x3400000, 0x80000000, 0x80636d24, 0x0, 0x3400080},
7973{0x3400000, 0x80000000, 0x807fffff, 0x0, 0x3400080},
7974{0x3400000, 0x80000000, 0x80800000, 0x80800000, 0x3400000},
7975{0x3400000, 0x80000000, 0x80800002, 0x80800002, 0x3400000},
7976{0x3400000, 0x80000000, 0x81398437, 0x81398437, 0x3400000},
7977{0x3400000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3400000},
7978{0x3400000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3400000},
7979{0x3400000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3400000},
7980{0x3400000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3400000},
7981{0x3400000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3400000},
7982{0x3400000, 0x80000000, 0xff800000, 0xff800000, 0x3400000},
7983{0x3400000, 0x80000000, 0xff800001, 0x7fc00000, 0x3400001},
7984{0x3400000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3400001},
7985{0x3400000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3400001},
7986{0x3400000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3400000},
7987{0x3400000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3400000},
7988{0x3400000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3400000},
7989{0x3400000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3400000},
7990{0x3400000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3400000},
7991{0x3400000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3400000},
7992{0x3400000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3400000},
7993{0x3400000, 0x80000000, 0x9503366, 0x9503366, 0x3400000},
7994{0x3400000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3400000},
7995{0x3400000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3400000},
7996{0x3400000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3400000},
7997{0x3400000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3400000},
7998{0x3400000, 0x80000000, 0x966320b, 0x966320b, 0x3400000},
7999{0x3400000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3400000},
8000{0x3400000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400000},
8001{0x3400000, 0x80000000, 0x317285d3, 0x317285d3, 0x3400000},
8002{0x3400000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3400000},
8003{0x3400000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3400000},
8004{0x3400000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3400000},
8005{0x3400000, 0x80000001, 0x0, 0x0, 0x3400080},
8006{0x3400000, 0x80000001, 0x1, 0x0, 0x3400080},
8007{0x3400000, 0x80000001, 0x76, 0x0, 0x3400080},
8008{0x3400000, 0x80000001, 0x2b94, 0x0, 0x3400080},
8009{0x3400000, 0x80000001, 0x636d24, 0x0, 0x3400080},
8010{0x3400000, 0x80000001, 0x7fffff, 0x0, 0x3400080},
8011{0x3400000, 0x80000001, 0x800000, 0x800000, 0x3400080},
8012{0x3400000, 0x80000001, 0x800002, 0x800002, 0x3400080},
8013{0x3400000, 0x80000001, 0x1398437, 0x1398437, 0x3400080},
8014{0x3400000, 0x80000001, 0xba98d27, 0xba98d27, 0x3400080},
8015{0x3400000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3400080},
8016{0x3400000, 0x80000001, 0x751f853a, 0x751f853a, 0x3400080},
8017{0x3400000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
8018{0x3400000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3400080},
8019{0x3400000, 0x80000001, 0x7f800000, 0x7f800000, 0x3400080},
8020{0x3400000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3400081},
8021{0x3400000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3400081},
8022{0x3400000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3400081},
8023{0x3400000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3400080},
8024{0x3400000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3400080},
8025{0x3400000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3400080},
8026{0x3400000, 0x80000001, 0x80000000, 0x0, 0x3400080},
8027{0x3400000, 0x80000001, 0x80000001, 0x0, 0x3400080},
8028{0x3400000, 0x80000001, 0x80000076, 0x0, 0x3400080},
8029{0x3400000, 0x80000001, 0x80002b94, 0x0, 0x3400080},
8030{0x3400000, 0x80000001, 0x80636d24, 0x0, 0x3400080},
8031{0x3400000, 0x80000001, 0x807fffff, 0x0, 0x3400080},
8032{0x3400000, 0x80000001, 0x80800000, 0x80800000, 0x3400080},
8033{0x3400000, 0x80000001, 0x80800002, 0x80800002, 0x3400080},
8034{0x3400000, 0x80000001, 0x81398437, 0x81398437, 0x3400080},
8035{0x3400000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3400080},
8036{0x3400000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
8037{0x3400000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3400080},
8038{0x3400000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3400080},
8039{0x3400000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3400080},
8040{0x3400000, 0x80000001, 0xff800000, 0xff800000, 0x3400080},
8041{0x3400000, 0x80000001, 0xff800001, 0x7fc00000, 0x3400081},
8042{0x3400000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3400081},
8043{0x3400000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3400081},
8044{0x3400000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3400080},
8045{0x3400000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3400080},
8046{0x3400000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3400080},
8047{0x3400000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3400080},
8048{0x3400000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3400080},
8049{0x3400000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3400080},
8050{0x3400000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3400080},
8051{0x3400000, 0x80000001, 0x9503366, 0x9503366, 0x3400080},
8052{0x3400000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
8053{0x3400000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
8054{0x3400000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3400080},
8055{0x3400000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
8056{0x3400000, 0x80000001, 0x966320b, 0x966320b, 0x3400080},
8057{0x3400000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3400080},
8058{0x3400000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
8059{0x3400000, 0x80000001, 0x317285d3, 0x317285d3, 0x3400080},
8060{0x3400000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3400080},
8061{0x3400000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
8062{0x3400000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3400080},
8063{0x3400000, 0x80000076, 0x0, 0x0, 0x3400080},
8064{0x3400000, 0x80000076, 0x1, 0x0, 0x3400080},
8065{0x3400000, 0x80000076, 0x76, 0x0, 0x3400080},
8066{0x3400000, 0x80000076, 0x2b94, 0x0, 0x3400080},
8067{0x3400000, 0x80000076, 0x636d24, 0x0, 0x3400080},
8068{0x3400000, 0x80000076, 0x7fffff, 0x0, 0x3400080},
8069{0x3400000, 0x80000076, 0x800000, 0x800000, 0x3400080},
8070{0x3400000, 0x80000076, 0x800002, 0x800002, 0x3400080},
8071{0x3400000, 0x80000076, 0x1398437, 0x1398437, 0x3400080},
8072{0x3400000, 0x80000076, 0xba98d27, 0xba98d27, 0x3400080},
8073{0x3400000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3400080},
8074{0x3400000, 0x80000076, 0x751f853a, 0x751f853a, 0x3400080},
8075{0x3400000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
8076{0x3400000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3400080},
8077{0x3400000, 0x80000076, 0x7f800000, 0x7f800000, 0x3400080},
8078{0x3400000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3400081},
8079{0x3400000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3400081},
8080{0x3400000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3400081},
8081{0x3400000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3400080},
8082{0x3400000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3400080},
8083{0x3400000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3400080},
8084{0x3400000, 0x80000076, 0x80000000, 0x0, 0x3400080},
8085{0x3400000, 0x80000076, 0x80000001, 0x0, 0x3400080},
8086{0x3400000, 0x80000076, 0x80000076, 0x0, 0x3400080},
8087{0x3400000, 0x80000076, 0x80002b94, 0x0, 0x3400080},
8088{0x3400000, 0x80000076, 0x80636d24, 0x0, 0x3400080},
8089{0x3400000, 0x80000076, 0x807fffff, 0x0, 0x3400080},
8090{0x3400000, 0x80000076, 0x80800000, 0x80800000, 0x3400080},
8091{0x3400000, 0x80000076, 0x80800002, 0x80800002, 0x3400080},
8092{0x3400000, 0x80000076, 0x81398437, 0x81398437, 0x3400080},
8093{0x3400000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3400080},
8094{0x3400000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
8095{0x3400000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3400080},
8096{0x3400000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3400080},
8097{0x3400000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3400080},
8098{0x3400000, 0x80000076, 0xff800000, 0xff800000, 0x3400080},
8099{0x3400000, 0x80000076, 0xff800001, 0x7fc00000, 0x3400081},
8100{0x3400000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3400081},
8101{0x3400000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3400081},
8102{0x3400000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3400080},
8103{0x3400000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3400080},
8104{0x3400000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3400080},
8105{0x3400000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3400080},
8106{0x3400000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3400080},
8107{0x3400000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3400080},
8108{0x3400000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3400080},
8109{0x3400000, 0x80000076, 0x9503366, 0x9503366, 0x3400080},
8110{0x3400000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
8111{0x3400000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
8112{0x3400000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3400080},
8113{0x3400000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
8114{0x3400000, 0x80000076, 0x966320b, 0x966320b, 0x3400080},
8115{0x3400000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3400080},
8116{0x3400000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
8117{0x3400000, 0x80000076, 0x317285d3, 0x317285d3, 0x3400080},
8118{0x3400000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3400080},
8119{0x3400000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
8120{0x3400000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3400080},
8121{0x3400000, 0x80002b94, 0x0, 0x0, 0x3400080},
8122{0x3400000, 0x80002b94, 0x1, 0x0, 0x3400080},
8123{0x3400000, 0x80002b94, 0x76, 0x0, 0x3400080},
8124{0x3400000, 0x80002b94, 0x2b94, 0x0, 0x3400080},
8125{0x3400000, 0x80002b94, 0x636d24, 0x0, 0x3400080},
8126{0x3400000, 0x80002b94, 0x7fffff, 0x0, 0x3400080},
8127{0x3400000, 0x80002b94, 0x800000, 0x800000, 0x3400080},
8128{0x3400000, 0x80002b94, 0x800002, 0x800002, 0x3400080},
8129{0x3400000, 0x80002b94, 0x1398437, 0x1398437, 0x3400080},
8130{0x3400000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3400080},
8131{0x3400000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3400080},
8132{0x3400000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3400080},
8133{0x3400000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
8134{0x3400000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3400080},
8135{0x3400000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3400080},
8136{0x3400000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3400081},
8137{0x3400000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3400081},
8138{0x3400000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3400081},
8139{0x3400000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3400080},
8140{0x3400000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3400080},
8141{0x3400000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3400080},
8142{0x3400000, 0x80002b94, 0x80000000, 0x0, 0x3400080},
8143{0x3400000, 0x80002b94, 0x80000001, 0x0, 0x3400080},
8144{0x3400000, 0x80002b94, 0x80000076, 0x0, 0x3400080},
8145{0x3400000, 0x80002b94, 0x80002b94, 0x0, 0x3400080},
8146{0x3400000, 0x80002b94, 0x80636d24, 0x0, 0x3400080},
8147{0x3400000, 0x80002b94, 0x807fffff, 0x0, 0x3400080},
8148{0x3400000, 0x80002b94, 0x80800000, 0x80800000, 0x3400080},
8149{0x3400000, 0x80002b94, 0x80800002, 0x80800002, 0x3400080},
8150{0x3400000, 0x80002b94, 0x81398437, 0x81398437, 0x3400080},
8151{0x3400000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3400080},
8152{0x3400000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
8153{0x3400000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3400080},
8154{0x3400000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3400080},
8155{0x3400000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3400080},
8156{0x3400000, 0x80002b94, 0xff800000, 0xff800000, 0x3400080},
8157{0x3400000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3400081},
8158{0x3400000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3400081},
8159{0x3400000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3400081},
8160{0x3400000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3400080},
8161{0x3400000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3400080},
8162{0x3400000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3400080},
8163{0x3400000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3400080},
8164{0x3400000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3400080},
8165{0x3400000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3400080},
8166{0x3400000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3400080},
8167{0x3400000, 0x80002b94, 0x9503366, 0x9503366, 0x3400080},
8168{0x3400000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
8169{0x3400000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
8170{0x3400000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3400080},
8171{0x3400000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
8172{0x3400000, 0x80002b94, 0x966320b, 0x966320b, 0x3400080},
8173{0x3400000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3400080},
8174{0x3400000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
8175{0x3400000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3400080},
8176{0x3400000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3400080},
8177{0x3400000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
8178{0x3400000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3400080},
8179{0x3400000, 0x80636d24, 0x0, 0x0, 0x3400080},
8180{0x3400000, 0x80636d24, 0x1, 0x0, 0x3400080},
8181{0x3400000, 0x80636d24, 0x76, 0x0, 0x3400080},
8182{0x3400000, 0x80636d24, 0x2b94, 0x0, 0x3400080},
8183{0x3400000, 0x80636d24, 0x636d24, 0x0, 0x3400080},
8184{0x3400000, 0x80636d24, 0x7fffff, 0x0, 0x3400080},
8185{0x3400000, 0x80636d24, 0x800000, 0x800000, 0x3400080},
8186{0x3400000, 0x80636d24, 0x800002, 0x800002, 0x3400080},
8187{0x3400000, 0x80636d24, 0x1398437, 0x1398437, 0x3400080},
8188{0x3400000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3400080},
8189{0x3400000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3400080},
8190{0x3400000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3400080},
8191{0x3400000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
8192{0x3400000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3400080},
8193{0x3400000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3400080},
8194{0x3400000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3400081},
8195{0x3400000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3400081},
8196{0x3400000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3400081},
8197{0x3400000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3400080},
8198{0x3400000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3400080},
8199{0x3400000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3400080},
8200{0x3400000, 0x80636d24, 0x80000000, 0x0, 0x3400080},
8201{0x3400000, 0x80636d24, 0x80000001, 0x0, 0x3400080},
8202{0x3400000, 0x80636d24, 0x80000076, 0x0, 0x3400080},
8203{0x3400000, 0x80636d24, 0x80002b94, 0x0, 0x3400080},
8204{0x3400000, 0x80636d24, 0x80636d24, 0x0, 0x3400080},
8205{0x3400000, 0x80636d24, 0x807fffff, 0x0, 0x3400080},
8206{0x3400000, 0x80636d24, 0x80800000, 0x80800000, 0x3400080},
8207{0x3400000, 0x80636d24, 0x80800002, 0x80800002, 0x3400080},
8208{0x3400000, 0x80636d24, 0x81398437, 0x81398437, 0x3400080},
8209{0x3400000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3400080},
8210{0x3400000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
8211{0x3400000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3400080},
8212{0x3400000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3400080},
8213{0x3400000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3400080},
8214{0x3400000, 0x80636d24, 0xff800000, 0xff800000, 0x3400080},
8215{0x3400000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3400081},
8216{0x3400000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3400081},
8217{0x3400000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3400081},
8218{0x3400000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3400080},
8219{0x3400000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3400080},
8220{0x3400000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3400080},
8221{0x3400000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3400080},
8222{0x3400000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3400080},
8223{0x3400000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3400080},
8224{0x3400000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3400080},
8225{0x3400000, 0x80636d24, 0x9503366, 0x9503366, 0x3400080},
8226{0x3400000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
8227{0x3400000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
8228{0x3400000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3400080},
8229{0x3400000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
8230{0x3400000, 0x80636d24, 0x966320b, 0x966320b, 0x3400080},
8231{0x3400000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3400080},
8232{0x3400000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
8233{0x3400000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3400080},
8234{0x3400000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3400080},
8235{0x3400000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
8236{0x3400000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3400080},
8237{0x3400000, 0x807fffff, 0x0, 0x0, 0x3400080},
8238{0x3400000, 0x807fffff, 0x1, 0x0, 0x3400080},
8239{0x3400000, 0x807fffff, 0x76, 0x0, 0x3400080},
8240{0x3400000, 0x807fffff, 0x2b94, 0x0, 0x3400080},
8241{0x3400000, 0x807fffff, 0x636d24, 0x0, 0x3400080},
8242{0x3400000, 0x807fffff, 0x7fffff, 0x0, 0x3400080},
8243{0x3400000, 0x807fffff, 0x800000, 0x800000, 0x3400080},
8244{0x3400000, 0x807fffff, 0x800002, 0x800002, 0x3400080},
8245{0x3400000, 0x807fffff, 0x1398437, 0x1398437, 0x3400080},
8246{0x3400000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3400080},
8247{0x3400000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3400080},
8248{0x3400000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3400080},
8249{0x3400000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
8250{0x3400000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3400080},
8251{0x3400000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3400080},
8252{0x3400000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3400081},
8253{0x3400000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3400081},
8254{0x3400000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3400081},
8255{0x3400000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3400080},
8256{0x3400000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3400080},
8257{0x3400000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3400080},
8258{0x3400000, 0x807fffff, 0x80000000, 0x0, 0x3400080},
8259{0x3400000, 0x807fffff, 0x80000001, 0x0, 0x3400080},
8260{0x3400000, 0x807fffff, 0x80000076, 0x0, 0x3400080},
8261{0x3400000, 0x807fffff, 0x80002b94, 0x0, 0x3400080},
8262{0x3400000, 0x807fffff, 0x80636d24, 0x0, 0x3400080},
8263{0x3400000, 0x807fffff, 0x807fffff, 0x0, 0x3400080},
8264{0x3400000, 0x807fffff, 0x80800000, 0x80800000, 0x3400080},
8265{0x3400000, 0x807fffff, 0x80800002, 0x80800002, 0x3400080},
8266{0x3400000, 0x807fffff, 0x81398437, 0x81398437, 0x3400080},
8267{0x3400000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3400080},
8268{0x3400000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
8269{0x3400000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3400080},
8270{0x3400000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3400080},
8271{0x3400000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3400080},
8272{0x3400000, 0x807fffff, 0xff800000, 0xff800000, 0x3400080},
8273{0x3400000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3400081},
8274{0x3400000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3400081},
8275{0x3400000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3400081},
8276{0x3400000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3400080},
8277{0x3400000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3400080},
8278{0x3400000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3400080},
8279{0x3400000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3400080},
8280{0x3400000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3400080},
8281{0x3400000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3400080},
8282{0x3400000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3400080},
8283{0x3400000, 0x807fffff, 0x9503366, 0x9503366, 0x3400080},
8284{0x3400000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
8285{0x3400000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
8286{0x3400000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3400080},
8287{0x3400000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
8288{0x3400000, 0x807fffff, 0x966320b, 0x966320b, 0x3400080},
8289{0x3400000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3400080},
8290{0x3400000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
8291{0x3400000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3400080},
8292{0x3400000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3400080},
8293{0x3400000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
8294{0x3400000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3400080},
8295{0x3400000, 0x80800000, 0x0, 0x80800000, 0x3400000},
8296{0x3400000, 0x80800000, 0x1, 0x80800000, 0x3400080},
8297{0x3400000, 0x80800000, 0x76, 0x80800000, 0x3400080},
8298{0x3400000, 0x80800000, 0x2b94, 0x80800000, 0x3400080},
8299{0x3400000, 0x80800000, 0x636d24, 0x80800000, 0x3400080},
8300{0x3400000, 0x80800000, 0x7fffff, 0x80800000, 0x3400080},
8301{0x3400000, 0x80800000, 0x800000, 0x0, 0x3400000},
8302{0x3400000, 0x80800000, 0x800002, 0x0, 0x3400008},
8303{0x3400000, 0x80800000, 0x1398437, 0xf3086e, 0x3400000},
8304{0x3400000, 0x80800000, 0xba98d27, 0xba98d25, 0x3400000},
8305{0x3400000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3400000},
8306{0x3400000, 0x80800000, 0x751f853a, 0x751f853a, 0x3400010},
8307{0x3400000, 0x80800000, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
8308{0x3400000, 0x80800000, 0x7f7fffff, 0x7f7fffff, 0x3400010},
8309{0x3400000, 0x80800000, 0x7f800000, 0x7f800000, 0x3400000},
8310{0x3400000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3400001},
8311{0x3400000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3400001},
8312{0x3400000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3400001},
8313{0x3400000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3400000},
8314{0x3400000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
8315{0x3400000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3400000},
8316{0x3400000, 0x80800000, 0x80000000, 0x80800000, 0x3400000},
8317{0x3400000, 0x80800000, 0x80000001, 0x80800000, 0x3400080},
8318{0x3400000, 0x80800000, 0x80000076, 0x80800000, 0x3400080},
8319{0x3400000, 0x80800000, 0x80002b94, 0x80800000, 0x3400080},
8320{0x3400000, 0x80800000, 0x80636d24, 0x80800000, 0x3400080},
8321{0x3400000, 0x80800000, 0x807fffff, 0x80800000, 0x3400080},
8322{0x3400000, 0x80800000, 0x80800000, 0x81000000, 0x3400000},
8323{0x3400000, 0x80800000, 0x80800002, 0x81000001, 0x3400000},
8324{0x3400000, 0x80800000, 0x81398437, 0x81798437, 0x3400000},
8325{0x3400000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3400000},
8326{0x3400000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3400000},
8327{0x3400000, 0x80800000, 0xf51f853a, 0xf51f853a, 0x3400010},
8328{0x3400000, 0x80800000, 0xff7ffff0, 0xff7ffff0, 0x3400010},
8329{0x3400000, 0x80800000, 0xff7fffff, 0xff7fffff, 0x3400010},
8330{0x3400000, 0x80800000, 0xff800000, 0xff800000, 0x3400000},
8331{0x3400000, 0x80800000, 0xff800001, 0x7fc00000, 0x3400001},
8332{0x3400000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3400001},
8333{0x3400000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3400001},
8334{0x3400000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3400000},
8335{0x3400000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3400000},
8336{0x3400000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3400000},
8337{0x3400000, 0x80800000, 0x4f3495cb, 0x4f3495cb, 0x3400010},
8338{0x3400000, 0x80800000, 0xe73a5134, 0xe73a5134, 0x3400010},
8339{0x3400000, 0x80800000, 0x7c994e9e, 0x7c994e9e, 0x3400010},
8340{0x3400000, 0x80800000, 0x6164bd6c, 0x6164bd6c, 0x3400010},
8341{0x3400000, 0x80800000, 0x9503366, 0x9503326, 0x3400000},
8342{0x3400000, 0x80800000, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
8343{0x3400000, 0x80800000, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
8344{0x3400000, 0x80800000, 0x77f31e2f, 0x77f31e2f, 0x3400010},
8345{0x3400000, 0x80800000, 0xaab4d7d8, 0xaab4d7d8, 0x3400010},
8346{0x3400000, 0x80800000, 0x966320b, 0x96631cb, 0x3400000},
8347{0x3400000, 0x80800000, 0xb26bddee, 0xb26bddee, 0x3400010},
8348{0x3400000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010},
8349{0x3400000, 0x80800000, 0x317285d3, 0x317285d3, 0x3400010},
8350{0x3400000, 0x80800000, 0x3c9623b1, 0x3c9623b1, 0x3400010},
8351{0x3400000, 0x80800000, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
8352{0x3400000, 0x80800000, 0x7b906a6c, 0x7b906a6c, 0x3400010},
8353{0x3400000, 0x80800002, 0x0, 0x80800002, 0x3400000},
8354{0x3400000, 0x80800002, 0x1, 0x80800002, 0x3400080},
8355{0x3400000, 0x80800002, 0x76, 0x80800002, 0x3400080},
8356{0x3400000, 0x80800002, 0x2b94, 0x80800002, 0x3400080},
8357{0x3400000, 0x80800002, 0x636d24, 0x80800002, 0x3400080},
8358{0x3400000, 0x80800002, 0x7fffff, 0x80800002, 0x3400080},
8359{0x3400000, 0x80800002, 0x800000, 0x0, 0x3400008},
8360{0x3400000, 0x80800002, 0x800002, 0x0, 0x3400000},
8361{0x3400000, 0x80800002, 0x1398437, 0xf3086c, 0x3400000},
8362{0x3400000, 0x80800002, 0xba98d27, 0xba98d25, 0x3400010},
8363{0x3400000, 0x80800002, 0xba98d7a, 0xba98d78, 0x3400010},
8364{0x3400000, 0x80800002, 0x751f853a, 0x751f853a, 0x3400010},
8365{0x3400000, 0x80800002, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
8366{0x3400000, 0x80800002, 0x7f7fffff, 0x7f7fffff, 0x3400010},
8367{0x3400000, 0x80800002, 0x7f800000, 0x7f800000, 0x3400000},
8368{0x3400000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3400001},
8369{0x3400000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3400001},
8370{0x3400000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3400001},
8371{0x3400000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3400000},
8372{0x3400000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3400000},
8373{0x3400000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3400000},
8374{0x3400000, 0x80800002, 0x80000000, 0x80800002, 0x3400000},
8375{0x3400000, 0x80800002, 0x80000001, 0x80800002, 0x3400080},
8376{0x3400000, 0x80800002, 0x80000076, 0x80800002, 0x3400080},
8377{0x3400000, 0x80800002, 0x80002b94, 0x80800002, 0x3400080},
8378{0x3400000, 0x80800002, 0x80636d24, 0x80800002, 0x3400080},
8379{0x3400000, 0x80800002, 0x807fffff, 0x80800002, 0x3400080},
8380{0x3400000, 0x80800002, 0x80800000, 0x81000001, 0x3400000},
8381{0x3400000, 0x80800002, 0x80800002, 0x81000002, 0x3400000},
8382{0x3400000, 0x80800002, 0x81398437, 0x81798438, 0x3400000},
8383{0x3400000, 0x80800002, 0x8ba98d27, 0x8ba98d29, 0x3400010},
8384{0x3400000, 0x80800002, 0x8ba98d7a, 0x8ba98d7c, 0x3400010},
8385{0x3400000, 0x80800002, 0xf51f853a, 0xf51f853a, 0x3400010},
8386{0x3400000, 0x80800002, 0xff7ffff0, 0xff7ffff0, 0x3400010},
8387{0x3400000, 0x80800002, 0xff7fffff, 0xff7fffff, 0x3400010},
8388{0x3400000, 0x80800002, 0xff800000, 0xff800000, 0x3400000},
8389{0x3400000, 0x80800002, 0xff800001, 0x7fc00000, 0x3400001},
8390{0x3400000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3400001},
8391{0x3400000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3400001},
8392{0x3400000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3400000},
8393{0x3400000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3400000},
8394{0x3400000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3400000},
8395{0x3400000, 0x80800002, 0x4f3495cb, 0x4f3495cb, 0x3400010},
8396{0x3400000, 0x80800002, 0xe73a5134, 0xe73a5134, 0x3400010},
8397{0x3400000, 0x80800002, 0x7c994e9e, 0x7c994e9e, 0x3400010},
8398{0x3400000, 0x80800002, 0x6164bd6c, 0x6164bd6c, 0x3400010},
8399{0x3400000, 0x80800002, 0x9503366, 0x9503326, 0x3400010},
8400{0x3400000, 0x80800002, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
8401{0x3400000, 0x80800002, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
8402{0x3400000, 0x80800002, 0x77f31e2f, 0x77f31e2f, 0x3400010},
8403{0x3400000, 0x80800002, 0xaab4d7d8, 0xaab4d7d8, 0x3400010},
8404{0x3400000, 0x80800002, 0x966320b, 0x96631cb, 0x3400010},
8405{0x3400000, 0x80800002, 0xb26bddee, 0xb26bddee, 0x3400010},
8406{0x3400000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010},
8407{0x3400000, 0x80800002, 0x317285d3, 0x317285d3, 0x3400010},
8408{0x3400000, 0x80800002, 0x3c9623b1, 0x3c9623b1, 0x3400010},
8409{0x3400000, 0x80800002, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
8410{0x3400000, 0x80800002, 0x7b906a6c, 0x7b906a6c, 0x3400010},
8411{0x3400000, 0x81398437, 0x0, 0x81398437, 0x3400000},
8412{0x3400000, 0x81398437, 0x1, 0x81398437, 0x3400080},
8413{0x3400000, 0x81398437, 0x76, 0x81398437, 0x3400080},
8414{0x3400000, 0x81398437, 0x2b94, 0x81398437, 0x3400080},
8415{0x3400000, 0x81398437, 0x636d24, 0x81398437, 0x3400080},
8416{0x3400000, 0x81398437, 0x7fffff, 0x81398437, 0x3400080},
8417{0x3400000, 0x81398437, 0x800000, 0x80f3086e, 0x3400000},
8418{0x3400000, 0x81398437, 0x800002, 0x80f3086c, 0x3400000},
8419{0x3400000, 0x81398437, 0x1398437, 0x0, 0x3400000},
8420{0x3400000, 0x81398437, 0xba98d27, 0xba98d22, 0x3400010},
8421{0x3400000, 0x81398437, 0xba98d7a, 0xba98d75, 0x3400010},
8422{0x3400000, 0x81398437, 0x751f853a, 0x751f853a, 0x3400010},
8423{0x3400000, 0x81398437, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
8424{0x3400000, 0x81398437, 0x7f7fffff, 0x7f7fffff, 0x3400010},
8425{0x3400000, 0x81398437, 0x7f800000, 0x7f800000, 0x3400000},
8426{0x3400000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3400001},
8427{0x3400000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3400001},
8428{0x3400000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3400001},
8429{0x3400000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3400000},
8430{0x3400000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3400000},
8431{0x3400000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3400000},
8432{0x3400000, 0x81398437, 0x80000000, 0x81398437, 0x3400000},
8433{0x3400000, 0x81398437, 0x80000001, 0x81398437, 0x3400080},
8434{0x3400000, 0x81398437, 0x80000076, 0x81398437, 0x3400080},
8435{0x3400000, 0x81398437, 0x80002b94, 0x81398437, 0x3400080},
8436{0x3400000, 0x81398437, 0x80636d24, 0x81398437, 0x3400080},
8437{0x3400000, 0x81398437, 0x807fffff, 0x81398437, 0x3400080},
8438{0x3400000, 0x81398437, 0x80800000, 0x81798437, 0x3400000},
8439{0x3400000, 0x81398437, 0x80800002, 0x81798438, 0x3400000},
8440{0x3400000, 0x81398437, 0x81398437, 0x81b98437, 0x3400000},
8441{0x3400000, 0x81398437, 0x8ba98d27, 0x8ba98d2c, 0x3400010},
8442{0x3400000, 0x81398437, 0x8ba98d7a, 0x8ba98d7f, 0x3400010},
8443{0x3400000, 0x81398437, 0xf51f853a, 0xf51f853a, 0x3400010},
8444{0x3400000, 0x81398437, 0xff7ffff0, 0xff7ffff0, 0x3400010},
8445{0x3400000, 0x81398437, 0xff7fffff, 0xff7fffff, 0x3400010},
8446{0x3400000, 0x81398437, 0xff800000, 0xff800000, 0x3400000},
8447{0x3400000, 0x81398437, 0xff800001, 0x7fc00000, 0x3400001},
8448{0x3400000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3400001},
8449{0x3400000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3400001},
8450{0x3400000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3400000},
8451{0x3400000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3400000},
8452{0x3400000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3400000},
8453{0x3400000, 0x81398437, 0x4f3495cb, 0x4f3495cb, 0x3400010},
8454{0x3400000, 0x81398437, 0xe73a5134, 0xe73a5134, 0x3400010},
8455{0x3400000, 0x81398437, 0x7c994e9e, 0x7c994e9e, 0x3400010},
8456{0x3400000, 0x81398437, 0x6164bd6c, 0x6164bd6c, 0x3400010},
8457{0x3400000, 0x81398437, 0x9503366, 0x95032ad, 0x3400010},
8458{0x3400000, 0x81398437, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
8459{0x3400000, 0x81398437, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
8460{0x3400000, 0x81398437, 0x77f31e2f, 0x77f31e2f, 0x3400010},
8461{0x3400000, 0x81398437, 0xaab4d7d8, 0xaab4d7d8, 0x3400010},
8462{0x3400000, 0x81398437, 0x966320b, 0x9663152, 0x3400010},
8463{0x3400000, 0x81398437, 0xb26bddee, 0xb26bddee, 0x3400010},
8464{0x3400000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010},
8465{0x3400000, 0x81398437, 0x317285d3, 0x317285d3, 0x3400010},
8466{0x3400000, 0x81398437, 0x3c9623b1, 0x3c9623b1, 0x3400010},
8467{0x3400000, 0x81398437, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
8468{0x3400000, 0x81398437, 0x7b906a6c, 0x7b906a6c, 0x3400010},
8469{0x3400000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3400000},
8470{0x3400000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3400080},
8471{0x3400000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3400080},
8472{0x3400000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3400080},
8473{0x3400000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3400080},
8474{0x3400000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3400080},
8475{0x3400000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3400000},
8476{0x3400000, 0x8ba98d27, 0x800002, 0x8ba98d24, 0x3400010},
8477{0x3400000, 0x8ba98d27, 0x1398437, 0x8ba98d21, 0x3400010},
8478{0x3400000, 0x8ba98d27, 0xba98d27, 0x0, 0x3400000},
8479{0x3400000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3400000},
8480{0x3400000, 0x8ba98d27, 0x751f853a, 0x751f853a, 0x3400010},
8481{0x3400000, 0x8ba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
8482{0x3400000, 0x8ba98d27, 0x7f7fffff, 0x7f7fffff, 0x3400010},
8483{0x3400000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3400000},
8484{0x3400000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3400001},
8485{0x3400000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3400001},
8486{0x3400000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3400001},
8487{0x3400000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3400000},
8488{0x3400000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3400000},
8489{0x3400000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3400000},
8490{0x3400000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3400000},
8491{0x3400000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3400080},
8492{0x3400000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3400080},
8493{0x3400000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3400080},
8494{0x3400000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3400080},
8495{0x3400000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3400080},
8496{0x3400000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3400000},
8497{0x3400000, 0x8ba98d27, 0x80800002, 0x8ba98d29, 0x3400010},
8498{0x3400000, 0x8ba98d27, 0x81398437, 0x8ba98d2c, 0x3400010},
8499{0x3400000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3400000},
8500{0x3400000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d50, 0x3400010},
8501{0x3400000, 0x8ba98d27, 0xf51f853a, 0xf51f853a, 0x3400010},
8502{0x3400000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff0, 0x3400010},
8503{0x3400000, 0x8ba98d27, 0xff7fffff, 0xff7fffff, 0x3400010},
8504{0x3400000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3400000},
8505{0x3400000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3400001},
8506{0x3400000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3400001},
8507{0x3400000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3400001},
8508{0x3400000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3400000},
8509{0x3400000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3400000},
8510{0x3400000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3400000},
8511{0x3400000, 0x8ba98d27, 0x4f3495cb, 0x4f3495cb, 0x3400010},
8512{0x3400000, 0x8ba98d27, 0xe73a5134, 0xe73a5134, 0x3400010},
8513{0x3400000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9e, 0x3400010},
8514{0x3400000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6c, 0x3400010},
8515{0x3400000, 0x8ba98d27, 0x9503366, 0x8ba30b8b, 0x3400010},
8516{0x3400000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
8517{0x3400000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
8518{0x3400000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2f, 0x3400010},
8519{0x3400000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3400010},
8520{0x3400000, 0x8ba98d27, 0x966320b, 0x8ba25b96, 0x3400010},
8521{0x3400000, 0x8ba98d27, 0xb26bddee, 0xb26bddee, 0x3400010},
8522{0x3400000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010},
8523{0x3400000, 0x8ba98d27, 0x317285d3, 0x317285d3, 0x3400010},
8524{0x3400000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b1, 0x3400010},
8525{0x3400000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
8526{0x3400000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6c, 0x3400010},
8527{0x3400000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3400000},
8528{0x3400000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3400080},
8529{0x3400000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3400080},
8530{0x3400000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3400080},
8531{0x3400000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3400080},
8532{0x3400000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3400080},
8533{0x3400000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3400000},
8534{0x3400000, 0x8ba98d7a, 0x800002, 0x8ba98d77, 0x3400010},
8535{0x3400000, 0x8ba98d7a, 0x1398437, 0x8ba98d74, 0x3400010},
8536{0x3400000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3400000},
8537{0x3400000, 0x8ba98d7a, 0xba98d7a, 0x0, 0x3400000},
8538{0x3400000, 0x8ba98d7a, 0x751f853a, 0x751f853a, 0x3400010},
8539{0x3400000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
8540{0x3400000, 0x8ba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3400010},
8541{0x3400000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3400000},
8542{0x3400000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3400001},
8543{0x3400000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3400001},
8544{0x3400000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3400001},
8545{0x3400000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3400000},
8546{0x3400000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3400000},
8547{0x3400000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3400000},
8548{0x3400000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3400000},
8549{0x3400000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3400080},
8550{0x3400000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3400080},
8551{0x3400000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3400080},
8552{0x3400000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3400080},
8553{0x3400000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3400080},
8554{0x3400000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3400000},
8555{0x3400000, 0x8ba98d7a, 0x80800002, 0x8ba98d7c, 0x3400010},
8556{0x3400000, 0x8ba98d7a, 0x81398437, 0x8ba98d7f, 0x3400010},
8557{0x3400000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d50, 0x3400010},
8558{0x3400000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3400000},
8559{0x3400000, 0x8ba98d7a, 0xf51f853a, 0xf51f853a, 0x3400010},
8560{0x3400000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3400010},
8561{0x3400000, 0x8ba98d7a, 0xff7fffff, 0xff7fffff, 0x3400010},
8562{0x3400000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3400000},
8563{0x3400000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3400001},
8564{0x3400000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3400001},
8565{0x3400000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3400001},
8566{0x3400000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3400000},
8567{0x3400000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3400000},
8568{0x3400000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3400000},
8569{0x3400000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3400010},
8570{0x3400000, 0x8ba98d7a, 0xe73a5134, 0xe73a5134, 0x3400010},
8571{0x3400000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3400010},
8572{0x3400000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3400010},
8573{0x3400000, 0x8ba98d7a, 0x9503366, 0x8ba30bde, 0x3400010},
8574{0x3400000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
8575{0x3400000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
8576{0x3400000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3400010},
8577{0x3400000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3400010},
8578{0x3400000, 0x8ba98d7a, 0x966320b, 0x8ba25be9, 0x3400010},
8579{0x3400000, 0x8ba98d7a, 0xb26bddee, 0xb26bddee, 0x3400010},
8580{0x3400000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010},
8581{0x3400000, 0x8ba98d7a, 0x317285d3, 0x317285d3, 0x3400010},
8582{0x3400000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3400010},
8583{0x3400000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
8584{0x3400000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3400010},
8585{0x3400000, 0xf51f853a, 0x0, 0xf51f853a, 0x3400000},
8586{0x3400000, 0xf51f853a, 0x1, 0xf51f853a, 0x3400080},
8587{0x3400000, 0xf51f853a, 0x76, 0xf51f853a, 0x3400080},
8588{0x3400000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3400080},
8589{0x3400000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3400080},
8590{0x3400000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3400080},
8591{0x3400000, 0xf51f853a, 0x800000, 0xf51f8539, 0x3400010},
8592{0x3400000, 0xf51f853a, 0x800002, 0xf51f8539, 0x3400010},
8593{0x3400000, 0xf51f853a, 0x1398437, 0xf51f8539, 0x3400010},
8594{0x3400000, 0xf51f853a, 0xba98d27, 0xf51f8539, 0x3400010},
8595{0x3400000, 0xf51f853a, 0xba98d7a, 0xf51f8539, 0x3400010},
8596{0x3400000, 0xf51f853a, 0x751f853a, 0x0, 0x3400000},
8597{0x3400000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe7, 0x3400010},
8598{0x3400000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff6, 0x3400010},
8599{0x3400000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3400000},
8600{0x3400000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3400001},
8601{0x3400000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3400001},
8602{0x3400000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3400001},
8603{0x3400000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3400000},
8604{0x3400000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3400000},
8605{0x3400000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3400000},
8606{0x3400000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3400000},
8607{0x3400000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3400080},
8608{0x3400000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3400080},
8609{0x3400000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3400080},
8610{0x3400000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3400080},
8611{0x3400000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3400080},
8612{0x3400000, 0xf51f853a, 0x80800000, 0xf51f853a, 0x3400010},
8613{0x3400000, 0xf51f853a, 0x80800002, 0xf51f853a, 0x3400010},
8614{0x3400000, 0xf51f853a, 0x81398437, 0xf51f853a, 0x3400010},
8615{0x3400000, 0xf51f853a, 0x8ba98d27, 0xf51f853a, 0x3400010},
8616{0x3400000, 0xf51f853a, 0x8ba98d7a, 0xf51f853a, 0x3400010},
8617{0x3400000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3400000},
8618{0x3400000, 0xf51f853a, 0xff7ffff0, 0xff7ffff9, 0x3400010},
8619{0x3400000, 0xf51f853a, 0xff7fffff, 0xff7fffff, 0x3400014},
8620{0x3400000, 0xf51f853a, 0xff800000, 0xff800000, 0x3400000},
8621{0x3400000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3400001},
8622{0x3400000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3400001},
8623{0x3400000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3400001},
8624{0x3400000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3400000},
8625{0x3400000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3400000},
8626{0x3400000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3400000},
8627{0x3400000, 0xf51f853a, 0x4f3495cb, 0xf51f8539, 0x3400010},
8628{0x3400000, 0xf51f853a, 0xe73a5134, 0xf51f853a, 0x3400010},
8629{0x3400000, 0xf51f853a, 0x7c994e9e, 0x7c994d5f, 0x3400010},
8630{0x3400000, 0xf51f853a, 0x6164bd6c, 0xf51f8539, 0x3400010},
8631{0x3400000, 0xf51f853a, 0x9503366, 0xf51f8539, 0x3400010},
8632{0x3400000, 0xf51f853a, 0xbf5a97c9, 0xf51f853a, 0x3400010},
8633{0x3400000, 0xf51f853a, 0xe6ff1a14, 0xf51f853a, 0x3400010},
8634{0x3400000, 0xf51f853a, 0x77f31e2f, 0x77ee2206, 0x3400010},
8635{0x3400000, 0xf51f853a, 0xaab4d7d8, 0xf51f853a, 0x3400010},
8636{0x3400000, 0xf51f853a, 0x966320b, 0xf51f8539, 0x3400010},
8637{0x3400000, 0xf51f853a, 0xb26bddee, 0xf51f853a, 0x3400010},
8638{0x3400000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853a, 0x3400010},
8639{0x3400000, 0xf51f853a, 0x317285d3, 0xf51f8539, 0x3400010},
8640{0x3400000, 0xf51f853a, 0x3c9623b1, 0xf51f8539, 0x3400010},
8641{0x3400000, 0xf51f853a, 0x51fd2c7c, 0xf51f8539, 0x3400010},
8642{0x3400000, 0xf51f853a, 0x7b906a6c, 0x7b906570, 0x3400010},
8643{0x3400000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3400000},
8644{0x3400000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3400080},
8645{0x3400000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3400080},
8646{0x3400000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3400080},
8647{0x3400000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3400080},
8648{0x3400000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3400080},
8649{0x3400000, 0xff7ffff0, 0x800000, 0xff7fffef, 0x3400010},
8650{0x3400000, 0xff7ffff0, 0x800002, 0xff7fffef, 0x3400010},
8651{0x3400000, 0xff7ffff0, 0x1398437, 0xff7fffef, 0x3400010},
8652{0x3400000, 0xff7ffff0, 0xba98d27, 0xff7fffef, 0x3400010},
8653{0x3400000, 0xff7ffff0, 0xba98d7a, 0xff7fffef, 0x3400010},
8654{0x3400000, 0xff7ffff0, 0x751f853a, 0xff7fffe6, 0x3400010},
8655{0x3400000, 0xff7ffff0, 0x7f7ffff0, 0x0, 0x3400000},
8656{0x3400000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3400000},
8657{0x3400000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3400000},
8658{0x3400000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3400001},
8659{0x3400000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3400001},
8660{0x3400000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3400001},
8661{0x3400000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3400000},
8662{0x3400000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3400000},
8663{0x3400000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3400000},
8664{0x3400000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3400000},
8665{0x3400000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3400080},
8666{0x3400000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3400080},
8667{0x3400000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3400080},
8668{0x3400000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3400080},
8669{0x3400000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3400080},
8670{0x3400000, 0xff7ffff0, 0x80800000, 0xff7ffff0, 0x3400010},
8671{0x3400000, 0xff7ffff0, 0x80800002, 0xff7ffff0, 0x3400010},
8672{0x3400000, 0xff7ffff0, 0x81398437, 0xff7ffff0, 0x3400010},
8673{0x3400000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff0, 0x3400010},
8674{0x3400000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff0, 0x3400010},
8675{0x3400000, 0xff7ffff0, 0xf51f853a, 0xff7ffff9, 0x3400010},
8676{0x3400000, 0xff7ffff0, 0xff7ffff0, 0xff7fffff, 0x3400014},
8677{0x3400000, 0xff7ffff0, 0xff7fffff, 0xff7fffff, 0x3400014},
8678{0x3400000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3400000},
8679{0x3400000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3400001},
8680{0x3400000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3400001},
8681{0x3400000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3400001},
8682{0x3400000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3400000},
8683{0x3400000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3400000},
8684{0x3400000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3400000},
8685{0x3400000, 0xff7ffff0, 0x4f3495cb, 0xff7fffef, 0x3400010},
8686{0x3400000, 0xff7ffff0, 0xe73a5134, 0xff7ffff0, 0x3400010},
8687{0x3400000, 0xff7ffff0, 0x7c994e9e, 0xff7b357b, 0x3400010},
8688{0x3400000, 0xff7ffff0, 0x6164bd6c, 0xff7fffef, 0x3400010},
8689{0x3400000, 0xff7ffff0, 0x9503366, 0xff7fffef, 0x3400010},
8690{0x3400000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff0, 0x3400010},
8691{0x3400000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff0, 0x3400010},
8692{0x3400000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe09, 0x3400010},
8693{0x3400000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff0, 0x3400010},
8694{0x3400000, 0xff7ffff0, 0x966320b, 0xff7fffef, 0x3400010},
8695{0x3400000, 0xff7ffff0, 0xb26bddee, 0xff7ffff0, 0x3400010},
8696{0x3400000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff0, 0x3400010},
8697{0x3400000, 0xff7ffff0, 0x317285d3, 0xff7fffef, 0x3400010},
8698{0x3400000, 0xff7ffff0, 0x3c9623b1, 0xff7fffef, 0x3400010},
8699{0x3400000, 0xff7ffff0, 0x51fd2c7c, 0xff7fffef, 0x3400010},
8700{0x3400000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1b, 0x3400010},
8701{0x3400000, 0xff7fffff, 0x0, 0xff7fffff, 0x3400000},
8702{0x3400000, 0xff7fffff, 0x1, 0xff7fffff, 0x3400080},
8703{0x3400000, 0xff7fffff, 0x76, 0xff7fffff, 0x3400080},
8704{0x3400000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3400080},
8705{0x3400000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3400080},
8706{0x3400000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3400080},
8707{0x3400000, 0xff7fffff, 0x800000, 0xff7ffffe, 0x3400010},
8708{0x3400000, 0xff7fffff, 0x800002, 0xff7ffffe, 0x3400010},
8709{0x3400000, 0xff7fffff, 0x1398437, 0xff7ffffe, 0x3400010},
8710{0x3400000, 0xff7fffff, 0xba98d27, 0xff7ffffe, 0x3400010},
8711{0x3400000, 0xff7fffff, 0xba98d7a, 0xff7ffffe, 0x3400010},
8712{0x3400000, 0xff7fffff, 0x751f853a, 0xff7ffff5, 0x3400010},
8713{0x3400000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3400000},
8714{0x3400000, 0xff7fffff, 0x7f7fffff, 0x0, 0x3400000},
8715{0x3400000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3400000},
8716{0x3400000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3400001},
8717{0x3400000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3400001},
8718{0x3400000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
8719{0x3400000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3400000},
8720{0x3400000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3400000},
8721{0x3400000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3400000},
8722{0x3400000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3400000},
8723{0x3400000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3400080},
8724{0x3400000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3400080},
8725{0x3400000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3400080},
8726{0x3400000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3400080},
8727{0x3400000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3400080},
8728{0x3400000, 0xff7fffff, 0x80800000, 0xff7fffff, 0x3400010},
8729{0x3400000, 0xff7fffff, 0x80800002, 0xff7fffff, 0x3400010},
8730{0x3400000, 0xff7fffff, 0x81398437, 0xff7fffff, 0x3400010},
8731{0x3400000, 0xff7fffff, 0x8ba98d27, 0xff7fffff, 0x3400010},
8732{0x3400000, 0xff7fffff, 0x8ba98d7a, 0xff7fffff, 0x3400010},
8733{0x3400000, 0xff7fffff, 0xf51f853a, 0xff7fffff, 0x3400014},
8734{0x3400000, 0xff7fffff, 0xff7ffff0, 0xff7fffff, 0x3400014},
8735{0x3400000, 0xff7fffff, 0xff7fffff, 0xff7fffff, 0x3400014},
8736{0x3400000, 0xff7fffff, 0xff800000, 0xff800000, 0x3400000},
8737{0x3400000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3400001},
8738{0x3400000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3400001},
8739{0x3400000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3400001},
8740{0x3400000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3400000},
8741{0x3400000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3400000},
8742{0x3400000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3400000},
8743{0x3400000, 0xff7fffff, 0x4f3495cb, 0xff7ffffe, 0x3400010},
8744{0x3400000, 0xff7fffff, 0xe73a5134, 0xff7fffff, 0x3400010},
8745{0x3400000, 0xff7fffff, 0x7c994e9e, 0xff7b358a, 0x3400010},
8746{0x3400000, 0xff7fffff, 0x6164bd6c, 0xff7ffffe, 0x3400010},
8747{0x3400000, 0xff7fffff, 0x9503366, 0xff7ffffe, 0x3400010},
8748{0x3400000, 0xff7fffff, 0xbf5a97c9, 0xff7fffff, 0x3400010},
8749{0x3400000, 0xff7fffff, 0xe6ff1a14, 0xff7fffff, 0x3400010},
8750{0x3400000, 0xff7fffff, 0x77f31e2f, 0xff7ffe18, 0x3400010},
8751{0x3400000, 0xff7fffff, 0xaab4d7d8, 0xff7fffff, 0x3400010},
8752{0x3400000, 0xff7fffff, 0x966320b, 0xff7ffffe, 0x3400010},
8753{0x3400000, 0xff7fffff, 0xb26bddee, 0xff7fffff, 0x3400010},
8754{0x3400000, 0xff7fffff, 0xb5c8e5d3, 0xff7fffff, 0x3400010},
8755{0x3400000, 0xff7fffff, 0x317285d3, 0xff7ffffe, 0x3400010},
8756{0x3400000, 0xff7fffff, 0x3c9623b1, 0xff7ffffe, 0x3400010},
8757{0x3400000, 0xff7fffff, 0x51fd2c7c, 0xff7ffffe, 0x3400010},
8758{0x3400000, 0xff7fffff, 0x7b906a6c, 0xff7edf2a, 0x3400010},
8759{0x3400000, 0xff800000, 0x0, 0xff800000, 0x3400000},
8760{0x3400000, 0xff800000, 0x1, 0xff800000, 0x3400080},
8761{0x3400000, 0xff800000, 0x76, 0xff800000, 0x3400080},
8762{0x3400000, 0xff800000, 0x2b94, 0xff800000, 0x3400080},
8763{0x3400000, 0xff800000, 0x636d24, 0xff800000, 0x3400080},
8764{0x3400000, 0xff800000, 0x7fffff, 0xff800000, 0x3400080},
8765{0x3400000, 0xff800000, 0x800000, 0xff800000, 0x3400000},
8766{0x3400000, 0xff800000, 0x800002, 0xff800000, 0x3400000},
8767{0x3400000, 0xff800000, 0x1398437, 0xff800000, 0x3400000},
8768{0x3400000, 0xff800000, 0xba98d27, 0xff800000, 0x3400000},
8769{0x3400000, 0xff800000, 0xba98d7a, 0xff800000, 0x3400000},
8770{0x3400000, 0xff800000, 0x751f853a, 0xff800000, 0x3400000},
8771{0x3400000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3400000},
8772{0x3400000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3400000},
8773{0x3400000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3400001},
8774{0x3400000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3400001},
8775{0x3400000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3400001},
8776{0x3400000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3400001},
8777{0x3400000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3400000},
8778{0x3400000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
8779{0x3400000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3400000},
8780{0x3400000, 0xff800000, 0x80000000, 0xff800000, 0x3400000},
8781{0x3400000, 0xff800000, 0x80000001, 0xff800000, 0x3400080},
8782{0x3400000, 0xff800000, 0x80000076, 0xff800000, 0x3400080},
8783{0x3400000, 0xff800000, 0x80002b94, 0xff800000, 0x3400080},
8784{0x3400000, 0xff800000, 0x80636d24, 0xff800000, 0x3400080},
8785{0x3400000, 0xff800000, 0x807fffff, 0xff800000, 0x3400080},
8786{0x3400000, 0xff800000, 0x80800000, 0xff800000, 0x3400000},
8787{0x3400000, 0xff800000, 0x80800002, 0xff800000, 0x3400000},
8788{0x3400000, 0xff800000, 0x81398437, 0xff800000, 0x3400000},
8789{0x3400000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3400000},
8790{0x3400000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3400000},
8791{0x3400000, 0xff800000, 0xf51f853a, 0xff800000, 0x3400000},
8792{0x3400000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3400000},
8793{0x3400000, 0xff800000, 0xff7fffff, 0xff800000, 0x3400000},
8794{0x3400000, 0xff800000, 0xff800000, 0xff800000, 0x3400000},
8795{0x3400000, 0xff800000, 0xff800001, 0x7fc00000, 0x3400001},
8796{0x3400000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3400001},
8797{0x3400000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3400001},
8798{0x3400000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3400000},
8799{0x3400000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3400000},
8800{0x3400000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3400000},
8801{0x3400000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3400000},
8802{0x3400000, 0xff800000, 0xe73a5134, 0xff800000, 0x3400000},
8803{0x3400000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3400000},
8804{0x3400000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3400000},
8805{0x3400000, 0xff800000, 0x9503366, 0xff800000, 0x3400000},
8806{0x3400000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3400000},
8807{0x3400000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3400000},
8808{0x3400000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3400000},
8809{0x3400000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3400000},
8810{0x3400000, 0xff800000, 0x966320b, 0xff800000, 0x3400000},
8811{0x3400000, 0xff800000, 0xb26bddee, 0xff800000, 0x3400000},
8812{0x3400000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3400000},
8813{0x3400000, 0xff800000, 0x317285d3, 0xff800000, 0x3400000},
8814{0x3400000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3400000},
8815{0x3400000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3400000},
8816{0x3400000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3400000},
8817{0x3400000, 0xff800001, 0x0, 0x7fc00000, 0x3400001},
8818{0x3400000, 0xff800001, 0x1, 0x7fc00000, 0x3400081},
8819{0x3400000, 0xff800001, 0x76, 0x7fc00000, 0x3400081},
8820{0x3400000, 0xff800001, 0x2b94, 0x7fc00000, 0x3400081},
8821{0x3400000, 0xff800001, 0x636d24, 0x7fc00000, 0x3400081},
8822{0x3400000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3400081},
8823{0x3400000, 0xff800001, 0x800000, 0x7fc00000, 0x3400001},
8824{0x3400000, 0xff800001, 0x800002, 0x7fc00000, 0x3400001},
8825{0x3400000, 0xff800001, 0x1398437, 0x7fc00000, 0x3400001},
8826{0x3400000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3400001},
8827{0x3400000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3400001},
8828{0x3400000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3400001},
8829{0x3400000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3400001},
8830{0x3400000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3400001},
8831{0x3400000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3400001},
8832{0x3400000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3400001},
8833{0x3400000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3400001},
8834{0x3400000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3400001},
8835{0x3400000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3400001},
8836{0x3400000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3400001},
8837{0x3400000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3400001},
8838{0x3400000, 0xff800001, 0x80000000, 0x7fc00000, 0x3400001},
8839{0x3400000, 0xff800001, 0x80000001, 0x7fc00000, 0x3400081},
8840{0x3400000, 0xff800001, 0x80000076, 0x7fc00000, 0x3400081},
8841{0x3400000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3400081},
8842{0x3400000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3400081},
8843{0x3400000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3400081},
8844{0x3400000, 0xff800001, 0x80800000, 0x7fc00000, 0x3400001},
8845{0x3400000, 0xff800001, 0x80800002, 0x7fc00000, 0x3400001},
8846{0x3400000, 0xff800001, 0x81398437, 0x7fc00000, 0x3400001},
8847{0x3400000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3400001},
8848{0x3400000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3400001},
8849{0x3400000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3400001},
8850{0x3400000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3400001},
8851{0x3400000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3400001},
8852{0x3400000, 0xff800001, 0xff800000, 0x7fc00000, 0x3400001},
8853{0x3400000, 0xff800001, 0xff800001, 0x7fc00000, 0x3400001},
8854{0x3400000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3400001},
8855{0x3400000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3400001},
8856{0x3400000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3400001},
8857{0x3400000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3400001},
8858{0x3400000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3400001},
8859{0x3400000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3400001},
8860{0x3400000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3400001},
8861{0x3400000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3400001},
8862{0x3400000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3400001},
8863{0x3400000, 0xff800001, 0x9503366, 0x7fc00000, 0x3400001},
8864{0x3400000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3400001},
8865{0x3400000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3400001},
8866{0x3400000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3400001},
8867{0x3400000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3400001},
8868{0x3400000, 0xff800001, 0x966320b, 0x7fc00000, 0x3400001},
8869{0x3400000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3400001},
8870{0x3400000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
8871{0x3400000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3400001},
8872{0x3400000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3400001},
8873{0x3400000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3400001},
8874{0x3400000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3400001},
8875{0x3400000, 0xff984a37, 0x0, 0x7fc00000, 0x3400001},
8876{0x3400000, 0xff984a37, 0x1, 0x7fc00000, 0x3400081},
8877{0x3400000, 0xff984a37, 0x76, 0x7fc00000, 0x3400081},
8878{0x3400000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3400081},
8879{0x3400000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3400081},
8880{0x3400000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3400081},
8881{0x3400000, 0xff984a37, 0x800000, 0x7fc00000, 0x3400001},
8882{0x3400000, 0xff984a37, 0x800002, 0x7fc00000, 0x3400001},
8883{0x3400000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3400001},
8884{0x3400000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3400001},
8885{0x3400000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3400001},
8886{0x3400000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3400001},
8887{0x3400000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3400001},
8888{0x3400000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3400001},
8889{0x3400000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3400001},
8890{0x3400000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3400001},
8891{0x3400000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3400001},
8892{0x3400000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3400001},
8893{0x3400000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3400001},
8894{0x3400000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3400001},
8895{0x3400000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3400001},
8896{0x3400000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3400001},
8897{0x3400000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3400081},
8898{0x3400000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3400081},
8899{0x3400000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3400081},
8900{0x3400000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3400081},
8901{0x3400000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3400081},
8902{0x3400000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3400001},
8903{0x3400000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3400001},
8904{0x3400000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3400001},
8905{0x3400000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3400001},
8906{0x3400000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3400001},
8907{0x3400000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3400001},
8908{0x3400000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3400001},
8909{0x3400000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3400001},
8910{0x3400000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3400001},
8911{0x3400000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3400001},
8912{0x3400000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3400001},
8913{0x3400000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3400001},
8914{0x3400000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3400001},
8915{0x3400000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3400001},
8916{0x3400000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3400001},
8917{0x3400000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3400001},
8918{0x3400000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3400001},
8919{0x3400000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3400001},
8920{0x3400000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3400001},
8921{0x3400000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3400001},
8922{0x3400000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3400001},
8923{0x3400000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3400001},
8924{0x3400000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3400001},
8925{0x3400000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3400001},
8926{0x3400000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3400001},
8927{0x3400000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3400001},
8928{0x3400000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
8929{0x3400000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3400001},
8930{0x3400000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3400001},
8931{0x3400000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3400001},
8932{0x3400000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3400001},
8933{0x3400000, 0xffbfffff, 0x0, 0x7fc00000, 0x3400001},
8934{0x3400000, 0xffbfffff, 0x1, 0x7fc00000, 0x3400081},
8935{0x3400000, 0xffbfffff, 0x76, 0x7fc00000, 0x3400081},
8936{0x3400000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3400081},
8937{0x3400000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3400081},
8938{0x3400000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3400081},
8939{0x3400000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3400001},
8940{0x3400000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3400001},
8941{0x3400000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3400001},
8942{0x3400000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3400001},
8943{0x3400000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3400001},
8944{0x3400000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3400001},
8945{0x3400000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3400001},
8946{0x3400000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3400001},
8947{0x3400000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3400001},
8948{0x3400000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3400001},
8949{0x3400000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3400001},
8950{0x3400000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
8951{0x3400000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3400001},
8952{0x3400000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3400001},
8953{0x3400000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3400001},
8954{0x3400000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3400001},
8955{0x3400000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3400081},
8956{0x3400000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3400081},
8957{0x3400000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3400081},
8958{0x3400000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3400081},
8959{0x3400000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3400081},
8960{0x3400000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3400001},
8961{0x3400000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3400001},
8962{0x3400000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3400001},
8963{0x3400000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3400001},
8964{0x3400000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3400001},
8965{0x3400000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3400001},
8966{0x3400000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3400001},
8967{0x3400000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3400001},
8968{0x3400000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3400001},
8969{0x3400000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3400001},
8970{0x3400000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3400001},
8971{0x3400000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3400001},
8972{0x3400000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3400001},
8973{0x3400000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3400001},
8974{0x3400000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3400001},
8975{0x3400000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3400001},
8976{0x3400000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3400001},
8977{0x3400000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3400001},
8978{0x3400000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3400001},
8979{0x3400000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3400001},
8980{0x3400000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3400001},
8981{0x3400000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3400001},
8982{0x3400000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3400001},
8983{0x3400000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3400001},
8984{0x3400000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3400001},
8985{0x3400000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3400001},
8986{0x3400000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
8987{0x3400000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3400001},
8988{0x3400000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3400001},
8989{0x3400000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3400001},
8990{0x3400000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3400001},
8991{0x3400000, 0xffc00000, 0x0, 0x7fc00000, 0x3400000},
8992{0x3400000, 0xffc00000, 0x1, 0x7fc00000, 0x3400080},
8993{0x3400000, 0xffc00000, 0x76, 0x7fc00000, 0x3400080},
8994{0x3400000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3400080},
8995{0x3400000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3400080},
8996{0x3400000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3400080},
8997{0x3400000, 0xffc00000, 0x800000, 0x7fc00000, 0x3400000},
8998{0x3400000, 0xffc00000, 0x800002, 0x7fc00000, 0x3400000},
8999{0x3400000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3400000},
9000{0x3400000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3400000},
9001{0x3400000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3400000},
9002{0x3400000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3400000},
9003{0x3400000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3400000},
9004{0x3400000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3400000},
9005{0x3400000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3400000},
9006{0x3400000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3400001},
9007{0x3400000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3400001},
9008{0x3400000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3400001},
9009{0x3400000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3400000},
9010{0x3400000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9011{0x3400000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3400000},
9012{0x3400000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3400000},
9013{0x3400000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3400080},
9014{0x3400000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3400080},
9015{0x3400000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3400080},
9016{0x3400000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3400080},
9017{0x3400000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3400080},
9018{0x3400000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3400000},
9019{0x3400000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3400000},
9020{0x3400000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3400000},
9021{0x3400000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3400000},
9022{0x3400000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3400000},
9023{0x3400000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3400000},
9024{0x3400000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3400000},
9025{0x3400000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3400000},
9026{0x3400000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3400000},
9027{0x3400000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3400001},
9028{0x3400000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3400001},
9029{0x3400000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3400001},
9030{0x3400000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3400000},
9031{0x3400000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3400000},
9032{0x3400000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3400000},
9033{0x3400000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3400000},
9034{0x3400000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3400000},
9035{0x3400000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3400000},
9036{0x3400000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3400000},
9037{0x3400000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3400000},
9038{0x3400000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3400000},
9039{0x3400000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3400000},
9040{0x3400000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3400000},
9041{0x3400000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3400000},
9042{0x3400000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3400000},
9043{0x3400000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3400000},
9044{0x3400000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
9045{0x3400000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3400000},
9046{0x3400000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3400000},
9047{0x3400000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3400000},
9048{0x3400000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3400000},
9049{0x3400000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3400000},
9050{0x3400000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3400080},
9051{0x3400000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3400080},
9052{0x3400000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3400080},
9053{0x3400000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3400080},
9054{0x3400000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3400080},
9055{0x3400000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3400000},
9056{0x3400000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3400000},
9057{0x3400000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3400000},
9058{0x3400000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3400000},
9059{0x3400000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3400000},
9060{0x3400000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3400000},
9061{0x3400000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3400000},
9062{0x3400000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3400000},
9063{0x3400000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3400000},
9064{0x3400000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3400001},
9065{0x3400000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3400001},
9066{0x3400000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3400001},
9067{0x3400000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3400000},
9068{0x3400000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9069{0x3400000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3400000},
9070{0x3400000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3400000},
9071{0x3400000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3400080},
9072{0x3400000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3400080},
9073{0x3400000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3400080},
9074{0x3400000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3400080},
9075{0x3400000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3400080},
9076{0x3400000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3400000},
9077{0x3400000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3400000},
9078{0x3400000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3400000},
9079{0x3400000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3400000},
9080{0x3400000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3400000},
9081{0x3400000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3400000},
9082{0x3400000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3400000},
9083{0x3400000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3400000},
9084{0x3400000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3400000},
9085{0x3400000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3400001},
9086{0x3400000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3400001},
9087{0x3400000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3400001},
9088{0x3400000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3400000},
9089{0x3400000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3400000},
9090{0x3400000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3400000},
9091{0x3400000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3400000},
9092{0x3400000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3400000},
9093{0x3400000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3400000},
9094{0x3400000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3400000},
9095{0x3400000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3400000},
9096{0x3400000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3400000},
9097{0x3400000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3400000},
9098{0x3400000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3400000},
9099{0x3400000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3400000},
9100{0x3400000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3400000},
9101{0x3400000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3400000},
9102{0x3400000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
9103{0x3400000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3400000},
9104{0x3400000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3400000},
9105{0x3400000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3400000},
9106{0x3400000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3400000},
9107{0x3400000, 0xffffffff, 0x0, 0x7fc00000, 0x3400000},
9108{0x3400000, 0xffffffff, 0x1, 0x7fc00000, 0x3400080},
9109{0x3400000, 0xffffffff, 0x76, 0x7fc00000, 0x3400080},
9110{0x3400000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3400080},
9111{0x3400000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3400080},
9112{0x3400000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3400080},
9113{0x3400000, 0xffffffff, 0x800000, 0x7fc00000, 0x3400000},
9114{0x3400000, 0xffffffff, 0x800002, 0x7fc00000, 0x3400000},
9115{0x3400000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3400000},
9116{0x3400000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3400000},
9117{0x3400000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3400000},
9118{0x3400000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3400000},
9119{0x3400000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3400000},
9120{0x3400000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3400000},
9121{0x3400000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3400000},
9122{0x3400000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3400001},
9123{0x3400000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3400001},
9124{0x3400000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
9125{0x3400000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3400000},
9126{0x3400000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9127{0x3400000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3400000},
9128{0x3400000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3400000},
9129{0x3400000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3400080},
9130{0x3400000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3400080},
9131{0x3400000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3400080},
9132{0x3400000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3400080},
9133{0x3400000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3400080},
9134{0x3400000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3400000},
9135{0x3400000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3400000},
9136{0x3400000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3400000},
9137{0x3400000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3400000},
9138{0x3400000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3400000},
9139{0x3400000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3400000},
9140{0x3400000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3400000},
9141{0x3400000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3400000},
9142{0x3400000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3400000},
9143{0x3400000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3400001},
9144{0x3400000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3400001},
9145{0x3400000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3400001},
9146{0x3400000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3400000},
9147{0x3400000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3400000},
9148{0x3400000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3400000},
9149{0x3400000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3400000},
9150{0x3400000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3400000},
9151{0x3400000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3400000},
9152{0x3400000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3400000},
9153{0x3400000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3400000},
9154{0x3400000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3400000},
9155{0x3400000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3400000},
9156{0x3400000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3400000},
9157{0x3400000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3400000},
9158{0x3400000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3400000},
9159{0x3400000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3400000},
9160{0x3400000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
9161{0x3400000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3400000},
9162{0x3400000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3400000},
9163{0x3400000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3400000},
9164{0x3400000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3400000},
9165{0x3400000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3400000},
9166{0x3400000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3400080},
9167{0x3400000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3400080},
9168{0x3400000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3400080},
9169{0x3400000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3400080},
9170{0x3400000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3400080},
9171{0x3400000, 0x4f3495cb, 0x800000, 0x4f3495cc, 0x3400010},
9172{0x3400000, 0x4f3495cb, 0x800002, 0x4f3495cc, 0x3400010},
9173{0x3400000, 0x4f3495cb, 0x1398437, 0x4f3495cc, 0x3400010},
9174{0x3400000, 0x4f3495cb, 0xba98d27, 0x4f3495cc, 0x3400010},
9175{0x3400000, 0x4f3495cb, 0xba98d7a, 0x4f3495cc, 0x3400010},
9176{0x3400000, 0x4f3495cb, 0x751f853a, 0x751f853b, 0x3400010},
9177{0x3400000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
9178{0x3400000, 0x4f3495cb, 0x7f7fffff, 0x7f800000, 0x3400014},
9179{0x3400000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3400000},
9180{0x3400000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3400001},
9181{0x3400000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3400001},
9182{0x3400000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3400001},
9183{0x3400000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3400000},
9184{0x3400000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9185{0x3400000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3400000},
9186{0x3400000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3400000},
9187{0x3400000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3400080},
9188{0x3400000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3400080},
9189{0x3400000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3400080},
9190{0x3400000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3400080},
9191{0x3400000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3400080},
9192{0x3400000, 0x4f3495cb, 0x80800000, 0x4f3495cb, 0x3400010},
9193{0x3400000, 0x4f3495cb, 0x80800002, 0x4f3495cb, 0x3400010},
9194{0x3400000, 0x4f3495cb, 0x81398437, 0x4f3495cb, 0x3400010},
9195{0x3400000, 0x4f3495cb, 0x8ba98d27, 0x4f3495cb, 0x3400010},
9196{0x3400000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495cb, 0x3400010},
9197{0x3400000, 0x4f3495cb, 0xf51f853a, 0xf51f8539, 0x3400010},
9198{0x3400000, 0x4f3495cb, 0xff7ffff0, 0xff7fffef, 0x3400010},
9199{0x3400000, 0x4f3495cb, 0xff7fffff, 0xff7ffffe, 0x3400010},
9200{0x3400000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3400000},
9201{0x3400000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3400001},
9202{0x3400000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3400001},
9203{0x3400000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3400001},
9204{0x3400000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3400000},
9205{0x3400000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3400000},
9206{0x3400000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3400000},
9207{0x3400000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3400000},
9208{0x3400000, 0x4f3495cb, 0xe73a5134, 0xe73a5133, 0x3400010},
9209{0x3400000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9f, 0x3400010},
9210{0x3400000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6d, 0x3400010},
9211{0x3400000, 0x4f3495cb, 0x9503366, 0x4f3495cc, 0x3400010},
9212{0x3400000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495cb, 0x3400010},
9213{0x3400000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
9214{0x3400000, 0x4f3495cb, 0x77f31e2f, 0x77f31e30, 0x3400010},
9215{0x3400000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495cb, 0x3400010},
9216{0x3400000, 0x4f3495cb, 0x966320b, 0x4f3495cc, 0x3400010},
9217{0x3400000, 0x4f3495cb, 0xb26bddee, 0x4f3495cb, 0x3400010},
9218{0x3400000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495cb, 0x3400010},
9219{0x3400000, 0x4f3495cb, 0x317285d3, 0x4f3495cc, 0x3400010},
9220{0x3400000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cc, 0x3400010},
9221{0x3400000, 0x4f3495cb, 0x51fd2c7c, 0x52016896, 0x3400010},
9222{0x3400000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6d, 0x3400010},
9223{0x3400000, 0xe73a5134, 0x0, 0xe73a5134, 0x3400000},
9224{0x3400000, 0xe73a5134, 0x1, 0xe73a5134, 0x3400080},
9225{0x3400000, 0xe73a5134, 0x76, 0xe73a5134, 0x3400080},
9226{0x3400000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3400080},
9227{0x3400000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3400080},
9228{0x3400000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3400080},
9229{0x3400000, 0xe73a5134, 0x800000, 0xe73a5133, 0x3400010},
9230{0x3400000, 0xe73a5134, 0x800002, 0xe73a5133, 0x3400010},
9231{0x3400000, 0xe73a5134, 0x1398437, 0xe73a5133, 0x3400010},
9232{0x3400000, 0xe73a5134, 0xba98d27, 0xe73a5133, 0x3400010},
9233{0x3400000, 0xe73a5134, 0xba98d7a, 0xe73a5133, 0x3400010},
9234{0x3400000, 0xe73a5134, 0x751f853a, 0x751f853a, 0x3400010},
9235{0x3400000, 0xe73a5134, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
9236{0x3400000, 0xe73a5134, 0x7f7fffff, 0x7f7fffff, 0x3400010},
9237{0x3400000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3400000},
9238{0x3400000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3400001},
9239{0x3400000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3400001},
9240{0x3400000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3400001},
9241{0x3400000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3400000},
9242{0x3400000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9243{0x3400000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3400000},
9244{0x3400000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3400000},
9245{0x3400000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3400080},
9246{0x3400000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3400080},
9247{0x3400000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3400080},
9248{0x3400000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3400080},
9249{0x3400000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3400080},
9250{0x3400000, 0xe73a5134, 0x80800000, 0xe73a5134, 0x3400010},
9251{0x3400000, 0xe73a5134, 0x80800002, 0xe73a5134, 0x3400010},
9252{0x3400000, 0xe73a5134, 0x81398437, 0xe73a5134, 0x3400010},
9253{0x3400000, 0xe73a5134, 0x8ba98d27, 0xe73a5134, 0x3400010},
9254{0x3400000, 0xe73a5134, 0x8ba98d7a, 0xe73a5134, 0x3400010},
9255{0x3400000, 0xe73a5134, 0xf51f853a, 0xf51f853a, 0x3400010},
9256{0x3400000, 0xe73a5134, 0xff7ffff0, 0xff7ffff0, 0x3400010},
9257{0x3400000, 0xe73a5134, 0xff7fffff, 0xff7fffff, 0x3400010},
9258{0x3400000, 0xe73a5134, 0xff800000, 0xff800000, 0x3400000},
9259{0x3400000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3400001},
9260{0x3400000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3400001},
9261{0x3400000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3400001},
9262{0x3400000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3400000},
9263{0x3400000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3400000},
9264{0x3400000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3400000},
9265{0x3400000, 0xe73a5134, 0x4f3495cb, 0xe73a5133, 0x3400010},
9266{0x3400000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3400000},
9267{0x3400000, 0xe73a5134, 0x7c994e9e, 0x7c994e9e, 0x3400010},
9268{0x3400000, 0xe73a5134, 0x6164bd6c, 0xe73a42e8, 0x3400010},
9269{0x3400000, 0xe73a5134, 0x9503366, 0xe73a5133, 0x3400010},
9270{0x3400000, 0xe73a5134, 0xbf5a97c9, 0xe73a5134, 0x3400010},
9271{0x3400000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3400000},
9272{0x3400000, 0xe73a5134, 0x77f31e2f, 0x77f31e2f, 0x3400010},
9273{0x3400000, 0xe73a5134, 0xaab4d7d8, 0xe73a5134, 0x3400010},
9274{0x3400000, 0xe73a5134, 0x966320b, 0xe73a5133, 0x3400010},
9275{0x3400000, 0xe73a5134, 0xb26bddee, 0xe73a5134, 0x3400010},
9276{0x3400000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5134, 0x3400010},
9277{0x3400000, 0xe73a5134, 0x317285d3, 0xe73a5133, 0x3400010},
9278{0x3400000, 0xe73a5134, 0x3c9623b1, 0xe73a5133, 0x3400010},
9279{0x3400000, 0xe73a5134, 0x51fd2c7c, 0xe73a5133, 0x3400010},
9280{0x3400000, 0xe73a5134, 0x7b906a6c, 0x7b906a6c, 0x3400010},
9281{0x3400000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3400000},
9282{0x3400000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3400080},
9283{0x3400000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3400080},
9284{0x3400000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3400080},
9285{0x3400000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3400080},
9286{0x3400000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3400080},
9287{0x3400000, 0x7c994e9e, 0x800000, 0x7c994e9f, 0x3400010},
9288{0x3400000, 0x7c994e9e, 0x800002, 0x7c994e9f, 0x3400010},
9289{0x3400000, 0x7c994e9e, 0x1398437, 0x7c994e9f, 0x3400010},
9290{0x3400000, 0x7c994e9e, 0xba98d27, 0x7c994e9f, 0x3400010},
9291{0x3400000, 0x7c994e9e, 0xba98d7a, 0x7c994e9f, 0x3400010},
9292{0x3400000, 0x7c994e9e, 0x751f853a, 0x7c994fde, 0x3400010},
9293{0x3400000, 0x7c994e9e, 0x7f7ffff0, 0x7f800000, 0x3400014},
9294{0x3400000, 0x7c994e9e, 0x7f7fffff, 0x7f800000, 0x3400014},
9295{0x3400000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3400000},
9296{0x3400000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3400001},
9297{0x3400000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3400001},
9298{0x3400000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3400001},
9299{0x3400000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3400000},
9300{0x3400000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9301{0x3400000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3400000},
9302{0x3400000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3400000},
9303{0x3400000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3400080},
9304{0x3400000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3400080},
9305{0x3400000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3400080},
9306{0x3400000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3400080},
9307{0x3400000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3400080},
9308{0x3400000, 0x7c994e9e, 0x80800000, 0x7c994e9e, 0x3400010},
9309{0x3400000, 0x7c994e9e, 0x80800002, 0x7c994e9e, 0x3400010},
9310{0x3400000, 0x7c994e9e, 0x81398437, 0x7c994e9e, 0x3400010},
9311{0x3400000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9e, 0x3400010},
9312{0x3400000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9e, 0x3400010},
9313{0x3400000, 0x7c994e9e, 0xf51f853a, 0x7c994d5f, 0x3400010},
9314{0x3400000, 0x7c994e9e, 0xff7ffff0, 0xff7b357b, 0x3400010},
9315{0x3400000, 0x7c994e9e, 0xff7fffff, 0xff7b358a, 0x3400010},
9316{0x3400000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3400000},
9317{0x3400000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3400001},
9318{0x3400000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3400001},
9319{0x3400000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3400001},
9320{0x3400000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3400000},
9321{0x3400000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3400000},
9322{0x3400000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3400000},
9323{0x3400000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9f, 0x3400010},
9324{0x3400000, 0x7c994e9e, 0xe73a5134, 0x7c994e9e, 0x3400010},
9325{0x3400000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3400000},
9326{0x3400000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9f, 0x3400010},
9327{0x3400000, 0x7c994e9e, 0x9503366, 0x7c994e9f, 0x3400010},
9328{0x3400000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9e, 0x3400010},
9329{0x3400000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9e, 0x3400010},
9330{0x3400000, 0x7c994e9e, 0x77f31e2f, 0x7c998b66, 0x3400010},
9331{0x3400000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9e, 0x3400010},
9332{0x3400000, 0x7c994e9e, 0x966320b, 0x7c994e9f, 0x3400010},
9333{0x3400000, 0x7c994e9e, 0xb26bddee, 0x7c994e9e, 0x3400010},
9334{0x3400000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9e, 0x3400010},
9335{0x3400000, 0x7c994e9e, 0x317285d3, 0x7c994e9f, 0x3400010},
9336{0x3400000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9f, 0x3400010},
9337{0x3400000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9f, 0x3400010},
9338{0x3400000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3400000},
9339{0x3400000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3400000},
9340{0x3400000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3400080},
9341{0x3400000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3400080},
9342{0x3400000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3400080},
9343{0x3400000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3400080},
9344{0x3400000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3400080},
9345{0x3400000, 0x6164bd6c, 0x800000, 0x6164bd6d, 0x3400010},
9346{0x3400000, 0x6164bd6c, 0x800002, 0x6164bd6d, 0x3400010},
9347{0x3400000, 0x6164bd6c, 0x1398437, 0x6164bd6d, 0x3400010},
9348{0x3400000, 0x6164bd6c, 0xba98d27, 0x6164bd6d, 0x3400010},
9349{0x3400000, 0x6164bd6c, 0xba98d7a, 0x6164bd6d, 0x3400010},
9350{0x3400000, 0x6164bd6c, 0x751f853a, 0x751f853b, 0x3400010},
9351{0x3400000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
9352{0x3400000, 0x6164bd6c, 0x7f7fffff, 0x7f800000, 0x3400014},
9353{0x3400000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3400000},
9354{0x3400000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3400001},
9355{0x3400000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3400001},
9356{0x3400000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3400001},
9357{0x3400000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3400000},
9358{0x3400000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9359{0x3400000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3400000},
9360{0x3400000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3400000},
9361{0x3400000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3400080},
9362{0x3400000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3400080},
9363{0x3400000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3400080},
9364{0x3400000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3400080},
9365{0x3400000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3400080},
9366{0x3400000, 0x6164bd6c, 0x80800000, 0x6164bd6c, 0x3400010},
9367{0x3400000, 0x6164bd6c, 0x80800002, 0x6164bd6c, 0x3400010},
9368{0x3400000, 0x6164bd6c, 0x81398437, 0x6164bd6c, 0x3400010},
9369{0x3400000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6c, 0x3400010},
9370{0x3400000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6c, 0x3400010},
9371{0x3400000, 0x6164bd6c, 0xf51f853a, 0xf51f8539, 0x3400010},
9372{0x3400000, 0x6164bd6c, 0xff7ffff0, 0xff7fffef, 0x3400010},
9373{0x3400000, 0x6164bd6c, 0xff7fffff, 0xff7ffffe, 0x3400010},
9374{0x3400000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3400000},
9375{0x3400000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3400001},
9376{0x3400000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3400001},
9377{0x3400000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3400001},
9378{0x3400000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3400000},
9379{0x3400000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3400000},
9380{0x3400000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3400000},
9381{0x3400000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6d, 0x3400010},
9382{0x3400000, 0x6164bd6c, 0xe73a5134, 0xe73a42e8, 0x3400010},
9383{0x3400000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9f, 0x3400010},
9384{0x3400000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3400000},
9385{0x3400000, 0x6164bd6c, 0x9503366, 0x6164bd6d, 0x3400010},
9386{0x3400000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6c, 0x3400010},
9387{0x3400000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7c, 0x3400010},
9388{0x3400000, 0x6164bd6c, 0x77f31e2f, 0x77f31e30, 0x3400010},
9389{0x3400000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6c, 0x3400010},
9390{0x3400000, 0x6164bd6c, 0x966320b, 0x6164bd6d, 0x3400010},
9391{0x3400000, 0x6164bd6c, 0xb26bddee, 0x6164bd6c, 0x3400010},
9392{0x3400000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6c, 0x3400010},
9393{0x3400000, 0x6164bd6c, 0x317285d3, 0x6164bd6d, 0x3400010},
9394{0x3400000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6d, 0x3400010},
9395{0x3400000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6d, 0x3400010},
9396{0x3400000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6d, 0x3400010},
9397{0x3400000, 0x9503366, 0x0, 0x9503366, 0x3400000},
9398{0x3400000, 0x9503366, 0x1, 0x9503366, 0x3400080},
9399{0x3400000, 0x9503366, 0x76, 0x9503366, 0x3400080},
9400{0x3400000, 0x9503366, 0x2b94, 0x9503366, 0x3400080},
9401{0x3400000, 0x9503366, 0x636d24, 0x9503366, 0x3400080},
9402{0x3400000, 0x9503366, 0x7fffff, 0x9503366, 0x3400080},
9403{0x3400000, 0x9503366, 0x800000, 0x95033a6, 0x3400000},
9404{0x3400000, 0x9503366, 0x800002, 0x95033a7, 0x3400010},
9405{0x3400000, 0x9503366, 0x1398437, 0x9503420, 0x3400010},
9406{0x3400000, 0x9503366, 0xba98d27, 0xbb00ec3, 0x3400010},
9407{0x3400000, 0x9503366, 0xba98d7a, 0xbb00f16, 0x3400010},
9408{0x3400000, 0x9503366, 0x751f853a, 0x751f853b, 0x3400010},
9409{0x3400000, 0x9503366, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
9410{0x3400000, 0x9503366, 0x7f7fffff, 0x7f800000, 0x3400014},
9411{0x3400000, 0x9503366, 0x7f800000, 0x7f800000, 0x3400000},
9412{0x3400000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3400001},
9413{0x3400000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3400001},
9414{0x3400000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3400001},
9415{0x3400000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3400000},
9416{0x3400000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9417{0x3400000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3400000},
9418{0x3400000, 0x9503366, 0x80000000, 0x9503366, 0x3400000},
9419{0x3400000, 0x9503366, 0x80000001, 0x9503366, 0x3400080},
9420{0x3400000, 0x9503366, 0x80000076, 0x9503366, 0x3400080},
9421{0x3400000, 0x9503366, 0x80002b94, 0x9503366, 0x3400080},
9422{0x3400000, 0x9503366, 0x80636d24, 0x9503366, 0x3400080},
9423{0x3400000, 0x9503366, 0x807fffff, 0x9503366, 0x3400080},
9424{0x3400000, 0x9503366, 0x80800000, 0x9503326, 0x3400000},
9425{0x3400000, 0x9503366, 0x80800002, 0x9503326, 0x3400010},
9426{0x3400000, 0x9503366, 0x81398437, 0x95032ad, 0x3400010},
9427{0x3400000, 0x9503366, 0x8ba98d27, 0x8ba30b8b, 0x3400010},
9428{0x3400000, 0x9503366, 0x8ba98d7a, 0x8ba30bde, 0x3400010},
9429{0x3400000, 0x9503366, 0xf51f853a, 0xf51f8539, 0x3400010},
9430{0x3400000, 0x9503366, 0xff7ffff0, 0xff7fffef, 0x3400010},
9431{0x3400000, 0x9503366, 0xff7fffff, 0xff7ffffe, 0x3400010},
9432{0x3400000, 0x9503366, 0xff800000, 0xff800000, 0x3400000},
9433{0x3400000, 0x9503366, 0xff800001, 0x7fc00000, 0x3400001},
9434{0x3400000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3400001},
9435{0x3400000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3400001},
9436{0x3400000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3400000},
9437{0x3400000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3400000},
9438{0x3400000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3400000},
9439{0x3400000, 0x9503366, 0x4f3495cb, 0x4f3495cc, 0x3400010},
9440{0x3400000, 0x9503366, 0xe73a5134, 0xe73a5133, 0x3400010},
9441{0x3400000, 0x9503366, 0x7c994e9e, 0x7c994e9f, 0x3400010},
9442{0x3400000, 0x9503366, 0x6164bd6c, 0x6164bd6d, 0x3400010},
9443{0x3400000, 0x9503366, 0x9503366, 0x9d03366, 0x3400000},
9444{0x3400000, 0x9503366, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
9445{0x3400000, 0x9503366, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
9446{0x3400000, 0x9503366, 0x77f31e2f, 0x77f31e30, 0x3400010},
9447{0x3400000, 0x9503366, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
9448{0x3400000, 0x9503366, 0x966320b, 0x9db32b9, 0x3400010},
9449{0x3400000, 0x9503366, 0xb26bddee, 0xb26bdded, 0x3400010},
9450{0x3400000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
9451{0x3400000, 0x9503366, 0x317285d3, 0x317285d4, 0x3400010},
9452{0x3400000, 0x9503366, 0x3c9623b1, 0x3c9623b2, 0x3400010},
9453{0x3400000, 0x9503366, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
9454{0x3400000, 0x9503366, 0x7b906a6c, 0x7b906a6d, 0x3400010},
9455{0x3400000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3400000},
9456{0x3400000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3400080},
9457{0x3400000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3400080},
9458{0x3400000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3400080},
9459{0x3400000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3400080},
9460{0x3400000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3400080},
9461{0x3400000, 0xbf5a97c9, 0x800000, 0xbf5a97c8, 0x3400010},
9462{0x3400000, 0xbf5a97c9, 0x800002, 0xbf5a97c8, 0x3400010},
9463{0x3400000, 0xbf5a97c9, 0x1398437, 0xbf5a97c8, 0x3400010},
9464{0x3400000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c8, 0x3400010},
9465{0x3400000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c8, 0x3400010},
9466{0x3400000, 0xbf5a97c9, 0x751f853a, 0x751f853a, 0x3400010},
9467{0x3400000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
9468{0x3400000, 0xbf5a97c9, 0x7f7fffff, 0x7f7fffff, 0x3400010},
9469{0x3400000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3400000},
9470{0x3400000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3400001},
9471{0x3400000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3400001},
9472{0x3400000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3400001},
9473{0x3400000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3400000},
9474{0x3400000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9475{0x3400000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3400000},
9476{0x3400000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3400000},
9477{0x3400000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3400080},
9478{0x3400000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3400080},
9479{0x3400000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3400080},
9480{0x3400000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3400080},
9481{0x3400000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3400080},
9482{0x3400000, 0xbf5a97c9, 0x80800000, 0xbf5a97c9, 0x3400010},
9483{0x3400000, 0xbf5a97c9, 0x80800002, 0xbf5a97c9, 0x3400010},
9484{0x3400000, 0xbf5a97c9, 0x81398437, 0xbf5a97c9, 0x3400010},
9485{0x3400000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97c9, 0x3400010},
9486{0x3400000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97c9, 0x3400010},
9487{0x3400000, 0xbf5a97c9, 0xf51f853a, 0xf51f853a, 0x3400010},
9488{0x3400000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff0, 0x3400010},
9489{0x3400000, 0xbf5a97c9, 0xff7fffff, 0xff7fffff, 0x3400010},
9490{0x3400000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3400000},
9491{0x3400000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3400001},
9492{0x3400000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3400001},
9493{0x3400000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3400001},
9494{0x3400000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3400000},
9495{0x3400000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3400000},
9496{0x3400000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3400000},
9497{0x3400000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495cb, 0x3400010},
9498{0x3400000, 0xbf5a97c9, 0xe73a5134, 0xe73a5134, 0x3400010},
9499{0x3400000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9e, 0x3400010},
9500{0x3400000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6c, 0x3400010},
9501{0x3400000, 0xbf5a97c9, 0x9503366, 0xbf5a97c8, 0x3400010},
9502{0x3400000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3400000},
9503{0x3400000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
9504{0x3400000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2f, 0x3400010},
9505{0x3400000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97c9, 0x3400010},
9506{0x3400000, 0xbf5a97c9, 0x966320b, 0xbf5a97c8, 0x3400010},
9507{0x3400000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97c9, 0x3400010},
9508{0x3400000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e2, 0x3400010},
9509{0x3400000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c8, 0x3400010},
9510{0x3400000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ab, 0x3400010},
9511{0x3400000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
9512{0x3400000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6c, 0x3400010},
9513{0x3400000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3400000},
9514{0x3400000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3400080},
9515{0x3400000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3400080},
9516{0x3400000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3400080},
9517{0x3400000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3400080},
9518{0x3400000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3400080},
9519{0x3400000, 0xe6ff1a14, 0x800000, 0xe6ff1a13, 0x3400010},
9520{0x3400000, 0xe6ff1a14, 0x800002, 0xe6ff1a13, 0x3400010},
9521{0x3400000, 0xe6ff1a14, 0x1398437, 0xe6ff1a13, 0x3400010},
9522{0x3400000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a13, 0x3400010},
9523{0x3400000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a13, 0x3400010},
9524{0x3400000, 0xe6ff1a14, 0x751f853a, 0x751f853a, 0x3400010},
9525{0x3400000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
9526{0x3400000, 0xe6ff1a14, 0x7f7fffff, 0x7f7fffff, 0x3400010},
9527{0x3400000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3400000},
9528{0x3400000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3400001},
9529{0x3400000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3400001},
9530{0x3400000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3400001},
9531{0x3400000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3400000},
9532{0x3400000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9533{0x3400000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3400000},
9534{0x3400000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3400000},
9535{0x3400000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3400080},
9536{0x3400000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3400080},
9537{0x3400000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3400080},
9538{0x3400000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3400080},
9539{0x3400000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3400080},
9540{0x3400000, 0xe6ff1a14, 0x80800000, 0xe6ff1a14, 0x3400010},
9541{0x3400000, 0xe6ff1a14, 0x80800002, 0xe6ff1a14, 0x3400010},
9542{0x3400000, 0xe6ff1a14, 0x81398437, 0xe6ff1a14, 0x3400010},
9543{0x3400000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a14, 0x3400010},
9544{0x3400000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a14, 0x3400010},
9545{0x3400000, 0xe6ff1a14, 0xf51f853a, 0xf51f853a, 0x3400010},
9546{0x3400000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff0, 0x3400010},
9547{0x3400000, 0xe6ff1a14, 0xff7fffff, 0xff7fffff, 0x3400010},
9548{0x3400000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3400000},
9549{0x3400000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3400001},
9550{0x3400000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3400001},
9551{0x3400000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3400001},
9552{0x3400000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3400000},
9553{0x3400000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3400000},
9554{0x3400000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3400000},
9555{0x3400000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a13, 0x3400010},
9556{0x3400000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3400000},
9557{0x3400000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9e, 0x3400010},
9558{0x3400000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7c, 0x3400010},
9559{0x3400000, 0xe6ff1a14, 0x9503366, 0xe6ff1a13, 0x3400010},
9560{0x3400000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a14, 0x3400010},
9561{0x3400000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3400000},
9562{0x3400000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2f, 0x3400010},
9563{0x3400000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a14, 0x3400010},
9564{0x3400000, 0xe6ff1a14, 0x966320b, 0xe6ff1a13, 0x3400010},
9565{0x3400000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a14, 0x3400010},
9566{0x3400000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a14, 0x3400010},
9567{0x3400000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a13, 0x3400010},
9568{0x3400000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a13, 0x3400010},
9569{0x3400000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a13, 0x3400010},
9570{0x3400000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6c, 0x3400010},
9571{0x3400000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3400000},
9572{0x3400000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3400080},
9573{0x3400000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3400080},
9574{0x3400000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3400080},
9575{0x3400000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3400080},
9576{0x3400000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3400080},
9577{0x3400000, 0x77f31e2f, 0x800000, 0x77f31e30, 0x3400010},
9578{0x3400000, 0x77f31e2f, 0x800002, 0x77f31e30, 0x3400010},
9579{0x3400000, 0x77f31e2f, 0x1398437, 0x77f31e30, 0x3400010},
9580{0x3400000, 0x77f31e2f, 0xba98d27, 0x77f31e30, 0x3400010},
9581{0x3400000, 0x77f31e2f, 0xba98d7a, 0x77f31e30, 0x3400010},
9582{0x3400000, 0x77f31e2f, 0x751f853a, 0x77f81a59, 0x3400010},
9583{0x3400000, 0x77f31e2f, 0x7f7ffff0, 0x7f800000, 0x3400014},
9584{0x3400000, 0x77f31e2f, 0x7f7fffff, 0x7f800000, 0x3400014},
9585{0x3400000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3400000},
9586{0x3400000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3400001},
9587{0x3400000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3400001},
9588{0x3400000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3400001},
9589{0x3400000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3400000},
9590{0x3400000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9591{0x3400000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3400000},
9592{0x3400000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3400000},
9593{0x3400000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3400080},
9594{0x3400000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3400080},
9595{0x3400000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3400080},
9596{0x3400000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3400080},
9597{0x3400000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3400080},
9598{0x3400000, 0x77f31e2f, 0x80800000, 0x77f31e2f, 0x3400010},
9599{0x3400000, 0x77f31e2f, 0x80800002, 0x77f31e2f, 0x3400010},
9600{0x3400000, 0x77f31e2f, 0x81398437, 0x77f31e2f, 0x3400010},
9601{0x3400000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2f, 0x3400010},
9602{0x3400000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2f, 0x3400010},
9603{0x3400000, 0x77f31e2f, 0xf51f853a, 0x77ee2206, 0x3400010},
9604{0x3400000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe09, 0x3400010},
9605{0x3400000, 0x77f31e2f, 0xff7fffff, 0xff7ffe18, 0x3400010},
9606{0x3400000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3400000},
9607{0x3400000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3400001},
9608{0x3400000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3400001},
9609{0x3400000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3400001},
9610{0x3400000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3400000},
9611{0x3400000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3400000},
9612{0x3400000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3400000},
9613{0x3400000, 0x77f31e2f, 0x4f3495cb, 0x77f31e30, 0x3400010},
9614{0x3400000, 0x77f31e2f, 0xe73a5134, 0x77f31e2f, 0x3400010},
9615{0x3400000, 0x77f31e2f, 0x7c994e9e, 0x7c998b66, 0x3400010},
9616{0x3400000, 0x77f31e2f, 0x6164bd6c, 0x77f31e30, 0x3400010},
9617{0x3400000, 0x77f31e2f, 0x9503366, 0x77f31e30, 0x3400010},
9618{0x3400000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2f, 0x3400010},
9619{0x3400000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2f, 0x3400010},
9620{0x3400000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3400000},
9621{0x3400000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2f, 0x3400010},
9622{0x3400000, 0x77f31e2f, 0x966320b, 0x77f31e30, 0x3400010},
9623{0x3400000, 0x77f31e2f, 0xb26bddee, 0x77f31e2f, 0x3400010},
9624{0x3400000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2f, 0x3400010},
9625{0x3400000, 0x77f31e2f, 0x317285d3, 0x77f31e30, 0x3400010},
9626{0x3400000, 0x77f31e2f, 0x3c9623b1, 0x77f31e30, 0x3400010},
9627{0x3400000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e30, 0x3400010},
9628{0x3400000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8b, 0x3400010},
9629{0x3400000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3400000},
9630{0x3400000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3400080},
9631{0x3400000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3400080},
9632{0x3400000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3400080},
9633{0x3400000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3400080},
9634{0x3400000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3400080},
9635{0x3400000, 0xaab4d7d8, 0x800000, 0xaab4d7d7, 0x3400010},
9636{0x3400000, 0xaab4d7d8, 0x800002, 0xaab4d7d7, 0x3400010},
9637{0x3400000, 0xaab4d7d8, 0x1398437, 0xaab4d7d7, 0x3400010},
9638{0x3400000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d7, 0x3400010},
9639{0x3400000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d7, 0x3400010},
9640{0x3400000, 0xaab4d7d8, 0x751f853a, 0x751f853a, 0x3400010},
9641{0x3400000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
9642{0x3400000, 0xaab4d7d8, 0x7f7fffff, 0x7f7fffff, 0x3400010},
9643{0x3400000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3400000},
9644{0x3400000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3400001},
9645{0x3400000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3400001},
9646{0x3400000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3400001},
9647{0x3400000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3400000},
9648{0x3400000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9649{0x3400000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3400000},
9650{0x3400000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3400000},
9651{0x3400000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3400080},
9652{0x3400000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3400080},
9653{0x3400000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3400080},
9654{0x3400000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3400080},
9655{0x3400000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3400080},
9656{0x3400000, 0xaab4d7d8, 0x80800000, 0xaab4d7d8, 0x3400010},
9657{0x3400000, 0xaab4d7d8, 0x80800002, 0xaab4d7d8, 0x3400010},
9658{0x3400000, 0xaab4d7d8, 0x81398437, 0xaab4d7d8, 0x3400010},
9659{0x3400000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d8, 0x3400010},
9660{0x3400000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d8, 0x3400010},
9661{0x3400000, 0xaab4d7d8, 0xf51f853a, 0xf51f853a, 0x3400010},
9662{0x3400000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff0, 0x3400010},
9663{0x3400000, 0xaab4d7d8, 0xff7fffff, 0xff7fffff, 0x3400010},
9664{0x3400000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3400000},
9665{0x3400000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3400001},
9666{0x3400000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3400001},
9667{0x3400000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3400001},
9668{0x3400000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3400000},
9669{0x3400000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3400000},
9670{0x3400000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3400000},
9671{0x3400000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495cb, 0x3400010},
9672{0x3400000, 0xaab4d7d8, 0xe73a5134, 0xe73a5134, 0x3400010},
9673{0x3400000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9e, 0x3400010},
9674{0x3400000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6c, 0x3400010},
9675{0x3400000, 0xaab4d7d8, 0x9503366, 0xaab4d7d7, 0x3400010},
9676{0x3400000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
9677{0x3400000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
9678{0x3400000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2f, 0x3400010},
9679{0x3400000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3400000},
9680{0x3400000, 0xaab4d7d8, 0x966320b, 0xaab4d7d7, 0x3400010},
9681{0x3400000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf57, 0x3400010},
9682{0x3400000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d5, 0x3400010},
9683{0x3400000, 0xaab4d7d8, 0x317285d3, 0x3172802d, 0x3400010},
9684{0x3400000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b1, 0x3400010},
9685{0x3400000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
9686{0x3400000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6c, 0x3400010},
9687{0x3400000, 0x966320b, 0x0, 0x966320b, 0x3400000},
9688{0x3400000, 0x966320b, 0x1, 0x966320b, 0x3400080},
9689{0x3400000, 0x966320b, 0x76, 0x966320b, 0x3400080},
9690{0x3400000, 0x966320b, 0x2b94, 0x966320b, 0x3400080},
9691{0x3400000, 0x966320b, 0x636d24, 0x966320b, 0x3400080},
9692{0x3400000, 0x966320b, 0x7fffff, 0x966320b, 0x3400080},
9693{0x3400000, 0x966320b, 0x800000, 0x966324b, 0x3400000},
9694{0x3400000, 0x966320b, 0x800002, 0x966324c, 0x3400010},
9695{0x3400000, 0x966320b, 0x1398437, 0x96632c5, 0x3400010},
9696{0x3400000, 0x966320b, 0xba98d27, 0xbb0beb8, 0x3400010},
9697{0x3400000, 0x966320b, 0xba98d7a, 0xbb0bf0b, 0x3400010},
9698{0x3400000, 0x966320b, 0x751f853a, 0x751f853b, 0x3400010},
9699{0x3400000, 0x966320b, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
9700{0x3400000, 0x966320b, 0x7f7fffff, 0x7f800000, 0x3400014},
9701{0x3400000, 0x966320b, 0x7f800000, 0x7f800000, 0x3400000},
9702{0x3400000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3400001},
9703{0x3400000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3400001},
9704{0x3400000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3400001},
9705{0x3400000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3400000},
9706{0x3400000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9707{0x3400000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3400000},
9708{0x3400000, 0x966320b, 0x80000000, 0x966320b, 0x3400000},
9709{0x3400000, 0x966320b, 0x80000001, 0x966320b, 0x3400080},
9710{0x3400000, 0x966320b, 0x80000076, 0x966320b, 0x3400080},
9711{0x3400000, 0x966320b, 0x80002b94, 0x966320b, 0x3400080},
9712{0x3400000, 0x966320b, 0x80636d24, 0x966320b, 0x3400080},
9713{0x3400000, 0x966320b, 0x807fffff, 0x966320b, 0x3400080},
9714{0x3400000, 0x966320b, 0x80800000, 0x96631cb, 0x3400000},
9715{0x3400000, 0x966320b, 0x80800002, 0x96631cb, 0x3400010},
9716{0x3400000, 0x966320b, 0x81398437, 0x9663152, 0x3400010},
9717{0x3400000, 0x966320b, 0x8ba98d27, 0x8ba25b96, 0x3400010},
9718{0x3400000, 0x966320b, 0x8ba98d7a, 0x8ba25be9, 0x3400010},
9719{0x3400000, 0x966320b, 0xf51f853a, 0xf51f8539, 0x3400010},
9720{0x3400000, 0x966320b, 0xff7ffff0, 0xff7fffef, 0x3400010},
9721{0x3400000, 0x966320b, 0xff7fffff, 0xff7ffffe, 0x3400010},
9722{0x3400000, 0x966320b, 0xff800000, 0xff800000, 0x3400000},
9723{0x3400000, 0x966320b, 0xff800001, 0x7fc00000, 0x3400001},
9724{0x3400000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3400001},
9725{0x3400000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3400001},
9726{0x3400000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3400000},
9727{0x3400000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3400000},
9728{0x3400000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3400000},
9729{0x3400000, 0x966320b, 0x4f3495cb, 0x4f3495cc, 0x3400010},
9730{0x3400000, 0x966320b, 0xe73a5134, 0xe73a5133, 0x3400010},
9731{0x3400000, 0x966320b, 0x7c994e9e, 0x7c994e9f, 0x3400010},
9732{0x3400000, 0x966320b, 0x6164bd6c, 0x6164bd6d, 0x3400010},
9733{0x3400000, 0x966320b, 0x9503366, 0x9db32b9, 0x3400010},
9734{0x3400000, 0x966320b, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
9735{0x3400000, 0x966320b, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
9736{0x3400000, 0x966320b, 0x77f31e2f, 0x77f31e30, 0x3400010},
9737{0x3400000, 0x966320b, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
9738{0x3400000, 0x966320b, 0x966320b, 0x9e6320b, 0x3400000},
9739{0x3400000, 0x966320b, 0xb26bddee, 0xb26bdded, 0x3400010},
9740{0x3400000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
9741{0x3400000, 0x966320b, 0x317285d3, 0x317285d4, 0x3400010},
9742{0x3400000, 0x966320b, 0x3c9623b1, 0x3c9623b2, 0x3400010},
9743{0x3400000, 0x966320b, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
9744{0x3400000, 0x966320b, 0x7b906a6c, 0x7b906a6d, 0x3400010},
9745{0x3400000, 0xb26bddee, 0x0, 0xb26bddee, 0x3400000},
9746{0x3400000, 0xb26bddee, 0x1, 0xb26bddee, 0x3400080},
9747{0x3400000, 0xb26bddee, 0x76, 0xb26bddee, 0x3400080},
9748{0x3400000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3400080},
9749{0x3400000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3400080},
9750{0x3400000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3400080},
9751{0x3400000, 0xb26bddee, 0x800000, 0xb26bdded, 0x3400010},
9752{0x3400000, 0xb26bddee, 0x800002, 0xb26bdded, 0x3400010},
9753{0x3400000, 0xb26bddee, 0x1398437, 0xb26bdded, 0x3400010},
9754{0x3400000, 0xb26bddee, 0xba98d27, 0xb26bdded, 0x3400010},
9755{0x3400000, 0xb26bddee, 0xba98d7a, 0xb26bdded, 0x3400010},
9756{0x3400000, 0xb26bddee, 0x751f853a, 0x751f853a, 0x3400010},
9757{0x3400000, 0xb26bddee, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
9758{0x3400000, 0xb26bddee, 0x7f7fffff, 0x7f7fffff, 0x3400010},
9759{0x3400000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3400000},
9760{0x3400000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3400001},
9761{0x3400000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3400001},
9762{0x3400000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3400001},
9763{0x3400000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3400000},
9764{0x3400000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9765{0x3400000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3400000},
9766{0x3400000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3400000},
9767{0x3400000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3400080},
9768{0x3400000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3400080},
9769{0x3400000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3400080},
9770{0x3400000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3400080},
9771{0x3400000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3400080},
9772{0x3400000, 0xb26bddee, 0x80800000, 0xb26bddee, 0x3400010},
9773{0x3400000, 0xb26bddee, 0x80800002, 0xb26bddee, 0x3400010},
9774{0x3400000, 0xb26bddee, 0x81398437, 0xb26bddee, 0x3400010},
9775{0x3400000, 0xb26bddee, 0x8ba98d27, 0xb26bddee, 0x3400010},
9776{0x3400000, 0xb26bddee, 0x8ba98d7a, 0xb26bddee, 0x3400010},
9777{0x3400000, 0xb26bddee, 0xf51f853a, 0xf51f853a, 0x3400010},
9778{0x3400000, 0xb26bddee, 0xff7ffff0, 0xff7ffff0, 0x3400010},
9779{0x3400000, 0xb26bddee, 0xff7fffff, 0xff7fffff, 0x3400010},
9780{0x3400000, 0xb26bddee, 0xff800000, 0xff800000, 0x3400000},
9781{0x3400000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3400001},
9782{0x3400000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3400001},
9783{0x3400000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3400001},
9784{0x3400000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3400000},
9785{0x3400000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3400000},
9786{0x3400000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3400000},
9787{0x3400000, 0xb26bddee, 0x4f3495cb, 0x4f3495cb, 0x3400010},
9788{0x3400000, 0xb26bddee, 0xe73a5134, 0xe73a5134, 0x3400010},
9789{0x3400000, 0xb26bddee, 0x7c994e9e, 0x7c994e9e, 0x3400010},
9790{0x3400000, 0xb26bddee, 0x6164bd6c, 0x6164bd6c, 0x3400010},
9791{0x3400000, 0xb26bddee, 0x9503366, 0xb26bdded, 0x3400010},
9792{0x3400000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
9793{0x3400000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
9794{0x3400000, 0xb26bddee, 0x77f31e2f, 0x77f31e2f, 0x3400010},
9795{0x3400000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf57, 0x3400010},
9796{0x3400000, 0xb26bddee, 0x966320b, 0xb26bdded, 0x3400010},
9797{0x3400000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3400000},
9798{0x3400000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8e, 0x3400010},
9799{0x3400000, 0xb26bddee, 0x317285d3, 0xb22f3c79, 0x3400010},
9800{0x3400000, 0xb26bddee, 0x3c9623b1, 0x3c9623aa, 0x3400010},
9801{0x3400000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
9802{0x3400000, 0xb26bddee, 0x7b906a6c, 0x7b906a6c, 0x3400010},
9803{0x3400000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3400000},
9804{0x3400000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3400080},
9805{0x3400000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3400080},
9806{0x3400000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3400080},
9807{0x3400000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3400080},
9808{0x3400000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3400080},
9809{0x3400000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d2, 0x3400010},
9810{0x3400000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d2, 0x3400010},
9811{0x3400000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d2, 0x3400010},
9812{0x3400000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d2, 0x3400010},
9813{0x3400000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d2, 0x3400010},
9814{0x3400000, 0xb5c8e5d3, 0x751f853a, 0x751f853a, 0x3400010},
9815{0x3400000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
9816{0x3400000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7fffff, 0x3400010},
9817{0x3400000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3400000},
9818{0x3400000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3400001},
9819{0x3400000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3400001},
9820{0x3400000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3400001},
9821{0x3400000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3400000},
9822{0x3400000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9823{0x3400000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3400000},
9824{0x3400000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3400000},
9825{0x3400000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3400080},
9826{0x3400000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3400080},
9827{0x3400000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3400080},
9828{0x3400000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3400080},
9829{0x3400000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3400080},
9830{0x3400000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d3, 0x3400010},
9831{0x3400000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d3, 0x3400010},
9832{0x3400000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d3, 0x3400010},
9833{0x3400000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d3, 0x3400010},
9834{0x3400000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d3, 0x3400010},
9835{0x3400000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853a, 0x3400010},
9836{0x3400000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff0, 0x3400010},
9837{0x3400000, 0xb5c8e5d3, 0xff7fffff, 0xff7fffff, 0x3400010},
9838{0x3400000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3400000},
9839{0x3400000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3400001},
9840{0x3400000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3400001},
9841{0x3400000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3400001},
9842{0x3400000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3400000},
9843{0x3400000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3400000},
9844{0x3400000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3400000},
9845{0x3400000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495cb, 0x3400010},
9846{0x3400000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5134, 0x3400010},
9847{0x3400000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9e, 0x3400010},
9848{0x3400000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6c, 0x3400010},
9849{0x3400000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d2, 0x3400010},
9850{0x3400000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e2, 0x3400010},
9851{0x3400000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
9852{0x3400000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2f, 0x3400010},
9853{0x3400000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d5, 0x3400010},
9854{0x3400000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d2, 0x3400010},
9855{0x3400000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8e, 0x3400010},
9856{0x3400000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3400000},
9857{0x3400000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c90, 0x3400010},
9858{0x3400000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208e, 0x3400010},
9859{0x3400000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
9860{0x3400000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6c, 0x3400010},
9861{0x3400000, 0x317285d3, 0x0, 0x317285d3, 0x3400000},
9862{0x3400000, 0x317285d3, 0x1, 0x317285d3, 0x3400080},
9863{0x3400000, 0x317285d3, 0x76, 0x317285d3, 0x3400080},
9864{0x3400000, 0x317285d3, 0x2b94, 0x317285d3, 0x3400080},
9865{0x3400000, 0x317285d3, 0x636d24, 0x317285d3, 0x3400080},
9866{0x3400000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3400080},
9867{0x3400000, 0x317285d3, 0x800000, 0x317285d4, 0x3400010},
9868{0x3400000, 0x317285d3, 0x800002, 0x317285d4, 0x3400010},
9869{0x3400000, 0x317285d3, 0x1398437, 0x317285d4, 0x3400010},
9870{0x3400000, 0x317285d3, 0xba98d27, 0x317285d4, 0x3400010},
9871{0x3400000, 0x317285d3, 0xba98d7a, 0x317285d4, 0x3400010},
9872{0x3400000, 0x317285d3, 0x751f853a, 0x751f853b, 0x3400010},
9873{0x3400000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
9874{0x3400000, 0x317285d3, 0x7f7fffff, 0x7f800000, 0x3400014},
9875{0x3400000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3400000},
9876{0x3400000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3400001},
9877{0x3400000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3400001},
9878{0x3400000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3400001},
9879{0x3400000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3400000},
9880{0x3400000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9881{0x3400000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3400000},
9882{0x3400000, 0x317285d3, 0x80000000, 0x317285d3, 0x3400000},
9883{0x3400000, 0x317285d3, 0x80000001, 0x317285d3, 0x3400080},
9884{0x3400000, 0x317285d3, 0x80000076, 0x317285d3, 0x3400080},
9885{0x3400000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3400080},
9886{0x3400000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3400080},
9887{0x3400000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3400080},
9888{0x3400000, 0x317285d3, 0x80800000, 0x317285d3, 0x3400010},
9889{0x3400000, 0x317285d3, 0x80800002, 0x317285d3, 0x3400010},
9890{0x3400000, 0x317285d3, 0x81398437, 0x317285d3, 0x3400010},
9891{0x3400000, 0x317285d3, 0x8ba98d27, 0x317285d3, 0x3400010},
9892{0x3400000, 0x317285d3, 0x8ba98d7a, 0x317285d3, 0x3400010},
9893{0x3400000, 0x317285d3, 0xf51f853a, 0xf51f8539, 0x3400010},
9894{0x3400000, 0x317285d3, 0xff7ffff0, 0xff7fffef, 0x3400010},
9895{0x3400000, 0x317285d3, 0xff7fffff, 0xff7ffffe, 0x3400010},
9896{0x3400000, 0x317285d3, 0xff800000, 0xff800000, 0x3400000},
9897{0x3400000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3400001},
9898{0x3400000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3400001},
9899{0x3400000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3400001},
9900{0x3400000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3400000},
9901{0x3400000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3400000},
9902{0x3400000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3400000},
9903{0x3400000, 0x317285d3, 0x4f3495cb, 0x4f3495cc, 0x3400010},
9904{0x3400000, 0x317285d3, 0xe73a5134, 0xe73a5133, 0x3400010},
9905{0x3400000, 0x317285d3, 0x7c994e9e, 0x7c994e9f, 0x3400010},
9906{0x3400000, 0x317285d3, 0x6164bd6c, 0x6164bd6d, 0x3400010},
9907{0x3400000, 0x317285d3, 0x9503366, 0x317285d4, 0x3400010},
9908{0x3400000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
9909{0x3400000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
9910{0x3400000, 0x317285d3, 0x77f31e2f, 0x77f31e30, 0x3400010},
9911{0x3400000, 0x317285d3, 0xaab4d7d8, 0x3172802d, 0x3400010},
9912{0x3400000, 0x317285d3, 0x966320b, 0x317285d4, 0x3400010},
9913{0x3400000, 0x317285d3, 0xb26bddee, 0xb22f3c79, 0x3400010},
9914{0x3400000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c90, 0x3400010},
9915{0x3400000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3400000},
9916{0x3400000, 0x317285d3, 0x3c9623b1, 0x3c9623b3, 0x3400010},
9917{0x3400000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
9918{0x3400000, 0x317285d3, 0x7b906a6c, 0x7b906a6d, 0x3400010},
9919{0x3400000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3400000},
9920{0x3400000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3400080},
9921{0x3400000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3400080},
9922{0x3400000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3400080},
9923{0x3400000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3400080},
9924{0x3400000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3400080},
9925{0x3400000, 0x3c9623b1, 0x800000, 0x3c9623b2, 0x3400010},
9926{0x3400000, 0x3c9623b1, 0x800002, 0x3c9623b2, 0x3400010},
9927{0x3400000, 0x3c9623b1, 0x1398437, 0x3c9623b2, 0x3400010},
9928{0x3400000, 0x3c9623b1, 0xba98d27, 0x3c9623b2, 0x3400010},
9929{0x3400000, 0x3c9623b1, 0xba98d7a, 0x3c9623b2, 0x3400010},
9930{0x3400000, 0x3c9623b1, 0x751f853a, 0x751f853b, 0x3400010},
9931{0x3400000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
9932{0x3400000, 0x3c9623b1, 0x7f7fffff, 0x7f800000, 0x3400014},
9933{0x3400000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3400000},
9934{0x3400000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3400001},
9935{0x3400000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3400001},
9936{0x3400000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3400001},
9937{0x3400000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3400000},
9938{0x3400000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9939{0x3400000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3400000},
9940{0x3400000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3400000},
9941{0x3400000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3400080},
9942{0x3400000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3400080},
9943{0x3400000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3400080},
9944{0x3400000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3400080},
9945{0x3400000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3400080},
9946{0x3400000, 0x3c9623b1, 0x80800000, 0x3c9623b1, 0x3400010},
9947{0x3400000, 0x3c9623b1, 0x80800002, 0x3c9623b1, 0x3400010},
9948{0x3400000, 0x3c9623b1, 0x81398437, 0x3c9623b1, 0x3400010},
9949{0x3400000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b1, 0x3400010},
9950{0x3400000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b1, 0x3400010},
9951{0x3400000, 0x3c9623b1, 0xf51f853a, 0xf51f8539, 0x3400010},
9952{0x3400000, 0x3c9623b1, 0xff7ffff0, 0xff7fffef, 0x3400010},
9953{0x3400000, 0x3c9623b1, 0xff7fffff, 0xff7ffffe, 0x3400010},
9954{0x3400000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3400000},
9955{0x3400000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3400001},
9956{0x3400000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3400001},
9957{0x3400000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3400001},
9958{0x3400000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3400000},
9959{0x3400000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3400000},
9960{0x3400000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3400000},
9961{0x3400000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cc, 0x3400010},
9962{0x3400000, 0x3c9623b1, 0xe73a5134, 0xe73a5133, 0x3400010},
9963{0x3400000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9f, 0x3400010},
9964{0x3400000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6d, 0x3400010},
9965{0x3400000, 0x3c9623b1, 0x9503366, 0x3c9623b2, 0x3400010},
9966{0x3400000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ab, 0x3400010},
9967{0x3400000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
9968{0x3400000, 0x3c9623b1, 0x77f31e2f, 0x77f31e30, 0x3400010},
9969{0x3400000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b1, 0x3400010},
9970{0x3400000, 0x3c9623b1, 0x966320b, 0x3c9623b2, 0x3400010},
9971{0x3400000, 0x3c9623b1, 0xb26bddee, 0x3c9623aa, 0x3400010},
9972{0x3400000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208e, 0x3400010},
9973{0x3400000, 0x3c9623b1, 0x317285d3, 0x3c9623b3, 0x3400010},
9974{0x3400000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3400000},
9975{0x3400000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
9976{0x3400000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6d, 0x3400010},
9977{0x3400000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3400000},
9978{0x3400000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3400080},
9979{0x3400000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3400080},
9980{0x3400000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3400080},
9981{0x3400000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3400080},
9982{0x3400000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3400080},
9983{0x3400000, 0x51fd2c7c, 0x800000, 0x51fd2c7d, 0x3400010},
9984{0x3400000, 0x51fd2c7c, 0x800002, 0x51fd2c7d, 0x3400010},
9985{0x3400000, 0x51fd2c7c, 0x1398437, 0x51fd2c7d, 0x3400010},
9986{0x3400000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7d, 0x3400010},
9987{0x3400000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7d, 0x3400010},
9988{0x3400000, 0x51fd2c7c, 0x751f853a, 0x751f853b, 0x3400010},
9989{0x3400000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
9990{0x3400000, 0x51fd2c7c, 0x7f7fffff, 0x7f800000, 0x3400014},
9991{0x3400000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3400000},
9992{0x3400000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3400001},
9993{0x3400000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3400001},
9994{0x3400000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3400001},
9995{0x3400000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3400000},
9996{0x3400000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3400000},
9997{0x3400000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3400000},
9998{0x3400000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3400000},
9999{0x3400000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3400080},
10000{0x3400000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3400080},
10001{0x3400000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3400080},
10002{0x3400000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3400080},
10003{0x3400000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3400080},
10004{0x3400000, 0x51fd2c7c, 0x80800000, 0x51fd2c7c, 0x3400010},
10005{0x3400000, 0x51fd2c7c, 0x80800002, 0x51fd2c7c, 0x3400010},
10006{0x3400000, 0x51fd2c7c, 0x81398437, 0x51fd2c7c, 0x3400010},
10007{0x3400000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7c, 0x3400010},
10008{0x3400000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7c, 0x3400010},
10009{0x3400000, 0x51fd2c7c, 0xf51f853a, 0xf51f8539, 0x3400010},
10010{0x3400000, 0x51fd2c7c, 0xff7ffff0, 0xff7fffef, 0x3400010},
10011{0x3400000, 0x51fd2c7c, 0xff7fffff, 0xff7ffffe, 0x3400010},
10012{0x3400000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3400000},
10013{0x3400000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3400001},
10014{0x3400000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3400001},
10015{0x3400000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3400001},
10016{0x3400000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3400000},
10017{0x3400000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3400000},
10018{0x3400000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3400000},
10019{0x3400000, 0x51fd2c7c, 0x4f3495cb, 0x52016896, 0x3400010},
10020{0x3400000, 0x51fd2c7c, 0xe73a5134, 0xe73a5133, 0x3400010},
10021{0x3400000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9f, 0x3400010},
10022{0x3400000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6d, 0x3400010},
10023{0x3400000, 0x51fd2c7c, 0x9503366, 0x51fd2c7d, 0x3400010},
10024{0x3400000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7c, 0x3400010},
10025{0x3400000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
10026{0x3400000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e30, 0x3400010},
10027{0x3400000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7c, 0x3400010},
10028{0x3400000, 0x51fd2c7c, 0x966320b, 0x51fd2c7d, 0x3400010},
10029{0x3400000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7c, 0x3400010},
10030{0x3400000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7c, 0x3400010},
10031{0x3400000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7d, 0x3400010},
10032{0x3400000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7d, 0x3400010},
10033{0x3400000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3400000},
10034{0x3400000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6d, 0x3400010},
10035{0x3400000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3400000},
10036{0x3400000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3400080},
10037{0x3400000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3400080},
10038{0x3400000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3400080},
10039{0x3400000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3400080},
10040{0x3400000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3400080},
10041{0x3400000, 0x7b906a6c, 0x800000, 0x7b906a6d, 0x3400010},
10042{0x3400000, 0x7b906a6c, 0x800002, 0x7b906a6d, 0x3400010},
10043{0x3400000, 0x7b906a6c, 0x1398437, 0x7b906a6d, 0x3400010},
10044{0x3400000, 0x7b906a6c, 0xba98d27, 0x7b906a6d, 0x3400010},
10045{0x3400000, 0x7b906a6c, 0xba98d7a, 0x7b906a6d, 0x3400010},
10046{0x3400000, 0x7b906a6c, 0x751f853a, 0x7b906f69, 0x3400010},
10047{0x3400000, 0x7b906a6c, 0x7f7ffff0, 0x7f800000, 0x3400014},
10048{0x3400000, 0x7b906a6c, 0x7f7fffff, 0x7f800000, 0x3400014},
10049{0x3400000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3400000},
10050{0x3400000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3400001},
10051{0x3400000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3400001},
10052{0x3400000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3400001},
10053{0x3400000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3400000},
10054{0x3400000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3400000},
10055{0x3400000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3400000},
10056{0x3400000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3400000},
10057{0x3400000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3400080},
10058{0x3400000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3400080},
10059{0x3400000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3400080},
10060{0x3400000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3400080},
10061{0x3400000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3400080},
10062{0x3400000, 0x7b906a6c, 0x80800000, 0x7b906a6c, 0x3400010},
10063{0x3400000, 0x7b906a6c, 0x80800002, 0x7b906a6c, 0x3400010},
10064{0x3400000, 0x7b906a6c, 0x81398437, 0x7b906a6c, 0x3400010},
10065{0x3400000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6c, 0x3400010},
10066{0x3400000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6c, 0x3400010},
10067{0x3400000, 0x7b906a6c, 0xf51f853a, 0x7b906570, 0x3400010},
10068{0x3400000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1b, 0x3400010},
10069{0x3400000, 0x7b906a6c, 0xff7fffff, 0xff7edf2a, 0x3400010},
10070{0x3400000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3400000},
10071{0x3400000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3400001},
10072{0x3400000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3400001},
10073{0x3400000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3400001},
10074{0x3400000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3400000},
10075{0x3400000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3400000},
10076{0x3400000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3400000},
10077{0x3400000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6d, 0x3400010},
10078{0x3400000, 0x7b906a6c, 0xe73a5134, 0x7b906a6c, 0x3400010},
10079{0x3400000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3400000},
10080{0x3400000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6d, 0x3400010},
10081{0x3400000, 0x7b906a6c, 0x9503366, 0x7b906a6d, 0x3400010},
10082{0x3400000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6c, 0x3400010},
10083{0x3400000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6c, 0x3400010},
10084{0x3400000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8b, 0x3400010},
10085{0x3400000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6c, 0x3400010},
10086{0x3400000, 0x7b906a6c, 0x966320b, 0x7b906a6d, 0x3400010},
10087{0x3400000, 0x7b906a6c, 0xb26bddee, 0x7b906a6c, 0x3400010},
10088{0x3400000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6c, 0x3400010},
10089{0x3400000, 0x7b906a6c, 0x317285d3, 0x7b906a6d, 0x3400010},
10090{0x3400000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6d, 0x3400010},
10091{0x3400000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6d, 0x3400010},
10092{0x3400000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3400000},
10093{0x3000000, 0x0, 0x0, 0x0, 0x3000000},
10094{0x3000000, 0x0, 0x1, 0x0, 0x3000080},
10095{0x3000000, 0x0, 0x76, 0x0, 0x3000080},
10096{0x3000000, 0x0, 0x2b94, 0x0, 0x3000080},
10097{0x3000000, 0x0, 0x636d24, 0x0, 0x3000080},
10098{0x3000000, 0x0, 0x7fffff, 0x0, 0x3000080},
10099{0x3000000, 0x0, 0x800000, 0x800000, 0x3000000},
10100{0x3000000, 0x0, 0x800002, 0x800002, 0x3000000},
10101{0x3000000, 0x0, 0x1398437, 0x1398437, 0x3000000},
10102{0x3000000, 0x0, 0xba98d27, 0xba98d27, 0x3000000},
10103{0x3000000, 0x0, 0xba98d7a, 0xba98d7a, 0x3000000},
10104{0x3000000, 0x0, 0x751f853a, 0x751f853a, 0x3000000},
10105{0x3000000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3000000},
10106{0x3000000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3000000},
10107{0x3000000, 0x0, 0x7f800000, 0x7f800000, 0x3000000},
10108{0x3000000, 0x0, 0x7f800001, 0x7fc00000, 0x3000001},
10109{0x3000000, 0x0, 0x7f984a37, 0x7fc00000, 0x3000001},
10110{0x3000000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3000001},
10111{0x3000000, 0x0, 0x7fc00000, 0x7fc00000, 0x3000000},
10112{0x3000000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3000000},
10113{0x3000000, 0x0, 0x7fffffff, 0x7fc00000, 0x3000000},
10114{0x3000000, 0x0, 0x80000000, 0x0, 0x3000000},
10115{0x3000000, 0x0, 0x80000001, 0x0, 0x3000080},
10116{0x3000000, 0x0, 0x80000076, 0x0, 0x3000080},
10117{0x3000000, 0x0, 0x80002b94, 0x0, 0x3000080},
10118{0x3000000, 0x0, 0x80636d24, 0x0, 0x3000080},
10119{0x3000000, 0x0, 0x807fffff, 0x0, 0x3000080},
10120{0x3000000, 0x0, 0x80800000, 0x80800000, 0x3000000},
10121{0x3000000, 0x0, 0x80800002, 0x80800002, 0x3000000},
10122{0x3000000, 0x0, 0x81398437, 0x81398437, 0x3000000},
10123{0x3000000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3000000},
10124{0x3000000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3000000},
10125{0x3000000, 0x0, 0xf51f853a, 0xf51f853a, 0x3000000},
10126{0x3000000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3000000},
10127{0x3000000, 0x0, 0xff7fffff, 0xff7fffff, 0x3000000},
10128{0x3000000, 0x0, 0xff800000, 0xff800000, 0x3000000},
10129{0x3000000, 0x0, 0xff800001, 0x7fc00000, 0x3000001},
10130{0x3000000, 0x0, 0xff984a37, 0x7fc00000, 0x3000001},
10131{0x3000000, 0x0, 0xffbfffff, 0x7fc00000, 0x3000001},
10132{0x3000000, 0x0, 0xffc00000, 0x7fc00000, 0x3000000},
10133{0x3000000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3000000},
10134{0x3000000, 0x0, 0xffffffff, 0x7fc00000, 0x3000000},
10135{0x3000000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3000000},
10136{0x3000000, 0x0, 0xe73a5134, 0xe73a5134, 0x3000000},
10137{0x3000000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3000000},
10138{0x3000000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3000000},
10139{0x3000000, 0x0, 0x9503366, 0x9503366, 0x3000000},
10140{0x3000000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3000000},
10141{0x3000000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3000000},
10142{0x3000000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3000000},
10143{0x3000000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3000000},
10144{0x3000000, 0x0, 0x966320b, 0x966320b, 0x3000000},
10145{0x3000000, 0x0, 0xb26bddee, 0xb26bddee, 0x3000000},
10146{0x3000000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000000},
10147{0x3000000, 0x0, 0x317285d3, 0x317285d3, 0x3000000},
10148{0x3000000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3000000},
10149{0x3000000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3000000},
10150{0x3000000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3000000},
10151{0x3000000, 0x1, 0x0, 0x0, 0x3000080},
10152{0x3000000, 0x1, 0x1, 0x0, 0x3000080},
10153{0x3000000, 0x1, 0x76, 0x0, 0x3000080},
10154{0x3000000, 0x1, 0x2b94, 0x0, 0x3000080},
10155{0x3000000, 0x1, 0x636d24, 0x0, 0x3000080},
10156{0x3000000, 0x1, 0x7fffff, 0x0, 0x3000080},
10157{0x3000000, 0x1, 0x800000, 0x800000, 0x3000080},
10158{0x3000000, 0x1, 0x800002, 0x800002, 0x3000080},
10159{0x3000000, 0x1, 0x1398437, 0x1398437, 0x3000080},
10160{0x3000000, 0x1, 0xba98d27, 0xba98d27, 0x3000080},
10161{0x3000000, 0x1, 0xba98d7a, 0xba98d7a, 0x3000080},
10162{0x3000000, 0x1, 0x751f853a, 0x751f853a, 0x3000080},
10163{0x3000000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
10164{0x3000000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3000080},
10165{0x3000000, 0x1, 0x7f800000, 0x7f800000, 0x3000080},
10166{0x3000000, 0x1, 0x7f800001, 0x7fc00000, 0x3000081},
10167{0x3000000, 0x1, 0x7f984a37, 0x7fc00000, 0x3000081},
10168{0x3000000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3000081},
10169{0x3000000, 0x1, 0x7fc00000, 0x7fc00000, 0x3000080},
10170{0x3000000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3000080},
10171{0x3000000, 0x1, 0x7fffffff, 0x7fc00000, 0x3000080},
10172{0x3000000, 0x1, 0x80000000, 0x0, 0x3000080},
10173{0x3000000, 0x1, 0x80000001, 0x0, 0x3000080},
10174{0x3000000, 0x1, 0x80000076, 0x0, 0x3000080},
10175{0x3000000, 0x1, 0x80002b94, 0x0, 0x3000080},
10176{0x3000000, 0x1, 0x80636d24, 0x0, 0x3000080},
10177{0x3000000, 0x1, 0x807fffff, 0x0, 0x3000080},
10178{0x3000000, 0x1, 0x80800000, 0x80800000, 0x3000080},
10179{0x3000000, 0x1, 0x80800002, 0x80800002, 0x3000080},
10180{0x3000000, 0x1, 0x81398437, 0x81398437, 0x3000080},
10181{0x3000000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3000080},
10182{0x3000000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
10183{0x3000000, 0x1, 0xf51f853a, 0xf51f853a, 0x3000080},
10184{0x3000000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3000080},
10185{0x3000000, 0x1, 0xff7fffff, 0xff7fffff, 0x3000080},
10186{0x3000000, 0x1, 0xff800000, 0xff800000, 0x3000080},
10187{0x3000000, 0x1, 0xff800001, 0x7fc00000, 0x3000081},
10188{0x3000000, 0x1, 0xff984a37, 0x7fc00000, 0x3000081},
10189{0x3000000, 0x1, 0xffbfffff, 0x7fc00000, 0x3000081},
10190{0x3000000, 0x1, 0xffc00000, 0x7fc00000, 0x3000080},
10191{0x3000000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3000080},
10192{0x3000000, 0x1, 0xffffffff, 0x7fc00000, 0x3000080},
10193{0x3000000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3000080},
10194{0x3000000, 0x1, 0xe73a5134, 0xe73a5134, 0x3000080},
10195{0x3000000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3000080},
10196{0x3000000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3000080},
10197{0x3000000, 0x1, 0x9503366, 0x9503366, 0x3000080},
10198{0x3000000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
10199{0x3000000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
10200{0x3000000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3000080},
10201{0x3000000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
10202{0x3000000, 0x1, 0x966320b, 0x966320b, 0x3000080},
10203{0x3000000, 0x1, 0xb26bddee, 0xb26bddee, 0x3000080},
10204{0x3000000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
10205{0x3000000, 0x1, 0x317285d3, 0x317285d3, 0x3000080},
10206{0x3000000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3000080},
10207{0x3000000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
10208{0x3000000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3000080},
10209{0x3000000, 0x76, 0x0, 0x0, 0x3000080},
10210{0x3000000, 0x76, 0x1, 0x0, 0x3000080},
10211{0x3000000, 0x76, 0x76, 0x0, 0x3000080},
10212{0x3000000, 0x76, 0x2b94, 0x0, 0x3000080},
10213{0x3000000, 0x76, 0x636d24, 0x0, 0x3000080},
10214{0x3000000, 0x76, 0x7fffff, 0x0, 0x3000080},
10215{0x3000000, 0x76, 0x800000, 0x800000, 0x3000080},
10216{0x3000000, 0x76, 0x800002, 0x800002, 0x3000080},
10217{0x3000000, 0x76, 0x1398437, 0x1398437, 0x3000080},
10218{0x3000000, 0x76, 0xba98d27, 0xba98d27, 0x3000080},
10219{0x3000000, 0x76, 0xba98d7a, 0xba98d7a, 0x3000080},
10220{0x3000000, 0x76, 0x751f853a, 0x751f853a, 0x3000080},
10221{0x3000000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
10222{0x3000000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3000080},
10223{0x3000000, 0x76, 0x7f800000, 0x7f800000, 0x3000080},
10224{0x3000000, 0x76, 0x7f800001, 0x7fc00000, 0x3000081},
10225{0x3000000, 0x76, 0x7f984a37, 0x7fc00000, 0x3000081},
10226{0x3000000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3000081},
10227{0x3000000, 0x76, 0x7fc00000, 0x7fc00000, 0x3000080},
10228{0x3000000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3000080},
10229{0x3000000, 0x76, 0x7fffffff, 0x7fc00000, 0x3000080},
10230{0x3000000, 0x76, 0x80000000, 0x0, 0x3000080},
10231{0x3000000, 0x76, 0x80000001, 0x0, 0x3000080},
10232{0x3000000, 0x76, 0x80000076, 0x0, 0x3000080},
10233{0x3000000, 0x76, 0x80002b94, 0x0, 0x3000080},
10234{0x3000000, 0x76, 0x80636d24, 0x0, 0x3000080},
10235{0x3000000, 0x76, 0x807fffff, 0x0, 0x3000080},
10236{0x3000000, 0x76, 0x80800000, 0x80800000, 0x3000080},
10237{0x3000000, 0x76, 0x80800002, 0x80800002, 0x3000080},
10238{0x3000000, 0x76, 0x81398437, 0x81398437, 0x3000080},
10239{0x3000000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3000080},
10240{0x3000000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
10241{0x3000000, 0x76, 0xf51f853a, 0xf51f853a, 0x3000080},
10242{0x3000000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3000080},
10243{0x3000000, 0x76, 0xff7fffff, 0xff7fffff, 0x3000080},
10244{0x3000000, 0x76, 0xff800000, 0xff800000, 0x3000080},
10245{0x3000000, 0x76, 0xff800001, 0x7fc00000, 0x3000081},
10246{0x3000000, 0x76, 0xff984a37, 0x7fc00000, 0x3000081},
10247{0x3000000, 0x76, 0xffbfffff, 0x7fc00000, 0x3000081},
10248{0x3000000, 0x76, 0xffc00000, 0x7fc00000, 0x3000080},
10249{0x3000000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3000080},
10250{0x3000000, 0x76, 0xffffffff, 0x7fc00000, 0x3000080},
10251{0x3000000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3000080},
10252{0x3000000, 0x76, 0xe73a5134, 0xe73a5134, 0x3000080},
10253{0x3000000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3000080},
10254{0x3000000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3000080},
10255{0x3000000, 0x76, 0x9503366, 0x9503366, 0x3000080},
10256{0x3000000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
10257{0x3000000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
10258{0x3000000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3000080},
10259{0x3000000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
10260{0x3000000, 0x76, 0x966320b, 0x966320b, 0x3000080},
10261{0x3000000, 0x76, 0xb26bddee, 0xb26bddee, 0x3000080},
10262{0x3000000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
10263{0x3000000, 0x76, 0x317285d3, 0x317285d3, 0x3000080},
10264{0x3000000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3000080},
10265{0x3000000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
10266{0x3000000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3000080},
10267{0x3000000, 0x2b94, 0x0, 0x0, 0x3000080},
10268{0x3000000, 0x2b94, 0x1, 0x0, 0x3000080},
10269{0x3000000, 0x2b94, 0x76, 0x0, 0x3000080},
10270{0x3000000, 0x2b94, 0x2b94, 0x0, 0x3000080},
10271{0x3000000, 0x2b94, 0x636d24, 0x0, 0x3000080},
10272{0x3000000, 0x2b94, 0x7fffff, 0x0, 0x3000080},
10273{0x3000000, 0x2b94, 0x800000, 0x800000, 0x3000080},
10274{0x3000000, 0x2b94, 0x800002, 0x800002, 0x3000080},
10275{0x3000000, 0x2b94, 0x1398437, 0x1398437, 0x3000080},
10276{0x3000000, 0x2b94, 0xba98d27, 0xba98d27, 0x3000080},
10277{0x3000000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3000080},
10278{0x3000000, 0x2b94, 0x751f853a, 0x751f853a, 0x3000080},
10279{0x3000000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
10280{0x3000000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3000080},
10281{0x3000000, 0x2b94, 0x7f800000, 0x7f800000, 0x3000080},
10282{0x3000000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3000081},
10283{0x3000000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3000081},
10284{0x3000000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3000081},
10285{0x3000000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3000080},
10286{0x3000000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3000080},
10287{0x3000000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3000080},
10288{0x3000000, 0x2b94, 0x80000000, 0x0, 0x3000080},
10289{0x3000000, 0x2b94, 0x80000001, 0x0, 0x3000080},
10290{0x3000000, 0x2b94, 0x80000076, 0x0, 0x3000080},
10291{0x3000000, 0x2b94, 0x80002b94, 0x0, 0x3000080},
10292{0x3000000, 0x2b94, 0x80636d24, 0x0, 0x3000080},
10293{0x3000000, 0x2b94, 0x807fffff, 0x0, 0x3000080},
10294{0x3000000, 0x2b94, 0x80800000, 0x80800000, 0x3000080},
10295{0x3000000, 0x2b94, 0x80800002, 0x80800002, 0x3000080},
10296{0x3000000, 0x2b94, 0x81398437, 0x81398437, 0x3000080},
10297{0x3000000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3000080},
10298{0x3000000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
10299{0x3000000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3000080},
10300{0x3000000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3000080},
10301{0x3000000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3000080},
10302{0x3000000, 0x2b94, 0xff800000, 0xff800000, 0x3000080},
10303{0x3000000, 0x2b94, 0xff800001, 0x7fc00000, 0x3000081},
10304{0x3000000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3000081},
10305{0x3000000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3000081},
10306{0x3000000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3000080},
10307{0x3000000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3000080},
10308{0x3000000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3000080},
10309{0x3000000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3000080},
10310{0x3000000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3000080},
10311{0x3000000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3000080},
10312{0x3000000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3000080},
10313{0x3000000, 0x2b94, 0x9503366, 0x9503366, 0x3000080},
10314{0x3000000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
10315{0x3000000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
10316{0x3000000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3000080},
10317{0x3000000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
10318{0x3000000, 0x2b94, 0x966320b, 0x966320b, 0x3000080},
10319{0x3000000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3000080},
10320{0x3000000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
10321{0x3000000, 0x2b94, 0x317285d3, 0x317285d3, 0x3000080},
10322{0x3000000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3000080},
10323{0x3000000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
10324{0x3000000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3000080},
10325{0x3000000, 0x636d24, 0x0, 0x0, 0x3000080},
10326{0x3000000, 0x636d24, 0x1, 0x0, 0x3000080},
10327{0x3000000, 0x636d24, 0x76, 0x0, 0x3000080},
10328{0x3000000, 0x636d24, 0x2b94, 0x0, 0x3000080},
10329{0x3000000, 0x636d24, 0x636d24, 0x0, 0x3000080},
10330{0x3000000, 0x636d24, 0x7fffff, 0x0, 0x3000080},
10331{0x3000000, 0x636d24, 0x800000, 0x800000, 0x3000080},
10332{0x3000000, 0x636d24, 0x800002, 0x800002, 0x3000080},
10333{0x3000000, 0x636d24, 0x1398437, 0x1398437, 0x3000080},
10334{0x3000000, 0x636d24, 0xba98d27, 0xba98d27, 0x3000080},
10335{0x3000000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3000080},
10336{0x3000000, 0x636d24, 0x751f853a, 0x751f853a, 0x3000080},
10337{0x3000000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
10338{0x3000000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3000080},
10339{0x3000000, 0x636d24, 0x7f800000, 0x7f800000, 0x3000080},
10340{0x3000000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3000081},
10341{0x3000000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3000081},
10342{0x3000000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3000081},
10343{0x3000000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3000080},
10344{0x3000000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3000080},
10345{0x3000000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3000080},
10346{0x3000000, 0x636d24, 0x80000000, 0x0, 0x3000080},
10347{0x3000000, 0x636d24, 0x80000001, 0x0, 0x3000080},
10348{0x3000000, 0x636d24, 0x80000076, 0x0, 0x3000080},
10349{0x3000000, 0x636d24, 0x80002b94, 0x0, 0x3000080},
10350{0x3000000, 0x636d24, 0x80636d24, 0x0, 0x3000080},
10351{0x3000000, 0x636d24, 0x807fffff, 0x0, 0x3000080},
10352{0x3000000, 0x636d24, 0x80800000, 0x80800000, 0x3000080},
10353{0x3000000, 0x636d24, 0x80800002, 0x80800002, 0x3000080},
10354{0x3000000, 0x636d24, 0x81398437, 0x81398437, 0x3000080},
10355{0x3000000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3000080},
10356{0x3000000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
10357{0x3000000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3000080},
10358{0x3000000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3000080},
10359{0x3000000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3000080},
10360{0x3000000, 0x636d24, 0xff800000, 0xff800000, 0x3000080},
10361{0x3000000, 0x636d24, 0xff800001, 0x7fc00000, 0x3000081},
10362{0x3000000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3000081},
10363{0x3000000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3000081},
10364{0x3000000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3000080},
10365{0x3000000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3000080},
10366{0x3000000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3000080},
10367{0x3000000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3000080},
10368{0x3000000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3000080},
10369{0x3000000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3000080},
10370{0x3000000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3000080},
10371{0x3000000, 0x636d24, 0x9503366, 0x9503366, 0x3000080},
10372{0x3000000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
10373{0x3000000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
10374{0x3000000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3000080},
10375{0x3000000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
10376{0x3000000, 0x636d24, 0x966320b, 0x966320b, 0x3000080},
10377{0x3000000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3000080},
10378{0x3000000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
10379{0x3000000, 0x636d24, 0x317285d3, 0x317285d3, 0x3000080},
10380{0x3000000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3000080},
10381{0x3000000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
10382{0x3000000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3000080},
10383{0x3000000, 0x7fffff, 0x0, 0x0, 0x3000080},
10384{0x3000000, 0x7fffff, 0x1, 0x0, 0x3000080},
10385{0x3000000, 0x7fffff, 0x76, 0x0, 0x3000080},
10386{0x3000000, 0x7fffff, 0x2b94, 0x0, 0x3000080},
10387{0x3000000, 0x7fffff, 0x636d24, 0x0, 0x3000080},
10388{0x3000000, 0x7fffff, 0x7fffff, 0x0, 0x3000080},
10389{0x3000000, 0x7fffff, 0x800000, 0x800000, 0x3000080},
10390{0x3000000, 0x7fffff, 0x800002, 0x800002, 0x3000080},
10391{0x3000000, 0x7fffff, 0x1398437, 0x1398437, 0x3000080},
10392{0x3000000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3000080},
10393{0x3000000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3000080},
10394{0x3000000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3000080},
10395{0x3000000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
10396{0x3000000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3000080},
10397{0x3000000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3000080},
10398{0x3000000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3000081},
10399{0x3000000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3000081},
10400{0x3000000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3000081},
10401{0x3000000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3000080},
10402{0x3000000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3000080},
10403{0x3000000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3000080},
10404{0x3000000, 0x7fffff, 0x80000000, 0x0, 0x3000080},
10405{0x3000000, 0x7fffff, 0x80000001, 0x0, 0x3000080},
10406{0x3000000, 0x7fffff, 0x80000076, 0x0, 0x3000080},
10407{0x3000000, 0x7fffff, 0x80002b94, 0x0, 0x3000080},
10408{0x3000000, 0x7fffff, 0x80636d24, 0x0, 0x3000080},
10409{0x3000000, 0x7fffff, 0x807fffff, 0x0, 0x3000080},
10410{0x3000000, 0x7fffff, 0x80800000, 0x80800000, 0x3000080},
10411{0x3000000, 0x7fffff, 0x80800002, 0x80800002, 0x3000080},
10412{0x3000000, 0x7fffff, 0x81398437, 0x81398437, 0x3000080},
10413{0x3000000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3000080},
10414{0x3000000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
10415{0x3000000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3000080},
10416{0x3000000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3000080},
10417{0x3000000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3000080},
10418{0x3000000, 0x7fffff, 0xff800000, 0xff800000, 0x3000080},
10419{0x3000000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3000081},
10420{0x3000000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3000081},
10421{0x3000000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3000081},
10422{0x3000000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3000080},
10423{0x3000000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3000080},
10424{0x3000000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3000080},
10425{0x3000000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3000080},
10426{0x3000000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3000080},
10427{0x3000000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3000080},
10428{0x3000000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3000080},
10429{0x3000000, 0x7fffff, 0x9503366, 0x9503366, 0x3000080},
10430{0x3000000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
10431{0x3000000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
10432{0x3000000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3000080},
10433{0x3000000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
10434{0x3000000, 0x7fffff, 0x966320b, 0x966320b, 0x3000080},
10435{0x3000000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3000080},
10436{0x3000000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
10437{0x3000000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3000080},
10438{0x3000000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3000080},
10439{0x3000000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
10440{0x3000000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3000080},
10441{0x3000000, 0x800000, 0x0, 0x800000, 0x3000000},
10442{0x3000000, 0x800000, 0x1, 0x800000, 0x3000080},
10443{0x3000000, 0x800000, 0x76, 0x800000, 0x3000080},
10444{0x3000000, 0x800000, 0x2b94, 0x800000, 0x3000080},
10445{0x3000000, 0x800000, 0x636d24, 0x800000, 0x3000080},
10446{0x3000000, 0x800000, 0x7fffff, 0x800000, 0x3000080},
10447{0x3000000, 0x800000, 0x800000, 0x1000000, 0x3000000},
10448{0x3000000, 0x800000, 0x800002, 0x1000001, 0x3000000},
10449{0x3000000, 0x800000, 0x1398437, 0x1798437, 0x3000000},
10450{0x3000000, 0x800000, 0xba98d27, 0xba98d29, 0x3000000},
10451{0x3000000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3000000},
10452{0x3000000, 0x800000, 0x751f853a, 0x751f853a, 0x3000010},
10453{0x3000000, 0x800000, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
10454{0x3000000, 0x800000, 0x7f7fffff, 0x7f7fffff, 0x3000010},
10455{0x3000000, 0x800000, 0x7f800000, 0x7f800000, 0x3000000},
10456{0x3000000, 0x800000, 0x7f800001, 0x7fc00000, 0x3000001},
10457{0x3000000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3000001},
10458{0x3000000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3000001},
10459{0x3000000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3000000},
10460{0x3000000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
10461{0x3000000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3000000},
10462{0x3000000, 0x800000, 0x80000000, 0x800000, 0x3000000},
10463{0x3000000, 0x800000, 0x80000001, 0x800000, 0x3000080},
10464{0x3000000, 0x800000, 0x80000076, 0x800000, 0x3000080},
10465{0x3000000, 0x800000, 0x80002b94, 0x800000, 0x3000080},
10466{0x3000000, 0x800000, 0x80636d24, 0x800000, 0x3000080},
10467{0x3000000, 0x800000, 0x807fffff, 0x800000, 0x3000080},
10468{0x3000000, 0x800000, 0x80800000, 0x0, 0x3000000},
10469{0x3000000, 0x800000, 0x80800002, 0x0, 0x3000008},
10470{0x3000000, 0x800000, 0x81398437, 0x80f3086e, 0x3000000},
10471{0x3000000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3000000},
10472{0x3000000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3000000},
10473{0x3000000, 0x800000, 0xf51f853a, 0xf51f853a, 0x3000010},
10474{0x3000000, 0x800000, 0xff7ffff0, 0xff7ffff0, 0x3000010},
10475{0x3000000, 0x800000, 0xff7fffff, 0xff7fffff, 0x3000010},
10476{0x3000000, 0x800000, 0xff800000, 0xff800000, 0x3000000},
10477{0x3000000, 0x800000, 0xff800001, 0x7fc00000, 0x3000001},
10478{0x3000000, 0x800000, 0xff984a37, 0x7fc00000, 0x3000001},
10479{0x3000000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3000001},
10480{0x3000000, 0x800000, 0xffc00000, 0x7fc00000, 0x3000000},
10481{0x3000000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3000000},
10482{0x3000000, 0x800000, 0xffffffff, 0x7fc00000, 0x3000000},
10483{0x3000000, 0x800000, 0x4f3495cb, 0x4f3495cb, 0x3000010},
10484{0x3000000, 0x800000, 0xe73a5134, 0xe73a5134, 0x3000010},
10485{0x3000000, 0x800000, 0x7c994e9e, 0x7c994e9e, 0x3000010},
10486{0x3000000, 0x800000, 0x6164bd6c, 0x6164bd6c, 0x3000010},
10487{0x3000000, 0x800000, 0x9503366, 0x95033a6, 0x3000000},
10488{0x3000000, 0x800000, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
10489{0x3000000, 0x800000, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
10490{0x3000000, 0x800000, 0x77f31e2f, 0x77f31e2f, 0x3000010},
10491{0x3000000, 0x800000, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
10492{0x3000000, 0x800000, 0x966320b, 0x966324b, 0x3000000},
10493{0x3000000, 0x800000, 0xb26bddee, 0xb26bddee, 0x3000010},
10494{0x3000000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
10495{0x3000000, 0x800000, 0x317285d3, 0x317285d3, 0x3000010},
10496{0x3000000, 0x800000, 0x3c9623b1, 0x3c9623b1, 0x3000010},
10497{0x3000000, 0x800000, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
10498{0x3000000, 0x800000, 0x7b906a6c, 0x7b906a6c, 0x3000010},
10499{0x3000000, 0x800002, 0x0, 0x800002, 0x3000000},
10500{0x3000000, 0x800002, 0x1, 0x800002, 0x3000080},
10501{0x3000000, 0x800002, 0x76, 0x800002, 0x3000080},
10502{0x3000000, 0x800002, 0x2b94, 0x800002, 0x3000080},
10503{0x3000000, 0x800002, 0x636d24, 0x800002, 0x3000080},
10504{0x3000000, 0x800002, 0x7fffff, 0x800002, 0x3000080},
10505{0x3000000, 0x800002, 0x800000, 0x1000001, 0x3000000},
10506{0x3000000, 0x800002, 0x800002, 0x1000002, 0x3000000},
10507{0x3000000, 0x800002, 0x1398437, 0x1798438, 0x3000000},
10508{0x3000000, 0x800002, 0xba98d27, 0xba98d29, 0x3000010},
10509{0x3000000, 0x800002, 0xba98d7a, 0xba98d7c, 0x3000010},
10510{0x3000000, 0x800002, 0x751f853a, 0x751f853a, 0x3000010},
10511{0x3000000, 0x800002, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
10512{0x3000000, 0x800002, 0x7f7fffff, 0x7f7fffff, 0x3000010},
10513{0x3000000, 0x800002, 0x7f800000, 0x7f800000, 0x3000000},
10514{0x3000000, 0x800002, 0x7f800001, 0x7fc00000, 0x3000001},
10515{0x3000000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3000001},
10516{0x3000000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3000001},
10517{0x3000000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3000000},
10518{0x3000000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3000000},
10519{0x3000000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3000000},
10520{0x3000000, 0x800002, 0x80000000, 0x800002, 0x3000000},
10521{0x3000000, 0x800002, 0x80000001, 0x800002, 0x3000080},
10522{0x3000000, 0x800002, 0x80000076, 0x800002, 0x3000080},
10523{0x3000000, 0x800002, 0x80002b94, 0x800002, 0x3000080},
10524{0x3000000, 0x800002, 0x80636d24, 0x800002, 0x3000080},
10525{0x3000000, 0x800002, 0x807fffff, 0x800002, 0x3000080},
10526{0x3000000, 0x800002, 0x80800000, 0x0, 0x3000008},
10527{0x3000000, 0x800002, 0x80800002, 0x0, 0x3000000},
10528{0x3000000, 0x800002, 0x81398437, 0x80f3086c, 0x3000000},
10529{0x3000000, 0x800002, 0x8ba98d27, 0x8ba98d25, 0x3000010},
10530{0x3000000, 0x800002, 0x8ba98d7a, 0x8ba98d78, 0x3000010},
10531{0x3000000, 0x800002, 0xf51f853a, 0xf51f853a, 0x3000010},
10532{0x3000000, 0x800002, 0xff7ffff0, 0xff7ffff0, 0x3000010},
10533{0x3000000, 0x800002, 0xff7fffff, 0xff7fffff, 0x3000010},
10534{0x3000000, 0x800002, 0xff800000, 0xff800000, 0x3000000},
10535{0x3000000, 0x800002, 0xff800001, 0x7fc00000, 0x3000001},
10536{0x3000000, 0x800002, 0xff984a37, 0x7fc00000, 0x3000001},
10537{0x3000000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3000001},
10538{0x3000000, 0x800002, 0xffc00000, 0x7fc00000, 0x3000000},
10539{0x3000000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3000000},
10540{0x3000000, 0x800002, 0xffffffff, 0x7fc00000, 0x3000000},
10541{0x3000000, 0x800002, 0x4f3495cb, 0x4f3495cb, 0x3000010},
10542{0x3000000, 0x800002, 0xe73a5134, 0xe73a5134, 0x3000010},
10543{0x3000000, 0x800002, 0x7c994e9e, 0x7c994e9e, 0x3000010},
10544{0x3000000, 0x800002, 0x6164bd6c, 0x6164bd6c, 0x3000010},
10545{0x3000000, 0x800002, 0x9503366, 0x95033a6, 0x3000010},
10546{0x3000000, 0x800002, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
10547{0x3000000, 0x800002, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
10548{0x3000000, 0x800002, 0x77f31e2f, 0x77f31e2f, 0x3000010},
10549{0x3000000, 0x800002, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
10550{0x3000000, 0x800002, 0x966320b, 0x966324b, 0x3000010},
10551{0x3000000, 0x800002, 0xb26bddee, 0xb26bddee, 0x3000010},
10552{0x3000000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
10553{0x3000000, 0x800002, 0x317285d3, 0x317285d3, 0x3000010},
10554{0x3000000, 0x800002, 0x3c9623b1, 0x3c9623b1, 0x3000010},
10555{0x3000000, 0x800002, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
10556{0x3000000, 0x800002, 0x7b906a6c, 0x7b906a6c, 0x3000010},
10557{0x3000000, 0x1398437, 0x0, 0x1398437, 0x3000000},
10558{0x3000000, 0x1398437, 0x1, 0x1398437, 0x3000080},
10559{0x3000000, 0x1398437, 0x76, 0x1398437, 0x3000080},
10560{0x3000000, 0x1398437, 0x2b94, 0x1398437, 0x3000080},
10561{0x3000000, 0x1398437, 0x636d24, 0x1398437, 0x3000080},
10562{0x3000000, 0x1398437, 0x7fffff, 0x1398437, 0x3000080},
10563{0x3000000, 0x1398437, 0x800000, 0x1798437, 0x3000000},
10564{0x3000000, 0x1398437, 0x800002, 0x1798438, 0x3000000},
10565{0x3000000, 0x1398437, 0x1398437, 0x1b98437, 0x3000000},
10566{0x3000000, 0x1398437, 0xba98d27, 0xba98d2d, 0x3000010},
10567{0x3000000, 0x1398437, 0xba98d7a, 0xba98d80, 0x3000010},
10568{0x3000000, 0x1398437, 0x751f853a, 0x751f853a, 0x3000010},
10569{0x3000000, 0x1398437, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
10570{0x3000000, 0x1398437, 0x7f7fffff, 0x7f7fffff, 0x3000010},
10571{0x3000000, 0x1398437, 0x7f800000, 0x7f800000, 0x3000000},
10572{0x3000000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3000001},
10573{0x3000000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3000001},
10574{0x3000000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3000001},
10575{0x3000000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3000000},
10576{0x3000000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3000000},
10577{0x3000000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3000000},
10578{0x3000000, 0x1398437, 0x80000000, 0x1398437, 0x3000000},
10579{0x3000000, 0x1398437, 0x80000001, 0x1398437, 0x3000080},
10580{0x3000000, 0x1398437, 0x80000076, 0x1398437, 0x3000080},
10581{0x3000000, 0x1398437, 0x80002b94, 0x1398437, 0x3000080},
10582{0x3000000, 0x1398437, 0x80636d24, 0x1398437, 0x3000080},
10583{0x3000000, 0x1398437, 0x807fffff, 0x1398437, 0x3000080},
10584{0x3000000, 0x1398437, 0x80800000, 0xf3086e, 0x3000000},
10585{0x3000000, 0x1398437, 0x80800002, 0xf3086c, 0x3000000},
10586{0x3000000, 0x1398437, 0x81398437, 0x0, 0x3000000},
10587{0x3000000, 0x1398437, 0x8ba98d27, 0x8ba98d21, 0x3000010},
10588{0x3000000, 0x1398437, 0x8ba98d7a, 0x8ba98d74, 0x3000010},
10589{0x3000000, 0x1398437, 0xf51f853a, 0xf51f853a, 0x3000010},
10590{0x3000000, 0x1398437, 0xff7ffff0, 0xff7ffff0, 0x3000010},
10591{0x3000000, 0x1398437, 0xff7fffff, 0xff7fffff, 0x3000010},
10592{0x3000000, 0x1398437, 0xff800000, 0xff800000, 0x3000000},
10593{0x3000000, 0x1398437, 0xff800001, 0x7fc00000, 0x3000001},
10594{0x3000000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3000001},
10595{0x3000000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3000001},
10596{0x3000000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3000000},
10597{0x3000000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3000000},
10598{0x3000000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3000000},
10599{0x3000000, 0x1398437, 0x4f3495cb, 0x4f3495cb, 0x3000010},
10600{0x3000000, 0x1398437, 0xe73a5134, 0xe73a5134, 0x3000010},
10601{0x3000000, 0x1398437, 0x7c994e9e, 0x7c994e9e, 0x3000010},
10602{0x3000000, 0x1398437, 0x6164bd6c, 0x6164bd6c, 0x3000010},
10603{0x3000000, 0x1398437, 0x9503366, 0x9503420, 0x3000010},
10604{0x3000000, 0x1398437, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
10605{0x3000000, 0x1398437, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
10606{0x3000000, 0x1398437, 0x77f31e2f, 0x77f31e2f, 0x3000010},
10607{0x3000000, 0x1398437, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
10608{0x3000000, 0x1398437, 0x966320b, 0x96632c5, 0x3000010},
10609{0x3000000, 0x1398437, 0xb26bddee, 0xb26bddee, 0x3000010},
10610{0x3000000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
10611{0x3000000, 0x1398437, 0x317285d3, 0x317285d3, 0x3000010},
10612{0x3000000, 0x1398437, 0x3c9623b1, 0x3c9623b1, 0x3000010},
10613{0x3000000, 0x1398437, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
10614{0x3000000, 0x1398437, 0x7b906a6c, 0x7b906a6c, 0x3000010},
10615{0x3000000, 0xba98d27, 0x0, 0xba98d27, 0x3000000},
10616{0x3000000, 0xba98d27, 0x1, 0xba98d27, 0x3000080},
10617{0x3000000, 0xba98d27, 0x76, 0xba98d27, 0x3000080},
10618{0x3000000, 0xba98d27, 0x2b94, 0xba98d27, 0x3000080},
10619{0x3000000, 0xba98d27, 0x636d24, 0xba98d27, 0x3000080},
10620{0x3000000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3000080},
10621{0x3000000, 0xba98d27, 0x800000, 0xba98d29, 0x3000000},
10622{0x3000000, 0xba98d27, 0x800002, 0xba98d29, 0x3000010},
10623{0x3000000, 0xba98d27, 0x1398437, 0xba98d2d, 0x3000010},
10624{0x3000000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3000000},
10625{0x3000000, 0xba98d27, 0xba98d7a, 0xc298d50, 0x3000010},
10626{0x3000000, 0xba98d27, 0x751f853a, 0x751f853a, 0x3000010},
10627{0x3000000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
10628{0x3000000, 0xba98d27, 0x7f7fffff, 0x7f7fffff, 0x3000010},
10629{0x3000000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3000000},
10630{0x3000000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3000001},
10631{0x3000000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3000001},
10632{0x3000000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3000001},
10633{0x3000000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3000000},
10634{0x3000000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3000000},
10635{0x3000000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3000000},
10636{0x3000000, 0xba98d27, 0x80000000, 0xba98d27, 0x3000000},
10637{0x3000000, 0xba98d27, 0x80000001, 0xba98d27, 0x3000080},
10638{0x3000000, 0xba98d27, 0x80000076, 0xba98d27, 0x3000080},
10639{0x3000000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3000080},
10640{0x3000000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3000080},
10641{0x3000000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3000080},
10642{0x3000000, 0xba98d27, 0x80800000, 0xba98d25, 0x3000000},
10643{0x3000000, 0xba98d27, 0x80800002, 0xba98d25, 0x3000010},
10644{0x3000000, 0xba98d27, 0x81398437, 0xba98d21, 0x3000010},
10645{0x3000000, 0xba98d27, 0x8ba98d27, 0x0, 0x3000000},
10646{0x3000000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3000000},
10647{0x3000000, 0xba98d27, 0xf51f853a, 0xf51f853a, 0x3000010},
10648{0x3000000, 0xba98d27, 0xff7ffff0, 0xff7ffff0, 0x3000010},
10649{0x3000000, 0xba98d27, 0xff7fffff, 0xff7fffff, 0x3000010},
10650{0x3000000, 0xba98d27, 0xff800000, 0xff800000, 0x3000000},
10651{0x3000000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3000001},
10652{0x3000000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3000001},
10653{0x3000000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3000001},
10654{0x3000000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3000000},
10655{0x3000000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3000000},
10656{0x3000000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3000000},
10657{0x3000000, 0xba98d27, 0x4f3495cb, 0x4f3495cb, 0x3000010},
10658{0x3000000, 0xba98d27, 0xe73a5134, 0xe73a5134, 0x3000010},
10659{0x3000000, 0xba98d27, 0x7c994e9e, 0x7c994e9e, 0x3000010},
10660{0x3000000, 0xba98d27, 0x6164bd6c, 0x6164bd6c, 0x3000010},
10661{0x3000000, 0xba98d27, 0x9503366, 0xbb00ec2, 0x3000010},
10662{0x3000000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
10663{0x3000000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
10664{0x3000000, 0xba98d27, 0x77f31e2f, 0x77f31e2f, 0x3000010},
10665{0x3000000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
10666{0x3000000, 0xba98d27, 0x966320b, 0xbb0beb7, 0x3000010},
10667{0x3000000, 0xba98d27, 0xb26bddee, 0xb26bddee, 0x3000010},
10668{0x3000000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
10669{0x3000000, 0xba98d27, 0x317285d3, 0x317285d3, 0x3000010},
10670{0x3000000, 0xba98d27, 0x3c9623b1, 0x3c9623b1, 0x3000010},
10671{0x3000000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
10672{0x3000000, 0xba98d27, 0x7b906a6c, 0x7b906a6c, 0x3000010},
10673{0x3000000, 0xba98d7a, 0x0, 0xba98d7a, 0x3000000},
10674{0x3000000, 0xba98d7a, 0x1, 0xba98d7a, 0x3000080},
10675{0x3000000, 0xba98d7a, 0x76, 0xba98d7a, 0x3000080},
10676{0x3000000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3000080},
10677{0x3000000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3000080},
10678{0x3000000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3000080},
10679{0x3000000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3000000},
10680{0x3000000, 0xba98d7a, 0x800002, 0xba98d7c, 0x3000010},
10681{0x3000000, 0xba98d7a, 0x1398437, 0xba98d80, 0x3000010},
10682{0x3000000, 0xba98d7a, 0xba98d27, 0xc298d50, 0x3000010},
10683{0x3000000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3000000},
10684{0x3000000, 0xba98d7a, 0x751f853a, 0x751f853a, 0x3000010},
10685{0x3000000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
10686{0x3000000, 0xba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3000010},
10687{0x3000000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3000000},
10688{0x3000000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3000001},
10689{0x3000000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3000001},
10690{0x3000000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3000001},
10691{0x3000000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3000000},
10692{0x3000000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3000000},
10693{0x3000000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3000000},
10694{0x3000000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3000000},
10695{0x3000000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3000080},
10696{0x3000000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3000080},
10697{0x3000000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3000080},
10698{0x3000000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3000080},
10699{0x3000000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3000080},
10700{0x3000000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3000000},
10701{0x3000000, 0xba98d7a, 0x80800002, 0xba98d78, 0x3000010},
10702{0x3000000, 0xba98d7a, 0x81398437, 0xba98d74, 0x3000010},
10703{0x3000000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3000000},
10704{0x3000000, 0xba98d7a, 0x8ba98d7a, 0x0, 0x3000000},
10705{0x3000000, 0xba98d7a, 0xf51f853a, 0xf51f853a, 0x3000010},
10706{0x3000000, 0xba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3000010},
10707{0x3000000, 0xba98d7a, 0xff7fffff, 0xff7fffff, 0x3000010},
10708{0x3000000, 0xba98d7a, 0xff800000, 0xff800000, 0x3000000},
10709{0x3000000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3000001},
10710{0x3000000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3000001},
10711{0x3000000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3000001},
10712{0x3000000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3000000},
10713{0x3000000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3000000},
10714{0x3000000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3000000},
10715{0x3000000, 0xba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3000010},
10716{0x3000000, 0xba98d7a, 0xe73a5134, 0xe73a5134, 0x3000010},
10717{0x3000000, 0xba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3000010},
10718{0x3000000, 0xba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3000010},
10719{0x3000000, 0xba98d7a, 0x9503366, 0xbb00f15, 0x3000010},
10720{0x3000000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
10721{0x3000000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
10722{0x3000000, 0xba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3000010},
10723{0x3000000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
10724{0x3000000, 0xba98d7a, 0x966320b, 0xbb0bf0a, 0x3000010},
10725{0x3000000, 0xba98d7a, 0xb26bddee, 0xb26bddee, 0x3000010},
10726{0x3000000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
10727{0x3000000, 0xba98d7a, 0x317285d3, 0x317285d3, 0x3000010},
10728{0x3000000, 0xba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3000010},
10729{0x3000000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
10730{0x3000000, 0xba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3000010},
10731{0x3000000, 0x751f853a, 0x0, 0x751f853a, 0x3000000},
10732{0x3000000, 0x751f853a, 0x1, 0x751f853a, 0x3000080},
10733{0x3000000, 0x751f853a, 0x76, 0x751f853a, 0x3000080},
10734{0x3000000, 0x751f853a, 0x2b94, 0x751f853a, 0x3000080},
10735{0x3000000, 0x751f853a, 0x636d24, 0x751f853a, 0x3000080},
10736{0x3000000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3000080},
10737{0x3000000, 0x751f853a, 0x800000, 0x751f853a, 0x3000010},
10738{0x3000000, 0x751f853a, 0x800002, 0x751f853a, 0x3000010},
10739{0x3000000, 0x751f853a, 0x1398437, 0x751f853a, 0x3000010},
10740{0x3000000, 0x751f853a, 0xba98d27, 0x751f853a, 0x3000010},
10741{0x3000000, 0x751f853a, 0xba98d7a, 0x751f853a, 0x3000010},
10742{0x3000000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3000000},
10743{0x3000000, 0x751f853a, 0x7f7ffff0, 0x7f7ffffa, 0x3000010},
10744{0x3000000, 0x751f853a, 0x7f7fffff, 0x7f800000, 0x3000014},
10745{0x3000000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3000000},
10746{0x3000000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3000001},
10747{0x3000000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3000001},
10748{0x3000000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3000001},
10749{0x3000000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3000000},
10750{0x3000000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3000000},
10751{0x3000000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3000000},
10752{0x3000000, 0x751f853a, 0x80000000, 0x751f853a, 0x3000000},
10753{0x3000000, 0x751f853a, 0x80000001, 0x751f853a, 0x3000080},
10754{0x3000000, 0x751f853a, 0x80000076, 0x751f853a, 0x3000080},
10755{0x3000000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3000080},
10756{0x3000000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3000080},
10757{0x3000000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3000080},
10758{0x3000000, 0x751f853a, 0x80800000, 0x751f853a, 0x3000010},
10759{0x3000000, 0x751f853a, 0x80800002, 0x751f853a, 0x3000010},
10760{0x3000000, 0x751f853a, 0x81398437, 0x751f853a, 0x3000010},
10761{0x3000000, 0x751f853a, 0x8ba98d27, 0x751f853a, 0x3000010},
10762{0x3000000, 0x751f853a, 0x8ba98d7a, 0x751f853a, 0x3000010},
10763{0x3000000, 0x751f853a, 0xf51f853a, 0x0, 0x3000000},
10764{0x3000000, 0x751f853a, 0xff7ffff0, 0xff7fffe6, 0x3000010},
10765{0x3000000, 0x751f853a, 0xff7fffff, 0xff7ffff5, 0x3000010},
10766{0x3000000, 0x751f853a, 0xff800000, 0xff800000, 0x3000000},
10767{0x3000000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3000001},
10768{0x3000000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3000001},
10769{0x3000000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3000001},
10770{0x3000000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3000000},
10771{0x3000000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3000000},
10772{0x3000000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3000000},
10773{0x3000000, 0x751f853a, 0x4f3495cb, 0x751f853a, 0x3000010},
10774{0x3000000, 0x751f853a, 0xe73a5134, 0x751f853a, 0x3000010},
10775{0x3000000, 0x751f853a, 0x7c994e9e, 0x7c994fdd, 0x3000010},
10776{0x3000000, 0x751f853a, 0x6164bd6c, 0x751f853a, 0x3000010},
10777{0x3000000, 0x751f853a, 0x9503366, 0x751f853a, 0x3000010},
10778{0x3000000, 0x751f853a, 0xbf5a97c9, 0x751f853a, 0x3000010},
10779{0x3000000, 0x751f853a, 0xe6ff1a14, 0x751f853a, 0x3000010},
10780{0x3000000, 0x751f853a, 0x77f31e2f, 0x77f81a59, 0x3000010},
10781{0x3000000, 0x751f853a, 0xaab4d7d8, 0x751f853a, 0x3000010},
10782{0x3000000, 0x751f853a, 0x966320b, 0x751f853a, 0x3000010},
10783{0x3000000, 0x751f853a, 0xb26bddee, 0x751f853a, 0x3000010},
10784{0x3000000, 0x751f853a, 0xb5c8e5d3, 0x751f853a, 0x3000010},
10785{0x3000000, 0x751f853a, 0x317285d3, 0x751f853a, 0x3000010},
10786{0x3000000, 0x751f853a, 0x3c9623b1, 0x751f853a, 0x3000010},
10787{0x3000000, 0x751f853a, 0x51fd2c7c, 0x751f853a, 0x3000010},
10788{0x3000000, 0x751f853a, 0x7b906a6c, 0x7b906f68, 0x3000010},
10789{0x3000000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3000000},
10790{0x3000000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3000080},
10791{0x3000000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3000080},
10792{0x3000000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3000080},
10793{0x3000000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3000080},
10794{0x3000000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3000080},
10795{0x3000000, 0x7f7ffff0, 0x800000, 0x7f7ffff0, 0x3000010},
10796{0x3000000, 0x7f7ffff0, 0x800002, 0x7f7ffff0, 0x3000010},
10797{0x3000000, 0x7f7ffff0, 0x1398437, 0x7f7ffff0, 0x3000010},
10798{0x3000000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff0, 0x3000010},
10799{0x3000000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff0, 0x3000010},
10800{0x3000000, 0x7f7ffff0, 0x751f853a, 0x7f7ffffa, 0x3000010},
10801{0x3000000, 0x7f7ffff0, 0x7f7ffff0, 0x7f800000, 0x3000014},
10802{0x3000000, 0x7f7ffff0, 0x7f7fffff, 0x7f800000, 0x3000014},
10803{0x3000000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3000000},
10804{0x3000000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3000001},
10805{0x3000000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3000001},
10806{0x3000000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3000001},
10807{0x3000000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3000000},
10808{0x3000000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3000000},
10809{0x3000000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3000000},
10810{0x3000000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3000000},
10811{0x3000000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3000080},
10812{0x3000000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3000080},
10813{0x3000000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3000080},
10814{0x3000000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3000080},
10815{0x3000000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3000080},
10816{0x3000000, 0x7f7ffff0, 0x80800000, 0x7f7ffff0, 0x3000010},
10817{0x3000000, 0x7f7ffff0, 0x80800002, 0x7f7ffff0, 0x3000010},
10818{0x3000000, 0x7f7ffff0, 0x81398437, 0x7f7ffff0, 0x3000010},
10819{0x3000000, 0x7f7ffff0, 0x8ba98d27, 0x7f7ffff0, 0x3000010},
10820{0x3000000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7ffff0, 0x3000010},
10821{0x3000000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe6, 0x3000010},
10822{0x3000000, 0x7f7ffff0, 0xff7ffff0, 0x0, 0x3000000},
10823{0x3000000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3000000},
10824{0x3000000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3000000},
10825{0x3000000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3000001},
10826{0x3000000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3000001},
10827{0x3000000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3000001},
10828{0x3000000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3000000},
10829{0x3000000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3000000},
10830{0x3000000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3000000},
10831{0x3000000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff0, 0x3000010},
10832{0x3000000, 0x7f7ffff0, 0xe73a5134, 0x7f7ffff0, 0x3000010},
10833{0x3000000, 0x7f7ffff0, 0x7c994e9e, 0x7f800000, 0x3000014},
10834{0x3000000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff0, 0x3000010},
10835{0x3000000, 0x7f7ffff0, 0x9503366, 0x7f7ffff0, 0x3000010},
10836{0x3000000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7ffff0, 0x3000010},
10837{0x3000000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7ffff0, 0x3000010},
10838{0x3000000, 0x7f7ffff0, 0x77f31e2f, 0x7f800000, 0x3000014},
10839{0x3000000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7ffff0, 0x3000010},
10840{0x3000000, 0x7f7ffff0, 0x966320b, 0x7f7ffff0, 0x3000010},
10841{0x3000000, 0x7f7ffff0, 0xb26bddee, 0x7f7ffff0, 0x3000010},
10842{0x3000000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7ffff0, 0x3000010},
10843{0x3000000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff0, 0x3000010},
10844{0x3000000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff0, 0x3000010},
10845{0x3000000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff0, 0x3000010},
10846{0x3000000, 0x7f7ffff0, 0x7b906a6c, 0x7f800000, 0x3000014},
10847{0x3000000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3000000},
10848{0x3000000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3000080},
10849{0x3000000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3000080},
10850{0x3000000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3000080},
10851{0x3000000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3000080},
10852{0x3000000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3000080},
10853{0x3000000, 0x7f7fffff, 0x800000, 0x7f7fffff, 0x3000010},
10854{0x3000000, 0x7f7fffff, 0x800002, 0x7f7fffff, 0x3000010},
10855{0x3000000, 0x7f7fffff, 0x1398437, 0x7f7fffff, 0x3000010},
10856{0x3000000, 0x7f7fffff, 0xba98d27, 0x7f7fffff, 0x3000010},
10857{0x3000000, 0x7f7fffff, 0xba98d7a, 0x7f7fffff, 0x3000010},
10858{0x3000000, 0x7f7fffff, 0x751f853a, 0x7f800000, 0x3000014},
10859{0x3000000, 0x7f7fffff, 0x7f7ffff0, 0x7f800000, 0x3000014},
10860{0x3000000, 0x7f7fffff, 0x7f7fffff, 0x7f800000, 0x3000014},
10861{0x3000000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3000000},
10862{0x3000000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3000001},
10863{0x3000000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3000001},
10864{0x3000000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
10865{0x3000000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3000000},
10866{0x3000000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3000000},
10867{0x3000000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3000000},
10868{0x3000000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3000000},
10869{0x3000000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3000080},
10870{0x3000000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3000080},
10871{0x3000000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3000080},
10872{0x3000000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3000080},
10873{0x3000000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3000080},
10874{0x3000000, 0x7f7fffff, 0x80800000, 0x7f7fffff, 0x3000010},
10875{0x3000000, 0x7f7fffff, 0x80800002, 0x7f7fffff, 0x3000010},
10876{0x3000000, 0x7f7fffff, 0x81398437, 0x7f7fffff, 0x3000010},
10877{0x3000000, 0x7f7fffff, 0x8ba98d27, 0x7f7fffff, 0x3000010},
10878{0x3000000, 0x7f7fffff, 0x8ba98d7a, 0x7f7fffff, 0x3000010},
10879{0x3000000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff5, 0x3000010},
10880{0x3000000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3000000},
10881{0x3000000, 0x7f7fffff, 0xff7fffff, 0x0, 0x3000000},
10882{0x3000000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3000000},
10883{0x3000000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3000001},
10884{0x3000000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3000001},
10885{0x3000000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3000001},
10886{0x3000000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3000000},
10887{0x3000000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3000000},
10888{0x3000000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3000000},
10889{0x3000000, 0x7f7fffff, 0x4f3495cb, 0x7f7fffff, 0x3000010},
10890{0x3000000, 0x7f7fffff, 0xe73a5134, 0x7f7fffff, 0x3000010},
10891{0x3000000, 0x7f7fffff, 0x7c994e9e, 0x7f800000, 0x3000014},
10892{0x3000000, 0x7f7fffff, 0x6164bd6c, 0x7f7fffff, 0x3000010},
10893{0x3000000, 0x7f7fffff, 0x9503366, 0x7f7fffff, 0x3000010},
10894{0x3000000, 0x7f7fffff, 0xbf5a97c9, 0x7f7fffff, 0x3000010},
10895{0x3000000, 0x7f7fffff, 0xe6ff1a14, 0x7f7fffff, 0x3000010},
10896{0x3000000, 0x7f7fffff, 0x77f31e2f, 0x7f800000, 0x3000014},
10897{0x3000000, 0x7f7fffff, 0xaab4d7d8, 0x7f7fffff, 0x3000010},
10898{0x3000000, 0x7f7fffff, 0x966320b, 0x7f7fffff, 0x3000010},
10899{0x3000000, 0x7f7fffff, 0xb26bddee, 0x7f7fffff, 0x3000010},
10900{0x3000000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7fffff, 0x3000010},
10901{0x3000000, 0x7f7fffff, 0x317285d3, 0x7f7fffff, 0x3000010},
10902{0x3000000, 0x7f7fffff, 0x3c9623b1, 0x7f7fffff, 0x3000010},
10903{0x3000000, 0x7f7fffff, 0x51fd2c7c, 0x7f7fffff, 0x3000010},
10904{0x3000000, 0x7f7fffff, 0x7b906a6c, 0x7f800000, 0x3000014},
10905{0x3000000, 0x7f800000, 0x0, 0x7f800000, 0x3000000},
10906{0x3000000, 0x7f800000, 0x1, 0x7f800000, 0x3000080},
10907{0x3000000, 0x7f800000, 0x76, 0x7f800000, 0x3000080},
10908{0x3000000, 0x7f800000, 0x2b94, 0x7f800000, 0x3000080},
10909{0x3000000, 0x7f800000, 0x636d24, 0x7f800000, 0x3000080},
10910{0x3000000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3000080},
10911{0x3000000, 0x7f800000, 0x800000, 0x7f800000, 0x3000000},
10912{0x3000000, 0x7f800000, 0x800002, 0x7f800000, 0x3000000},
10913{0x3000000, 0x7f800000, 0x1398437, 0x7f800000, 0x3000000},
10914{0x3000000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3000000},
10915{0x3000000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3000000},
10916{0x3000000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3000000},
10917{0x3000000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3000000},
10918{0x3000000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3000000},
10919{0x3000000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3000000},
10920{0x3000000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3000001},
10921{0x3000000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3000001},
10922{0x3000000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3000001},
10923{0x3000000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3000000},
10924{0x3000000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
10925{0x3000000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3000000},
10926{0x3000000, 0x7f800000, 0x80000000, 0x7f800000, 0x3000000},
10927{0x3000000, 0x7f800000, 0x80000001, 0x7f800000, 0x3000080},
10928{0x3000000, 0x7f800000, 0x80000076, 0x7f800000, 0x3000080},
10929{0x3000000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3000080},
10930{0x3000000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3000080},
10931{0x3000000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3000080},
10932{0x3000000, 0x7f800000, 0x80800000, 0x7f800000, 0x3000000},
10933{0x3000000, 0x7f800000, 0x80800002, 0x7f800000, 0x3000000},
10934{0x3000000, 0x7f800000, 0x81398437, 0x7f800000, 0x3000000},
10935{0x3000000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3000000},
10936{0x3000000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3000000},
10937{0x3000000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3000000},
10938{0x3000000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3000000},
10939{0x3000000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3000000},
10940{0x3000000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3000001},
10941{0x3000000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3000001},
10942{0x3000000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3000001},
10943{0x3000000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3000001},
10944{0x3000000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3000000},
10945{0x3000000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3000000},
10946{0x3000000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3000000},
10947{0x3000000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3000000},
10948{0x3000000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3000000},
10949{0x3000000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3000000},
10950{0x3000000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3000000},
10951{0x3000000, 0x7f800000, 0x9503366, 0x7f800000, 0x3000000},
10952{0x3000000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3000000},
10953{0x3000000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3000000},
10954{0x3000000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3000000},
10955{0x3000000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3000000},
10956{0x3000000, 0x7f800000, 0x966320b, 0x7f800000, 0x3000000},
10957{0x3000000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3000000},
10958{0x3000000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3000000},
10959{0x3000000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3000000},
10960{0x3000000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3000000},
10961{0x3000000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3000000},
10962{0x3000000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3000000},
10963{0x3000000, 0x7f800001, 0x0, 0x7fc00000, 0x3000001},
10964{0x3000000, 0x7f800001, 0x1, 0x7fc00000, 0x3000081},
10965{0x3000000, 0x7f800001, 0x76, 0x7fc00000, 0x3000081},
10966{0x3000000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3000081},
10967{0x3000000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3000081},
10968{0x3000000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3000081},
10969{0x3000000, 0x7f800001, 0x800000, 0x7fc00000, 0x3000001},
10970{0x3000000, 0x7f800001, 0x800002, 0x7fc00000, 0x3000001},
10971{0x3000000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3000001},
10972{0x3000000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3000001},
10973{0x3000000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3000001},
10974{0x3000000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3000001},
10975{0x3000000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3000001},
10976{0x3000000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3000001},
10977{0x3000000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3000001},
10978{0x3000000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3000001},
10979{0x3000000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3000001},
10980{0x3000000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3000001},
10981{0x3000000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3000001},
10982{0x3000000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3000001},
10983{0x3000000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3000001},
10984{0x3000000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3000001},
10985{0x3000000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3000081},
10986{0x3000000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3000081},
10987{0x3000000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3000081},
10988{0x3000000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3000081},
10989{0x3000000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3000081},
10990{0x3000000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3000001},
10991{0x3000000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3000001},
10992{0x3000000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3000001},
10993{0x3000000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3000001},
10994{0x3000000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3000001},
10995{0x3000000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3000001},
10996{0x3000000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3000001},
10997{0x3000000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3000001},
10998{0x3000000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3000001},
10999{0x3000000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3000001},
11000{0x3000000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3000001},
11001{0x3000000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3000001},
11002{0x3000000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3000001},
11003{0x3000000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3000001},
11004{0x3000000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3000001},
11005{0x3000000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3000001},
11006{0x3000000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3000001},
11007{0x3000000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3000001},
11008{0x3000000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3000001},
11009{0x3000000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3000001},
11010{0x3000000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3000001},
11011{0x3000000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3000001},
11012{0x3000000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3000001},
11013{0x3000000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3000001},
11014{0x3000000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3000001},
11015{0x3000000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3000001},
11016{0x3000000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
11017{0x3000000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3000001},
11018{0x3000000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3000001},
11019{0x3000000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3000001},
11020{0x3000000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3000001},
11021{0x3000000, 0x7f984a37, 0x0, 0x7fc00000, 0x3000001},
11022{0x3000000, 0x7f984a37, 0x1, 0x7fc00000, 0x3000081},
11023{0x3000000, 0x7f984a37, 0x76, 0x7fc00000, 0x3000081},
11024{0x3000000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3000081},
11025{0x3000000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3000081},
11026{0x3000000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3000081},
11027{0x3000000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3000001},
11028{0x3000000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3000001},
11029{0x3000000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3000001},
11030{0x3000000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3000001},
11031{0x3000000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3000001},
11032{0x3000000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3000001},
11033{0x3000000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3000001},
11034{0x3000000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3000001},
11035{0x3000000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3000001},
11036{0x3000000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3000001},
11037{0x3000000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3000001},
11038{0x3000000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3000001},
11039{0x3000000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3000001},
11040{0x3000000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3000001},
11041{0x3000000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3000001},
11042{0x3000000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3000001},
11043{0x3000000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3000081},
11044{0x3000000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3000081},
11045{0x3000000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3000081},
11046{0x3000000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3000081},
11047{0x3000000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3000081},
11048{0x3000000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3000001},
11049{0x3000000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3000001},
11050{0x3000000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3000001},
11051{0x3000000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3000001},
11052{0x3000000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3000001},
11053{0x3000000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3000001},
11054{0x3000000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3000001},
11055{0x3000000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3000001},
11056{0x3000000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3000001},
11057{0x3000000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3000001},
11058{0x3000000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3000001},
11059{0x3000000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3000001},
11060{0x3000000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3000001},
11061{0x3000000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3000001},
11062{0x3000000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3000001},
11063{0x3000000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3000001},
11064{0x3000000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3000001},
11065{0x3000000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3000001},
11066{0x3000000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3000001},
11067{0x3000000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3000001},
11068{0x3000000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3000001},
11069{0x3000000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3000001},
11070{0x3000000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3000001},
11071{0x3000000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3000001},
11072{0x3000000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3000001},
11073{0x3000000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3000001},
11074{0x3000000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
11075{0x3000000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3000001},
11076{0x3000000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3000001},
11077{0x3000000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3000001},
11078{0x3000000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3000001},
11079{0x3000000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3000001},
11080{0x3000000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3000081},
11081{0x3000000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3000081},
11082{0x3000000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3000081},
11083{0x3000000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3000081},
11084{0x3000000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3000081},
11085{0x3000000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3000001},
11086{0x3000000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3000001},
11087{0x3000000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3000001},
11088{0x3000000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3000001},
11089{0x3000000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3000001},
11090{0x3000000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3000001},
11091{0x3000000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3000001},
11092{0x3000000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3000001},
11093{0x3000000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3000001},
11094{0x3000000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3000001},
11095{0x3000000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3000001},
11096{0x3000000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
11097{0x3000000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3000001},
11098{0x3000000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3000001},
11099{0x3000000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3000001},
11100{0x3000000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3000001},
11101{0x3000000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3000081},
11102{0x3000000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3000081},
11103{0x3000000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3000081},
11104{0x3000000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3000081},
11105{0x3000000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3000081},
11106{0x3000000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3000001},
11107{0x3000000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3000001},
11108{0x3000000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3000001},
11109{0x3000000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3000001},
11110{0x3000000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3000001},
11111{0x3000000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3000001},
11112{0x3000000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3000001},
11113{0x3000000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3000001},
11114{0x3000000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3000001},
11115{0x3000000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3000001},
11116{0x3000000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3000001},
11117{0x3000000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3000001},
11118{0x3000000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3000001},
11119{0x3000000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3000001},
11120{0x3000000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3000001},
11121{0x3000000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3000001},
11122{0x3000000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3000001},
11123{0x3000000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3000001},
11124{0x3000000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3000001},
11125{0x3000000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3000001},
11126{0x3000000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3000001},
11127{0x3000000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3000001},
11128{0x3000000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3000001},
11129{0x3000000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3000001},
11130{0x3000000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3000001},
11131{0x3000000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3000001},
11132{0x3000000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
11133{0x3000000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3000001},
11134{0x3000000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3000001},
11135{0x3000000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3000001},
11136{0x3000000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3000001},
11137{0x3000000, 0x7fc00000, 0x0, 0x7fc00000, 0x3000000},
11138{0x3000000, 0x7fc00000, 0x1, 0x7fc00000, 0x3000080},
11139{0x3000000, 0x7fc00000, 0x76, 0x7fc00000, 0x3000080},
11140{0x3000000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3000080},
11141{0x3000000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3000080},
11142{0x3000000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3000080},
11143{0x3000000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3000000},
11144{0x3000000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3000000},
11145{0x3000000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3000000},
11146{0x3000000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3000000},
11147{0x3000000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3000000},
11148{0x3000000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3000000},
11149{0x3000000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3000000},
11150{0x3000000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3000000},
11151{0x3000000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3000000},
11152{0x3000000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3000001},
11153{0x3000000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3000001},
11154{0x3000000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3000001},
11155{0x3000000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3000000},
11156{0x3000000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
11157{0x3000000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3000000},
11158{0x3000000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3000000},
11159{0x3000000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3000080},
11160{0x3000000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3000080},
11161{0x3000000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3000080},
11162{0x3000000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3000080},
11163{0x3000000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3000080},
11164{0x3000000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3000000},
11165{0x3000000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3000000},
11166{0x3000000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3000000},
11167{0x3000000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3000000},
11168{0x3000000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3000000},
11169{0x3000000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3000000},
11170{0x3000000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3000000},
11171{0x3000000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3000000},
11172{0x3000000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3000000},
11173{0x3000000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3000001},
11174{0x3000000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3000001},
11175{0x3000000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3000001},
11176{0x3000000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3000000},
11177{0x3000000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3000000},
11178{0x3000000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3000000},
11179{0x3000000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3000000},
11180{0x3000000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3000000},
11181{0x3000000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3000000},
11182{0x3000000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3000000},
11183{0x3000000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3000000},
11184{0x3000000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3000000},
11185{0x3000000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3000000},
11186{0x3000000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3000000},
11187{0x3000000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3000000},
11188{0x3000000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3000000},
11189{0x3000000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3000000},
11190{0x3000000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
11191{0x3000000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3000000},
11192{0x3000000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3000000},
11193{0x3000000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3000000},
11194{0x3000000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3000000},
11195{0x3000000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3000000},
11196{0x3000000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3000080},
11197{0x3000000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3000080},
11198{0x3000000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3000080},
11199{0x3000000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3000080},
11200{0x3000000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3000080},
11201{0x3000000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3000000},
11202{0x3000000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3000000},
11203{0x3000000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3000000},
11204{0x3000000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3000000},
11205{0x3000000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3000000},
11206{0x3000000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3000000},
11207{0x3000000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3000000},
11208{0x3000000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3000000},
11209{0x3000000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3000000},
11210{0x3000000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3000001},
11211{0x3000000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3000001},
11212{0x3000000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3000001},
11213{0x3000000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3000000},
11214{0x3000000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3000000},
11215{0x3000000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3000000},
11216{0x3000000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3000000},
11217{0x3000000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3000080},
11218{0x3000000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3000080},
11219{0x3000000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3000080},
11220{0x3000000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3000080},
11221{0x3000000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3000080},
11222{0x3000000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3000000},
11223{0x3000000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3000000},
11224{0x3000000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3000000},
11225{0x3000000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3000000},
11226{0x3000000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3000000},
11227{0x3000000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3000000},
11228{0x3000000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3000000},
11229{0x3000000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3000000},
11230{0x3000000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3000000},
11231{0x3000000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3000001},
11232{0x3000000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3000001},
11233{0x3000000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3000001},
11234{0x3000000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3000000},
11235{0x3000000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3000000},
11236{0x3000000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3000000},
11237{0x3000000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3000000},
11238{0x3000000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3000000},
11239{0x3000000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3000000},
11240{0x3000000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3000000},
11241{0x3000000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3000000},
11242{0x3000000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3000000},
11243{0x3000000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3000000},
11244{0x3000000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3000000},
11245{0x3000000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3000000},
11246{0x3000000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3000000},
11247{0x3000000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3000000},
11248{0x3000000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
11249{0x3000000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3000000},
11250{0x3000000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3000000},
11251{0x3000000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3000000},
11252{0x3000000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3000000},
11253{0x3000000, 0x7fffffff, 0x0, 0x7fc00000, 0x3000000},
11254{0x3000000, 0x7fffffff, 0x1, 0x7fc00000, 0x3000080},
11255{0x3000000, 0x7fffffff, 0x76, 0x7fc00000, 0x3000080},
11256{0x3000000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3000080},
11257{0x3000000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3000080},
11258{0x3000000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3000080},
11259{0x3000000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3000000},
11260{0x3000000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3000000},
11261{0x3000000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3000000},
11262{0x3000000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3000000},
11263{0x3000000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3000000},
11264{0x3000000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3000000},
11265{0x3000000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3000000},
11266{0x3000000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3000000},
11267{0x3000000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3000000},
11268{0x3000000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3000001},
11269{0x3000000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3000001},
11270{0x3000000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
11271{0x3000000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3000000},
11272{0x3000000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3000000},
11273{0x3000000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3000000},
11274{0x3000000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3000000},
11275{0x3000000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3000080},
11276{0x3000000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3000080},
11277{0x3000000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3000080},
11278{0x3000000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3000080},
11279{0x3000000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3000080},
11280{0x3000000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3000000},
11281{0x3000000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3000000},
11282{0x3000000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3000000},
11283{0x3000000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3000000},
11284{0x3000000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3000000},
11285{0x3000000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3000000},
11286{0x3000000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3000000},
11287{0x3000000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3000000},
11288{0x3000000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3000000},
11289{0x3000000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3000001},
11290{0x3000000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3000001},
11291{0x3000000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3000001},
11292{0x3000000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3000000},
11293{0x3000000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3000000},
11294{0x3000000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3000000},
11295{0x3000000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3000000},
11296{0x3000000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3000000},
11297{0x3000000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3000000},
11298{0x3000000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3000000},
11299{0x3000000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3000000},
11300{0x3000000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3000000},
11301{0x3000000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3000000},
11302{0x3000000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3000000},
11303{0x3000000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3000000},
11304{0x3000000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3000000},
11305{0x3000000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3000000},
11306{0x3000000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
11307{0x3000000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3000000},
11308{0x3000000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3000000},
11309{0x3000000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3000000},
11310{0x3000000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3000000},
11311{0x3000000, 0x80000000, 0x0, 0x0, 0x3000000},
11312{0x3000000, 0x80000000, 0x1, 0x0, 0x3000080},
11313{0x3000000, 0x80000000, 0x76, 0x0, 0x3000080},
11314{0x3000000, 0x80000000, 0x2b94, 0x0, 0x3000080},
11315{0x3000000, 0x80000000, 0x636d24, 0x0, 0x3000080},
11316{0x3000000, 0x80000000, 0x7fffff, 0x0, 0x3000080},
11317{0x3000000, 0x80000000, 0x800000, 0x800000, 0x3000000},
11318{0x3000000, 0x80000000, 0x800002, 0x800002, 0x3000000},
11319{0x3000000, 0x80000000, 0x1398437, 0x1398437, 0x3000000},
11320{0x3000000, 0x80000000, 0xba98d27, 0xba98d27, 0x3000000},
11321{0x3000000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3000000},
11322{0x3000000, 0x80000000, 0x751f853a, 0x751f853a, 0x3000000},
11323{0x3000000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3000000},
11324{0x3000000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3000000},
11325{0x3000000, 0x80000000, 0x7f800000, 0x7f800000, 0x3000000},
11326{0x3000000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3000001},
11327{0x3000000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3000001},
11328{0x3000000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3000001},
11329{0x3000000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3000000},
11330{0x3000000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
11331{0x3000000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3000000},
11332{0x3000000, 0x80000000, 0x80000000, 0x80000000, 0x3000000},
11333{0x3000000, 0x80000000, 0x80000001, 0x0, 0x3000080},
11334{0x3000000, 0x80000000, 0x80000076, 0x0, 0x3000080},
11335{0x3000000, 0x80000000, 0x80002b94, 0x0, 0x3000080},
11336{0x3000000, 0x80000000, 0x80636d24, 0x0, 0x3000080},
11337{0x3000000, 0x80000000, 0x807fffff, 0x0, 0x3000080},
11338{0x3000000, 0x80000000, 0x80800000, 0x80800000, 0x3000000},
11339{0x3000000, 0x80000000, 0x80800002, 0x80800002, 0x3000000},
11340{0x3000000, 0x80000000, 0x81398437, 0x81398437, 0x3000000},
11341{0x3000000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3000000},
11342{0x3000000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3000000},
11343{0x3000000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3000000},
11344{0x3000000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3000000},
11345{0x3000000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3000000},
11346{0x3000000, 0x80000000, 0xff800000, 0xff800000, 0x3000000},
11347{0x3000000, 0x80000000, 0xff800001, 0x7fc00000, 0x3000001},
11348{0x3000000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3000001},
11349{0x3000000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3000001},
11350{0x3000000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3000000},
11351{0x3000000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3000000},
11352{0x3000000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3000000},
11353{0x3000000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3000000},
11354{0x3000000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3000000},
11355{0x3000000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3000000},
11356{0x3000000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3000000},
11357{0x3000000, 0x80000000, 0x9503366, 0x9503366, 0x3000000},
11358{0x3000000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3000000},
11359{0x3000000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3000000},
11360{0x3000000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3000000},
11361{0x3000000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3000000},
11362{0x3000000, 0x80000000, 0x966320b, 0x966320b, 0x3000000},
11363{0x3000000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3000000},
11364{0x3000000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000000},
11365{0x3000000, 0x80000000, 0x317285d3, 0x317285d3, 0x3000000},
11366{0x3000000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3000000},
11367{0x3000000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3000000},
11368{0x3000000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3000000},
11369{0x3000000, 0x80000001, 0x0, 0x0, 0x3000080},
11370{0x3000000, 0x80000001, 0x1, 0x0, 0x3000080},
11371{0x3000000, 0x80000001, 0x76, 0x0, 0x3000080},
11372{0x3000000, 0x80000001, 0x2b94, 0x0, 0x3000080},
11373{0x3000000, 0x80000001, 0x636d24, 0x0, 0x3000080},
11374{0x3000000, 0x80000001, 0x7fffff, 0x0, 0x3000080},
11375{0x3000000, 0x80000001, 0x800000, 0x800000, 0x3000080},
11376{0x3000000, 0x80000001, 0x800002, 0x800002, 0x3000080},
11377{0x3000000, 0x80000001, 0x1398437, 0x1398437, 0x3000080},
11378{0x3000000, 0x80000001, 0xba98d27, 0xba98d27, 0x3000080},
11379{0x3000000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3000080},
11380{0x3000000, 0x80000001, 0x751f853a, 0x751f853a, 0x3000080},
11381{0x3000000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
11382{0x3000000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3000080},
11383{0x3000000, 0x80000001, 0x7f800000, 0x7f800000, 0x3000080},
11384{0x3000000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3000081},
11385{0x3000000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3000081},
11386{0x3000000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3000081},
11387{0x3000000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3000080},
11388{0x3000000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3000080},
11389{0x3000000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3000080},
11390{0x3000000, 0x80000001, 0x80000000, 0x0, 0x3000080},
11391{0x3000000, 0x80000001, 0x80000001, 0x0, 0x3000080},
11392{0x3000000, 0x80000001, 0x80000076, 0x0, 0x3000080},
11393{0x3000000, 0x80000001, 0x80002b94, 0x0, 0x3000080},
11394{0x3000000, 0x80000001, 0x80636d24, 0x0, 0x3000080},
11395{0x3000000, 0x80000001, 0x807fffff, 0x0, 0x3000080},
11396{0x3000000, 0x80000001, 0x80800000, 0x80800000, 0x3000080},
11397{0x3000000, 0x80000001, 0x80800002, 0x80800002, 0x3000080},
11398{0x3000000, 0x80000001, 0x81398437, 0x81398437, 0x3000080},
11399{0x3000000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3000080},
11400{0x3000000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
11401{0x3000000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3000080},
11402{0x3000000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3000080},
11403{0x3000000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3000080},
11404{0x3000000, 0x80000001, 0xff800000, 0xff800000, 0x3000080},
11405{0x3000000, 0x80000001, 0xff800001, 0x7fc00000, 0x3000081},
11406{0x3000000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3000081},
11407{0x3000000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3000081},
11408{0x3000000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3000080},
11409{0x3000000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3000080},
11410{0x3000000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3000080},
11411{0x3000000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3000080},
11412{0x3000000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3000080},
11413{0x3000000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3000080},
11414{0x3000000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3000080},
11415{0x3000000, 0x80000001, 0x9503366, 0x9503366, 0x3000080},
11416{0x3000000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
11417{0x3000000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
11418{0x3000000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3000080},
11419{0x3000000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
11420{0x3000000, 0x80000001, 0x966320b, 0x966320b, 0x3000080},
11421{0x3000000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3000080},
11422{0x3000000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
11423{0x3000000, 0x80000001, 0x317285d3, 0x317285d3, 0x3000080},
11424{0x3000000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3000080},
11425{0x3000000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
11426{0x3000000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3000080},
11427{0x3000000, 0x80000076, 0x0, 0x0, 0x3000080},
11428{0x3000000, 0x80000076, 0x1, 0x0, 0x3000080},
11429{0x3000000, 0x80000076, 0x76, 0x0, 0x3000080},
11430{0x3000000, 0x80000076, 0x2b94, 0x0, 0x3000080},
11431{0x3000000, 0x80000076, 0x636d24, 0x0, 0x3000080},
11432{0x3000000, 0x80000076, 0x7fffff, 0x0, 0x3000080},
11433{0x3000000, 0x80000076, 0x800000, 0x800000, 0x3000080},
11434{0x3000000, 0x80000076, 0x800002, 0x800002, 0x3000080},
11435{0x3000000, 0x80000076, 0x1398437, 0x1398437, 0x3000080},
11436{0x3000000, 0x80000076, 0xba98d27, 0xba98d27, 0x3000080},
11437{0x3000000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3000080},
11438{0x3000000, 0x80000076, 0x751f853a, 0x751f853a, 0x3000080},
11439{0x3000000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
11440{0x3000000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3000080},
11441{0x3000000, 0x80000076, 0x7f800000, 0x7f800000, 0x3000080},
11442{0x3000000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3000081},
11443{0x3000000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3000081},
11444{0x3000000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3000081},
11445{0x3000000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3000080},
11446{0x3000000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3000080},
11447{0x3000000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3000080},
11448{0x3000000, 0x80000076, 0x80000000, 0x0, 0x3000080},
11449{0x3000000, 0x80000076, 0x80000001, 0x0, 0x3000080},
11450{0x3000000, 0x80000076, 0x80000076, 0x0, 0x3000080},
11451{0x3000000, 0x80000076, 0x80002b94, 0x0, 0x3000080},
11452{0x3000000, 0x80000076, 0x80636d24, 0x0, 0x3000080},
11453{0x3000000, 0x80000076, 0x807fffff, 0x0, 0x3000080},
11454{0x3000000, 0x80000076, 0x80800000, 0x80800000, 0x3000080},
11455{0x3000000, 0x80000076, 0x80800002, 0x80800002, 0x3000080},
11456{0x3000000, 0x80000076, 0x81398437, 0x81398437, 0x3000080},
11457{0x3000000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3000080},
11458{0x3000000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
11459{0x3000000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3000080},
11460{0x3000000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3000080},
11461{0x3000000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3000080},
11462{0x3000000, 0x80000076, 0xff800000, 0xff800000, 0x3000080},
11463{0x3000000, 0x80000076, 0xff800001, 0x7fc00000, 0x3000081},
11464{0x3000000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3000081},
11465{0x3000000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3000081},
11466{0x3000000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3000080},
11467{0x3000000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3000080},
11468{0x3000000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3000080},
11469{0x3000000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3000080},
11470{0x3000000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3000080},
11471{0x3000000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3000080},
11472{0x3000000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3000080},
11473{0x3000000, 0x80000076, 0x9503366, 0x9503366, 0x3000080},
11474{0x3000000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
11475{0x3000000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
11476{0x3000000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3000080},
11477{0x3000000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
11478{0x3000000, 0x80000076, 0x966320b, 0x966320b, 0x3000080},
11479{0x3000000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3000080},
11480{0x3000000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
11481{0x3000000, 0x80000076, 0x317285d3, 0x317285d3, 0x3000080},
11482{0x3000000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3000080},
11483{0x3000000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
11484{0x3000000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3000080},
11485{0x3000000, 0x80002b94, 0x0, 0x0, 0x3000080},
11486{0x3000000, 0x80002b94, 0x1, 0x0, 0x3000080},
11487{0x3000000, 0x80002b94, 0x76, 0x0, 0x3000080},
11488{0x3000000, 0x80002b94, 0x2b94, 0x0, 0x3000080},
11489{0x3000000, 0x80002b94, 0x636d24, 0x0, 0x3000080},
11490{0x3000000, 0x80002b94, 0x7fffff, 0x0, 0x3000080},
11491{0x3000000, 0x80002b94, 0x800000, 0x800000, 0x3000080},
11492{0x3000000, 0x80002b94, 0x800002, 0x800002, 0x3000080},
11493{0x3000000, 0x80002b94, 0x1398437, 0x1398437, 0x3000080},
11494{0x3000000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3000080},
11495{0x3000000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3000080},
11496{0x3000000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3000080},
11497{0x3000000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
11498{0x3000000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3000080},
11499{0x3000000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3000080},
11500{0x3000000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3000081},
11501{0x3000000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3000081},
11502{0x3000000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3000081},
11503{0x3000000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3000080},
11504{0x3000000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3000080},
11505{0x3000000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3000080},
11506{0x3000000, 0x80002b94, 0x80000000, 0x0, 0x3000080},
11507{0x3000000, 0x80002b94, 0x80000001, 0x0, 0x3000080},
11508{0x3000000, 0x80002b94, 0x80000076, 0x0, 0x3000080},
11509{0x3000000, 0x80002b94, 0x80002b94, 0x0, 0x3000080},
11510{0x3000000, 0x80002b94, 0x80636d24, 0x0, 0x3000080},
11511{0x3000000, 0x80002b94, 0x807fffff, 0x0, 0x3000080},
11512{0x3000000, 0x80002b94, 0x80800000, 0x80800000, 0x3000080},
11513{0x3000000, 0x80002b94, 0x80800002, 0x80800002, 0x3000080},
11514{0x3000000, 0x80002b94, 0x81398437, 0x81398437, 0x3000080},
11515{0x3000000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3000080},
11516{0x3000000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
11517{0x3000000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3000080},
11518{0x3000000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3000080},
11519{0x3000000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3000080},
11520{0x3000000, 0x80002b94, 0xff800000, 0xff800000, 0x3000080},
11521{0x3000000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3000081},
11522{0x3000000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3000081},
11523{0x3000000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3000081},
11524{0x3000000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3000080},
11525{0x3000000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3000080},
11526{0x3000000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3000080},
11527{0x3000000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3000080},
11528{0x3000000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3000080},
11529{0x3000000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3000080},
11530{0x3000000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3000080},
11531{0x3000000, 0x80002b94, 0x9503366, 0x9503366, 0x3000080},
11532{0x3000000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
11533{0x3000000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
11534{0x3000000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3000080},
11535{0x3000000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
11536{0x3000000, 0x80002b94, 0x966320b, 0x966320b, 0x3000080},
11537{0x3000000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3000080},
11538{0x3000000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
11539{0x3000000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3000080},
11540{0x3000000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3000080},
11541{0x3000000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
11542{0x3000000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3000080},
11543{0x3000000, 0x80636d24, 0x0, 0x0, 0x3000080},
11544{0x3000000, 0x80636d24, 0x1, 0x0, 0x3000080},
11545{0x3000000, 0x80636d24, 0x76, 0x0, 0x3000080},
11546{0x3000000, 0x80636d24, 0x2b94, 0x0, 0x3000080},
11547{0x3000000, 0x80636d24, 0x636d24, 0x0, 0x3000080},
11548{0x3000000, 0x80636d24, 0x7fffff, 0x0, 0x3000080},
11549{0x3000000, 0x80636d24, 0x800000, 0x800000, 0x3000080},
11550{0x3000000, 0x80636d24, 0x800002, 0x800002, 0x3000080},
11551{0x3000000, 0x80636d24, 0x1398437, 0x1398437, 0x3000080},
11552{0x3000000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3000080},
11553{0x3000000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3000080},
11554{0x3000000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3000080},
11555{0x3000000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
11556{0x3000000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3000080},
11557{0x3000000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3000080},
11558{0x3000000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3000081},
11559{0x3000000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3000081},
11560{0x3000000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3000081},
11561{0x3000000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3000080},
11562{0x3000000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3000080},
11563{0x3000000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3000080},
11564{0x3000000, 0x80636d24, 0x80000000, 0x0, 0x3000080},
11565{0x3000000, 0x80636d24, 0x80000001, 0x0, 0x3000080},
11566{0x3000000, 0x80636d24, 0x80000076, 0x0, 0x3000080},
11567{0x3000000, 0x80636d24, 0x80002b94, 0x0, 0x3000080},
11568{0x3000000, 0x80636d24, 0x80636d24, 0x0, 0x3000080},
11569{0x3000000, 0x80636d24, 0x807fffff, 0x0, 0x3000080},
11570{0x3000000, 0x80636d24, 0x80800000, 0x80800000, 0x3000080},
11571{0x3000000, 0x80636d24, 0x80800002, 0x80800002, 0x3000080},
11572{0x3000000, 0x80636d24, 0x81398437, 0x81398437, 0x3000080},
11573{0x3000000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3000080},
11574{0x3000000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
11575{0x3000000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3000080},
11576{0x3000000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3000080},
11577{0x3000000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3000080},
11578{0x3000000, 0x80636d24, 0xff800000, 0xff800000, 0x3000080},
11579{0x3000000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3000081},
11580{0x3000000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3000081},
11581{0x3000000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3000081},
11582{0x3000000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3000080},
11583{0x3000000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3000080},
11584{0x3000000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3000080},
11585{0x3000000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3000080},
11586{0x3000000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3000080},
11587{0x3000000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3000080},
11588{0x3000000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3000080},
11589{0x3000000, 0x80636d24, 0x9503366, 0x9503366, 0x3000080},
11590{0x3000000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
11591{0x3000000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
11592{0x3000000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3000080},
11593{0x3000000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
11594{0x3000000, 0x80636d24, 0x966320b, 0x966320b, 0x3000080},
11595{0x3000000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3000080},
11596{0x3000000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
11597{0x3000000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3000080},
11598{0x3000000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3000080},
11599{0x3000000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
11600{0x3000000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3000080},
11601{0x3000000, 0x807fffff, 0x0, 0x0, 0x3000080},
11602{0x3000000, 0x807fffff, 0x1, 0x0, 0x3000080},
11603{0x3000000, 0x807fffff, 0x76, 0x0, 0x3000080},
11604{0x3000000, 0x807fffff, 0x2b94, 0x0, 0x3000080},
11605{0x3000000, 0x807fffff, 0x636d24, 0x0, 0x3000080},
11606{0x3000000, 0x807fffff, 0x7fffff, 0x0, 0x3000080},
11607{0x3000000, 0x807fffff, 0x800000, 0x800000, 0x3000080},
11608{0x3000000, 0x807fffff, 0x800002, 0x800002, 0x3000080},
11609{0x3000000, 0x807fffff, 0x1398437, 0x1398437, 0x3000080},
11610{0x3000000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3000080},
11611{0x3000000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3000080},
11612{0x3000000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3000080},
11613{0x3000000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
11614{0x3000000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3000080},
11615{0x3000000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3000080},
11616{0x3000000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3000081},
11617{0x3000000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3000081},
11618{0x3000000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3000081},
11619{0x3000000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3000080},
11620{0x3000000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3000080},
11621{0x3000000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3000080},
11622{0x3000000, 0x807fffff, 0x80000000, 0x0, 0x3000080},
11623{0x3000000, 0x807fffff, 0x80000001, 0x0, 0x3000080},
11624{0x3000000, 0x807fffff, 0x80000076, 0x0, 0x3000080},
11625{0x3000000, 0x807fffff, 0x80002b94, 0x0, 0x3000080},
11626{0x3000000, 0x807fffff, 0x80636d24, 0x0, 0x3000080},
11627{0x3000000, 0x807fffff, 0x807fffff, 0x0, 0x3000080},
11628{0x3000000, 0x807fffff, 0x80800000, 0x80800000, 0x3000080},
11629{0x3000000, 0x807fffff, 0x80800002, 0x80800002, 0x3000080},
11630{0x3000000, 0x807fffff, 0x81398437, 0x81398437, 0x3000080},
11631{0x3000000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3000080},
11632{0x3000000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
11633{0x3000000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3000080},
11634{0x3000000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3000080},
11635{0x3000000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3000080},
11636{0x3000000, 0x807fffff, 0xff800000, 0xff800000, 0x3000080},
11637{0x3000000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3000081},
11638{0x3000000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3000081},
11639{0x3000000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3000081},
11640{0x3000000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3000080},
11641{0x3000000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3000080},
11642{0x3000000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3000080},
11643{0x3000000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3000080},
11644{0x3000000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3000080},
11645{0x3000000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3000080},
11646{0x3000000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3000080},
11647{0x3000000, 0x807fffff, 0x9503366, 0x9503366, 0x3000080},
11648{0x3000000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
11649{0x3000000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
11650{0x3000000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3000080},
11651{0x3000000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
11652{0x3000000, 0x807fffff, 0x966320b, 0x966320b, 0x3000080},
11653{0x3000000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3000080},
11654{0x3000000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
11655{0x3000000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3000080},
11656{0x3000000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3000080},
11657{0x3000000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
11658{0x3000000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3000080},
11659{0x3000000, 0x80800000, 0x0, 0x80800000, 0x3000000},
11660{0x3000000, 0x80800000, 0x1, 0x80800000, 0x3000080},
11661{0x3000000, 0x80800000, 0x76, 0x80800000, 0x3000080},
11662{0x3000000, 0x80800000, 0x2b94, 0x80800000, 0x3000080},
11663{0x3000000, 0x80800000, 0x636d24, 0x80800000, 0x3000080},
11664{0x3000000, 0x80800000, 0x7fffff, 0x80800000, 0x3000080},
11665{0x3000000, 0x80800000, 0x800000, 0x0, 0x3000000},
11666{0x3000000, 0x80800000, 0x800002, 0x0, 0x3000008},
11667{0x3000000, 0x80800000, 0x1398437, 0xf3086e, 0x3000000},
11668{0x3000000, 0x80800000, 0xba98d27, 0xba98d25, 0x3000000},
11669{0x3000000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3000000},
11670{0x3000000, 0x80800000, 0x751f853a, 0x751f853a, 0x3000010},
11671{0x3000000, 0x80800000, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
11672{0x3000000, 0x80800000, 0x7f7fffff, 0x7f7fffff, 0x3000010},
11673{0x3000000, 0x80800000, 0x7f800000, 0x7f800000, 0x3000000},
11674{0x3000000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3000001},
11675{0x3000000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3000001},
11676{0x3000000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3000001},
11677{0x3000000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3000000},
11678{0x3000000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
11679{0x3000000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3000000},
11680{0x3000000, 0x80800000, 0x80000000, 0x80800000, 0x3000000},
11681{0x3000000, 0x80800000, 0x80000001, 0x80800000, 0x3000080},
11682{0x3000000, 0x80800000, 0x80000076, 0x80800000, 0x3000080},
11683{0x3000000, 0x80800000, 0x80002b94, 0x80800000, 0x3000080},
11684{0x3000000, 0x80800000, 0x80636d24, 0x80800000, 0x3000080},
11685{0x3000000, 0x80800000, 0x807fffff, 0x80800000, 0x3000080},
11686{0x3000000, 0x80800000, 0x80800000, 0x81000000, 0x3000000},
11687{0x3000000, 0x80800000, 0x80800002, 0x81000001, 0x3000000},
11688{0x3000000, 0x80800000, 0x81398437, 0x81798437, 0x3000000},
11689{0x3000000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3000000},
11690{0x3000000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3000000},
11691{0x3000000, 0x80800000, 0xf51f853a, 0xf51f853a, 0x3000010},
11692{0x3000000, 0x80800000, 0xff7ffff0, 0xff7ffff0, 0x3000010},
11693{0x3000000, 0x80800000, 0xff7fffff, 0xff7fffff, 0x3000010},
11694{0x3000000, 0x80800000, 0xff800000, 0xff800000, 0x3000000},
11695{0x3000000, 0x80800000, 0xff800001, 0x7fc00000, 0x3000001},
11696{0x3000000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3000001},
11697{0x3000000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3000001},
11698{0x3000000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3000000},
11699{0x3000000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3000000},
11700{0x3000000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3000000},
11701{0x3000000, 0x80800000, 0x4f3495cb, 0x4f3495cb, 0x3000010},
11702{0x3000000, 0x80800000, 0xe73a5134, 0xe73a5134, 0x3000010},
11703{0x3000000, 0x80800000, 0x7c994e9e, 0x7c994e9e, 0x3000010},
11704{0x3000000, 0x80800000, 0x6164bd6c, 0x6164bd6c, 0x3000010},
11705{0x3000000, 0x80800000, 0x9503366, 0x9503326, 0x3000000},
11706{0x3000000, 0x80800000, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
11707{0x3000000, 0x80800000, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
11708{0x3000000, 0x80800000, 0x77f31e2f, 0x77f31e2f, 0x3000010},
11709{0x3000000, 0x80800000, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
11710{0x3000000, 0x80800000, 0x966320b, 0x96631cb, 0x3000000},
11711{0x3000000, 0x80800000, 0xb26bddee, 0xb26bddee, 0x3000010},
11712{0x3000000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
11713{0x3000000, 0x80800000, 0x317285d3, 0x317285d3, 0x3000010},
11714{0x3000000, 0x80800000, 0x3c9623b1, 0x3c9623b1, 0x3000010},
11715{0x3000000, 0x80800000, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
11716{0x3000000, 0x80800000, 0x7b906a6c, 0x7b906a6c, 0x3000010},
11717{0x3000000, 0x80800002, 0x0, 0x80800002, 0x3000000},
11718{0x3000000, 0x80800002, 0x1, 0x80800002, 0x3000080},
11719{0x3000000, 0x80800002, 0x76, 0x80800002, 0x3000080},
11720{0x3000000, 0x80800002, 0x2b94, 0x80800002, 0x3000080},
11721{0x3000000, 0x80800002, 0x636d24, 0x80800002, 0x3000080},
11722{0x3000000, 0x80800002, 0x7fffff, 0x80800002, 0x3000080},
11723{0x3000000, 0x80800002, 0x800000, 0x0, 0x3000008},
11724{0x3000000, 0x80800002, 0x800002, 0x0, 0x3000000},
11725{0x3000000, 0x80800002, 0x1398437, 0xf3086c, 0x3000000},
11726{0x3000000, 0x80800002, 0xba98d27, 0xba98d25, 0x3000010},
11727{0x3000000, 0x80800002, 0xba98d7a, 0xba98d78, 0x3000010},
11728{0x3000000, 0x80800002, 0x751f853a, 0x751f853a, 0x3000010},
11729{0x3000000, 0x80800002, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
11730{0x3000000, 0x80800002, 0x7f7fffff, 0x7f7fffff, 0x3000010},
11731{0x3000000, 0x80800002, 0x7f800000, 0x7f800000, 0x3000000},
11732{0x3000000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3000001},
11733{0x3000000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3000001},
11734{0x3000000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3000001},
11735{0x3000000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3000000},
11736{0x3000000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3000000},
11737{0x3000000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3000000},
11738{0x3000000, 0x80800002, 0x80000000, 0x80800002, 0x3000000},
11739{0x3000000, 0x80800002, 0x80000001, 0x80800002, 0x3000080},
11740{0x3000000, 0x80800002, 0x80000076, 0x80800002, 0x3000080},
11741{0x3000000, 0x80800002, 0x80002b94, 0x80800002, 0x3000080},
11742{0x3000000, 0x80800002, 0x80636d24, 0x80800002, 0x3000080},
11743{0x3000000, 0x80800002, 0x807fffff, 0x80800002, 0x3000080},
11744{0x3000000, 0x80800002, 0x80800000, 0x81000001, 0x3000000},
11745{0x3000000, 0x80800002, 0x80800002, 0x81000002, 0x3000000},
11746{0x3000000, 0x80800002, 0x81398437, 0x81798438, 0x3000000},
11747{0x3000000, 0x80800002, 0x8ba98d27, 0x8ba98d29, 0x3000010},
11748{0x3000000, 0x80800002, 0x8ba98d7a, 0x8ba98d7c, 0x3000010},
11749{0x3000000, 0x80800002, 0xf51f853a, 0xf51f853a, 0x3000010},
11750{0x3000000, 0x80800002, 0xff7ffff0, 0xff7ffff0, 0x3000010},
11751{0x3000000, 0x80800002, 0xff7fffff, 0xff7fffff, 0x3000010},
11752{0x3000000, 0x80800002, 0xff800000, 0xff800000, 0x3000000},
11753{0x3000000, 0x80800002, 0xff800001, 0x7fc00000, 0x3000001},
11754{0x3000000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3000001},
11755{0x3000000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3000001},
11756{0x3000000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3000000},
11757{0x3000000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3000000},
11758{0x3000000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3000000},
11759{0x3000000, 0x80800002, 0x4f3495cb, 0x4f3495cb, 0x3000010},
11760{0x3000000, 0x80800002, 0xe73a5134, 0xe73a5134, 0x3000010},
11761{0x3000000, 0x80800002, 0x7c994e9e, 0x7c994e9e, 0x3000010},
11762{0x3000000, 0x80800002, 0x6164bd6c, 0x6164bd6c, 0x3000010},
11763{0x3000000, 0x80800002, 0x9503366, 0x9503326, 0x3000010},
11764{0x3000000, 0x80800002, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
11765{0x3000000, 0x80800002, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
11766{0x3000000, 0x80800002, 0x77f31e2f, 0x77f31e2f, 0x3000010},
11767{0x3000000, 0x80800002, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
11768{0x3000000, 0x80800002, 0x966320b, 0x96631cb, 0x3000010},
11769{0x3000000, 0x80800002, 0xb26bddee, 0xb26bddee, 0x3000010},
11770{0x3000000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
11771{0x3000000, 0x80800002, 0x317285d3, 0x317285d3, 0x3000010},
11772{0x3000000, 0x80800002, 0x3c9623b1, 0x3c9623b1, 0x3000010},
11773{0x3000000, 0x80800002, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
11774{0x3000000, 0x80800002, 0x7b906a6c, 0x7b906a6c, 0x3000010},
11775{0x3000000, 0x81398437, 0x0, 0x81398437, 0x3000000},
11776{0x3000000, 0x81398437, 0x1, 0x81398437, 0x3000080},
11777{0x3000000, 0x81398437, 0x76, 0x81398437, 0x3000080},
11778{0x3000000, 0x81398437, 0x2b94, 0x81398437, 0x3000080},
11779{0x3000000, 0x81398437, 0x636d24, 0x81398437, 0x3000080},
11780{0x3000000, 0x81398437, 0x7fffff, 0x81398437, 0x3000080},
11781{0x3000000, 0x81398437, 0x800000, 0x80f3086e, 0x3000000},
11782{0x3000000, 0x81398437, 0x800002, 0x80f3086c, 0x3000000},
11783{0x3000000, 0x81398437, 0x1398437, 0x0, 0x3000000},
11784{0x3000000, 0x81398437, 0xba98d27, 0xba98d21, 0x3000010},
11785{0x3000000, 0x81398437, 0xba98d7a, 0xba98d74, 0x3000010},
11786{0x3000000, 0x81398437, 0x751f853a, 0x751f853a, 0x3000010},
11787{0x3000000, 0x81398437, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
11788{0x3000000, 0x81398437, 0x7f7fffff, 0x7f7fffff, 0x3000010},
11789{0x3000000, 0x81398437, 0x7f800000, 0x7f800000, 0x3000000},
11790{0x3000000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3000001},
11791{0x3000000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3000001},
11792{0x3000000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3000001},
11793{0x3000000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3000000},
11794{0x3000000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3000000},
11795{0x3000000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3000000},
11796{0x3000000, 0x81398437, 0x80000000, 0x81398437, 0x3000000},
11797{0x3000000, 0x81398437, 0x80000001, 0x81398437, 0x3000080},
11798{0x3000000, 0x81398437, 0x80000076, 0x81398437, 0x3000080},
11799{0x3000000, 0x81398437, 0x80002b94, 0x81398437, 0x3000080},
11800{0x3000000, 0x81398437, 0x80636d24, 0x81398437, 0x3000080},
11801{0x3000000, 0x81398437, 0x807fffff, 0x81398437, 0x3000080},
11802{0x3000000, 0x81398437, 0x80800000, 0x81798437, 0x3000000},
11803{0x3000000, 0x81398437, 0x80800002, 0x81798438, 0x3000000},
11804{0x3000000, 0x81398437, 0x81398437, 0x81b98437, 0x3000000},
11805{0x3000000, 0x81398437, 0x8ba98d27, 0x8ba98d2d, 0x3000010},
11806{0x3000000, 0x81398437, 0x8ba98d7a, 0x8ba98d80, 0x3000010},
11807{0x3000000, 0x81398437, 0xf51f853a, 0xf51f853a, 0x3000010},
11808{0x3000000, 0x81398437, 0xff7ffff0, 0xff7ffff0, 0x3000010},
11809{0x3000000, 0x81398437, 0xff7fffff, 0xff7fffff, 0x3000010},
11810{0x3000000, 0x81398437, 0xff800000, 0xff800000, 0x3000000},
11811{0x3000000, 0x81398437, 0xff800001, 0x7fc00000, 0x3000001},
11812{0x3000000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3000001},
11813{0x3000000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3000001},
11814{0x3000000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3000000},
11815{0x3000000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3000000},
11816{0x3000000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3000000},
11817{0x3000000, 0x81398437, 0x4f3495cb, 0x4f3495cb, 0x3000010},
11818{0x3000000, 0x81398437, 0xe73a5134, 0xe73a5134, 0x3000010},
11819{0x3000000, 0x81398437, 0x7c994e9e, 0x7c994e9e, 0x3000010},
11820{0x3000000, 0x81398437, 0x6164bd6c, 0x6164bd6c, 0x3000010},
11821{0x3000000, 0x81398437, 0x9503366, 0x95032ac, 0x3000010},
11822{0x3000000, 0x81398437, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
11823{0x3000000, 0x81398437, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
11824{0x3000000, 0x81398437, 0x77f31e2f, 0x77f31e2f, 0x3000010},
11825{0x3000000, 0x81398437, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
11826{0x3000000, 0x81398437, 0x966320b, 0x9663151, 0x3000010},
11827{0x3000000, 0x81398437, 0xb26bddee, 0xb26bddee, 0x3000010},
11828{0x3000000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
11829{0x3000000, 0x81398437, 0x317285d3, 0x317285d3, 0x3000010},
11830{0x3000000, 0x81398437, 0x3c9623b1, 0x3c9623b1, 0x3000010},
11831{0x3000000, 0x81398437, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
11832{0x3000000, 0x81398437, 0x7b906a6c, 0x7b906a6c, 0x3000010},
11833{0x3000000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3000000},
11834{0x3000000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3000080},
11835{0x3000000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3000080},
11836{0x3000000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3000080},
11837{0x3000000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3000080},
11838{0x3000000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3000080},
11839{0x3000000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3000000},
11840{0x3000000, 0x8ba98d27, 0x800002, 0x8ba98d25, 0x3000010},
11841{0x3000000, 0x8ba98d27, 0x1398437, 0x8ba98d21, 0x3000010},
11842{0x3000000, 0x8ba98d27, 0xba98d27, 0x0, 0x3000000},
11843{0x3000000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3000000},
11844{0x3000000, 0x8ba98d27, 0x751f853a, 0x751f853a, 0x3000010},
11845{0x3000000, 0x8ba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
11846{0x3000000, 0x8ba98d27, 0x7f7fffff, 0x7f7fffff, 0x3000010},
11847{0x3000000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3000000},
11848{0x3000000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3000001},
11849{0x3000000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3000001},
11850{0x3000000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3000001},
11851{0x3000000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3000000},
11852{0x3000000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3000000},
11853{0x3000000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3000000},
11854{0x3000000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3000000},
11855{0x3000000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3000080},
11856{0x3000000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3000080},
11857{0x3000000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3000080},
11858{0x3000000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3000080},
11859{0x3000000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3000080},
11860{0x3000000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3000000},
11861{0x3000000, 0x8ba98d27, 0x80800002, 0x8ba98d29, 0x3000010},
11862{0x3000000, 0x8ba98d27, 0x81398437, 0x8ba98d2d, 0x3000010},
11863{0x3000000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3000000},
11864{0x3000000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d50, 0x3000010},
11865{0x3000000, 0x8ba98d27, 0xf51f853a, 0xf51f853a, 0x3000010},
11866{0x3000000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff0, 0x3000010},
11867{0x3000000, 0x8ba98d27, 0xff7fffff, 0xff7fffff, 0x3000010},
11868{0x3000000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3000000},
11869{0x3000000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3000001},
11870{0x3000000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3000001},
11871{0x3000000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3000001},
11872{0x3000000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3000000},
11873{0x3000000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3000000},
11874{0x3000000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3000000},
11875{0x3000000, 0x8ba98d27, 0x4f3495cb, 0x4f3495cb, 0x3000010},
11876{0x3000000, 0x8ba98d27, 0xe73a5134, 0xe73a5134, 0x3000010},
11877{0x3000000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9e, 0x3000010},
11878{0x3000000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6c, 0x3000010},
11879{0x3000000, 0x8ba98d27, 0x9503366, 0x8ba30b8c, 0x3000010},
11880{0x3000000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
11881{0x3000000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
11882{0x3000000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2f, 0x3000010},
11883{0x3000000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
11884{0x3000000, 0x8ba98d27, 0x966320b, 0x8ba25b97, 0x3000010},
11885{0x3000000, 0x8ba98d27, 0xb26bddee, 0xb26bddee, 0x3000010},
11886{0x3000000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
11887{0x3000000, 0x8ba98d27, 0x317285d3, 0x317285d3, 0x3000010},
11888{0x3000000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b1, 0x3000010},
11889{0x3000000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
11890{0x3000000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6c, 0x3000010},
11891{0x3000000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3000000},
11892{0x3000000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3000080},
11893{0x3000000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3000080},
11894{0x3000000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3000080},
11895{0x3000000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3000080},
11896{0x3000000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3000080},
11897{0x3000000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3000000},
11898{0x3000000, 0x8ba98d7a, 0x800002, 0x8ba98d78, 0x3000010},
11899{0x3000000, 0x8ba98d7a, 0x1398437, 0x8ba98d74, 0x3000010},
11900{0x3000000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3000000},
11901{0x3000000, 0x8ba98d7a, 0xba98d7a, 0x0, 0x3000000},
11902{0x3000000, 0x8ba98d7a, 0x751f853a, 0x751f853a, 0x3000010},
11903{0x3000000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
11904{0x3000000, 0x8ba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3000010},
11905{0x3000000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3000000},
11906{0x3000000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3000001},
11907{0x3000000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3000001},
11908{0x3000000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3000001},
11909{0x3000000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3000000},
11910{0x3000000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3000000},
11911{0x3000000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3000000},
11912{0x3000000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3000000},
11913{0x3000000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3000080},
11914{0x3000000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3000080},
11915{0x3000000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3000080},
11916{0x3000000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3000080},
11917{0x3000000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3000080},
11918{0x3000000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3000000},
11919{0x3000000, 0x8ba98d7a, 0x80800002, 0x8ba98d7c, 0x3000010},
11920{0x3000000, 0x8ba98d7a, 0x81398437, 0x8ba98d80, 0x3000010},
11921{0x3000000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d50, 0x3000010},
11922{0x3000000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3000000},
11923{0x3000000, 0x8ba98d7a, 0xf51f853a, 0xf51f853a, 0x3000010},
11924{0x3000000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3000010},
11925{0x3000000, 0x8ba98d7a, 0xff7fffff, 0xff7fffff, 0x3000010},
11926{0x3000000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3000000},
11927{0x3000000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3000001},
11928{0x3000000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3000001},
11929{0x3000000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3000001},
11930{0x3000000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3000000},
11931{0x3000000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3000000},
11932{0x3000000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3000000},
11933{0x3000000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3000010},
11934{0x3000000, 0x8ba98d7a, 0xe73a5134, 0xe73a5134, 0x3000010},
11935{0x3000000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3000010},
11936{0x3000000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3000010},
11937{0x3000000, 0x8ba98d7a, 0x9503366, 0x8ba30bdf, 0x3000010},
11938{0x3000000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
11939{0x3000000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
11940{0x3000000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3000010},
11941{0x3000000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
11942{0x3000000, 0x8ba98d7a, 0x966320b, 0x8ba25bea, 0x3000010},
11943{0x3000000, 0x8ba98d7a, 0xb26bddee, 0xb26bddee, 0x3000010},
11944{0x3000000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
11945{0x3000000, 0x8ba98d7a, 0x317285d3, 0x317285d3, 0x3000010},
11946{0x3000000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3000010},
11947{0x3000000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
11948{0x3000000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3000010},
11949{0x3000000, 0xf51f853a, 0x0, 0xf51f853a, 0x3000000},
11950{0x3000000, 0xf51f853a, 0x1, 0xf51f853a, 0x3000080},
11951{0x3000000, 0xf51f853a, 0x76, 0xf51f853a, 0x3000080},
11952{0x3000000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3000080},
11953{0x3000000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3000080},
11954{0x3000000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3000080},
11955{0x3000000, 0xf51f853a, 0x800000, 0xf51f853a, 0x3000010},
11956{0x3000000, 0xf51f853a, 0x800002, 0xf51f853a, 0x3000010},
11957{0x3000000, 0xf51f853a, 0x1398437, 0xf51f853a, 0x3000010},
11958{0x3000000, 0xf51f853a, 0xba98d27, 0xf51f853a, 0x3000010},
11959{0x3000000, 0xf51f853a, 0xba98d7a, 0xf51f853a, 0x3000010},
11960{0x3000000, 0xf51f853a, 0x751f853a, 0x0, 0x3000000},
11961{0x3000000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe6, 0x3000010},
11962{0x3000000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff5, 0x3000010},
11963{0x3000000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3000000},
11964{0x3000000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3000001},
11965{0x3000000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3000001},
11966{0x3000000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3000001},
11967{0x3000000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3000000},
11968{0x3000000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3000000},
11969{0x3000000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3000000},
11970{0x3000000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3000000},
11971{0x3000000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3000080},
11972{0x3000000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3000080},
11973{0x3000000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3000080},
11974{0x3000000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3000080},
11975{0x3000000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3000080},
11976{0x3000000, 0xf51f853a, 0x80800000, 0xf51f853a, 0x3000010},
11977{0x3000000, 0xf51f853a, 0x80800002, 0xf51f853a, 0x3000010},
11978{0x3000000, 0xf51f853a, 0x81398437, 0xf51f853a, 0x3000010},
11979{0x3000000, 0xf51f853a, 0x8ba98d27, 0xf51f853a, 0x3000010},
11980{0x3000000, 0xf51f853a, 0x8ba98d7a, 0xf51f853a, 0x3000010},
11981{0x3000000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3000000},
11982{0x3000000, 0xf51f853a, 0xff7ffff0, 0xff7ffffa, 0x3000010},
11983{0x3000000, 0xf51f853a, 0xff7fffff, 0xff800000, 0x3000014},
11984{0x3000000, 0xf51f853a, 0xff800000, 0xff800000, 0x3000000},
11985{0x3000000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3000001},
11986{0x3000000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3000001},
11987{0x3000000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3000001},
11988{0x3000000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3000000},
11989{0x3000000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3000000},
11990{0x3000000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3000000},
11991{0x3000000, 0xf51f853a, 0x4f3495cb, 0xf51f853a, 0x3000010},
11992{0x3000000, 0xf51f853a, 0xe73a5134, 0xf51f853a, 0x3000010},
11993{0x3000000, 0xf51f853a, 0x7c994e9e, 0x7c994d5f, 0x3000010},
11994{0x3000000, 0xf51f853a, 0x6164bd6c, 0xf51f853a, 0x3000010},
11995{0x3000000, 0xf51f853a, 0x9503366, 0xf51f853a, 0x3000010},
11996{0x3000000, 0xf51f853a, 0xbf5a97c9, 0xf51f853a, 0x3000010},
11997{0x3000000, 0xf51f853a, 0xe6ff1a14, 0xf51f853a, 0x3000010},
11998{0x3000000, 0xf51f853a, 0x77f31e2f, 0x77ee2205, 0x3000010},
11999{0x3000000, 0xf51f853a, 0xaab4d7d8, 0xf51f853a, 0x3000010},
12000{0x3000000, 0xf51f853a, 0x966320b, 0xf51f853a, 0x3000010},
12001{0x3000000, 0xf51f853a, 0xb26bddee, 0xf51f853a, 0x3000010},
12002{0x3000000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853a, 0x3000010},
12003{0x3000000, 0xf51f853a, 0x317285d3, 0xf51f853a, 0x3000010},
12004{0x3000000, 0xf51f853a, 0x3c9623b1, 0xf51f853a, 0x3000010},
12005{0x3000000, 0xf51f853a, 0x51fd2c7c, 0xf51f853a, 0x3000010},
12006{0x3000000, 0xf51f853a, 0x7b906a6c, 0x7b906570, 0x3000010},
12007{0x3000000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3000000},
12008{0x3000000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3000080},
12009{0x3000000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3000080},
12010{0x3000000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3000080},
12011{0x3000000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3000080},
12012{0x3000000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3000080},
12013{0x3000000, 0xff7ffff0, 0x800000, 0xff7ffff0, 0x3000010},
12014{0x3000000, 0xff7ffff0, 0x800002, 0xff7ffff0, 0x3000010},
12015{0x3000000, 0xff7ffff0, 0x1398437, 0xff7ffff0, 0x3000010},
12016{0x3000000, 0xff7ffff0, 0xba98d27, 0xff7ffff0, 0x3000010},
12017{0x3000000, 0xff7ffff0, 0xba98d7a, 0xff7ffff0, 0x3000010},
12018{0x3000000, 0xff7ffff0, 0x751f853a, 0xff7fffe6, 0x3000010},
12019{0x3000000, 0xff7ffff0, 0x7f7ffff0, 0x0, 0x3000000},
12020{0x3000000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3000000},
12021{0x3000000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3000000},
12022{0x3000000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3000001},
12023{0x3000000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3000001},
12024{0x3000000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3000001},
12025{0x3000000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3000000},
12026{0x3000000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3000000},
12027{0x3000000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3000000},
12028{0x3000000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3000000},
12029{0x3000000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3000080},
12030{0x3000000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3000080},
12031{0x3000000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3000080},
12032{0x3000000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3000080},
12033{0x3000000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3000080},
12034{0x3000000, 0xff7ffff0, 0x80800000, 0xff7ffff0, 0x3000010},
12035{0x3000000, 0xff7ffff0, 0x80800002, 0xff7ffff0, 0x3000010},
12036{0x3000000, 0xff7ffff0, 0x81398437, 0xff7ffff0, 0x3000010},
12037{0x3000000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff0, 0x3000010},
12038{0x3000000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff0, 0x3000010},
12039{0x3000000, 0xff7ffff0, 0xf51f853a, 0xff7ffffa, 0x3000010},
12040{0x3000000, 0xff7ffff0, 0xff7ffff0, 0xff800000, 0x3000014},
12041{0x3000000, 0xff7ffff0, 0xff7fffff, 0xff800000, 0x3000014},
12042{0x3000000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3000000},
12043{0x3000000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3000001},
12044{0x3000000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3000001},
12045{0x3000000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3000001},
12046{0x3000000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3000000},
12047{0x3000000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3000000},
12048{0x3000000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3000000},
12049{0x3000000, 0xff7ffff0, 0x4f3495cb, 0xff7ffff0, 0x3000010},
12050{0x3000000, 0xff7ffff0, 0xe73a5134, 0xff7ffff0, 0x3000010},
12051{0x3000000, 0xff7ffff0, 0x7c994e9e, 0xff7b357b, 0x3000010},
12052{0x3000000, 0xff7ffff0, 0x6164bd6c, 0xff7ffff0, 0x3000010},
12053{0x3000000, 0xff7ffff0, 0x9503366, 0xff7ffff0, 0x3000010},
12054{0x3000000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff0, 0x3000010},
12055{0x3000000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff0, 0x3000010},
12056{0x3000000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe0a, 0x3000010},
12057{0x3000000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff0, 0x3000010},
12058{0x3000000, 0xff7ffff0, 0x966320b, 0xff7ffff0, 0x3000010},
12059{0x3000000, 0xff7ffff0, 0xb26bddee, 0xff7ffff0, 0x3000010},
12060{0x3000000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff0, 0x3000010},
12061{0x3000000, 0xff7ffff0, 0x317285d3, 0xff7ffff0, 0x3000010},
12062{0x3000000, 0xff7ffff0, 0x3c9623b1, 0xff7ffff0, 0x3000010},
12063{0x3000000, 0xff7ffff0, 0x51fd2c7c, 0xff7ffff0, 0x3000010},
12064{0x3000000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1b, 0x3000010},
12065{0x3000000, 0xff7fffff, 0x0, 0xff7fffff, 0x3000000},
12066{0x3000000, 0xff7fffff, 0x1, 0xff7fffff, 0x3000080},
12067{0x3000000, 0xff7fffff, 0x76, 0xff7fffff, 0x3000080},
12068{0x3000000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3000080},
12069{0x3000000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3000080},
12070{0x3000000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3000080},
12071{0x3000000, 0xff7fffff, 0x800000, 0xff7fffff, 0x3000010},
12072{0x3000000, 0xff7fffff, 0x800002, 0xff7fffff, 0x3000010},
12073{0x3000000, 0xff7fffff, 0x1398437, 0xff7fffff, 0x3000010},
12074{0x3000000, 0xff7fffff, 0xba98d27, 0xff7fffff, 0x3000010},
12075{0x3000000, 0xff7fffff, 0xba98d7a, 0xff7fffff, 0x3000010},
12076{0x3000000, 0xff7fffff, 0x751f853a, 0xff7ffff5, 0x3000010},
12077{0x3000000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3000000},
12078{0x3000000, 0xff7fffff, 0x7f7fffff, 0x0, 0x3000000},
12079{0x3000000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3000000},
12080{0x3000000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3000001},
12081{0x3000000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3000001},
12082{0x3000000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
12083{0x3000000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3000000},
12084{0x3000000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3000000},
12085{0x3000000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3000000},
12086{0x3000000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3000000},
12087{0x3000000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3000080},
12088{0x3000000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3000080},
12089{0x3000000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3000080},
12090{0x3000000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3000080},
12091{0x3000000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3000080},
12092{0x3000000, 0xff7fffff, 0x80800000, 0xff7fffff, 0x3000010},
12093{0x3000000, 0xff7fffff, 0x80800002, 0xff7fffff, 0x3000010},
12094{0x3000000, 0xff7fffff, 0x81398437, 0xff7fffff, 0x3000010},
12095{0x3000000, 0xff7fffff, 0x8ba98d27, 0xff7fffff, 0x3000010},
12096{0x3000000, 0xff7fffff, 0x8ba98d7a, 0xff7fffff, 0x3000010},
12097{0x3000000, 0xff7fffff, 0xf51f853a, 0xff800000, 0x3000014},
12098{0x3000000, 0xff7fffff, 0xff7ffff0, 0xff800000, 0x3000014},
12099{0x3000000, 0xff7fffff, 0xff7fffff, 0xff800000, 0x3000014},
12100{0x3000000, 0xff7fffff, 0xff800000, 0xff800000, 0x3000000},
12101{0x3000000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3000001},
12102{0x3000000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3000001},
12103{0x3000000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3000001},
12104{0x3000000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3000000},
12105{0x3000000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3000000},
12106{0x3000000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3000000},
12107{0x3000000, 0xff7fffff, 0x4f3495cb, 0xff7fffff, 0x3000010},
12108{0x3000000, 0xff7fffff, 0xe73a5134, 0xff7fffff, 0x3000010},
12109{0x3000000, 0xff7fffff, 0x7c994e9e, 0xff7b358a, 0x3000010},
12110{0x3000000, 0xff7fffff, 0x6164bd6c, 0xff7fffff, 0x3000010},
12111{0x3000000, 0xff7fffff, 0x9503366, 0xff7fffff, 0x3000010},
12112{0x3000000, 0xff7fffff, 0xbf5a97c9, 0xff7fffff, 0x3000010},
12113{0x3000000, 0xff7fffff, 0xe6ff1a14, 0xff7fffff, 0x3000010},
12114{0x3000000, 0xff7fffff, 0x77f31e2f, 0xff7ffe19, 0x3000010},
12115{0x3000000, 0xff7fffff, 0xaab4d7d8, 0xff7fffff, 0x3000010},
12116{0x3000000, 0xff7fffff, 0x966320b, 0xff7fffff, 0x3000010},
12117{0x3000000, 0xff7fffff, 0xb26bddee, 0xff7fffff, 0x3000010},
12118{0x3000000, 0xff7fffff, 0xb5c8e5d3, 0xff7fffff, 0x3000010},
12119{0x3000000, 0xff7fffff, 0x317285d3, 0xff7fffff, 0x3000010},
12120{0x3000000, 0xff7fffff, 0x3c9623b1, 0xff7fffff, 0x3000010},
12121{0x3000000, 0xff7fffff, 0x51fd2c7c, 0xff7fffff, 0x3000010},
12122{0x3000000, 0xff7fffff, 0x7b906a6c, 0xff7edf2a, 0x3000010},
12123{0x3000000, 0xff800000, 0x0, 0xff800000, 0x3000000},
12124{0x3000000, 0xff800000, 0x1, 0xff800000, 0x3000080},
12125{0x3000000, 0xff800000, 0x76, 0xff800000, 0x3000080},
12126{0x3000000, 0xff800000, 0x2b94, 0xff800000, 0x3000080},
12127{0x3000000, 0xff800000, 0x636d24, 0xff800000, 0x3000080},
12128{0x3000000, 0xff800000, 0x7fffff, 0xff800000, 0x3000080},
12129{0x3000000, 0xff800000, 0x800000, 0xff800000, 0x3000000},
12130{0x3000000, 0xff800000, 0x800002, 0xff800000, 0x3000000},
12131{0x3000000, 0xff800000, 0x1398437, 0xff800000, 0x3000000},
12132{0x3000000, 0xff800000, 0xba98d27, 0xff800000, 0x3000000},
12133{0x3000000, 0xff800000, 0xba98d7a, 0xff800000, 0x3000000},
12134{0x3000000, 0xff800000, 0x751f853a, 0xff800000, 0x3000000},
12135{0x3000000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3000000},
12136{0x3000000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3000000},
12137{0x3000000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3000001},
12138{0x3000000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3000001},
12139{0x3000000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3000001},
12140{0x3000000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3000001},
12141{0x3000000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3000000},
12142{0x3000000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
12143{0x3000000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3000000},
12144{0x3000000, 0xff800000, 0x80000000, 0xff800000, 0x3000000},
12145{0x3000000, 0xff800000, 0x80000001, 0xff800000, 0x3000080},
12146{0x3000000, 0xff800000, 0x80000076, 0xff800000, 0x3000080},
12147{0x3000000, 0xff800000, 0x80002b94, 0xff800000, 0x3000080},
12148{0x3000000, 0xff800000, 0x80636d24, 0xff800000, 0x3000080},
12149{0x3000000, 0xff800000, 0x807fffff, 0xff800000, 0x3000080},
12150{0x3000000, 0xff800000, 0x80800000, 0xff800000, 0x3000000},
12151{0x3000000, 0xff800000, 0x80800002, 0xff800000, 0x3000000},
12152{0x3000000, 0xff800000, 0x81398437, 0xff800000, 0x3000000},
12153{0x3000000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3000000},
12154{0x3000000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3000000},
12155{0x3000000, 0xff800000, 0xf51f853a, 0xff800000, 0x3000000},
12156{0x3000000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3000000},
12157{0x3000000, 0xff800000, 0xff7fffff, 0xff800000, 0x3000000},
12158{0x3000000, 0xff800000, 0xff800000, 0xff800000, 0x3000000},
12159{0x3000000, 0xff800000, 0xff800001, 0x7fc00000, 0x3000001},
12160{0x3000000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3000001},
12161{0x3000000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3000001},
12162{0x3000000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3000000},
12163{0x3000000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3000000},
12164{0x3000000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3000000},
12165{0x3000000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3000000},
12166{0x3000000, 0xff800000, 0xe73a5134, 0xff800000, 0x3000000},
12167{0x3000000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3000000},
12168{0x3000000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3000000},
12169{0x3000000, 0xff800000, 0x9503366, 0xff800000, 0x3000000},
12170{0x3000000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3000000},
12171{0x3000000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3000000},
12172{0x3000000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3000000},
12173{0x3000000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3000000},
12174{0x3000000, 0xff800000, 0x966320b, 0xff800000, 0x3000000},
12175{0x3000000, 0xff800000, 0xb26bddee, 0xff800000, 0x3000000},
12176{0x3000000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3000000},
12177{0x3000000, 0xff800000, 0x317285d3, 0xff800000, 0x3000000},
12178{0x3000000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3000000},
12179{0x3000000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3000000},
12180{0x3000000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3000000},
12181{0x3000000, 0xff800001, 0x0, 0x7fc00000, 0x3000001},
12182{0x3000000, 0xff800001, 0x1, 0x7fc00000, 0x3000081},
12183{0x3000000, 0xff800001, 0x76, 0x7fc00000, 0x3000081},
12184{0x3000000, 0xff800001, 0x2b94, 0x7fc00000, 0x3000081},
12185{0x3000000, 0xff800001, 0x636d24, 0x7fc00000, 0x3000081},
12186{0x3000000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3000081},
12187{0x3000000, 0xff800001, 0x800000, 0x7fc00000, 0x3000001},
12188{0x3000000, 0xff800001, 0x800002, 0x7fc00000, 0x3000001},
12189{0x3000000, 0xff800001, 0x1398437, 0x7fc00000, 0x3000001},
12190{0x3000000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3000001},
12191{0x3000000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3000001},
12192{0x3000000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3000001},
12193{0x3000000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3000001},
12194{0x3000000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3000001},
12195{0x3000000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3000001},
12196{0x3000000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3000001},
12197{0x3000000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3000001},
12198{0x3000000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3000001},
12199{0x3000000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3000001},
12200{0x3000000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3000001},
12201{0x3000000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3000001},
12202{0x3000000, 0xff800001, 0x80000000, 0x7fc00000, 0x3000001},
12203{0x3000000, 0xff800001, 0x80000001, 0x7fc00000, 0x3000081},
12204{0x3000000, 0xff800001, 0x80000076, 0x7fc00000, 0x3000081},
12205{0x3000000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3000081},
12206{0x3000000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3000081},
12207{0x3000000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3000081},
12208{0x3000000, 0xff800001, 0x80800000, 0x7fc00000, 0x3000001},
12209{0x3000000, 0xff800001, 0x80800002, 0x7fc00000, 0x3000001},
12210{0x3000000, 0xff800001, 0x81398437, 0x7fc00000, 0x3000001},
12211{0x3000000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3000001},
12212{0x3000000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3000001},
12213{0x3000000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3000001},
12214{0x3000000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3000001},
12215{0x3000000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3000001},
12216{0x3000000, 0xff800001, 0xff800000, 0x7fc00000, 0x3000001},
12217{0x3000000, 0xff800001, 0xff800001, 0x7fc00000, 0x3000001},
12218{0x3000000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3000001},
12219{0x3000000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3000001},
12220{0x3000000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3000001},
12221{0x3000000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3000001},
12222{0x3000000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3000001},
12223{0x3000000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3000001},
12224{0x3000000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3000001},
12225{0x3000000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3000001},
12226{0x3000000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3000001},
12227{0x3000000, 0xff800001, 0x9503366, 0x7fc00000, 0x3000001},
12228{0x3000000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3000001},
12229{0x3000000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3000001},
12230{0x3000000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3000001},
12231{0x3000000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3000001},
12232{0x3000000, 0xff800001, 0x966320b, 0x7fc00000, 0x3000001},
12233{0x3000000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3000001},
12234{0x3000000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
12235{0x3000000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3000001},
12236{0x3000000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3000001},
12237{0x3000000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3000001},
12238{0x3000000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3000001},
12239{0x3000000, 0xff984a37, 0x0, 0x7fc00000, 0x3000001},
12240{0x3000000, 0xff984a37, 0x1, 0x7fc00000, 0x3000081},
12241{0x3000000, 0xff984a37, 0x76, 0x7fc00000, 0x3000081},
12242{0x3000000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3000081},
12243{0x3000000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3000081},
12244{0x3000000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3000081},
12245{0x3000000, 0xff984a37, 0x800000, 0x7fc00000, 0x3000001},
12246{0x3000000, 0xff984a37, 0x800002, 0x7fc00000, 0x3000001},
12247{0x3000000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3000001},
12248{0x3000000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3000001},
12249{0x3000000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3000001},
12250{0x3000000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3000001},
12251{0x3000000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3000001},
12252{0x3000000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3000001},
12253{0x3000000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3000001},
12254{0x3000000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3000001},
12255{0x3000000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3000001},
12256{0x3000000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3000001},
12257{0x3000000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3000001},
12258{0x3000000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3000001},
12259{0x3000000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3000001},
12260{0x3000000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3000001},
12261{0x3000000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3000081},
12262{0x3000000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3000081},
12263{0x3000000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3000081},
12264{0x3000000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3000081},
12265{0x3000000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3000081},
12266{0x3000000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3000001},
12267{0x3000000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3000001},
12268{0x3000000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3000001},
12269{0x3000000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3000001},
12270{0x3000000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3000001},
12271{0x3000000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3000001},
12272{0x3000000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3000001},
12273{0x3000000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3000001},
12274{0x3000000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3000001},
12275{0x3000000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3000001},
12276{0x3000000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3000001},
12277{0x3000000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3000001},
12278{0x3000000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3000001},
12279{0x3000000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3000001},
12280{0x3000000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3000001},
12281{0x3000000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3000001},
12282{0x3000000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3000001},
12283{0x3000000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3000001},
12284{0x3000000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3000001},
12285{0x3000000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3000001},
12286{0x3000000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3000001},
12287{0x3000000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3000001},
12288{0x3000000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3000001},
12289{0x3000000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3000001},
12290{0x3000000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3000001},
12291{0x3000000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3000001},
12292{0x3000000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
12293{0x3000000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3000001},
12294{0x3000000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3000001},
12295{0x3000000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3000001},
12296{0x3000000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3000001},
12297{0x3000000, 0xffbfffff, 0x0, 0x7fc00000, 0x3000001},
12298{0x3000000, 0xffbfffff, 0x1, 0x7fc00000, 0x3000081},
12299{0x3000000, 0xffbfffff, 0x76, 0x7fc00000, 0x3000081},
12300{0x3000000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3000081},
12301{0x3000000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3000081},
12302{0x3000000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3000081},
12303{0x3000000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3000001},
12304{0x3000000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3000001},
12305{0x3000000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3000001},
12306{0x3000000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3000001},
12307{0x3000000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3000001},
12308{0x3000000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3000001},
12309{0x3000000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3000001},
12310{0x3000000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3000001},
12311{0x3000000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3000001},
12312{0x3000000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3000001},
12313{0x3000000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3000001},
12314{0x3000000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
12315{0x3000000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3000001},
12316{0x3000000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3000001},
12317{0x3000000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3000001},
12318{0x3000000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3000001},
12319{0x3000000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3000081},
12320{0x3000000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3000081},
12321{0x3000000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3000081},
12322{0x3000000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3000081},
12323{0x3000000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3000081},
12324{0x3000000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3000001},
12325{0x3000000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3000001},
12326{0x3000000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3000001},
12327{0x3000000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3000001},
12328{0x3000000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3000001},
12329{0x3000000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3000001},
12330{0x3000000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3000001},
12331{0x3000000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3000001},
12332{0x3000000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3000001},
12333{0x3000000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3000001},
12334{0x3000000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3000001},
12335{0x3000000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3000001},
12336{0x3000000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3000001},
12337{0x3000000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3000001},
12338{0x3000000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3000001},
12339{0x3000000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3000001},
12340{0x3000000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3000001},
12341{0x3000000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3000001},
12342{0x3000000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3000001},
12343{0x3000000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3000001},
12344{0x3000000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3000001},
12345{0x3000000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3000001},
12346{0x3000000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3000001},
12347{0x3000000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3000001},
12348{0x3000000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3000001},
12349{0x3000000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3000001},
12350{0x3000000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
12351{0x3000000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3000001},
12352{0x3000000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3000001},
12353{0x3000000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3000001},
12354{0x3000000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3000001},
12355{0x3000000, 0xffc00000, 0x0, 0x7fc00000, 0x3000000},
12356{0x3000000, 0xffc00000, 0x1, 0x7fc00000, 0x3000080},
12357{0x3000000, 0xffc00000, 0x76, 0x7fc00000, 0x3000080},
12358{0x3000000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3000080},
12359{0x3000000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3000080},
12360{0x3000000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3000080},
12361{0x3000000, 0xffc00000, 0x800000, 0x7fc00000, 0x3000000},
12362{0x3000000, 0xffc00000, 0x800002, 0x7fc00000, 0x3000000},
12363{0x3000000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3000000},
12364{0x3000000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3000000},
12365{0x3000000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3000000},
12366{0x3000000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3000000},
12367{0x3000000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3000000},
12368{0x3000000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3000000},
12369{0x3000000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3000000},
12370{0x3000000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3000001},
12371{0x3000000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3000001},
12372{0x3000000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3000001},
12373{0x3000000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3000000},
12374{0x3000000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
12375{0x3000000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3000000},
12376{0x3000000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3000000},
12377{0x3000000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3000080},
12378{0x3000000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3000080},
12379{0x3000000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3000080},
12380{0x3000000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3000080},
12381{0x3000000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3000080},
12382{0x3000000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3000000},
12383{0x3000000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3000000},
12384{0x3000000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3000000},
12385{0x3000000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3000000},
12386{0x3000000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3000000},
12387{0x3000000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3000000},
12388{0x3000000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3000000},
12389{0x3000000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3000000},
12390{0x3000000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3000000},
12391{0x3000000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3000001},
12392{0x3000000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3000001},
12393{0x3000000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3000001},
12394{0x3000000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3000000},
12395{0x3000000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3000000},
12396{0x3000000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3000000},
12397{0x3000000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3000000},
12398{0x3000000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3000000},
12399{0x3000000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3000000},
12400{0x3000000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3000000},
12401{0x3000000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3000000},
12402{0x3000000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3000000},
12403{0x3000000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3000000},
12404{0x3000000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3000000},
12405{0x3000000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3000000},
12406{0x3000000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3000000},
12407{0x3000000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3000000},
12408{0x3000000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
12409{0x3000000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3000000},
12410{0x3000000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3000000},
12411{0x3000000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3000000},
12412{0x3000000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3000000},
12413{0x3000000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3000000},
12414{0x3000000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3000080},
12415{0x3000000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3000080},
12416{0x3000000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3000080},
12417{0x3000000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3000080},
12418{0x3000000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3000080},
12419{0x3000000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3000000},
12420{0x3000000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3000000},
12421{0x3000000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3000000},
12422{0x3000000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3000000},
12423{0x3000000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3000000},
12424{0x3000000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3000000},
12425{0x3000000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3000000},
12426{0x3000000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3000000},
12427{0x3000000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3000000},
12428{0x3000000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3000001},
12429{0x3000000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3000001},
12430{0x3000000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3000001},
12431{0x3000000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3000000},
12432{0x3000000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3000000},
12433{0x3000000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3000000},
12434{0x3000000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3000000},
12435{0x3000000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3000080},
12436{0x3000000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3000080},
12437{0x3000000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3000080},
12438{0x3000000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3000080},
12439{0x3000000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3000080},
12440{0x3000000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3000000},
12441{0x3000000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3000000},
12442{0x3000000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3000000},
12443{0x3000000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3000000},
12444{0x3000000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3000000},
12445{0x3000000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3000000},
12446{0x3000000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3000000},
12447{0x3000000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3000000},
12448{0x3000000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3000000},
12449{0x3000000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3000001},
12450{0x3000000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3000001},
12451{0x3000000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3000001},
12452{0x3000000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3000000},
12453{0x3000000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3000000},
12454{0x3000000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3000000},
12455{0x3000000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3000000},
12456{0x3000000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3000000},
12457{0x3000000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3000000},
12458{0x3000000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3000000},
12459{0x3000000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3000000},
12460{0x3000000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3000000},
12461{0x3000000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3000000},
12462{0x3000000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3000000},
12463{0x3000000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3000000},
12464{0x3000000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3000000},
12465{0x3000000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3000000},
12466{0x3000000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
12467{0x3000000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3000000},
12468{0x3000000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3000000},
12469{0x3000000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3000000},
12470{0x3000000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3000000},
12471{0x3000000, 0xffffffff, 0x0, 0x7fc00000, 0x3000000},
12472{0x3000000, 0xffffffff, 0x1, 0x7fc00000, 0x3000080},
12473{0x3000000, 0xffffffff, 0x76, 0x7fc00000, 0x3000080},
12474{0x3000000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3000080},
12475{0x3000000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3000080},
12476{0x3000000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3000080},
12477{0x3000000, 0xffffffff, 0x800000, 0x7fc00000, 0x3000000},
12478{0x3000000, 0xffffffff, 0x800002, 0x7fc00000, 0x3000000},
12479{0x3000000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3000000},
12480{0x3000000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3000000},
12481{0x3000000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3000000},
12482{0x3000000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3000000},
12483{0x3000000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3000000},
12484{0x3000000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3000000},
12485{0x3000000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3000000},
12486{0x3000000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3000001},
12487{0x3000000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3000001},
12488{0x3000000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
12489{0x3000000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3000000},
12490{0x3000000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3000000},
12491{0x3000000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3000000},
12492{0x3000000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3000000},
12493{0x3000000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3000080},
12494{0x3000000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3000080},
12495{0x3000000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3000080},
12496{0x3000000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3000080},
12497{0x3000000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3000080},
12498{0x3000000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3000000},
12499{0x3000000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3000000},
12500{0x3000000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3000000},
12501{0x3000000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3000000},
12502{0x3000000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3000000},
12503{0x3000000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3000000},
12504{0x3000000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3000000},
12505{0x3000000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3000000},
12506{0x3000000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3000000},
12507{0x3000000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3000001},
12508{0x3000000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3000001},
12509{0x3000000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3000001},
12510{0x3000000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3000000},
12511{0x3000000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3000000},
12512{0x3000000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3000000},
12513{0x3000000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3000000},
12514{0x3000000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3000000},
12515{0x3000000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3000000},
12516{0x3000000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3000000},
12517{0x3000000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3000000},
12518{0x3000000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3000000},
12519{0x3000000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3000000},
12520{0x3000000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3000000},
12521{0x3000000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3000000},
12522{0x3000000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3000000},
12523{0x3000000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3000000},
12524{0x3000000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
12525{0x3000000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3000000},
12526{0x3000000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3000000},
12527{0x3000000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3000000},
12528{0x3000000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3000000},
12529{0x3000000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3000000},
12530{0x3000000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3000080},
12531{0x3000000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3000080},
12532{0x3000000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3000080},
12533{0x3000000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3000080},
12534{0x3000000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3000080},
12535{0x3000000, 0x4f3495cb, 0x800000, 0x4f3495cb, 0x3000010},
12536{0x3000000, 0x4f3495cb, 0x800002, 0x4f3495cb, 0x3000010},
12537{0x3000000, 0x4f3495cb, 0x1398437, 0x4f3495cb, 0x3000010},
12538{0x3000000, 0x4f3495cb, 0xba98d27, 0x4f3495cb, 0x3000010},
12539{0x3000000, 0x4f3495cb, 0xba98d7a, 0x4f3495cb, 0x3000010},
12540{0x3000000, 0x4f3495cb, 0x751f853a, 0x751f853a, 0x3000010},
12541{0x3000000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
12542{0x3000000, 0x4f3495cb, 0x7f7fffff, 0x7f7fffff, 0x3000010},
12543{0x3000000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3000000},
12544{0x3000000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3000001},
12545{0x3000000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3000001},
12546{0x3000000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3000001},
12547{0x3000000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3000000},
12548{0x3000000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3000000},
12549{0x3000000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3000000},
12550{0x3000000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3000000},
12551{0x3000000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3000080},
12552{0x3000000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3000080},
12553{0x3000000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3000080},
12554{0x3000000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3000080},
12555{0x3000000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3000080},
12556{0x3000000, 0x4f3495cb, 0x80800000, 0x4f3495cb, 0x3000010},
12557{0x3000000, 0x4f3495cb, 0x80800002, 0x4f3495cb, 0x3000010},
12558{0x3000000, 0x4f3495cb, 0x81398437, 0x4f3495cb, 0x3000010},
12559{0x3000000, 0x4f3495cb, 0x8ba98d27, 0x4f3495cb, 0x3000010},
12560{0x3000000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495cb, 0x3000010},
12561{0x3000000, 0x4f3495cb, 0xf51f853a, 0xf51f853a, 0x3000010},
12562{0x3000000, 0x4f3495cb, 0xff7ffff0, 0xff7ffff0, 0x3000010},
12563{0x3000000, 0x4f3495cb, 0xff7fffff, 0xff7fffff, 0x3000010},
12564{0x3000000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3000000},
12565{0x3000000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3000001},
12566{0x3000000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3000001},
12567{0x3000000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3000001},
12568{0x3000000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3000000},
12569{0x3000000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3000000},
12570{0x3000000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3000000},
12571{0x3000000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3000000},
12572{0x3000000, 0x4f3495cb, 0xe73a5134, 0xe73a5134, 0x3000010},
12573{0x3000000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9e, 0x3000010},
12574{0x3000000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6c, 0x3000010},
12575{0x3000000, 0x4f3495cb, 0x9503366, 0x4f3495cb, 0x3000010},
12576{0x3000000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495cb, 0x3000010},
12577{0x3000000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
12578{0x3000000, 0x4f3495cb, 0x77f31e2f, 0x77f31e2f, 0x3000010},
12579{0x3000000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495cb, 0x3000010},
12580{0x3000000, 0x4f3495cb, 0x966320b, 0x4f3495cb, 0x3000010},
12581{0x3000000, 0x4f3495cb, 0xb26bddee, 0x4f3495cb, 0x3000010},
12582{0x3000000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495cb, 0x3000010},
12583{0x3000000, 0x4f3495cb, 0x317285d3, 0x4f3495cb, 0x3000010},
12584{0x3000000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cb, 0x3000010},
12585{0x3000000, 0x4f3495cb, 0x51fd2c7c, 0x52016895, 0x3000010},
12586{0x3000000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6c, 0x3000010},
12587{0x3000000, 0xe73a5134, 0x0, 0xe73a5134, 0x3000000},
12588{0x3000000, 0xe73a5134, 0x1, 0xe73a5134, 0x3000080},
12589{0x3000000, 0xe73a5134, 0x76, 0xe73a5134, 0x3000080},
12590{0x3000000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3000080},
12591{0x3000000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3000080},
12592{0x3000000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3000080},
12593{0x3000000, 0xe73a5134, 0x800000, 0xe73a5134, 0x3000010},
12594{0x3000000, 0xe73a5134, 0x800002, 0xe73a5134, 0x3000010},
12595{0x3000000, 0xe73a5134, 0x1398437, 0xe73a5134, 0x3000010},
12596{0x3000000, 0xe73a5134, 0xba98d27, 0xe73a5134, 0x3000010},
12597{0x3000000, 0xe73a5134, 0xba98d7a, 0xe73a5134, 0x3000010},
12598{0x3000000, 0xe73a5134, 0x751f853a, 0x751f853a, 0x3000010},
12599{0x3000000, 0xe73a5134, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
12600{0x3000000, 0xe73a5134, 0x7f7fffff, 0x7f7fffff, 0x3000010},
12601{0x3000000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3000000},
12602{0x3000000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3000001},
12603{0x3000000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3000001},
12604{0x3000000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3000001},
12605{0x3000000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3000000},
12606{0x3000000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3000000},
12607{0x3000000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3000000},
12608{0x3000000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3000000},
12609{0x3000000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3000080},
12610{0x3000000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3000080},
12611{0x3000000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3000080},
12612{0x3000000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3000080},
12613{0x3000000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3000080},
12614{0x3000000, 0xe73a5134, 0x80800000, 0xe73a5134, 0x3000010},
12615{0x3000000, 0xe73a5134, 0x80800002, 0xe73a5134, 0x3000010},
12616{0x3000000, 0xe73a5134, 0x81398437, 0xe73a5134, 0x3000010},
12617{0x3000000, 0xe73a5134, 0x8ba98d27, 0xe73a5134, 0x3000010},
12618{0x3000000, 0xe73a5134, 0x8ba98d7a, 0xe73a5134, 0x3000010},
12619{0x3000000, 0xe73a5134, 0xf51f853a, 0xf51f853a, 0x3000010},
12620{0x3000000, 0xe73a5134, 0xff7ffff0, 0xff7ffff0, 0x3000010},
12621{0x3000000, 0xe73a5134, 0xff7fffff, 0xff7fffff, 0x3000010},
12622{0x3000000, 0xe73a5134, 0xff800000, 0xff800000, 0x3000000},
12623{0x3000000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3000001},
12624{0x3000000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3000001},
12625{0x3000000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3000001},
12626{0x3000000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3000000},
12627{0x3000000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3000000},
12628{0x3000000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3000000},
12629{0x3000000, 0xe73a5134, 0x4f3495cb, 0xe73a5134, 0x3000010},
12630{0x3000000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3000000},
12631{0x3000000, 0xe73a5134, 0x7c994e9e, 0x7c994e9e, 0x3000010},
12632{0x3000000, 0xe73a5134, 0x6164bd6c, 0xe73a42e8, 0x3000010},
12633{0x3000000, 0xe73a5134, 0x9503366, 0xe73a5134, 0x3000010},
12634{0x3000000, 0xe73a5134, 0xbf5a97c9, 0xe73a5134, 0x3000010},
12635{0x3000000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3000000},
12636{0x3000000, 0xe73a5134, 0x77f31e2f, 0x77f31e2f, 0x3000010},
12637{0x3000000, 0xe73a5134, 0xaab4d7d8, 0xe73a5134, 0x3000010},
12638{0x3000000, 0xe73a5134, 0x966320b, 0xe73a5134, 0x3000010},
12639{0x3000000, 0xe73a5134, 0xb26bddee, 0xe73a5134, 0x3000010},
12640{0x3000000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5134, 0x3000010},
12641{0x3000000, 0xe73a5134, 0x317285d3, 0xe73a5134, 0x3000010},
12642{0x3000000, 0xe73a5134, 0x3c9623b1, 0xe73a5134, 0x3000010},
12643{0x3000000, 0xe73a5134, 0x51fd2c7c, 0xe73a5134, 0x3000010},
12644{0x3000000, 0xe73a5134, 0x7b906a6c, 0x7b906a6c, 0x3000010},
12645{0x3000000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3000000},
12646{0x3000000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3000080},
12647{0x3000000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3000080},
12648{0x3000000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3000080},
12649{0x3000000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3000080},
12650{0x3000000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3000080},
12651{0x3000000, 0x7c994e9e, 0x800000, 0x7c994e9e, 0x3000010},
12652{0x3000000, 0x7c994e9e, 0x800002, 0x7c994e9e, 0x3000010},
12653{0x3000000, 0x7c994e9e, 0x1398437, 0x7c994e9e, 0x3000010},
12654{0x3000000, 0x7c994e9e, 0xba98d27, 0x7c994e9e, 0x3000010},
12655{0x3000000, 0x7c994e9e, 0xba98d7a, 0x7c994e9e, 0x3000010},
12656{0x3000000, 0x7c994e9e, 0x751f853a, 0x7c994fdd, 0x3000010},
12657{0x3000000, 0x7c994e9e, 0x7f7ffff0, 0x7f800000, 0x3000014},
12658{0x3000000, 0x7c994e9e, 0x7f7fffff, 0x7f800000, 0x3000014},
12659{0x3000000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3000000},
12660{0x3000000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3000001},
12661{0x3000000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3000001},
12662{0x3000000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3000001},
12663{0x3000000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3000000},
12664{0x3000000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3000000},
12665{0x3000000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3000000},
12666{0x3000000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3000000},
12667{0x3000000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3000080},
12668{0x3000000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3000080},
12669{0x3000000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3000080},
12670{0x3000000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3000080},
12671{0x3000000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3000080},
12672{0x3000000, 0x7c994e9e, 0x80800000, 0x7c994e9e, 0x3000010},
12673{0x3000000, 0x7c994e9e, 0x80800002, 0x7c994e9e, 0x3000010},
12674{0x3000000, 0x7c994e9e, 0x81398437, 0x7c994e9e, 0x3000010},
12675{0x3000000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9e, 0x3000010},
12676{0x3000000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9e, 0x3000010},
12677{0x3000000, 0x7c994e9e, 0xf51f853a, 0x7c994d5f, 0x3000010},
12678{0x3000000, 0x7c994e9e, 0xff7ffff0, 0xff7b357b, 0x3000010},
12679{0x3000000, 0x7c994e9e, 0xff7fffff, 0xff7b358a, 0x3000010},
12680{0x3000000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3000000},
12681{0x3000000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3000001},
12682{0x3000000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3000001},
12683{0x3000000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3000001},
12684{0x3000000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3000000},
12685{0x3000000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3000000},
12686{0x3000000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3000000},
12687{0x3000000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9e, 0x3000010},
12688{0x3000000, 0x7c994e9e, 0xe73a5134, 0x7c994e9e, 0x3000010},
12689{0x3000000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3000000},
12690{0x3000000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9e, 0x3000010},
12691{0x3000000, 0x7c994e9e, 0x9503366, 0x7c994e9e, 0x3000010},
12692{0x3000000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9e, 0x3000010},
12693{0x3000000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9e, 0x3000010},
12694{0x3000000, 0x7c994e9e, 0x77f31e2f, 0x7c998b66, 0x3000010},
12695{0x3000000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9e, 0x3000010},
12696{0x3000000, 0x7c994e9e, 0x966320b, 0x7c994e9e, 0x3000010},
12697{0x3000000, 0x7c994e9e, 0xb26bddee, 0x7c994e9e, 0x3000010},
12698{0x3000000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9e, 0x3000010},
12699{0x3000000, 0x7c994e9e, 0x317285d3, 0x7c994e9e, 0x3000010},
12700{0x3000000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9e, 0x3000010},
12701{0x3000000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9e, 0x3000010},
12702{0x3000000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3000000},
12703{0x3000000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3000000},
12704{0x3000000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3000080},
12705{0x3000000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3000080},
12706{0x3000000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3000080},
12707{0x3000000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3000080},
12708{0x3000000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3000080},
12709{0x3000000, 0x6164bd6c, 0x800000, 0x6164bd6c, 0x3000010},
12710{0x3000000, 0x6164bd6c, 0x800002, 0x6164bd6c, 0x3000010},
12711{0x3000000, 0x6164bd6c, 0x1398437, 0x6164bd6c, 0x3000010},
12712{0x3000000, 0x6164bd6c, 0xba98d27, 0x6164bd6c, 0x3000010},
12713{0x3000000, 0x6164bd6c, 0xba98d7a, 0x6164bd6c, 0x3000010},
12714{0x3000000, 0x6164bd6c, 0x751f853a, 0x751f853a, 0x3000010},
12715{0x3000000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
12716{0x3000000, 0x6164bd6c, 0x7f7fffff, 0x7f7fffff, 0x3000010},
12717{0x3000000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3000000},
12718{0x3000000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3000001},
12719{0x3000000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3000001},
12720{0x3000000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3000001},
12721{0x3000000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3000000},
12722{0x3000000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3000000},
12723{0x3000000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3000000},
12724{0x3000000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3000000},
12725{0x3000000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3000080},
12726{0x3000000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3000080},
12727{0x3000000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3000080},
12728{0x3000000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3000080},
12729{0x3000000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3000080},
12730{0x3000000, 0x6164bd6c, 0x80800000, 0x6164bd6c, 0x3000010},
12731{0x3000000, 0x6164bd6c, 0x80800002, 0x6164bd6c, 0x3000010},
12732{0x3000000, 0x6164bd6c, 0x81398437, 0x6164bd6c, 0x3000010},
12733{0x3000000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6c, 0x3000010},
12734{0x3000000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6c, 0x3000010},
12735{0x3000000, 0x6164bd6c, 0xf51f853a, 0xf51f853a, 0x3000010},
12736{0x3000000, 0x6164bd6c, 0xff7ffff0, 0xff7ffff0, 0x3000010},
12737{0x3000000, 0x6164bd6c, 0xff7fffff, 0xff7fffff, 0x3000010},
12738{0x3000000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3000000},
12739{0x3000000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3000001},
12740{0x3000000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3000001},
12741{0x3000000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3000001},
12742{0x3000000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3000000},
12743{0x3000000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3000000},
12744{0x3000000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3000000},
12745{0x3000000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6c, 0x3000010},
12746{0x3000000, 0x6164bd6c, 0xe73a5134, 0xe73a42e8, 0x3000010},
12747{0x3000000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9e, 0x3000010},
12748{0x3000000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3000000},
12749{0x3000000, 0x6164bd6c, 0x9503366, 0x6164bd6c, 0x3000010},
12750{0x3000000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6c, 0x3000010},
12751{0x3000000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7c, 0x3000010},
12752{0x3000000, 0x6164bd6c, 0x77f31e2f, 0x77f31e2f, 0x3000010},
12753{0x3000000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6c, 0x3000010},
12754{0x3000000, 0x6164bd6c, 0x966320b, 0x6164bd6c, 0x3000010},
12755{0x3000000, 0x6164bd6c, 0xb26bddee, 0x6164bd6c, 0x3000010},
12756{0x3000000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6c, 0x3000010},
12757{0x3000000, 0x6164bd6c, 0x317285d3, 0x6164bd6c, 0x3000010},
12758{0x3000000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6c, 0x3000010},
12759{0x3000000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6c, 0x3000010},
12760{0x3000000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6c, 0x3000010},
12761{0x3000000, 0x9503366, 0x0, 0x9503366, 0x3000000},
12762{0x3000000, 0x9503366, 0x1, 0x9503366, 0x3000080},
12763{0x3000000, 0x9503366, 0x76, 0x9503366, 0x3000080},
12764{0x3000000, 0x9503366, 0x2b94, 0x9503366, 0x3000080},
12765{0x3000000, 0x9503366, 0x636d24, 0x9503366, 0x3000080},
12766{0x3000000, 0x9503366, 0x7fffff, 0x9503366, 0x3000080},
12767{0x3000000, 0x9503366, 0x800000, 0x95033a6, 0x3000000},
12768{0x3000000, 0x9503366, 0x800002, 0x95033a6, 0x3000010},
12769{0x3000000, 0x9503366, 0x1398437, 0x9503420, 0x3000010},
12770{0x3000000, 0x9503366, 0xba98d27, 0xbb00ec2, 0x3000010},
12771{0x3000000, 0x9503366, 0xba98d7a, 0xbb00f15, 0x3000010},
12772{0x3000000, 0x9503366, 0x751f853a, 0x751f853a, 0x3000010},
12773{0x3000000, 0x9503366, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
12774{0x3000000, 0x9503366, 0x7f7fffff, 0x7f7fffff, 0x3000010},
12775{0x3000000, 0x9503366, 0x7f800000, 0x7f800000, 0x3000000},
12776{0x3000000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3000001},
12777{0x3000000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3000001},
12778{0x3000000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3000001},
12779{0x3000000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3000000},
12780{0x3000000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3000000},
12781{0x3000000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3000000},
12782{0x3000000, 0x9503366, 0x80000000, 0x9503366, 0x3000000},
12783{0x3000000, 0x9503366, 0x80000001, 0x9503366, 0x3000080},
12784{0x3000000, 0x9503366, 0x80000076, 0x9503366, 0x3000080},
12785{0x3000000, 0x9503366, 0x80002b94, 0x9503366, 0x3000080},
12786{0x3000000, 0x9503366, 0x80636d24, 0x9503366, 0x3000080},
12787{0x3000000, 0x9503366, 0x807fffff, 0x9503366, 0x3000080},
12788{0x3000000, 0x9503366, 0x80800000, 0x9503326, 0x3000000},
12789{0x3000000, 0x9503366, 0x80800002, 0x9503326, 0x3000010},
12790{0x3000000, 0x9503366, 0x81398437, 0x95032ac, 0x3000010},
12791{0x3000000, 0x9503366, 0x8ba98d27, 0x8ba30b8c, 0x3000010},
12792{0x3000000, 0x9503366, 0x8ba98d7a, 0x8ba30bdf, 0x3000010},
12793{0x3000000, 0x9503366, 0xf51f853a, 0xf51f853a, 0x3000010},
12794{0x3000000, 0x9503366, 0xff7ffff0, 0xff7ffff0, 0x3000010},
12795{0x3000000, 0x9503366, 0xff7fffff, 0xff7fffff, 0x3000010},
12796{0x3000000, 0x9503366, 0xff800000, 0xff800000, 0x3000000},
12797{0x3000000, 0x9503366, 0xff800001, 0x7fc00000, 0x3000001},
12798{0x3000000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3000001},
12799{0x3000000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3000001},
12800{0x3000000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3000000},
12801{0x3000000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3000000},
12802{0x3000000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3000000},
12803{0x3000000, 0x9503366, 0x4f3495cb, 0x4f3495cb, 0x3000010},
12804{0x3000000, 0x9503366, 0xe73a5134, 0xe73a5134, 0x3000010},
12805{0x3000000, 0x9503366, 0x7c994e9e, 0x7c994e9e, 0x3000010},
12806{0x3000000, 0x9503366, 0x6164bd6c, 0x6164bd6c, 0x3000010},
12807{0x3000000, 0x9503366, 0x9503366, 0x9d03366, 0x3000000},
12808{0x3000000, 0x9503366, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
12809{0x3000000, 0x9503366, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
12810{0x3000000, 0x9503366, 0x77f31e2f, 0x77f31e2f, 0x3000010},
12811{0x3000000, 0x9503366, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
12812{0x3000000, 0x9503366, 0x966320b, 0x9db32b8, 0x3000010},
12813{0x3000000, 0x9503366, 0xb26bddee, 0xb26bddee, 0x3000010},
12814{0x3000000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
12815{0x3000000, 0x9503366, 0x317285d3, 0x317285d3, 0x3000010},
12816{0x3000000, 0x9503366, 0x3c9623b1, 0x3c9623b1, 0x3000010},
12817{0x3000000, 0x9503366, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
12818{0x3000000, 0x9503366, 0x7b906a6c, 0x7b906a6c, 0x3000010},
12819{0x3000000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3000000},
12820{0x3000000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3000080},
12821{0x3000000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3000080},
12822{0x3000000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3000080},
12823{0x3000000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3000080},
12824{0x3000000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3000080},
12825{0x3000000, 0xbf5a97c9, 0x800000, 0xbf5a97c9, 0x3000010},
12826{0x3000000, 0xbf5a97c9, 0x800002, 0xbf5a97c9, 0x3000010},
12827{0x3000000, 0xbf5a97c9, 0x1398437, 0xbf5a97c9, 0x3000010},
12828{0x3000000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c9, 0x3000010},
12829{0x3000000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c9, 0x3000010},
12830{0x3000000, 0xbf5a97c9, 0x751f853a, 0x751f853a, 0x3000010},
12831{0x3000000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
12832{0x3000000, 0xbf5a97c9, 0x7f7fffff, 0x7f7fffff, 0x3000010},
12833{0x3000000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3000000},
12834{0x3000000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3000001},
12835{0x3000000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3000001},
12836{0x3000000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3000001},
12837{0x3000000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3000000},
12838{0x3000000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3000000},
12839{0x3000000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3000000},
12840{0x3000000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3000000},
12841{0x3000000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3000080},
12842{0x3000000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3000080},
12843{0x3000000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3000080},
12844{0x3000000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3000080},
12845{0x3000000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3000080},
12846{0x3000000, 0xbf5a97c9, 0x80800000, 0xbf5a97c9, 0x3000010},
12847{0x3000000, 0xbf5a97c9, 0x80800002, 0xbf5a97c9, 0x3000010},
12848{0x3000000, 0xbf5a97c9, 0x81398437, 0xbf5a97c9, 0x3000010},
12849{0x3000000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97c9, 0x3000010},
12850{0x3000000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97c9, 0x3000010},
12851{0x3000000, 0xbf5a97c9, 0xf51f853a, 0xf51f853a, 0x3000010},
12852{0x3000000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff0, 0x3000010},
12853{0x3000000, 0xbf5a97c9, 0xff7fffff, 0xff7fffff, 0x3000010},
12854{0x3000000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3000000},
12855{0x3000000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3000001},
12856{0x3000000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3000001},
12857{0x3000000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3000001},
12858{0x3000000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3000000},
12859{0x3000000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3000000},
12860{0x3000000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3000000},
12861{0x3000000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495cb, 0x3000010},
12862{0x3000000, 0xbf5a97c9, 0xe73a5134, 0xe73a5134, 0x3000010},
12863{0x3000000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9e, 0x3000010},
12864{0x3000000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6c, 0x3000010},
12865{0x3000000, 0xbf5a97c9, 0x9503366, 0xbf5a97c9, 0x3000010},
12866{0x3000000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3000000},
12867{0x3000000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
12868{0x3000000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2f, 0x3000010},
12869{0x3000000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97c9, 0x3000010},
12870{0x3000000, 0xbf5a97c9, 0x966320b, 0xbf5a97c9, 0x3000010},
12871{0x3000000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97c9, 0x3000010},
12872{0x3000000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e2, 0x3000010},
12873{0x3000000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c9, 0x3000010},
12874{0x3000000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ab, 0x3000010},
12875{0x3000000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
12876{0x3000000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6c, 0x3000010},
12877{0x3000000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3000000},
12878{0x3000000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3000080},
12879{0x3000000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3000080},
12880{0x3000000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3000080},
12881{0x3000000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3000080},
12882{0x3000000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3000080},
12883{0x3000000, 0xe6ff1a14, 0x800000, 0xe6ff1a14, 0x3000010},
12884{0x3000000, 0xe6ff1a14, 0x800002, 0xe6ff1a14, 0x3000010},
12885{0x3000000, 0xe6ff1a14, 0x1398437, 0xe6ff1a14, 0x3000010},
12886{0x3000000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a14, 0x3000010},
12887{0x3000000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a14, 0x3000010},
12888{0x3000000, 0xe6ff1a14, 0x751f853a, 0x751f853a, 0x3000010},
12889{0x3000000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
12890{0x3000000, 0xe6ff1a14, 0x7f7fffff, 0x7f7fffff, 0x3000010},
12891{0x3000000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3000000},
12892{0x3000000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3000001},
12893{0x3000000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3000001},
12894{0x3000000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3000001},
12895{0x3000000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3000000},
12896{0x3000000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3000000},
12897{0x3000000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3000000},
12898{0x3000000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3000000},
12899{0x3000000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3000080},
12900{0x3000000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3000080},
12901{0x3000000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3000080},
12902{0x3000000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3000080},
12903{0x3000000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3000080},
12904{0x3000000, 0xe6ff1a14, 0x80800000, 0xe6ff1a14, 0x3000010},
12905{0x3000000, 0xe6ff1a14, 0x80800002, 0xe6ff1a14, 0x3000010},
12906{0x3000000, 0xe6ff1a14, 0x81398437, 0xe6ff1a14, 0x3000010},
12907{0x3000000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a14, 0x3000010},
12908{0x3000000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a14, 0x3000010},
12909{0x3000000, 0xe6ff1a14, 0xf51f853a, 0xf51f853a, 0x3000010},
12910{0x3000000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff0, 0x3000010},
12911{0x3000000, 0xe6ff1a14, 0xff7fffff, 0xff7fffff, 0x3000010},
12912{0x3000000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3000000},
12913{0x3000000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3000001},
12914{0x3000000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3000001},
12915{0x3000000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3000001},
12916{0x3000000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3000000},
12917{0x3000000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3000000},
12918{0x3000000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3000000},
12919{0x3000000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a14, 0x3000010},
12920{0x3000000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3000000},
12921{0x3000000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9e, 0x3000010},
12922{0x3000000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7c, 0x3000010},
12923{0x3000000, 0xe6ff1a14, 0x9503366, 0xe6ff1a14, 0x3000010},
12924{0x3000000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a14, 0x3000010},
12925{0x3000000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3000000},
12926{0x3000000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2f, 0x3000010},
12927{0x3000000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a14, 0x3000010},
12928{0x3000000, 0xe6ff1a14, 0x966320b, 0xe6ff1a14, 0x3000010},
12929{0x3000000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a14, 0x3000010},
12930{0x3000000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a14, 0x3000010},
12931{0x3000000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a14, 0x3000010},
12932{0x3000000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a14, 0x3000010},
12933{0x3000000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a14, 0x3000010},
12934{0x3000000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6c, 0x3000010},
12935{0x3000000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3000000},
12936{0x3000000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3000080},
12937{0x3000000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3000080},
12938{0x3000000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3000080},
12939{0x3000000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3000080},
12940{0x3000000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3000080},
12941{0x3000000, 0x77f31e2f, 0x800000, 0x77f31e2f, 0x3000010},
12942{0x3000000, 0x77f31e2f, 0x800002, 0x77f31e2f, 0x3000010},
12943{0x3000000, 0x77f31e2f, 0x1398437, 0x77f31e2f, 0x3000010},
12944{0x3000000, 0x77f31e2f, 0xba98d27, 0x77f31e2f, 0x3000010},
12945{0x3000000, 0x77f31e2f, 0xba98d7a, 0x77f31e2f, 0x3000010},
12946{0x3000000, 0x77f31e2f, 0x751f853a, 0x77f81a59, 0x3000010},
12947{0x3000000, 0x77f31e2f, 0x7f7ffff0, 0x7f800000, 0x3000014},
12948{0x3000000, 0x77f31e2f, 0x7f7fffff, 0x7f800000, 0x3000014},
12949{0x3000000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3000000},
12950{0x3000000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3000001},
12951{0x3000000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3000001},
12952{0x3000000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3000001},
12953{0x3000000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3000000},
12954{0x3000000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3000000},
12955{0x3000000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3000000},
12956{0x3000000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3000000},
12957{0x3000000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3000080},
12958{0x3000000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3000080},
12959{0x3000000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3000080},
12960{0x3000000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3000080},
12961{0x3000000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3000080},
12962{0x3000000, 0x77f31e2f, 0x80800000, 0x77f31e2f, 0x3000010},
12963{0x3000000, 0x77f31e2f, 0x80800002, 0x77f31e2f, 0x3000010},
12964{0x3000000, 0x77f31e2f, 0x81398437, 0x77f31e2f, 0x3000010},
12965{0x3000000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2f, 0x3000010},
12966{0x3000000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2f, 0x3000010},
12967{0x3000000, 0x77f31e2f, 0xf51f853a, 0x77ee2205, 0x3000010},
12968{0x3000000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe0a, 0x3000010},
12969{0x3000000, 0x77f31e2f, 0xff7fffff, 0xff7ffe19, 0x3000010},
12970{0x3000000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3000000},
12971{0x3000000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3000001},
12972{0x3000000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3000001},
12973{0x3000000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3000001},
12974{0x3000000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3000000},
12975{0x3000000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3000000},
12976{0x3000000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3000000},
12977{0x3000000, 0x77f31e2f, 0x4f3495cb, 0x77f31e2f, 0x3000010},
12978{0x3000000, 0x77f31e2f, 0xe73a5134, 0x77f31e2f, 0x3000010},
12979{0x3000000, 0x77f31e2f, 0x7c994e9e, 0x7c998b66, 0x3000010},
12980{0x3000000, 0x77f31e2f, 0x6164bd6c, 0x77f31e2f, 0x3000010},
12981{0x3000000, 0x77f31e2f, 0x9503366, 0x77f31e2f, 0x3000010},
12982{0x3000000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2f, 0x3000010},
12983{0x3000000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2f, 0x3000010},
12984{0x3000000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3000000},
12985{0x3000000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2f, 0x3000010},
12986{0x3000000, 0x77f31e2f, 0x966320b, 0x77f31e2f, 0x3000010},
12987{0x3000000, 0x77f31e2f, 0xb26bddee, 0x77f31e2f, 0x3000010},
12988{0x3000000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2f, 0x3000010},
12989{0x3000000, 0x77f31e2f, 0x317285d3, 0x77f31e2f, 0x3000010},
12990{0x3000000, 0x77f31e2f, 0x3c9623b1, 0x77f31e2f, 0x3000010},
12991{0x3000000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e2f, 0x3000010},
12992{0x3000000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8a, 0x3000010},
12993{0x3000000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3000000},
12994{0x3000000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3000080},
12995{0x3000000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3000080},
12996{0x3000000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3000080},
12997{0x3000000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3000080},
12998{0x3000000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3000080},
12999{0x3000000, 0xaab4d7d8, 0x800000, 0xaab4d7d8, 0x3000010},
13000{0x3000000, 0xaab4d7d8, 0x800002, 0xaab4d7d8, 0x3000010},
13001{0x3000000, 0xaab4d7d8, 0x1398437, 0xaab4d7d8, 0x3000010},
13002{0x3000000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d8, 0x3000010},
13003{0x3000000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d8, 0x3000010},
13004{0x3000000, 0xaab4d7d8, 0x751f853a, 0x751f853a, 0x3000010},
13005{0x3000000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
13006{0x3000000, 0xaab4d7d8, 0x7f7fffff, 0x7f7fffff, 0x3000010},
13007{0x3000000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3000000},
13008{0x3000000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3000001},
13009{0x3000000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3000001},
13010{0x3000000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3000001},
13011{0x3000000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3000000},
13012{0x3000000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3000000},
13013{0x3000000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3000000},
13014{0x3000000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3000000},
13015{0x3000000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3000080},
13016{0x3000000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3000080},
13017{0x3000000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3000080},
13018{0x3000000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3000080},
13019{0x3000000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3000080},
13020{0x3000000, 0xaab4d7d8, 0x80800000, 0xaab4d7d8, 0x3000010},
13021{0x3000000, 0xaab4d7d8, 0x80800002, 0xaab4d7d8, 0x3000010},
13022{0x3000000, 0xaab4d7d8, 0x81398437, 0xaab4d7d8, 0x3000010},
13023{0x3000000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d8, 0x3000010},
13024{0x3000000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d8, 0x3000010},
13025{0x3000000, 0xaab4d7d8, 0xf51f853a, 0xf51f853a, 0x3000010},
13026{0x3000000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff0, 0x3000010},
13027{0x3000000, 0xaab4d7d8, 0xff7fffff, 0xff7fffff, 0x3000010},
13028{0x3000000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3000000},
13029{0x3000000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3000001},
13030{0x3000000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3000001},
13031{0x3000000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3000001},
13032{0x3000000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3000000},
13033{0x3000000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3000000},
13034{0x3000000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3000000},
13035{0x3000000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495cb, 0x3000010},
13036{0x3000000, 0xaab4d7d8, 0xe73a5134, 0xe73a5134, 0x3000010},
13037{0x3000000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9e, 0x3000010},
13038{0x3000000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6c, 0x3000010},
13039{0x3000000, 0xaab4d7d8, 0x9503366, 0xaab4d7d8, 0x3000010},
13040{0x3000000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
13041{0x3000000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
13042{0x3000000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2f, 0x3000010},
13043{0x3000000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3000000},
13044{0x3000000, 0xaab4d7d8, 0x966320b, 0xaab4d7d8, 0x3000010},
13045{0x3000000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf58, 0x3000010},
13046{0x3000000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d6, 0x3000010},
13047{0x3000000, 0xaab4d7d8, 0x317285d3, 0x3172802c, 0x3000010},
13048{0x3000000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b1, 0x3000010},
13049{0x3000000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
13050{0x3000000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6c, 0x3000010},
13051{0x3000000, 0x966320b, 0x0, 0x966320b, 0x3000000},
13052{0x3000000, 0x966320b, 0x1, 0x966320b, 0x3000080},
13053{0x3000000, 0x966320b, 0x76, 0x966320b, 0x3000080},
13054{0x3000000, 0x966320b, 0x2b94, 0x966320b, 0x3000080},
13055{0x3000000, 0x966320b, 0x636d24, 0x966320b, 0x3000080},
13056{0x3000000, 0x966320b, 0x7fffff, 0x966320b, 0x3000080},
13057{0x3000000, 0x966320b, 0x800000, 0x966324b, 0x3000000},
13058{0x3000000, 0x966320b, 0x800002, 0x966324b, 0x3000010},
13059{0x3000000, 0x966320b, 0x1398437, 0x96632c5, 0x3000010},
13060{0x3000000, 0x966320b, 0xba98d27, 0xbb0beb7, 0x3000010},
13061{0x3000000, 0x966320b, 0xba98d7a, 0xbb0bf0a, 0x3000010},
13062{0x3000000, 0x966320b, 0x751f853a, 0x751f853a, 0x3000010},
13063{0x3000000, 0x966320b, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
13064{0x3000000, 0x966320b, 0x7f7fffff, 0x7f7fffff, 0x3000010},
13065{0x3000000, 0x966320b, 0x7f800000, 0x7f800000, 0x3000000},
13066{0x3000000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3000001},
13067{0x3000000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3000001},
13068{0x3000000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3000001},
13069{0x3000000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3000000},
13070{0x3000000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3000000},
13071{0x3000000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3000000},
13072{0x3000000, 0x966320b, 0x80000000, 0x966320b, 0x3000000},
13073{0x3000000, 0x966320b, 0x80000001, 0x966320b, 0x3000080},
13074{0x3000000, 0x966320b, 0x80000076, 0x966320b, 0x3000080},
13075{0x3000000, 0x966320b, 0x80002b94, 0x966320b, 0x3000080},
13076{0x3000000, 0x966320b, 0x80636d24, 0x966320b, 0x3000080},
13077{0x3000000, 0x966320b, 0x807fffff, 0x966320b, 0x3000080},
13078{0x3000000, 0x966320b, 0x80800000, 0x96631cb, 0x3000000},
13079{0x3000000, 0x966320b, 0x80800002, 0x96631cb, 0x3000010},
13080{0x3000000, 0x966320b, 0x81398437, 0x9663151, 0x3000010},
13081{0x3000000, 0x966320b, 0x8ba98d27, 0x8ba25b97, 0x3000010},
13082{0x3000000, 0x966320b, 0x8ba98d7a, 0x8ba25bea, 0x3000010},
13083{0x3000000, 0x966320b, 0xf51f853a, 0xf51f853a, 0x3000010},
13084{0x3000000, 0x966320b, 0xff7ffff0, 0xff7ffff0, 0x3000010},
13085{0x3000000, 0x966320b, 0xff7fffff, 0xff7fffff, 0x3000010},
13086{0x3000000, 0x966320b, 0xff800000, 0xff800000, 0x3000000},
13087{0x3000000, 0x966320b, 0xff800001, 0x7fc00000, 0x3000001},
13088{0x3000000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3000001},
13089{0x3000000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3000001},
13090{0x3000000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3000000},
13091{0x3000000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3000000},
13092{0x3000000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3000000},
13093{0x3000000, 0x966320b, 0x4f3495cb, 0x4f3495cb, 0x3000010},
13094{0x3000000, 0x966320b, 0xe73a5134, 0xe73a5134, 0x3000010},
13095{0x3000000, 0x966320b, 0x7c994e9e, 0x7c994e9e, 0x3000010},
13096{0x3000000, 0x966320b, 0x6164bd6c, 0x6164bd6c, 0x3000010},
13097{0x3000000, 0x966320b, 0x9503366, 0x9db32b8, 0x3000010},
13098{0x3000000, 0x966320b, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
13099{0x3000000, 0x966320b, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
13100{0x3000000, 0x966320b, 0x77f31e2f, 0x77f31e2f, 0x3000010},
13101{0x3000000, 0x966320b, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
13102{0x3000000, 0x966320b, 0x966320b, 0x9e6320b, 0x3000000},
13103{0x3000000, 0x966320b, 0xb26bddee, 0xb26bddee, 0x3000010},
13104{0x3000000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
13105{0x3000000, 0x966320b, 0x317285d3, 0x317285d3, 0x3000010},
13106{0x3000000, 0x966320b, 0x3c9623b1, 0x3c9623b1, 0x3000010},
13107{0x3000000, 0x966320b, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
13108{0x3000000, 0x966320b, 0x7b906a6c, 0x7b906a6c, 0x3000010},
13109{0x3000000, 0xb26bddee, 0x0, 0xb26bddee, 0x3000000},
13110{0x3000000, 0xb26bddee, 0x1, 0xb26bddee, 0x3000080},
13111{0x3000000, 0xb26bddee, 0x76, 0xb26bddee, 0x3000080},
13112{0x3000000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3000080},
13113{0x3000000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3000080},
13114{0x3000000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3000080},
13115{0x3000000, 0xb26bddee, 0x800000, 0xb26bddee, 0x3000010},
13116{0x3000000, 0xb26bddee, 0x800002, 0xb26bddee, 0x3000010},
13117{0x3000000, 0xb26bddee, 0x1398437, 0xb26bddee, 0x3000010},
13118{0x3000000, 0xb26bddee, 0xba98d27, 0xb26bddee, 0x3000010},
13119{0x3000000, 0xb26bddee, 0xba98d7a, 0xb26bddee, 0x3000010},
13120{0x3000000, 0xb26bddee, 0x751f853a, 0x751f853a, 0x3000010},
13121{0x3000000, 0xb26bddee, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
13122{0x3000000, 0xb26bddee, 0x7f7fffff, 0x7f7fffff, 0x3000010},
13123{0x3000000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3000000},
13124{0x3000000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3000001},
13125{0x3000000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3000001},
13126{0x3000000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3000001},
13127{0x3000000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3000000},
13128{0x3000000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3000000},
13129{0x3000000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3000000},
13130{0x3000000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3000000},
13131{0x3000000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3000080},
13132{0x3000000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3000080},
13133{0x3000000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3000080},
13134{0x3000000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3000080},
13135{0x3000000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3000080},
13136{0x3000000, 0xb26bddee, 0x80800000, 0xb26bddee, 0x3000010},
13137{0x3000000, 0xb26bddee, 0x80800002, 0xb26bddee, 0x3000010},
13138{0x3000000, 0xb26bddee, 0x81398437, 0xb26bddee, 0x3000010},
13139{0x3000000, 0xb26bddee, 0x8ba98d27, 0xb26bddee, 0x3000010},
13140{0x3000000, 0xb26bddee, 0x8ba98d7a, 0xb26bddee, 0x3000010},
13141{0x3000000, 0xb26bddee, 0xf51f853a, 0xf51f853a, 0x3000010},
13142{0x3000000, 0xb26bddee, 0xff7ffff0, 0xff7ffff0, 0x3000010},
13143{0x3000000, 0xb26bddee, 0xff7fffff, 0xff7fffff, 0x3000010},
13144{0x3000000, 0xb26bddee, 0xff800000, 0xff800000, 0x3000000},
13145{0x3000000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3000001},
13146{0x3000000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3000001},
13147{0x3000000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3000001},
13148{0x3000000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3000000},
13149{0x3000000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3000000},
13150{0x3000000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3000000},
13151{0x3000000, 0xb26bddee, 0x4f3495cb, 0x4f3495cb, 0x3000010},
13152{0x3000000, 0xb26bddee, 0xe73a5134, 0xe73a5134, 0x3000010},
13153{0x3000000, 0xb26bddee, 0x7c994e9e, 0x7c994e9e, 0x3000010},
13154{0x3000000, 0xb26bddee, 0x6164bd6c, 0x6164bd6c, 0x3000010},
13155{0x3000000, 0xb26bddee, 0x9503366, 0xb26bddee, 0x3000010},
13156{0x3000000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
13157{0x3000000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
13158{0x3000000, 0xb26bddee, 0x77f31e2f, 0x77f31e2f, 0x3000010},
13159{0x3000000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf58, 0x3000010},
13160{0x3000000, 0xb26bddee, 0x966320b, 0xb26bddee, 0x3000010},
13161{0x3000000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3000000},
13162{0x3000000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8f, 0x3000010},
13163{0x3000000, 0xb26bddee, 0x317285d3, 0xb22f3c79, 0x3000010},
13164{0x3000000, 0xb26bddee, 0x3c9623b1, 0x3c9623aa, 0x3000010},
13165{0x3000000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
13166{0x3000000, 0xb26bddee, 0x7b906a6c, 0x7b906a6c, 0x3000010},
13167{0x3000000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3000000},
13168{0x3000000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3000080},
13169{0x3000000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3000080},
13170{0x3000000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3000080},
13171{0x3000000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3000080},
13172{0x3000000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3000080},
13173{0x3000000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d3, 0x3000010},
13174{0x3000000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d3, 0x3000010},
13175{0x3000000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d3, 0x3000010},
13176{0x3000000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d3, 0x3000010},
13177{0x3000000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d3, 0x3000010},
13178{0x3000000, 0xb5c8e5d3, 0x751f853a, 0x751f853a, 0x3000010},
13179{0x3000000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
13180{0x3000000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7fffff, 0x3000010},
13181{0x3000000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3000000},
13182{0x3000000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3000001},
13183{0x3000000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3000001},
13184{0x3000000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3000001},
13185{0x3000000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3000000},
13186{0x3000000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3000000},
13187{0x3000000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3000000},
13188{0x3000000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3000000},
13189{0x3000000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3000080},
13190{0x3000000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3000080},
13191{0x3000000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3000080},
13192{0x3000000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3000080},
13193{0x3000000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3000080},
13194{0x3000000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d3, 0x3000010},
13195{0x3000000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d3, 0x3000010},
13196{0x3000000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d3, 0x3000010},
13197{0x3000000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d3, 0x3000010},
13198{0x3000000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d3, 0x3000010},
13199{0x3000000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853a, 0x3000010},
13200{0x3000000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff0, 0x3000010},
13201{0x3000000, 0xb5c8e5d3, 0xff7fffff, 0xff7fffff, 0x3000010},
13202{0x3000000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3000000},
13203{0x3000000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3000001},
13204{0x3000000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3000001},
13205{0x3000000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3000001},
13206{0x3000000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3000000},
13207{0x3000000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3000000},
13208{0x3000000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3000000},
13209{0x3000000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495cb, 0x3000010},
13210{0x3000000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5134, 0x3000010},
13211{0x3000000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9e, 0x3000010},
13212{0x3000000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6c, 0x3000010},
13213{0x3000000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d3, 0x3000010},
13214{0x3000000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e2, 0x3000010},
13215{0x3000000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
13216{0x3000000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2f, 0x3000010},
13217{0x3000000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d6, 0x3000010},
13218{0x3000000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d3, 0x3000010},
13219{0x3000000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8f, 0x3000010},
13220{0x3000000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3000000},
13221{0x3000000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c90, 0x3000010},
13222{0x3000000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208d, 0x3000010},
13223{0x3000000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
13224{0x3000000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6c, 0x3000010},
13225{0x3000000, 0x317285d3, 0x0, 0x317285d3, 0x3000000},
13226{0x3000000, 0x317285d3, 0x1, 0x317285d3, 0x3000080},
13227{0x3000000, 0x317285d3, 0x76, 0x317285d3, 0x3000080},
13228{0x3000000, 0x317285d3, 0x2b94, 0x317285d3, 0x3000080},
13229{0x3000000, 0x317285d3, 0x636d24, 0x317285d3, 0x3000080},
13230{0x3000000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3000080},
13231{0x3000000, 0x317285d3, 0x800000, 0x317285d3, 0x3000010},
13232{0x3000000, 0x317285d3, 0x800002, 0x317285d3, 0x3000010},
13233{0x3000000, 0x317285d3, 0x1398437, 0x317285d3, 0x3000010},
13234{0x3000000, 0x317285d3, 0xba98d27, 0x317285d3, 0x3000010},
13235{0x3000000, 0x317285d3, 0xba98d7a, 0x317285d3, 0x3000010},
13236{0x3000000, 0x317285d3, 0x751f853a, 0x751f853a, 0x3000010},
13237{0x3000000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
13238{0x3000000, 0x317285d3, 0x7f7fffff, 0x7f7fffff, 0x3000010},
13239{0x3000000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3000000},
13240{0x3000000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3000001},
13241{0x3000000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3000001},
13242{0x3000000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3000001},
13243{0x3000000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3000000},
13244{0x3000000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3000000},
13245{0x3000000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3000000},
13246{0x3000000, 0x317285d3, 0x80000000, 0x317285d3, 0x3000000},
13247{0x3000000, 0x317285d3, 0x80000001, 0x317285d3, 0x3000080},
13248{0x3000000, 0x317285d3, 0x80000076, 0x317285d3, 0x3000080},
13249{0x3000000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3000080},
13250{0x3000000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3000080},
13251{0x3000000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3000080},
13252{0x3000000, 0x317285d3, 0x80800000, 0x317285d3, 0x3000010},
13253{0x3000000, 0x317285d3, 0x80800002, 0x317285d3, 0x3000010},
13254{0x3000000, 0x317285d3, 0x81398437, 0x317285d3, 0x3000010},
13255{0x3000000, 0x317285d3, 0x8ba98d27, 0x317285d3, 0x3000010},
13256{0x3000000, 0x317285d3, 0x8ba98d7a, 0x317285d3, 0x3000010},
13257{0x3000000, 0x317285d3, 0xf51f853a, 0xf51f853a, 0x3000010},
13258{0x3000000, 0x317285d3, 0xff7ffff0, 0xff7ffff0, 0x3000010},
13259{0x3000000, 0x317285d3, 0xff7fffff, 0xff7fffff, 0x3000010},
13260{0x3000000, 0x317285d3, 0xff800000, 0xff800000, 0x3000000},
13261{0x3000000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3000001},
13262{0x3000000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3000001},
13263{0x3000000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3000001},
13264{0x3000000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3000000},
13265{0x3000000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3000000},
13266{0x3000000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3000000},
13267{0x3000000, 0x317285d3, 0x4f3495cb, 0x4f3495cb, 0x3000010},
13268{0x3000000, 0x317285d3, 0xe73a5134, 0xe73a5134, 0x3000010},
13269{0x3000000, 0x317285d3, 0x7c994e9e, 0x7c994e9e, 0x3000010},
13270{0x3000000, 0x317285d3, 0x6164bd6c, 0x6164bd6c, 0x3000010},
13271{0x3000000, 0x317285d3, 0x9503366, 0x317285d3, 0x3000010},
13272{0x3000000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
13273{0x3000000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
13274{0x3000000, 0x317285d3, 0x77f31e2f, 0x77f31e2f, 0x3000010},
13275{0x3000000, 0x317285d3, 0xaab4d7d8, 0x3172802c, 0x3000010},
13276{0x3000000, 0x317285d3, 0x966320b, 0x317285d3, 0x3000010},
13277{0x3000000, 0x317285d3, 0xb26bddee, 0xb22f3c79, 0x3000010},
13278{0x3000000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c90, 0x3000010},
13279{0x3000000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3000000},
13280{0x3000000, 0x317285d3, 0x3c9623b1, 0x3c9623b3, 0x3000010},
13281{0x3000000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
13282{0x3000000, 0x317285d3, 0x7b906a6c, 0x7b906a6c, 0x3000010},
13283{0x3000000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3000000},
13284{0x3000000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3000080},
13285{0x3000000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3000080},
13286{0x3000000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3000080},
13287{0x3000000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3000080},
13288{0x3000000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3000080},
13289{0x3000000, 0x3c9623b1, 0x800000, 0x3c9623b1, 0x3000010},
13290{0x3000000, 0x3c9623b1, 0x800002, 0x3c9623b1, 0x3000010},
13291{0x3000000, 0x3c9623b1, 0x1398437, 0x3c9623b1, 0x3000010},
13292{0x3000000, 0x3c9623b1, 0xba98d27, 0x3c9623b1, 0x3000010},
13293{0x3000000, 0x3c9623b1, 0xba98d7a, 0x3c9623b1, 0x3000010},
13294{0x3000000, 0x3c9623b1, 0x751f853a, 0x751f853a, 0x3000010},
13295{0x3000000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
13296{0x3000000, 0x3c9623b1, 0x7f7fffff, 0x7f7fffff, 0x3000010},
13297{0x3000000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3000000},
13298{0x3000000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3000001},
13299{0x3000000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3000001},
13300{0x3000000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3000001},
13301{0x3000000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3000000},
13302{0x3000000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3000000},
13303{0x3000000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3000000},
13304{0x3000000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3000000},
13305{0x3000000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3000080},
13306{0x3000000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3000080},
13307{0x3000000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3000080},
13308{0x3000000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3000080},
13309{0x3000000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3000080},
13310{0x3000000, 0x3c9623b1, 0x80800000, 0x3c9623b1, 0x3000010},
13311{0x3000000, 0x3c9623b1, 0x80800002, 0x3c9623b1, 0x3000010},
13312{0x3000000, 0x3c9623b1, 0x81398437, 0x3c9623b1, 0x3000010},
13313{0x3000000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b1, 0x3000010},
13314{0x3000000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b1, 0x3000010},
13315{0x3000000, 0x3c9623b1, 0xf51f853a, 0xf51f853a, 0x3000010},
13316{0x3000000, 0x3c9623b1, 0xff7ffff0, 0xff7ffff0, 0x3000010},
13317{0x3000000, 0x3c9623b1, 0xff7fffff, 0xff7fffff, 0x3000010},
13318{0x3000000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3000000},
13319{0x3000000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3000001},
13320{0x3000000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3000001},
13321{0x3000000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3000001},
13322{0x3000000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3000000},
13323{0x3000000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3000000},
13324{0x3000000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3000000},
13325{0x3000000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cb, 0x3000010},
13326{0x3000000, 0x3c9623b1, 0xe73a5134, 0xe73a5134, 0x3000010},
13327{0x3000000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9e, 0x3000010},
13328{0x3000000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6c, 0x3000010},
13329{0x3000000, 0x3c9623b1, 0x9503366, 0x3c9623b1, 0x3000010},
13330{0x3000000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ab, 0x3000010},
13331{0x3000000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
13332{0x3000000, 0x3c9623b1, 0x77f31e2f, 0x77f31e2f, 0x3000010},
13333{0x3000000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b1, 0x3000010},
13334{0x3000000, 0x3c9623b1, 0x966320b, 0x3c9623b1, 0x3000010},
13335{0x3000000, 0x3c9623b1, 0xb26bddee, 0x3c9623aa, 0x3000010},
13336{0x3000000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208d, 0x3000010},
13337{0x3000000, 0x3c9623b1, 0x317285d3, 0x3c9623b3, 0x3000010},
13338{0x3000000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3000000},
13339{0x3000000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
13340{0x3000000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6c, 0x3000010},
13341{0x3000000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3000000},
13342{0x3000000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3000080},
13343{0x3000000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3000080},
13344{0x3000000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3000080},
13345{0x3000000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3000080},
13346{0x3000000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3000080},
13347{0x3000000, 0x51fd2c7c, 0x800000, 0x51fd2c7c, 0x3000010},
13348{0x3000000, 0x51fd2c7c, 0x800002, 0x51fd2c7c, 0x3000010},
13349{0x3000000, 0x51fd2c7c, 0x1398437, 0x51fd2c7c, 0x3000010},
13350{0x3000000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7c, 0x3000010},
13351{0x3000000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7c, 0x3000010},
13352{0x3000000, 0x51fd2c7c, 0x751f853a, 0x751f853a, 0x3000010},
13353{0x3000000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
13354{0x3000000, 0x51fd2c7c, 0x7f7fffff, 0x7f7fffff, 0x3000010},
13355{0x3000000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3000000},
13356{0x3000000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3000001},
13357{0x3000000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3000001},
13358{0x3000000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3000001},
13359{0x3000000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3000000},
13360{0x3000000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3000000},
13361{0x3000000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3000000},
13362{0x3000000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3000000},
13363{0x3000000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3000080},
13364{0x3000000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3000080},
13365{0x3000000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3000080},
13366{0x3000000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3000080},
13367{0x3000000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3000080},
13368{0x3000000, 0x51fd2c7c, 0x80800000, 0x51fd2c7c, 0x3000010},
13369{0x3000000, 0x51fd2c7c, 0x80800002, 0x51fd2c7c, 0x3000010},
13370{0x3000000, 0x51fd2c7c, 0x81398437, 0x51fd2c7c, 0x3000010},
13371{0x3000000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7c, 0x3000010},
13372{0x3000000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7c, 0x3000010},
13373{0x3000000, 0x51fd2c7c, 0xf51f853a, 0xf51f853a, 0x3000010},
13374{0x3000000, 0x51fd2c7c, 0xff7ffff0, 0xff7ffff0, 0x3000010},
13375{0x3000000, 0x51fd2c7c, 0xff7fffff, 0xff7fffff, 0x3000010},
13376{0x3000000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3000000},
13377{0x3000000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3000001},
13378{0x3000000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3000001},
13379{0x3000000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3000001},
13380{0x3000000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3000000},
13381{0x3000000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3000000},
13382{0x3000000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3000000},
13383{0x3000000, 0x51fd2c7c, 0x4f3495cb, 0x52016895, 0x3000010},
13384{0x3000000, 0x51fd2c7c, 0xe73a5134, 0xe73a5134, 0x3000010},
13385{0x3000000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9e, 0x3000010},
13386{0x3000000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6c, 0x3000010},
13387{0x3000000, 0x51fd2c7c, 0x9503366, 0x51fd2c7c, 0x3000010},
13388{0x3000000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7c, 0x3000010},
13389{0x3000000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
13390{0x3000000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e2f, 0x3000010},
13391{0x3000000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7c, 0x3000010},
13392{0x3000000, 0x51fd2c7c, 0x966320b, 0x51fd2c7c, 0x3000010},
13393{0x3000000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7c, 0x3000010},
13394{0x3000000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7c, 0x3000010},
13395{0x3000000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7c, 0x3000010},
13396{0x3000000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7c, 0x3000010},
13397{0x3000000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3000000},
13398{0x3000000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6c, 0x3000010},
13399{0x3000000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3000000},
13400{0x3000000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3000080},
13401{0x3000000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3000080},
13402{0x3000000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3000080},
13403{0x3000000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3000080},
13404{0x3000000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3000080},
13405{0x3000000, 0x7b906a6c, 0x800000, 0x7b906a6c, 0x3000010},
13406{0x3000000, 0x7b906a6c, 0x800002, 0x7b906a6c, 0x3000010},
13407{0x3000000, 0x7b906a6c, 0x1398437, 0x7b906a6c, 0x3000010},
13408{0x3000000, 0x7b906a6c, 0xba98d27, 0x7b906a6c, 0x3000010},
13409{0x3000000, 0x7b906a6c, 0xba98d7a, 0x7b906a6c, 0x3000010},
13410{0x3000000, 0x7b906a6c, 0x751f853a, 0x7b906f68, 0x3000010},
13411{0x3000000, 0x7b906a6c, 0x7f7ffff0, 0x7f800000, 0x3000014},
13412{0x3000000, 0x7b906a6c, 0x7f7fffff, 0x7f800000, 0x3000014},
13413{0x3000000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3000000},
13414{0x3000000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3000001},
13415{0x3000000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3000001},
13416{0x3000000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3000001},
13417{0x3000000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3000000},
13418{0x3000000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3000000},
13419{0x3000000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3000000},
13420{0x3000000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3000000},
13421{0x3000000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3000080},
13422{0x3000000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3000080},
13423{0x3000000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3000080},
13424{0x3000000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3000080},
13425{0x3000000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3000080},
13426{0x3000000, 0x7b906a6c, 0x80800000, 0x7b906a6c, 0x3000010},
13427{0x3000000, 0x7b906a6c, 0x80800002, 0x7b906a6c, 0x3000010},
13428{0x3000000, 0x7b906a6c, 0x81398437, 0x7b906a6c, 0x3000010},
13429{0x3000000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6c, 0x3000010},
13430{0x3000000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6c, 0x3000010},
13431{0x3000000, 0x7b906a6c, 0xf51f853a, 0x7b906570, 0x3000010},
13432{0x3000000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1b, 0x3000010},
13433{0x3000000, 0x7b906a6c, 0xff7fffff, 0xff7edf2a, 0x3000010},
13434{0x3000000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3000000},
13435{0x3000000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3000001},
13436{0x3000000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3000001},
13437{0x3000000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3000001},
13438{0x3000000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3000000},
13439{0x3000000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3000000},
13440{0x3000000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3000000},
13441{0x3000000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6c, 0x3000010},
13442{0x3000000, 0x7b906a6c, 0xe73a5134, 0x7b906a6c, 0x3000010},
13443{0x3000000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3000000},
13444{0x3000000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6c, 0x3000010},
13445{0x3000000, 0x7b906a6c, 0x9503366, 0x7b906a6c, 0x3000010},
13446{0x3000000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6c, 0x3000010},
13447{0x3000000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6c, 0x3000010},
13448{0x3000000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8a, 0x3000010},
13449{0x3000000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6c, 0x3000010},
13450{0x3000000, 0x7b906a6c, 0x966320b, 0x7b906a6c, 0x3000010},
13451{0x3000000, 0x7b906a6c, 0xb26bddee, 0x7b906a6c, 0x3000010},
13452{0x3000000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6c, 0x3000010},
13453{0x3000000, 0x7b906a6c, 0x317285d3, 0x7b906a6c, 0x3000010},
13454{0x3000000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6c, 0x3000010},
13455{0x3000000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6c, 0x3000010},
13456{0x3000000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3000000},
diff --git a/src/tests/core/memory/memory.cpp b/src/tests/core/memory/memory.cpp
new file mode 100644
index 000000000..671afb702
--- /dev/null
+++ b/src/tests/core/memory/memory.cpp
@@ -0,0 +1,56 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <catch.hpp>
6#include "core/hle/kernel/memory.h"
7#include "core/hle/kernel/process.h"
8#include "core/memory.h"
9
10TEST_CASE("Memory::IsValidVirtualAddress", "[core][memory]") {
11 SECTION("these regions should not be mapped on an empty process") {
12 auto process = Kernel::Process::Create("");
13 CHECK(Memory::IsValidVirtualAddress(*process, Memory::PROCESS_IMAGE_VADDR) == false);
14 CHECK(Memory::IsValidVirtualAddress(*process, Memory::HEAP_VADDR) == false);
15 CHECK(Memory::IsValidVirtualAddress(*process, Memory::LINEAR_HEAP_VADDR) == false);
16 CHECK(Memory::IsValidVirtualAddress(*process, Memory::VRAM_VADDR) == false);
17 CHECK(Memory::IsValidVirtualAddress(*process, Memory::CONFIG_MEMORY_VADDR) == false);
18 CHECK(Memory::IsValidVirtualAddress(*process, Memory::SHARED_PAGE_VADDR) == false);
19 CHECK(Memory::IsValidVirtualAddress(*process, Memory::TLS_AREA_VADDR) == false);
20 }
21
22 SECTION("CONFIG_MEMORY_VADDR and SHARED_PAGE_VADDR should be valid after mapping them") {
23 auto process = Kernel::Process::Create("");
24 Kernel::MapSharedPages(process->vm_manager);
25 CHECK(Memory::IsValidVirtualAddress(*process, Memory::CONFIG_MEMORY_VADDR) == true);
26 CHECK(Memory::IsValidVirtualAddress(*process, Memory::SHARED_PAGE_VADDR) == true);
27 }
28
29 SECTION("special regions should be valid after mapping them") {
30 auto process = Kernel::Process::Create("");
31 SECTION("VRAM") {
32 Kernel::HandleSpecialMapping(process->vm_manager,
33 {Memory::VRAM_VADDR, Memory::VRAM_SIZE, false, false});
34 CHECK(Memory::IsValidVirtualAddress(*process, Memory::VRAM_VADDR) == true);
35 }
36
37 SECTION("IO (Not yet implemented)") {
38 Kernel::HandleSpecialMapping(
39 process->vm_manager, {Memory::IO_AREA_VADDR, Memory::IO_AREA_SIZE, false, false});
40 CHECK_FALSE(Memory::IsValidVirtualAddress(*process, Memory::IO_AREA_VADDR) == true);
41 }
42
43 SECTION("DSP") {
44 Kernel::HandleSpecialMapping(
45 process->vm_manager, {Memory::DSP_RAM_VADDR, Memory::DSP_RAM_SIZE, false, false});
46 CHECK(Memory::IsValidVirtualAddress(*process, Memory::DSP_RAM_VADDR) == true);
47 }
48 }
49
50 SECTION("Unmapping a VAddr should make it invalid") {
51 auto process = Kernel::Process::Create("");
52 Kernel::MapSharedPages(process->vm_manager);
53 process->vm_manager.UnmapRange(Memory::CONFIG_MEMORY_VADDR, Memory::CONFIG_MEMORY_SIZE);
54 CHECK(Memory::IsValidVirtualAddress(*process, Memory::CONFIG_MEMORY_VADDR) == false);
55 }
56}
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt
index 0961a3251..82f47d8a9 100644
--- a/src/video_core/CMakeLists.txt
+++ b/src/video_core/CMakeLists.txt
@@ -1,6 +1,7 @@
1set(SRCS 1set(SRCS
2 command_processor.cpp 2 command_processor.cpp
3 debug_utils/debug_utils.cpp 3 debug_utils/debug_utils.cpp
4 geometry_pipeline.cpp
4 pica.cpp 5 pica.cpp
5 primitive_assembly.cpp 6 primitive_assembly.cpp
6 regs.cpp 7 regs.cpp
@@ -15,6 +16,7 @@ set(SRCS
15 shader/shader_interpreter.cpp 16 shader/shader_interpreter.cpp
16 swrasterizer/clipper.cpp 17 swrasterizer/clipper.cpp
17 swrasterizer/framebuffer.cpp 18 swrasterizer/framebuffer.cpp
19 swrasterizer/lighting.cpp
18 swrasterizer/proctex.cpp 20 swrasterizer/proctex.cpp
19 swrasterizer/rasterizer.cpp 21 swrasterizer/rasterizer.cpp
20 swrasterizer/swrasterizer.cpp 22 swrasterizer/swrasterizer.cpp
@@ -28,6 +30,7 @@ set(SRCS
28set(HEADERS 30set(HEADERS
29 command_processor.h 31 command_processor.h
30 debug_utils/debug_utils.h 32 debug_utils/debug_utils.h
33 geometry_pipeline.h
31 gpu_debugger.h 34 gpu_debugger.h
32 pica.h 35 pica.h
33 pica_state.h 36 pica_state.h
@@ -55,6 +58,7 @@ set(HEADERS
55 shader/shader_interpreter.h 58 shader/shader_interpreter.h
56 swrasterizer/clipper.h 59 swrasterizer/clipper.h
57 swrasterizer/framebuffer.h 60 swrasterizer/framebuffer.h
61 swrasterizer/lighting.h
58 swrasterizer/proctex.h 62 swrasterizer/proctex.h
59 swrasterizer/rasterizer.h 63 swrasterizer/rasterizer.h
60 swrasterizer/swrasterizer.h 64 swrasterizer/swrasterizer.h
diff --git a/src/video_core/command_processor.cpp b/src/video_core/command_processor.cpp
index 4633a1df1..caf9f7a06 100644
--- a/src/video_core/command_processor.cpp
+++ b/src/video_core/command_processor.cpp
@@ -119,24 +119,221 @@ static void WriteUniformFloatReg(ShaderRegs& config, Shader::ShaderSetup& setup,
119 } 119 }
120} 120}
121 121
122static void WriteProgramCode(ShaderRegs& config, Shader::ShaderSetup& setup, 122static void LoadDefaultVertexAttributes(u32 register_value) {
123 unsigned max_program_code_length, u32 value) { 123 auto& regs = g_state.regs;
124 if (config.program.offset >= max_program_code_length) { 124
125 LOG_ERROR(HW_GPU, "Invalid %s program offset %d", GetShaderSetupTypeName(setup), 125 // TODO: Does actual hardware indeed keep an intermediate buffer or does
126 (int)config.program.offset); 126 // it directly write the values?
127 } else { 127 default_attr_write_buffer[default_attr_counter++] = register_value;
128 setup.program_code[config.program.offset] = value; 128
129 config.program.offset++; 129 // Default attributes are written in a packed format such that four float24 values are encoded
130 // in three 32-bit numbers.
131 // We write to internal memory once a full such vector is written.
132 if (default_attr_counter >= 3) {
133 default_attr_counter = 0;
134
135 auto& setup = regs.pipeline.vs_default_attributes_setup;
136
137 if (setup.index >= 16) {
138 LOG_ERROR(HW_GPU, "Invalid VS default attribute index %d", (int)setup.index);
139 return;
140 }
141
142 Math::Vec4<float24> attribute;
143
144 // NOTE: The destination component order indeed is "backwards"
145 attribute.w = float24::FromRaw(default_attr_write_buffer[0] >> 8);
146 attribute.z = float24::FromRaw(((default_attr_write_buffer[0] & 0xFF) << 16) |
147 ((default_attr_write_buffer[1] >> 16) & 0xFFFF));
148 attribute.y = float24::FromRaw(((default_attr_write_buffer[1] & 0xFFFF) << 8) |
149 ((default_attr_write_buffer[2] >> 24) & 0xFF));
150 attribute.x = float24::FromRaw(default_attr_write_buffer[2] & 0xFFFFFF);
151
152 LOG_TRACE(HW_GPU, "Set default VS attribute %x to (%f %f %f %f)", (int)setup.index,
153 attribute.x.ToFloat32(), attribute.y.ToFloat32(), attribute.z.ToFloat32(),
154 attribute.w.ToFloat32());
155
156 // TODO: Verify that this actually modifies the register!
157 if (setup.index < 15) {
158 g_state.input_default_attributes.attr[setup.index] = attribute;
159 setup.index++;
160 } else {
161 // Put each attribute into an immediate input buffer. When all specified immediate
162 // attributes are present, the Vertex Shader is invoked and everything is sent to
163 // the primitive assembler.
164
165 auto& immediate_input = g_state.immediate.input_vertex;
166 auto& immediate_attribute_id = g_state.immediate.current_attribute;
167
168 immediate_input.attr[immediate_attribute_id] = attribute;
169
170 if (immediate_attribute_id < regs.pipeline.max_input_attrib_index) {
171 immediate_attribute_id += 1;
172 } else {
173 MICROPROFILE_SCOPE(GPU_Drawing);
174 immediate_attribute_id = 0;
175
176 auto* shader_engine = Shader::GetEngine();
177 shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset);
178
179 // Send to vertex shader
180 if (g_debug_context)
181 g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation,
182 static_cast<void*>(&immediate_input));
183 Shader::UnitState shader_unit;
184 Shader::AttributeBuffer output{};
185
186 shader_unit.LoadInput(regs.vs, immediate_input);
187 shader_engine->Run(g_state.vs, shader_unit);
188 shader_unit.WriteOutput(regs.vs, output);
189
190 // Send to geometry pipeline
191 if (g_state.immediate.reset_geometry_pipeline) {
192 g_state.geometry_pipeline.Reconfigure();
193 g_state.immediate.reset_geometry_pipeline = false;
194 }
195 ASSERT(!g_state.geometry_pipeline.NeedIndexInput());
196 g_state.geometry_pipeline.Setup(shader_engine);
197 g_state.geometry_pipeline.SubmitVertex(output);
198
199 // TODO: If drawing after every immediate mode triangle kills performance,
200 // change it to flush triangles whenever a drawing config register changes
201 // See: https://github.com/citra-emu/citra/pull/2866#issuecomment-327011550
202 VideoCore::g_renderer->Rasterizer()->DrawTriangles();
203 if (g_debug_context) {
204 g_debug_context->OnEvent(DebugContext::Event::FinishedPrimitiveBatch, nullptr);
205 }
206 }
207 }
130 } 208 }
131} 209}
132 210
133static void WriteSwizzlePatterns(ShaderRegs& config, Shader::ShaderSetup& setup, u32 value) { 211static void Draw(u32 command_id) {
134 if (config.swizzle_patterns.offset >= setup.swizzle_data.size()) { 212 MICROPROFILE_SCOPE(GPU_Drawing);
135 LOG_ERROR(HW_GPU, "Invalid %s swizzle pattern offset %d", GetShaderSetupTypeName(setup), 213 auto& regs = g_state.regs;
136 (int)config.swizzle_patterns.offset); 214
137 } else { 215#if PICA_LOG_TEV
138 setup.swizzle_data[config.swizzle_patterns.offset] = value; 216 DebugUtils::DumpTevStageConfig(regs.GetTevStages());
139 config.swizzle_patterns.offset++; 217#endif
218 if (g_debug_context)
219 g_debug_context->OnEvent(DebugContext::Event::IncomingPrimitiveBatch, nullptr);
220
221 // Processes information about internal vertex attributes to figure out how a vertex is
222 // loaded.
223 // Later, these can be compiled and cached.
224 const u32 base_address = regs.pipeline.vertex_attributes.GetPhysicalBaseAddress();
225 VertexLoader loader(regs.pipeline);
226
227 // Load vertices
228 bool is_indexed = (command_id == PICA_REG_INDEX(pipeline.trigger_draw_indexed));
229
230 const auto& index_info = regs.pipeline.index_array;
231 const u8* index_address_8 = Memory::GetPhysicalPointer(base_address + index_info.offset);
232 const u16* index_address_16 = reinterpret_cast<const u16*>(index_address_8);
233 bool index_u16 = index_info.format != 0;
234
235 PrimitiveAssembler<Shader::OutputVertex>& primitive_assembler = g_state.primitive_assembler;
236
237 if (g_debug_context && g_debug_context->recorder) {
238 for (int i = 0; i < 3; ++i) {
239 const auto texture = regs.texturing.GetTextures()[i];
240 if (!texture.enabled)
241 continue;
242
243 u8* texture_data = Memory::GetPhysicalPointer(texture.config.GetPhysicalAddress());
244 g_debug_context->recorder->MemoryAccessed(
245 texture_data, Pica::TexturingRegs::NibblesPerPixel(texture.format) *
246 texture.config.width / 2 * texture.config.height,
247 texture.config.GetPhysicalAddress());
248 }
249 }
250
251 DebugUtils::MemoryAccessTracker memory_accesses;
252
253 // Simple circular-replacement vertex cache
254 // The size has been tuned for optimal balance between hit-rate and the cost of lookup
255 const size_t VERTEX_CACHE_SIZE = 32;
256 std::array<u16, VERTEX_CACHE_SIZE> vertex_cache_ids;
257 std::array<Shader::AttributeBuffer, VERTEX_CACHE_SIZE> vertex_cache;
258 Shader::AttributeBuffer vs_output;
259
260 unsigned int vertex_cache_pos = 0;
261 vertex_cache_ids.fill(-1);
262
263 auto* shader_engine = Shader::GetEngine();
264 Shader::UnitState shader_unit;
265
266 shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset);
267
268 g_state.geometry_pipeline.Reconfigure();
269 g_state.geometry_pipeline.Setup(shader_engine);
270 if (g_state.geometry_pipeline.NeedIndexInput())
271 ASSERT(is_indexed);
272
273 for (unsigned int index = 0; index < regs.pipeline.num_vertices; ++index) {
274 // Indexed rendering doesn't use the start offset
275 unsigned int vertex = is_indexed
276 ? (index_u16 ? index_address_16[index] : index_address_8[index])
277 : (index + regs.pipeline.vertex_offset);
278
279 // -1 is a common special value used for primitive restart. Since it's unknown if
280 // the PICA supports it, and it would mess up the caching, guard against it here.
281 ASSERT(vertex != -1);
282
283 bool vertex_cache_hit = false;
284
285 if (is_indexed) {
286 if (g_state.geometry_pipeline.NeedIndexInput()) {
287 g_state.geometry_pipeline.SubmitIndex(vertex);
288 continue;
289 }
290
291 if (g_debug_context && Pica::g_debug_context->recorder) {
292 int size = index_u16 ? 2 : 1;
293 memory_accesses.AddAccess(base_address + index_info.offset + size * index, size);
294 }
295
296 for (unsigned int i = 0; i < VERTEX_CACHE_SIZE; ++i) {
297 if (vertex == vertex_cache_ids[i]) {
298 vs_output = vertex_cache[i];
299 vertex_cache_hit = true;
300 break;
301 }
302 }
303 }
304
305 if (!vertex_cache_hit) {
306 // Initialize data for the current vertex
307 Shader::AttributeBuffer input;
308 loader.LoadVertex(base_address, index, vertex, input, memory_accesses);
309
310 // Send to vertex shader
311 if (g_debug_context)
312 g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation,
313 (void*)&input);
314 shader_unit.LoadInput(regs.vs, input);
315 shader_engine->Run(g_state.vs, shader_unit);
316 shader_unit.WriteOutput(regs.vs, vs_output);
317
318 if (is_indexed) {
319 vertex_cache[vertex_cache_pos] = vs_output;
320 vertex_cache_ids[vertex_cache_pos] = vertex;
321 vertex_cache_pos = (vertex_cache_pos + 1) % VERTEX_CACHE_SIZE;
322 }
323 }
324
325 // Send to geometry pipeline
326 g_state.geometry_pipeline.SubmitVertex(vs_output);
327 }
328
329 for (auto& range : memory_accesses.ranges) {
330 g_debug_context->recorder->MemoryAccessed(Memory::GetPhysicalPointer(range.first),
331 range.second, range.first);
332 }
333
334 VideoCore::g_renderer->Rasterizer()->DrawTriangles();
335 if (g_debug_context) {
336 g_debug_context->OnEvent(DebugContext::Event::FinishedPrimitiveBatch, nullptr);
140 } 337 }
141} 338}
142 339
@@ -182,106 +379,19 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
182 379
183 case PICA_REG_INDEX(pipeline.vs_default_attributes_setup.index): 380 case PICA_REG_INDEX(pipeline.vs_default_attributes_setup.index):
184 g_state.immediate.current_attribute = 0; 381 g_state.immediate.current_attribute = 0;
382 g_state.immediate.reset_geometry_pipeline = true;
185 default_attr_counter = 0; 383 default_attr_counter = 0;
186 break; 384 break;
187 385
188 // Load default vertex input attributes 386 // Load default vertex input attributes
189 case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[0], 0x233): 387 case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[0], 0x233):
190 case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[1], 0x234): 388 case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[1], 0x234):
191 case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[2], 0x235): { 389 case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[2], 0x235):
192 // TODO: Does actual hardware indeed keep an intermediate buffer or does 390 LoadDefaultVertexAttributes(value);
193 // it directly write the values?
194 default_attr_write_buffer[default_attr_counter++] = value;
195
196 // Default attributes are written in a packed format such that four float24 values are
197 // encoded in
198 // three 32-bit numbers. We write to internal memory once a full such vector is
199 // written.
200 if (default_attr_counter >= 3) {
201 default_attr_counter = 0;
202
203 auto& setup = regs.pipeline.vs_default_attributes_setup;
204
205 if (setup.index >= 16) {
206 LOG_ERROR(HW_GPU, "Invalid VS default attribute index %d", (int)setup.index);
207 break;
208 }
209
210 Math::Vec4<float24> attribute;
211
212 // NOTE: The destination component order indeed is "backwards"
213 attribute.w = float24::FromRaw(default_attr_write_buffer[0] >> 8);
214 attribute.z = float24::FromRaw(((default_attr_write_buffer[0] & 0xFF) << 16) |
215 ((default_attr_write_buffer[1] >> 16) & 0xFFFF));
216 attribute.y = float24::FromRaw(((default_attr_write_buffer[1] & 0xFFFF) << 8) |
217 ((default_attr_write_buffer[2] >> 24) & 0xFF));
218 attribute.x = float24::FromRaw(default_attr_write_buffer[2] & 0xFFFFFF);
219
220 LOG_TRACE(HW_GPU, "Set default VS attribute %x to (%f %f %f %f)", (int)setup.index,
221 attribute.x.ToFloat32(), attribute.y.ToFloat32(), attribute.z.ToFloat32(),
222 attribute.w.ToFloat32());
223
224 // TODO: Verify that this actually modifies the register!
225 if (setup.index < 15) {
226 g_state.input_default_attributes.attr[setup.index] = attribute;
227 setup.index++;
228 } else {
229 // Put each attribute into an immediate input buffer. When all specified immediate
230 // attributes are present, the Vertex Shader is invoked and everything is sent to
231 // the primitive assembler.
232
233 auto& immediate_input = g_state.immediate.input_vertex;
234 auto& immediate_attribute_id = g_state.immediate.current_attribute;
235
236 immediate_input.attr[immediate_attribute_id] = attribute;
237
238 if (immediate_attribute_id < regs.pipeline.max_input_attrib_index) {
239 immediate_attribute_id += 1;
240 } else {
241 MICROPROFILE_SCOPE(GPU_Drawing);
242 immediate_attribute_id = 0;
243
244 auto* shader_engine = Shader::GetEngine();
245 shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset);
246
247 // Send to vertex shader
248 if (g_debug_context)
249 g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation,
250 static_cast<void*>(&immediate_input));
251 Shader::UnitState shader_unit;
252 Shader::AttributeBuffer output{};
253
254 shader_unit.LoadInput(regs.vs, immediate_input);
255 shader_engine->Run(g_state.vs, shader_unit);
256 shader_unit.WriteOutput(regs.vs, output);
257
258 // Send to renderer
259 using Pica::Shader::OutputVertex;
260 auto AddTriangle = [](const OutputVertex& v0, const OutputVertex& v1,
261 const OutputVertex& v2) {
262 VideoCore::g_renderer->Rasterizer()->AddTriangle(v0, v1, v2);
263 };
264
265 g_state.primitive_assembler.SubmitVertex(
266 Shader::OutputVertex::FromAttributeBuffer(regs.rasterizer, output),
267 AddTriangle);
268 }
269 }
270 }
271 break; 391 break;
272 }
273 392
274 case PICA_REG_INDEX(pipeline.gpu_mode): 393 case PICA_REG_INDEX(pipeline.gpu_mode):
275 if (regs.pipeline.gpu_mode == PipelineRegs::GPUMode::Configuring) { 394 // This register likely just enables vertex processing and doesn't need any special handling
276 MICROPROFILE_SCOPE(GPU_Drawing);
277
278 // Draw immediate mode triangles when GPU Mode is set to GPUMode::Configuring
279 VideoCore::g_renderer->Rasterizer()->DrawTriangles();
280
281 if (g_debug_context) {
282 g_debug_context->OnEvent(DebugContext::Event::FinishedPrimitiveBatch, nullptr);
283 }
284 }
285 break; 395 break;
286 396
287 case PICA_REG_INDEX_WORKAROUND(pipeline.command_buffer.trigger[0], 0x23c): 397 case PICA_REG_INDEX_WORKAROUND(pipeline.command_buffer.trigger[0], 0x23c):
@@ -297,130 +407,9 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
297 407
298 // It seems like these trigger vertex rendering 408 // It seems like these trigger vertex rendering
299 case PICA_REG_INDEX(pipeline.trigger_draw): 409 case PICA_REG_INDEX(pipeline.trigger_draw):
300 case PICA_REG_INDEX(pipeline.trigger_draw_indexed): { 410 case PICA_REG_INDEX(pipeline.trigger_draw_indexed):
301 MICROPROFILE_SCOPE(GPU_Drawing); 411 Draw(id);
302
303#if PICA_LOG_TEV
304 DebugUtils::DumpTevStageConfig(regs.GetTevStages());
305#endif
306 if (g_debug_context)
307 g_debug_context->OnEvent(DebugContext::Event::IncomingPrimitiveBatch, nullptr);
308
309 // Processes information about internal vertex attributes to figure out how a vertex is
310 // loaded.
311 // Later, these can be compiled and cached.
312 const u32 base_address = regs.pipeline.vertex_attributes.GetPhysicalBaseAddress();
313 VertexLoader loader(regs.pipeline);
314
315 // Load vertices
316 bool is_indexed = (id == PICA_REG_INDEX(pipeline.trigger_draw_indexed));
317
318 const auto& index_info = regs.pipeline.index_array;
319 const u8* index_address_8 = Memory::GetPhysicalPointer(base_address + index_info.offset);
320 const u16* index_address_16 = reinterpret_cast<const u16*>(index_address_8);
321 bool index_u16 = index_info.format != 0;
322
323 PrimitiveAssembler<Shader::OutputVertex>& primitive_assembler = g_state.primitive_assembler;
324
325 if (g_debug_context && g_debug_context->recorder) {
326 for (int i = 0; i < 3; ++i) {
327 const auto texture = regs.texturing.GetTextures()[i];
328 if (!texture.enabled)
329 continue;
330
331 u8* texture_data = Memory::GetPhysicalPointer(texture.config.GetPhysicalAddress());
332 g_debug_context->recorder->MemoryAccessed(
333 texture_data, Pica::TexturingRegs::NibblesPerPixel(texture.format) *
334 texture.config.width / 2 * texture.config.height,
335 texture.config.GetPhysicalAddress());
336 }
337 }
338
339 DebugUtils::MemoryAccessTracker memory_accesses;
340
341 // Simple circular-replacement vertex cache
342 // The size has been tuned for optimal balance between hit-rate and the cost of lookup
343 const size_t VERTEX_CACHE_SIZE = 32;
344 std::array<u16, VERTEX_CACHE_SIZE> vertex_cache_ids;
345 std::array<Shader::OutputVertex, VERTEX_CACHE_SIZE> vertex_cache;
346 Shader::OutputVertex output_vertex;
347
348 unsigned int vertex_cache_pos = 0;
349 vertex_cache_ids.fill(-1);
350
351 auto* shader_engine = Shader::GetEngine();
352 Shader::UnitState shader_unit;
353
354 shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset);
355
356 for (unsigned int index = 0; index < regs.pipeline.num_vertices; ++index) {
357 // Indexed rendering doesn't use the start offset
358 unsigned int vertex =
359 is_indexed ? (index_u16 ? index_address_16[index] : index_address_8[index])
360 : (index + regs.pipeline.vertex_offset);
361
362 // -1 is a common special value used for primitive restart. Since it's unknown if
363 // the PICA supports it, and it would mess up the caching, guard against it here.
364 ASSERT(vertex != -1);
365
366 bool vertex_cache_hit = false;
367
368 if (is_indexed) {
369 if (g_debug_context && Pica::g_debug_context->recorder) {
370 int size = index_u16 ? 2 : 1;
371 memory_accesses.AddAccess(base_address + index_info.offset + size * index,
372 size);
373 }
374
375 for (unsigned int i = 0; i < VERTEX_CACHE_SIZE; ++i) {
376 if (vertex == vertex_cache_ids[i]) {
377 output_vertex = vertex_cache[i];
378 vertex_cache_hit = true;
379 break;
380 }
381 }
382 }
383
384 if (!vertex_cache_hit) {
385 // Initialize data for the current vertex
386 Shader::AttributeBuffer input, output{};
387 loader.LoadVertex(base_address, index, vertex, input, memory_accesses);
388
389 // Send to vertex shader
390 if (g_debug_context)
391 g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation,
392 (void*)&input);
393 shader_unit.LoadInput(regs.vs, input);
394 shader_engine->Run(g_state.vs, shader_unit);
395 shader_unit.WriteOutput(regs.vs, output);
396
397 // Retrieve vertex from register data
398 output_vertex = Shader::OutputVertex::FromAttributeBuffer(regs.rasterizer, output);
399
400 if (is_indexed) {
401 vertex_cache[vertex_cache_pos] = output_vertex;
402 vertex_cache_ids[vertex_cache_pos] = vertex;
403 vertex_cache_pos = (vertex_cache_pos + 1) % VERTEX_CACHE_SIZE;
404 }
405 }
406
407 // Send to renderer
408 using Pica::Shader::OutputVertex;
409 auto AddTriangle = [](const OutputVertex& v0, const OutputVertex& v1,
410 const OutputVertex& v2) {
411 VideoCore::g_renderer->Rasterizer()->AddTriangle(v0, v1, v2);
412 };
413
414 primitive_assembler.SubmitVertex(output_vertex, AddTriangle);
415 }
416
417 for (auto& range : memory_accesses.ranges) {
418 g_debug_context->recorder->MemoryAccessed(Memory::GetPhysicalPointer(range.first),
419 range.second, range.first);
420 }
421
422 break; 412 break;
423 }
424 413
425 case PICA_REG_INDEX(gs.bool_uniforms): 414 case PICA_REG_INDEX(gs.bool_uniforms):
426 WriteUniformBoolReg(g_state.gs, g_state.regs.gs.bool_uniforms.Value()); 415 WriteUniformBoolReg(g_state.gs, g_state.regs.gs.bool_uniforms.Value());
@@ -458,7 +447,13 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
458 case PICA_REG_INDEX_WORKAROUND(gs.program.set_word[5], 0x2a1): 447 case PICA_REG_INDEX_WORKAROUND(gs.program.set_word[5], 0x2a1):
459 case PICA_REG_INDEX_WORKAROUND(gs.program.set_word[6], 0x2a2): 448 case PICA_REG_INDEX_WORKAROUND(gs.program.set_word[6], 0x2a2):
460 case PICA_REG_INDEX_WORKAROUND(gs.program.set_word[7], 0x2a3): { 449 case PICA_REG_INDEX_WORKAROUND(gs.program.set_word[7], 0x2a3): {
461 WriteProgramCode(g_state.regs.gs, g_state.gs, 4096, value); 450 u32& offset = g_state.regs.gs.program.offset;
451 if (offset >= 4096) {
452 LOG_ERROR(HW_GPU, "Invalid GS program offset %u", offset);
453 } else {
454 g_state.gs.program_code[offset] = value;
455 offset++;
456 }
462 break; 457 break;
463 } 458 }
464 459
@@ -470,11 +465,18 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
470 case PICA_REG_INDEX_WORKAROUND(gs.swizzle_patterns.set_word[5], 0x2ab): 465 case PICA_REG_INDEX_WORKAROUND(gs.swizzle_patterns.set_word[5], 0x2ab):
471 case PICA_REG_INDEX_WORKAROUND(gs.swizzle_patterns.set_word[6], 0x2ac): 466 case PICA_REG_INDEX_WORKAROUND(gs.swizzle_patterns.set_word[6], 0x2ac):
472 case PICA_REG_INDEX_WORKAROUND(gs.swizzle_patterns.set_word[7], 0x2ad): { 467 case PICA_REG_INDEX_WORKAROUND(gs.swizzle_patterns.set_word[7], 0x2ad): {
473 WriteSwizzlePatterns(g_state.regs.gs, g_state.gs, value); 468 u32& offset = g_state.regs.gs.swizzle_patterns.offset;
469 if (offset >= g_state.gs.swizzle_data.size()) {
470 LOG_ERROR(HW_GPU, "Invalid GS swizzle pattern offset %u", offset);
471 } else {
472 g_state.gs.swizzle_data[offset] = value;
473 offset++;
474 }
474 break; 475 break;
475 } 476 }
476 477
477 case PICA_REG_INDEX(vs.bool_uniforms): 478 case PICA_REG_INDEX(vs.bool_uniforms):
479 // TODO (wwylele): does regs.pipeline.gs_unit_exclusive_configuration affect this?
478 WriteUniformBoolReg(g_state.vs, g_state.regs.vs.bool_uniforms.Value()); 480 WriteUniformBoolReg(g_state.vs, g_state.regs.vs.bool_uniforms.Value());
479 break; 481 break;
480 482
@@ -482,6 +484,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
482 case PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[1], 0x2b2): 484 case PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[1], 0x2b2):
483 case PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[2], 0x2b3): 485 case PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[2], 0x2b3):
484 case PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[3], 0x2b4): { 486 case PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[3], 0x2b4): {
487 // TODO (wwylele): does regs.pipeline.gs_unit_exclusive_configuration affect this?
485 unsigned index = (id - PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[0], 0x2b1)); 488 unsigned index = (id - PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[0], 0x2b1));
486 auto values = regs.vs.int_uniforms[index]; 489 auto values = regs.vs.int_uniforms[index];
487 WriteUniformIntReg(g_state.vs, index, 490 WriteUniformIntReg(g_state.vs, index,
@@ -497,6 +500,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
497 case PICA_REG_INDEX_WORKAROUND(vs.uniform_setup.set_value[5], 0x2c6): 500 case PICA_REG_INDEX_WORKAROUND(vs.uniform_setup.set_value[5], 0x2c6):
498 case PICA_REG_INDEX_WORKAROUND(vs.uniform_setup.set_value[6], 0x2c7): 501 case PICA_REG_INDEX_WORKAROUND(vs.uniform_setup.set_value[6], 0x2c7):
499 case PICA_REG_INDEX_WORKAROUND(vs.uniform_setup.set_value[7], 0x2c8): { 502 case PICA_REG_INDEX_WORKAROUND(vs.uniform_setup.set_value[7], 0x2c8): {
503 // TODO (wwylele): does regs.pipeline.gs_unit_exclusive_configuration affect this?
500 WriteUniformFloatReg(g_state.regs.vs, g_state.vs, vs_float_regs_counter, 504 WriteUniformFloatReg(g_state.regs.vs, g_state.vs, vs_float_regs_counter,
501 vs_uniform_write_buffer, value); 505 vs_uniform_write_buffer, value);
502 break; 506 break;
@@ -510,7 +514,16 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
510 case PICA_REG_INDEX_WORKAROUND(vs.program.set_word[5], 0x2d1): 514 case PICA_REG_INDEX_WORKAROUND(vs.program.set_word[5], 0x2d1):
511 case PICA_REG_INDEX_WORKAROUND(vs.program.set_word[6], 0x2d2): 515 case PICA_REG_INDEX_WORKAROUND(vs.program.set_word[6], 0x2d2):
512 case PICA_REG_INDEX_WORKAROUND(vs.program.set_word[7], 0x2d3): { 516 case PICA_REG_INDEX_WORKAROUND(vs.program.set_word[7], 0x2d3): {
513 WriteProgramCode(g_state.regs.vs, g_state.vs, 512, value); 517 u32& offset = g_state.regs.vs.program.offset;
518 if (offset >= 512) {
519 LOG_ERROR(HW_GPU, "Invalid VS program offset %u", offset);
520 } else {
521 g_state.vs.program_code[offset] = value;
522 if (!g_state.regs.pipeline.gs_unit_exclusive_configuration) {
523 g_state.gs.program_code[offset] = value;
524 }
525 offset++;
526 }
514 break; 527 break;
515 } 528 }
516 529
@@ -522,7 +535,16 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
522 case PICA_REG_INDEX_WORKAROUND(vs.swizzle_patterns.set_word[5], 0x2db): 535 case PICA_REG_INDEX_WORKAROUND(vs.swizzle_patterns.set_word[5], 0x2db):
523 case PICA_REG_INDEX_WORKAROUND(vs.swizzle_patterns.set_word[6], 0x2dc): 536 case PICA_REG_INDEX_WORKAROUND(vs.swizzle_patterns.set_word[6], 0x2dc):
524 case PICA_REG_INDEX_WORKAROUND(vs.swizzle_patterns.set_word[7], 0x2dd): { 537 case PICA_REG_INDEX_WORKAROUND(vs.swizzle_patterns.set_word[7], 0x2dd): {
525 WriteSwizzlePatterns(g_state.regs.vs, g_state.vs, value); 538 u32& offset = g_state.regs.vs.swizzle_patterns.offset;
539 if (offset >= g_state.vs.swizzle_data.size()) {
540 LOG_ERROR(HW_GPU, "Invalid VS swizzle pattern offset %u", offset);
541 } else {
542 g_state.vs.swizzle_data[offset] = value;
543 if (!g_state.regs.pipeline.gs_unit_exclusive_configuration) {
544 g_state.gs.swizzle_data[offset] = value;
545 }
546 offset++;
547 }
526 break; 548 break;
527 } 549 }
528 550
@@ -620,6 +642,6 @@ void ProcessCommandList(const u32* list, u32 size) {
620 } 642 }
621} 643}
622 644
623} // namespace 645} // namespace CommandProcessor
624 646
625} // namespace 647} // namespace Pica
diff --git a/src/video_core/geometry_pipeline.cpp b/src/video_core/geometry_pipeline.cpp
new file mode 100644
index 000000000..98ff2ccd3
--- /dev/null
+++ b/src/video_core/geometry_pipeline.cpp
@@ -0,0 +1,274 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "video_core/geometry_pipeline.h"
6#include "video_core/pica_state.h"
7#include "video_core/regs.h"
8#include "video_core/renderer_base.h"
9#include "video_core/video_core.h"
10
11namespace Pica {
12
13/// An attribute buffering interface for different pipeline modes
14class GeometryPipelineBackend {
15public:
16 virtual ~GeometryPipelineBackend() = default;
17
18 /// Checks if there is no incomplete data transfer
19 virtual bool IsEmpty() const = 0;
20
21 /// Checks if the pipeline needs a direct input from index buffer
22 virtual bool NeedIndexInput() const = 0;
23
24 /// Submits an index from index buffer
25 virtual void SubmitIndex(unsigned int val) = 0;
26
27 /**
28 * Submits vertex attributes
29 * @param input attributes of a vertex output from vertex shader
30 * @return if the buffer is full and the geometry shader should be invoked
31 */
32 virtual bool SubmitVertex(const Shader::AttributeBuffer& input) = 0;
33};
34
35// In the Point mode, vertex attributes are sent to the input registers in the geometry shader unit.
36// The size of vertex shader outputs and geometry shader inputs are constants. Geometry shader is
37// invoked upon inputs buffer filled up by vertex shader outputs. For example, if we have a geometry
38// shader that takes 6 inputs, and the vertex shader outputs 2 attributes, it would take 3 vertices
39// for one geometry shader invocation.
40// TODO: what happens when the input size is not divisible by the output size?
41class GeometryPipeline_Point : public GeometryPipelineBackend {
42public:
43 GeometryPipeline_Point(const Regs& regs, Shader::GSUnitState& unit) : regs(regs), unit(unit) {
44 ASSERT(regs.pipeline.variable_primitive == 0);
45 ASSERT(regs.gs.input_to_uniform == 0);
46 vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1;
47 size_t gs_input_num = regs.gs.max_input_attribute_index + 1;
48 ASSERT(gs_input_num % vs_output_num == 0);
49 buffer_cur = attribute_buffer.attr;
50 buffer_end = attribute_buffer.attr + gs_input_num;
51 }
52
53 bool IsEmpty() const override {
54 return buffer_cur == attribute_buffer.attr;
55 }
56
57 bool NeedIndexInput() const override {
58 return false;
59 }
60
61 void SubmitIndex(unsigned int val) override {
62 UNREACHABLE();
63 }
64
65 bool SubmitVertex(const Shader::AttributeBuffer& input) override {
66 buffer_cur = std::copy(input.attr, input.attr + vs_output_num, buffer_cur);
67 if (buffer_cur == buffer_end) {
68 buffer_cur = attribute_buffer.attr;
69 unit.LoadInput(regs.gs, attribute_buffer);
70 return true;
71 }
72 return false;
73 }
74
75private:
76 const Regs& regs;
77 Shader::GSUnitState& unit;
78 Shader::AttributeBuffer attribute_buffer;
79 Math::Vec4<float24>* buffer_cur;
80 Math::Vec4<float24>* buffer_end;
81 unsigned int vs_output_num;
82};
83
84// In VariablePrimitive mode, vertex attributes are buffered into the uniform registers in the
85// geometry shader unit. The number of vertex is variable, which is specified by the first index
86// value in the batch. This mode is usually used for subdivision.
87class GeometryPipeline_VariablePrimitive : public GeometryPipelineBackend {
88public:
89 GeometryPipeline_VariablePrimitive(const Regs& regs, Shader::ShaderSetup& setup)
90 : regs(regs), setup(setup) {
91 ASSERT(regs.pipeline.variable_primitive == 1);
92 ASSERT(regs.gs.input_to_uniform == 1);
93 vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1;
94 }
95
96 bool IsEmpty() const override {
97 return need_index;
98 }
99
100 bool NeedIndexInput() const override {
101 return need_index;
102 }
103
104 void SubmitIndex(unsigned int val) override {
105 DEBUG_ASSERT(need_index);
106
107 // The number of vertex input is put to the uniform register
108 float24 vertex_num = float24::FromFloat32(static_cast<float>(val));
109 setup.uniforms.f[0] = Math::MakeVec(vertex_num, vertex_num, vertex_num, vertex_num);
110
111 // The second uniform register and so on are used for receiving input vertices
112 buffer_cur = setup.uniforms.f + 1;
113
114 main_vertex_num = regs.pipeline.variable_vertex_main_num_minus_1 + 1;
115 total_vertex_num = val;
116 need_index = false;
117 }
118
119 bool SubmitVertex(const Shader::AttributeBuffer& input) override {
120 DEBUG_ASSERT(!need_index);
121 if (main_vertex_num != 0) {
122 // For main vertices, receive all attributes
123 buffer_cur = std::copy(input.attr, input.attr + vs_output_num, buffer_cur);
124 --main_vertex_num;
125 } else {
126 // For other vertices, only receive the first attribute (usually the position)
127 *(buffer_cur++) = input.attr[0];
128 }
129 --total_vertex_num;
130
131 if (total_vertex_num == 0) {
132 need_index = true;
133 return true;
134 }
135
136 return false;
137 }
138
139private:
140 bool need_index = true;
141 const Regs& regs;
142 Shader::ShaderSetup& setup;
143 unsigned int main_vertex_num;
144 unsigned int total_vertex_num;
145 Math::Vec4<float24>* buffer_cur;
146 unsigned int vs_output_num;
147};
148
149// In FixedPrimitive mode, vertex attributes are buffered into the uniform registers in the geometry
150// shader unit. The number of vertex per shader invocation is constant. This is usually used for
151// particle system.
152class GeometryPipeline_FixedPrimitive : public GeometryPipelineBackend {
153public:
154 GeometryPipeline_FixedPrimitive(const Regs& regs, Shader::ShaderSetup& setup)
155 : regs(regs), setup(setup) {
156 ASSERT(regs.pipeline.variable_primitive == 0);
157 ASSERT(regs.gs.input_to_uniform == 1);
158 vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1;
159 ASSERT(vs_output_num == regs.pipeline.gs_config.stride_minus_1 + 1);
160 size_t vertex_num = regs.pipeline.gs_config.fixed_vertex_num_minus_1 + 1;
161 buffer_cur = buffer_begin = setup.uniforms.f + regs.pipeline.gs_config.start_index;
162 buffer_end = buffer_begin + vs_output_num * vertex_num;
163 }
164
165 bool IsEmpty() const override {
166 return buffer_cur == buffer_begin;
167 }
168
169 bool NeedIndexInput() const override {
170 return false;
171 }
172
173 void SubmitIndex(unsigned int val) override {
174 UNREACHABLE();
175 }
176
177 bool SubmitVertex(const Shader::AttributeBuffer& input) override {
178 buffer_cur = std::copy(input.attr, input.attr + vs_output_num, buffer_cur);
179 if (buffer_cur == buffer_end) {
180 buffer_cur = buffer_begin;
181 return true;
182 }
183 return false;
184 }
185
186private:
187 const Regs& regs;
188 Shader::ShaderSetup& setup;
189 Math::Vec4<float24>* buffer_begin;
190 Math::Vec4<float24>* buffer_cur;
191 Math::Vec4<float24>* buffer_end;
192 unsigned int vs_output_num;
193};
194
195GeometryPipeline::GeometryPipeline(State& state) : state(state) {}
196
197GeometryPipeline::~GeometryPipeline() = default;
198
199void GeometryPipeline::SetVertexHandler(Shader::VertexHandler vertex_handler) {
200 this->vertex_handler = vertex_handler;
201}
202
203void GeometryPipeline::Setup(Shader::ShaderEngine* shader_engine) {
204 if (!backend)
205 return;
206
207 this->shader_engine = shader_engine;
208 shader_engine->SetupBatch(state.gs, state.regs.gs.main_offset);
209}
210
211void GeometryPipeline::Reconfigure() {
212 ASSERT(!backend || backend->IsEmpty());
213
214 if (state.regs.pipeline.use_gs == PipelineRegs::UseGS::No) {
215 backend = nullptr;
216 return;
217 }
218
219 ASSERT(state.regs.pipeline.use_gs == PipelineRegs::UseGS::Yes);
220
221 // The following assumes that when geometry shader is in use, the shader unit 3 is configured as
222 // a geometry shader unit.
223 // TODO: what happens if this is not true?
224 ASSERT(state.regs.pipeline.gs_unit_exclusive_configuration == 1);
225 ASSERT(state.regs.gs.shader_mode == ShaderRegs::ShaderMode::GS);
226
227 state.gs_unit.ConfigOutput(state.regs.gs);
228
229 ASSERT(state.regs.pipeline.vs_outmap_total_minus_1_a ==
230 state.regs.pipeline.vs_outmap_total_minus_1_b);
231
232 switch (state.regs.pipeline.gs_config.mode) {
233 case PipelineRegs::GSMode::Point:
234 backend = std::make_unique<GeometryPipeline_Point>(state.regs, state.gs_unit);
235 break;
236 case PipelineRegs::GSMode::VariablePrimitive:
237 backend = std::make_unique<GeometryPipeline_VariablePrimitive>(state.regs, state.gs);
238 break;
239 case PipelineRegs::GSMode::FixedPrimitive:
240 backend = std::make_unique<GeometryPipeline_FixedPrimitive>(state.regs, state.gs);
241 break;
242 default:
243 UNREACHABLE();
244 }
245}
246
247bool GeometryPipeline::NeedIndexInput() const {
248 if (!backend)
249 return false;
250 return backend->NeedIndexInput();
251}
252
253void GeometryPipeline::SubmitIndex(unsigned int val) {
254 backend->SubmitIndex(val);
255}
256
257void GeometryPipeline::SubmitVertex(const Shader::AttributeBuffer& input) {
258 if (!backend) {
259 // No backend means the geometry shader is disabled, so we send the vertex shader output
260 // directly to the primitive assembler.
261 vertex_handler(input);
262 } else {
263 if (backend->SubmitVertex(input)) {
264 shader_engine->Run(state.gs, state.gs_unit);
265
266 // The uniform b15 is set to true after every geometry shader invocation. This is useful
267 // for the shader to know if this is the first invocation in a batch, if the program set
268 // b15 to false first.
269 state.gs.uniforms.b[15] = true;
270 }
271 }
272}
273
274} // namespace Pica
diff --git a/src/video_core/geometry_pipeline.h b/src/video_core/geometry_pipeline.h
new file mode 100644
index 000000000..91fdd3192
--- /dev/null
+++ b/src/video_core/geometry_pipeline.h
@@ -0,0 +1,49 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <memory>
8#include "video_core/shader/shader.h"
9
10namespace Pica {
11
12struct State;
13
14class GeometryPipelineBackend;
15
16/// A pipeline receiving from vertex shader and sending to geometry shader and primitive assembler
17class GeometryPipeline {
18public:
19 explicit GeometryPipeline(State& state);
20 ~GeometryPipeline();
21
22 /// Sets the handler for receiving vertex outputs from vertex shader
23 void SetVertexHandler(Shader::VertexHandler vertex_handler);
24
25 /**
26 * Setup the geometry shader unit if it is in use
27 * @param shader_engine the shader engine for the geometry shader to run
28 */
29 void Setup(Shader::ShaderEngine* shader_engine);
30
31 /// Reconfigures the pipeline according to current register settings
32 void Reconfigure();
33
34 /// Checks if the pipeline needs a direct input from index buffer
35 bool NeedIndexInput() const;
36
37 /// Submits an index from index buffer. Call this only when NeedIndexInput returns true
38 void SubmitIndex(unsigned int val);
39
40 /// Submits vertex attributes output from vertex shader
41 void SubmitVertex(const Shader::AttributeBuffer& input);
42
43private:
44 Shader::VertexHandler vertex_handler;
45 Shader::ShaderEngine* shader_engine;
46 std::unique_ptr<GeometryPipelineBackend> backend;
47 State& state;
48};
49} // namespace Pica
diff --git a/src/video_core/pica.cpp b/src/video_core/pica.cpp
index b95148a6a..218e06883 100644
--- a/src/video_core/pica.cpp
+++ b/src/video_core/pica.cpp
@@ -3,9 +3,11 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <cstring> 5#include <cstring>
6#include "video_core/geometry_pipeline.h"
6#include "video_core/pica.h" 7#include "video_core/pica.h"
7#include "video_core/pica_state.h" 8#include "video_core/pica_state.h"
8#include "video_core/regs_pipeline.h" 9#include "video_core/renderer_base.h"
10#include "video_core/video_core.h"
9 11
10namespace Pica { 12namespace Pica {
11 13
@@ -24,6 +26,23 @@ void Zero(T& o) {
24 memset(&o, 0, sizeof(o)); 26 memset(&o, 0, sizeof(o));
25} 27}
26 28
29State::State() : geometry_pipeline(*this) {
30 auto SubmitVertex = [this](const Shader::AttributeBuffer& vertex) {
31 using Pica::Shader::OutputVertex;
32 auto AddTriangle = [this](const OutputVertex& v0, const OutputVertex& v1,
33 const OutputVertex& v2) {
34 VideoCore::g_renderer->Rasterizer()->AddTriangle(v0, v1, v2);
35 };
36 primitive_assembler.SubmitVertex(
37 Shader::OutputVertex::FromAttributeBuffer(regs.rasterizer, vertex), AddTriangle);
38 };
39
40 auto SetWinding = [this]() { primitive_assembler.SetWinding(); };
41
42 g_state.gs_unit.SetVertexHandler(SubmitVertex, SetWinding);
43 g_state.geometry_pipeline.SetVertexHandler(SubmitVertex);
44}
45
27void State::Reset() { 46void State::Reset() {
28 Zero(regs); 47 Zero(regs);
29 Zero(vs); 48 Zero(vs);
diff --git a/src/video_core/pica_state.h b/src/video_core/pica_state.h
index 2d23d34e6..c6634a0bc 100644
--- a/src/video_core/pica_state.h
+++ b/src/video_core/pica_state.h
@@ -8,6 +8,7 @@
8#include "common/bit_field.h" 8#include "common/bit_field.h"
9#include "common/common_types.h" 9#include "common/common_types.h"
10#include "common/vector_math.h" 10#include "common/vector_math.h"
11#include "video_core/geometry_pipeline.h"
11#include "video_core/primitive_assembly.h" 12#include "video_core/primitive_assembly.h"
12#include "video_core/regs.h" 13#include "video_core/regs.h"
13#include "video_core/shader/shader.h" 14#include "video_core/shader/shader.h"
@@ -16,6 +17,7 @@ namespace Pica {
16 17
17/// Struct used to describe current Pica state 18/// Struct used to describe current Pica state
18struct State { 19struct State {
20 State();
19 void Reset(); 21 void Reset();
20 22
21 /// Pica registers 23 /// Pica registers
@@ -79,7 +81,7 @@ struct State {
79 std::array<ColorDifferenceEntry, 256> color_diff_table; 81 std::array<ColorDifferenceEntry, 256> color_diff_table;
80 } proctex; 82 } proctex;
81 83
82 struct { 84 struct Lighting {
83 union LutEntry { 85 union LutEntry {
84 // Used for raw access 86 // Used for raw access
85 u32 raw; 87 u32 raw;
@@ -137,8 +139,17 @@ struct State {
137 Shader::AttributeBuffer input_vertex; 139 Shader::AttributeBuffer input_vertex;
138 // Index of the next attribute to be loaded into `input_vertex`. 140 // Index of the next attribute to be loaded into `input_vertex`.
139 u32 current_attribute = 0; 141 u32 current_attribute = 0;
142 // Indicates the immediate mode just started and the geometry pipeline needs to reconfigure
143 bool reset_geometry_pipeline = true;
140 } immediate; 144 } immediate;
141 145
146 // the geometry shader needs to be kept in the global state because some shaders relie on
147 // preserved register value across shader invocation.
148 // TODO: also bring the three vertex shader units here and implement the shader scheduler.
149 Shader::GSUnitState gs_unit;
150
151 GeometryPipeline geometry_pipeline;
152
142 // This is constructed with a dummy triangle topology 153 // This is constructed with a dummy triangle topology
143 PrimitiveAssembler<Shader::OutputVertex> primitive_assembler; 154 PrimitiveAssembler<Shader::OutputVertex> primitive_assembler;
144}; 155};
diff --git a/src/video_core/pica_types.h b/src/video_core/pica_types.h
index 5d7e10066..2eafa7e9e 100644
--- a/src/video_core/pica_types.h
+++ b/src/video_core/pica_types.h
@@ -58,11 +58,12 @@ public:
58 } 58 }
59 59
60 Float<M, E> operator*(const Float<M, E>& flt) const { 60 Float<M, E> operator*(const Float<M, E>& flt) const {
61 if ((this->value == 0.f && !std::isnan(flt.value)) || 61 float result = value * flt.ToFloat32();
62 (flt.value == 0.f && !std::isnan(this->value))) 62 // PICA gives 0 instead of NaN when multiplying by inf
63 // PICA gives 0 instead of NaN when multiplying by inf 63 if (!std::isnan(value) && !std::isnan(flt.ToFloat32()))
64 return Zero(); 64 if (std::isnan(result))
65 return Float<M, E>::FromFloat32(ToFloat32() * flt.ToFloat32()); 65 result = 0.f;
66 return Float<M, E>::FromFloat32(result);
66 } 67 }
67 68
68 Float<M, E> operator/(const Float<M, E>& flt) const { 69 Float<M, E> operator/(const Float<M, E>& flt) const {
@@ -78,12 +79,7 @@ public:
78 } 79 }
79 80
80 Float<M, E>& operator*=(const Float<M, E>& flt) { 81 Float<M, E>& operator*=(const Float<M, E>& flt) {
81 if ((this->value == 0.f && !std::isnan(flt.value)) || 82 value = operator*(flt).value;
82 (flt.value == 0.f && !std::isnan(this->value)))
83 // PICA gives 0 instead of NaN when multiplying by inf
84 *this = Zero();
85 else
86 value *= flt.ToFloat32();
87 return *this; 83 return *this;
88 } 84 }
89 85
diff --git a/src/video_core/primitive_assembly.cpp b/src/video_core/primitive_assembly.cpp
index acd2ac5e2..9c3dd4cab 100644
--- a/src/video_core/primitive_assembly.cpp
+++ b/src/video_core/primitive_assembly.cpp
@@ -17,15 +17,18 @@ template <typename VertexType>
17void PrimitiveAssembler<VertexType>::SubmitVertex(const VertexType& vtx, 17void PrimitiveAssembler<VertexType>::SubmitVertex(const VertexType& vtx,
18 TriangleHandler triangle_handler) { 18 TriangleHandler triangle_handler) {
19 switch (topology) { 19 switch (topology) {
20 // TODO: Figure out what's different with TriangleTopology::Shader.
21 case PipelineRegs::TriangleTopology::List: 20 case PipelineRegs::TriangleTopology::List:
22 case PipelineRegs::TriangleTopology::Shader: 21 case PipelineRegs::TriangleTopology::Shader:
23 if (buffer_index < 2) { 22 if (buffer_index < 2) {
24 buffer[buffer_index++] = vtx; 23 buffer[buffer_index++] = vtx;
25 } else { 24 } else {
26 buffer_index = 0; 25 buffer_index = 0;
27 26 if (topology == PipelineRegs::TriangleTopology::Shader && winding) {
28 triangle_handler(buffer[0], buffer[1], vtx); 27 triangle_handler(buffer[1], buffer[0], vtx);
28 winding = false;
29 } else {
30 triangle_handler(buffer[0], buffer[1], vtx);
31 }
29 } 32 }
30 break; 33 break;
31 34
@@ -51,9 +54,15 @@ void PrimitiveAssembler<VertexType>::SubmitVertex(const VertexType& vtx,
51} 54}
52 55
53template <typename VertexType> 56template <typename VertexType>
57void PrimitiveAssembler<VertexType>::SetWinding() {
58 winding = true;
59}
60
61template <typename VertexType>
54void PrimitiveAssembler<VertexType>::Reset() { 62void PrimitiveAssembler<VertexType>::Reset() {
55 buffer_index = 0; 63 buffer_index = 0;
56 strip_ready = false; 64 strip_ready = false;
65 winding = false;
57} 66}
58 67
59template <typename VertexType> 68template <typename VertexType>
diff --git a/src/video_core/primitive_assembly.h b/src/video_core/primitive_assembly.h
index e8eccdf27..12de8e3b9 100644
--- a/src/video_core/primitive_assembly.h
+++ b/src/video_core/primitive_assembly.h
@@ -30,6 +30,12 @@ struct PrimitiveAssembler {
30 void SubmitVertex(const VertexType& vtx, TriangleHandler triangle_handler); 30 void SubmitVertex(const VertexType& vtx, TriangleHandler triangle_handler);
31 31
32 /** 32 /**
33 * Invert the vertex order of the next triangle. Called by geometry shader emitter.
34 * This only takes effect for TriangleTopology::Shader.
35 */
36 void SetWinding();
37
38 /**
33 * Resets the internal state of the PrimitiveAssembler. 39 * Resets the internal state of the PrimitiveAssembler.
34 */ 40 */
35 void Reset(); 41 void Reset();
@@ -45,6 +51,7 @@ private:
45 int buffer_index; 51 int buffer_index;
46 VertexType buffer[2]; 52 VertexType buffer[2];
47 bool strip_ready = false; 53 bool strip_ready = false;
54 bool winding = false;
48}; 55};
49 56
50} // namespace 57} // namespace
diff --git a/src/video_core/regs_framebuffer.h b/src/video_core/regs_framebuffer.h
index a50bd4111..7b565f911 100644
--- a/src/video_core/regs_framebuffer.h
+++ b/src/video_core/regs_framebuffer.h
@@ -256,10 +256,9 @@ struct FramebufferRegs {
256 return 3; 256 return 3;
257 case DepthFormat::D24S8: 257 case DepthFormat::D24S8:
258 return 4; 258 return 4;
259 default:
260 LOG_CRITICAL(HW_GPU, "Unknown depth format %u", format);
261 UNIMPLEMENTED();
262 } 259 }
260
261 ASSERT_MSG(false, "Unknown depth format %u", format);
263 } 262 }
264 263
265 // Returns the number of bits per depth component of the specified depth format 264 // Returns the number of bits per depth component of the specified depth format
@@ -270,10 +269,9 @@ struct FramebufferRegs {
270 case DepthFormat::D24: 269 case DepthFormat::D24:
271 case DepthFormat::D24S8: 270 case DepthFormat::D24S8:
272 return 24; 271 return 24;
273 default:
274 LOG_CRITICAL(HW_GPU, "Unknown depth format %u", format);
275 UNIMPLEMENTED();
276 } 272 }
273
274 ASSERT_MSG(false, "Unknown depth format %u", format);
277 } 275 }
278 276
279 INSERT_PADDING_WORDS(0x20); 277 INSERT_PADDING_WORDS(0x20);
diff --git a/src/video_core/regs_pipeline.h b/src/video_core/regs_pipeline.h
index 31c747d77..e78c3e331 100644
--- a/src/video_core/regs_pipeline.h
+++ b/src/video_core/regs_pipeline.h
@@ -147,7 +147,15 @@ struct PipelineRegs {
147 // Number of vertices to render 147 // Number of vertices to render
148 u32 num_vertices; 148 u32 num_vertices;
149 149
150 INSERT_PADDING_WORDS(0x1); 150 enum class UseGS : u32 {
151 No = 0,
152 Yes = 2,
153 };
154
155 union {
156 BitField<0, 2, UseGS> use_gs;
157 BitField<31, 1, u32> variable_primitive;
158 };
151 159
152 // The index of the first vertex to render 160 // The index of the first vertex to render
153 u32 vertex_offset; 161 u32 vertex_offset;
@@ -202,7 +210,14 @@ struct PipelineRegs {
202 /// Number of input attributes to the vertex shader minus 1 210 /// Number of input attributes to the vertex shader minus 1
203 BitField<0, 4, u32> max_input_attrib_index; 211 BitField<0, 4, u32> max_input_attrib_index;
204 212
205 INSERT_PADDING_WORDS(2); 213 INSERT_PADDING_WORDS(1);
214
215 // The shader unit 3, which can be used for both vertex and geometry shader, gets its
216 // configuration depending on this register. If this is not set, unit 3 will share some
217 // configuration with other units. It is known that program code and swizzle pattern uploaded
218 // via regs.vs will be also uploaded to unit 3 if this is not set. Although very likely, it is
219 // still unclear whether uniforms and other configuration can be also shared.
220 BitField<0, 1, u32> gs_unit_exclusive_configuration;
206 221
207 enum class GPUMode : u32 { 222 enum class GPUMode : u32 {
208 Drawing = 0, 223 Drawing = 0,
@@ -211,7 +226,29 @@ struct PipelineRegs {
211 226
212 GPUMode gpu_mode; 227 GPUMode gpu_mode;
213 228
214 INSERT_PADDING_WORDS(0x18); 229 INSERT_PADDING_WORDS(0x4);
230 BitField<0, 4, u32> vs_outmap_total_minus_1_a;
231 INSERT_PADDING_WORDS(0x6);
232 BitField<0, 4, u32> vs_outmap_total_minus_1_b;
233
234 enum class GSMode : u32 {
235 Point = 0,
236 VariablePrimitive = 1,
237 FixedPrimitive = 2,
238 };
239
240 union {
241 BitField<0, 8, GSMode> mode;
242 BitField<8, 4, u32> fixed_vertex_num_minus_1;
243 BitField<12, 4, u32> stride_minus_1;
244 BitField<16, 4, u32> start_index;
245 } gs_config;
246
247 INSERT_PADDING_WORDS(0x1);
248
249 u32 variable_vertex_main_num_minus_1;
250
251 INSERT_PADDING_WORDS(0x9);
215 252
216 enum class TriangleTopology : u32 { 253 enum class TriangleTopology : u32 {
217 List = 0, 254 List = 0,
diff --git a/src/video_core/regs_rasterizer.h b/src/video_core/regs_rasterizer.h
index 2874fd127..4fef00d76 100644
--- a/src/video_core/regs_rasterizer.h
+++ b/src/video_core/regs_rasterizer.h
@@ -5,10 +5,10 @@
5#pragma once 5#pragma once
6 6
7#include <array> 7#include <array>
8
9#include "common/bit_field.h" 8#include "common/bit_field.h"
10#include "common/common_funcs.h" 9#include "common/common_funcs.h"
11#include "common/common_types.h" 10#include "common/common_types.h"
11#include "video_core/pica_types.h"
12 12
13namespace Pica { 13namespace Pica {
14 14
@@ -31,7 +31,17 @@ struct RasterizerRegs {
31 31
32 BitField<0, 24, u32> viewport_size_y; 32 BitField<0, 24, u32> viewport_size_y;
33 33
34 INSERT_PADDING_WORDS(0x9); 34 INSERT_PADDING_WORDS(0x3);
35
36 BitField<0, 1, u32> clip_enable;
37 BitField<0, 24, u32> clip_coef[4]; // float24
38
39 Math::Vec4<float24> GetClipCoef() const {
40 return {float24::FromRaw(clip_coef[0]), float24::FromRaw(clip_coef[1]),
41 float24::FromRaw(clip_coef[2]), float24::FromRaw(clip_coef[3])};
42 }
43
44 INSERT_PADDING_WORDS(0x1);
35 45
36 BitField<0, 24, u32> viewport_depth_range; // float24 46 BitField<0, 24, u32> viewport_depth_range; // float24
37 BitField<0, 24, u32> viewport_depth_near_plane; // float24 47 BitField<0, 24, u32> viewport_depth_near_plane; // float24
diff --git a/src/video_core/regs_shader.h b/src/video_core/regs_shader.h
index ddb1ee451..c15d4d162 100644
--- a/src/video_core/regs_shader.h
+++ b/src/video_core/regs_shader.h
@@ -24,9 +24,16 @@ struct ShaderRegs {
24 24
25 INSERT_PADDING_WORDS(0x4); 25 INSERT_PADDING_WORDS(0x4);
26 26
27 enum ShaderMode {
28 GS = 0x08,
29 VS = 0xA0,
30 };
31
27 union { 32 union {
28 // Number of input attributes to shader unit - 1 33 // Number of input attributes to shader unit - 1
29 BitField<0, 4, u32> max_input_attribute_index; 34 BitField<0, 4, u32> max_input_attribute_index;
35 BitField<8, 8, u32> input_to_uniform;
36 BitField<24, 8, ShaderMode> shader_mode;
30 }; 37 };
31 38
32 // Offset to shader program entry point (in words) 39 // Offset to shader program entry point (in words)
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 1c6c15a58..7e09e4712 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -28,6 +28,9 @@ MICROPROFILE_DEFINE(OpenGL_Blits, "OpenGL", "Blits", MP_RGB(100, 100, 255));
28MICROPROFILE_DEFINE(OpenGL_CacheManagement, "OpenGL", "Cache Mgmt", MP_RGB(100, 255, 100)); 28MICROPROFILE_DEFINE(OpenGL_CacheManagement, "OpenGL", "Cache Mgmt", MP_RGB(100, 255, 100));
29 29
30RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) { 30RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) {
31 // Clipping plane 0 is always enabled for PICA fixed clip plane z <= 0
32 state.clip_distance[0] = true;
33
31 // Create sampler objects 34 // Create sampler objects
32 for (size_t i = 0; i < texture_samplers.size(); ++i) { 35 for (size_t i = 0; i < texture_samplers.size(); ++i) {
33 texture_samplers[i].Create(); 36 texture_samplers[i].Create();
@@ -166,6 +169,8 @@ RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) {
166 glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, proctex_diff_lut_buffer.handle); 169 glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, proctex_diff_lut_buffer.handle);
167 170
168 // Sync fixed function OpenGL state 171 // Sync fixed function OpenGL state
172 SyncClipEnabled();
173 SyncClipCoef();
169 SyncCullMode(); 174 SyncCullMode();
170 SyncBlendEnabled(); 175 SyncBlendEnabled();
171 SyncBlendFuncs(); 176 SyncBlendFuncs();
@@ -232,13 +237,24 @@ void RasterizerOpenGL::DrawTriangles() {
232 237
233 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 238 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
234 color_surface != nullptr ? color_surface->texture.handle : 0, 0); 239 color_surface != nullptr ? color_surface->texture.handle : 0, 0);
235 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 240 if (depth_surface != nullptr) {
236 depth_surface != nullptr ? depth_surface->texture.handle : 0, 0); 241 if (regs.framebuffer.framebuffer.depth_format ==
237 bool has_stencil = 242 Pica::FramebufferRegs::DepthFormat::D24S8) {
238 regs.framebuffer.framebuffer.depth_format == Pica::FramebufferRegs::DepthFormat::D24S8; 243 // attach both depth and stencil
239 glFramebufferTexture2D( 244 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
240 GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 245 depth_surface->texture.handle, 0);
241 (has_stencil && depth_surface != nullptr) ? depth_surface->texture.handle : 0, 0); 246 } else {
247 // attach depth
248 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
249 depth_surface->texture.handle, 0);
250 // clear stencil attachment
251 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
252 }
253 } else {
254 // clear both depth and stencil attachment
255 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0,
256 0);
257 }
242 258
243 // Sync the viewport 259 // Sync the viewport
244 // These registers hold half-width and half-height, so must be multiplied by 2 260 // These registers hold half-width and half-height, so must be multiplied by 2
@@ -398,6 +414,18 @@ void RasterizerOpenGL::NotifyPicaRegisterChanged(u32 id) {
398 SyncCullMode(); 414 SyncCullMode();
399 break; 415 break;
400 416
417 // Clipping plane
418 case PICA_REG_INDEX(rasterizer.clip_enable):
419 SyncClipEnabled();
420 break;
421
422 case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[0], 0x48):
423 case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[1], 0x49):
424 case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[2], 0x4a):
425 case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[3], 0x4b):
426 SyncClipCoef();
427 break;
428
401 // Depth modifiers 429 // Depth modifiers
402 case PICA_REG_INDEX(rasterizer.viewport_depth_range): 430 case PICA_REG_INDEX(rasterizer.viewport_depth_range):
403 SyncDepthScale(); 431 SyncDepthScale();
@@ -1277,6 +1305,20 @@ void RasterizerOpenGL::SetShader() {
1277 } 1305 }
1278} 1306}
1279 1307
1308void RasterizerOpenGL::SyncClipEnabled() {
1309 state.clip_distance[1] = Pica::g_state.regs.rasterizer.clip_enable != 0;
1310}
1311
1312void RasterizerOpenGL::SyncClipCoef() {
1313 const auto raw_clip_coef = Pica::g_state.regs.rasterizer.GetClipCoef();
1314 const GLvec4 new_clip_coef = {raw_clip_coef.x.ToFloat32(), raw_clip_coef.y.ToFloat32(),
1315 raw_clip_coef.z.ToFloat32(), raw_clip_coef.w.ToFloat32()};
1316 if (new_clip_coef != uniform_block_data.data.clip_coef) {
1317 uniform_block_data.data.clip_coef = new_clip_coef;
1318 uniform_block_data.dirty = true;
1319 }
1320}
1321
1280void RasterizerOpenGL::SyncCullMode() { 1322void RasterizerOpenGL::SyncCullMode() {
1281 const auto& regs = Pica::g_state.regs; 1323 const auto& regs = Pica::g_state.regs;
1282 1324
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index 78e218efe..46c62961c 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -151,14 +151,21 @@ private:
151 LightSrc light_src[8]; 151 LightSrc light_src[8];
152 alignas(16) GLvec4 const_color[6]; // A vec4 color for each of the six tev stages 152 alignas(16) GLvec4 const_color[6]; // A vec4 color for each of the six tev stages
153 alignas(16) GLvec4 tev_combiner_buffer_color; 153 alignas(16) GLvec4 tev_combiner_buffer_color;
154 alignas(16) GLvec4 clip_coef;
154 }; 155 };
155 156
156 static_assert( 157 static_assert(
157 sizeof(UniformData) == 0x460, 158 sizeof(UniformData) == 0x470,
158 "The size of the UniformData structure has changed, update the structure in the shader"); 159 "The size of the UniformData structure has changed, update the structure in the shader");
159 static_assert(sizeof(UniformData) < 16384, 160 static_assert(sizeof(UniformData) < 16384,
160 "UniformData structure must be less than 16kb as per the OpenGL spec"); 161 "UniformData structure must be less than 16kb as per the OpenGL spec");
161 162
163 /// Syncs the clip enabled status to match the PICA register
164 void SyncClipEnabled();
165
166 /// Syncs the clip coefficients to match the PICA register
167 void SyncClipCoef();
168
162 /// Sets the OpenGL shader in accordance with the current PICA register state 169 /// Sets the OpenGL shader in accordance with the current PICA register state
163 void SetShader(); 170 void SetShader();
164 171
diff --git a/src/video_core/renderer_opengl/gl_shader_gen.cpp b/src/video_core/renderer_opengl/gl_shader_gen.cpp
index bb192affd..9fe183944 100644
--- a/src/video_core/renderer_opengl/gl_shader_gen.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_gen.cpp
@@ -8,6 +8,7 @@
8#include "common/assert.h" 8#include "common/assert.h"
9#include "common/bit_field.h" 9#include "common/bit_field.h"
10#include "common/logging/log.h" 10#include "common/logging/log.h"
11#include "core/core.h"
11#include "video_core/regs_framebuffer.h" 12#include "video_core/regs_framebuffer.h"
12#include "video_core/regs_lighting.h" 13#include "video_core/regs_lighting.h"
13#include "video_core/regs_rasterizer.h" 14#include "video_core/regs_rasterizer.h"
@@ -24,6 +25,42 @@ using TevStageConfig = TexturingRegs::TevStageConfig;
24 25
25namespace GLShader { 26namespace GLShader {
26 27
28static const std::string UniformBlockDef = R"(
29#define NUM_TEV_STAGES 6
30#define NUM_LIGHTS 8
31
32struct LightSrc {
33 vec3 specular_0;
34 vec3 specular_1;
35 vec3 diffuse;
36 vec3 ambient;
37 vec3 position;
38 vec3 spot_direction;
39 float dist_atten_bias;
40 float dist_atten_scale;
41};
42
43layout (std140) uniform shader_data {
44 vec2 framebuffer_scale;
45 int alphatest_ref;
46 float depth_scale;
47 float depth_offset;
48 int scissor_x1;
49 int scissor_y1;
50 int scissor_x2;
51 int scissor_y2;
52 vec3 fog_color;
53 vec2 proctex_noise_f;
54 vec2 proctex_noise_a;
55 vec2 proctex_noise_p;
56 vec3 lighting_global_ambient;
57 LightSrc light_src[NUM_LIGHTS];
58 vec4 const_color[NUM_TEV_STAGES];
59 vec4 tev_combiner_buffer_color;
60 vec4 clip_coef;
61};
62)";
63
27PicaShaderConfig PicaShaderConfig::BuildFromRegs(const Pica::Regs& regs) { 64PicaShaderConfig PicaShaderConfig::BuildFromRegs(const Pica::Regs& regs) {
28 PicaShaderConfig res; 65 PicaShaderConfig res;
29 66
@@ -525,11 +562,12 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
525 "float geo_factor = 1.0;\n"; 562 "float geo_factor = 1.0;\n";
526 563
527 // Compute fragment normals and tangents 564 // Compute fragment normals and tangents
528 const std::string pertubation = 565 auto Perturbation = [&]() {
529 "2.0 * (" + SampleTexture(config, lighting.bump_selector) + ").rgb - 1.0"; 566 return "2.0 * (" + SampleTexture(config, lighting.bump_selector) + ").rgb - 1.0";
567 };
530 if (lighting.bump_mode == LightingRegs::LightingBumpMode::NormalMap) { 568 if (lighting.bump_mode == LightingRegs::LightingBumpMode::NormalMap) {
531 // Bump mapping is enabled using a normal map 569 // Bump mapping is enabled using a normal map
532 out += "vec3 surface_normal = " + pertubation + ";\n"; 570 out += "vec3 surface_normal = " + Perturbation() + ";\n";
533 571
534 // Recompute Z-component of perturbation if 'renorm' is enabled, this provides a higher 572 // Recompute Z-component of perturbation if 'renorm' is enabled, this provides a higher
535 // precision result 573 // precision result
@@ -543,7 +581,7 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
543 out += "vec3 surface_tangent = vec3(1.0, 0.0, 0.0);\n"; 581 out += "vec3 surface_tangent = vec3(1.0, 0.0, 0.0);\n";
544 } else if (lighting.bump_mode == LightingRegs::LightingBumpMode::TangentMap) { 582 } else if (lighting.bump_mode == LightingRegs::LightingBumpMode::TangentMap) {
545 // Bump mapping is enabled using a tangent map 583 // Bump mapping is enabled using a tangent map
546 out += "vec3 surface_tangent = " + pertubation + ";\n"; 584 out += "vec3 surface_tangent = " + Perturbation() + ";\n";
547 // Mathematically, recomputing Z-component of the tangent vector won't affect the relevant 585 // Mathematically, recomputing Z-component of the tangent vector won't affect the relevant
548 // computation below, which is also confirmed on 3DS. So we don't bother recomputing here 586 // computation below, which is also confirmed on 3DS. So we don't bother recomputing here
549 // even if 'renorm' is enabled. 587 // even if 'renorm' is enabled.
@@ -593,8 +631,8 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
593 // Note: even if the normal vector is modified by normal map, which is not the 631 // Note: even if the normal vector is modified by normal map, which is not the
594 // normal of the tangent plane anymore, the half angle vector is still projected 632 // normal of the tangent plane anymore, the half angle vector is still projected
595 // using the modified normal vector. 633 // using the modified normal vector.
596 std::string half_angle_proj = "normalize(half_vector) - normal / dot(normal, " 634 std::string half_angle_proj =
597 "normal) * dot(normal, normalize(half_vector))"; 635 "normalize(half_vector) - normal * dot(normal, normalize(half_vector))";
598 // Note: the half angle vector projection is confirmed not normalized before the dot 636 // Note: the half angle vector projection is confirmed not normalized before the dot
599 // product. The result is in fact not cos(phi) as the name suggested. 637 // product. The result is in fact not cos(phi) as the name suggested.
600 index = "dot(" + half_angle_proj + ", tangent)"; 638 index = "dot(" + half_angle_proj + ", tangent)";
@@ -749,7 +787,8 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
749 } 787 }
750 788
751 // Fresnel 789 // Fresnel
752 if (lighting.lut_fr.enable && 790 // Note: only the last entry in the light slots applies the Fresnel factor
791 if (light_index == lighting.src_num - 1 && lighting.lut_fr.enable &&
753 LightingRegs::IsLightingSamplerSupported(lighting.config, 792 LightingRegs::IsLightingSamplerSupported(lighting.config,
754 LightingRegs::LightingSampler::Fresnel)) { 793 LightingRegs::LightingSampler::Fresnel)) {
755 // Lookup fresnel LUT value 794 // Lookup fresnel LUT value
@@ -758,17 +797,17 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
758 lighting.lut_fr.type, lighting.lut_fr.abs_input); 797 lighting.lut_fr.type, lighting.lut_fr.abs_input);
759 value = "(" + std::to_string(lighting.lut_fr.scale) + " * " + value + ")"; 798 value = "(" + std::to_string(lighting.lut_fr.scale) + " * " + value + ")";
760 799
761 // Enabled for difffuse lighting alpha component 800 // Enabled for diffuse lighting alpha component
762 if (lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::PrimaryAlpha || 801 if (lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::PrimaryAlpha ||
763 lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) { 802 lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
764 out += "diffuse_sum.a *= " + value + ";\n"; 803 out += "diffuse_sum.a = " + value + ";\n";
765 } 804 }
766 805
767 // Enabled for the specular lighting alpha component 806 // Enabled for the specular lighting alpha component
768 if (lighting.fresnel_selector == 807 if (lighting.fresnel_selector ==
769 LightingRegs::LightingFresnelSelector::SecondaryAlpha || 808 LightingRegs::LightingFresnelSelector::SecondaryAlpha ||
770 lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) { 809 lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
771 out += "specular_sum.a *= " + value + ";\n"; 810 out += "specular_sum.a = " + value + ";\n";
772 } 811 }
773 } 812 }
774 813
@@ -1007,8 +1046,6 @@ std::string GenerateFragmentShader(const PicaShaderConfig& config) {
1007 1046
1008 std::string out = R"( 1047 std::string out = R"(
1009#version 330 core 1048#version 330 core
1010#define NUM_TEV_STAGES 6
1011#define NUM_LIGHTS 8
1012 1049
1013in vec4 primary_color; 1050in vec4 primary_color;
1014in vec2 texcoord[3]; 1051in vec2 texcoord[3];
@@ -1020,36 +1057,6 @@ in vec4 gl_FragCoord;
1020 1057
1021out vec4 color; 1058out vec4 color;
1022 1059
1023struct LightSrc {
1024 vec3 specular_0;
1025 vec3 specular_1;
1026 vec3 diffuse;
1027 vec3 ambient;
1028 vec3 position;
1029 vec3 spot_direction;
1030 float dist_atten_bias;
1031 float dist_atten_scale;
1032};
1033
1034layout (std140) uniform shader_data {
1035 vec2 framebuffer_scale;
1036 int alphatest_ref;
1037 float depth_scale;
1038 float depth_offset;
1039 int scissor_x1;
1040 int scissor_y1;
1041 int scissor_x2;
1042 int scissor_y2;
1043 vec3 fog_color;
1044 vec2 proctex_noise_f;
1045 vec2 proctex_noise_a;
1046 vec2 proctex_noise_p;
1047 vec3 lighting_global_ambient;
1048 LightSrc light_src[NUM_LIGHTS];
1049 vec4 const_color[NUM_TEV_STAGES];
1050 vec4 tev_combiner_buffer_color;
1051};
1052
1053uniform sampler2D tex[3]; 1060uniform sampler2D tex[3];
1054uniform samplerBuffer lighting_lut; 1061uniform samplerBuffer lighting_lut;
1055uniform samplerBuffer fog_lut; 1062uniform samplerBuffer fog_lut;
@@ -1058,7 +1065,11 @@ uniform samplerBuffer proctex_color_map;
1058uniform samplerBuffer proctex_alpha_map; 1065uniform samplerBuffer proctex_alpha_map;
1059uniform samplerBuffer proctex_lut; 1066uniform samplerBuffer proctex_lut;
1060uniform samplerBuffer proctex_diff_lut; 1067uniform samplerBuffer proctex_diff_lut;
1068)";
1069
1070 out += UniformBlockDef;
1061 1071
1072 out += R"(
1062// Rotate the vector v by the quaternion q 1073// Rotate the vector v by the quaternion q
1063vec3 quaternion_rotate(vec4 q, vec3 v) { 1074vec3 quaternion_rotate(vec4 q, vec3 v) {
1064 return v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v); 1075 return v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);
@@ -1111,7 +1122,10 @@ vec4 secondary_fragment_color = vec4(0.0);
1111 "gl_FragCoord.y < scissor_y2)) discard;\n"; 1122 "gl_FragCoord.y < scissor_y2)) discard;\n";
1112 } 1123 }
1113 1124
1114 out += "float z_over_w = 1.0 - gl_FragCoord.z * 2.0;\n"; 1125 // After perspective divide, OpenGL transform z_over_w from [-1, 1] to [near, far]. Here we use
1126 // default near = 0 and far = 1, and undo the transformation to get the original z_over_w, then
1127 // do our own transformation according to PICA specification.
1128 out += "float z_over_w = 2.0 * gl_FragCoord.z - 1.0;\n";
1115 out += "float depth = z_over_w * depth_scale + depth_offset;\n"; 1129 out += "float depth = z_over_w * depth_scale + depth_offset;\n";
1116 if (state.depthmap_enable == RasterizerRegs::DepthBuffering::WBuffering) { 1130 if (state.depthmap_enable == RasterizerRegs::DepthBuffering::WBuffering) {
1117 out += "depth /= gl_FragCoord.w;\n"; 1131 out += "depth /= gl_FragCoord.w;\n";
@@ -1151,6 +1165,11 @@ vec4 secondary_fragment_color = vec4(0.0);
1151 1165
1152 // Blend the fog 1166 // Blend the fog
1153 out += "last_tex_env_out.rgb = mix(fog_color.rgb, last_tex_env_out.rgb, fog_factor);\n"; 1167 out += "last_tex_env_out.rgb = mix(fog_color.rgb, last_tex_env_out.rgb, fog_factor);\n";
1168 } else if (state.fog_mode == TexturingRegs::FogMode::Gas) {
1169 Core::Telemetry().AddField(Telemetry::FieldType::Session, "VideoCore_Pica_UseGasMode",
1170 true);
1171 LOG_CRITICAL(Render_OpenGL, "Unimplemented gas mode");
1172 UNIMPLEMENTED();
1154 } 1173 }
1155 1174
1156 out += "gl_FragDepth = depth;\n"; 1175 out += "gl_FragDepth = depth;\n";
@@ -1186,6 +1205,12 @@ out float texcoord0_w;
1186out vec4 normquat; 1205out vec4 normquat;
1187out vec3 view; 1206out vec3 view;
1188 1207
1208)";
1209
1210 out += UniformBlockDef;
1211
1212 out += R"(
1213
1189void main() { 1214void main() {
1190 primary_color = vert_color; 1215 primary_color = vert_color;
1191 texcoord[0] = vert_texcoord0; 1216 texcoord[0] = vert_texcoord0;
@@ -1194,7 +1219,9 @@ void main() {
1194 texcoord0_w = vert_texcoord0_w; 1219 texcoord0_w = vert_texcoord0_w;
1195 normquat = vert_normquat; 1220 normquat = vert_normquat;
1196 view = vert_view; 1221 view = vert_view;
1197 gl_Position = vec4(vert_position.x, vert_position.y, -vert_position.z, vert_position.w); 1222 gl_Position = vert_position;
1223 gl_ClipDistance[0] = -vert_position.z; // fixed PICA clipping plane z <= 0
1224 gl_ClipDistance[1] = dot(clip_coef, vert_position);
1198} 1225}
1199)"; 1226)";
1200 1227
diff --git a/src/video_core/renderer_opengl/gl_state.cpp b/src/video_core/renderer_opengl/gl_state.cpp
index bc9d34b84..5770ae08f 100644
--- a/src/video_core/renderer_opengl/gl_state.cpp
+++ b/src/video_core/renderer_opengl/gl_state.cpp
@@ -68,6 +68,8 @@ OpenGLState::OpenGLState() {
68 draw.vertex_buffer = 0; 68 draw.vertex_buffer = 0;
69 draw.uniform_buffer = 0; 69 draw.uniform_buffer = 0;
70 draw.shader_program = 0; 70 draw.shader_program = 0;
71
72 clip_distance = {};
71} 73}
72 74
73void OpenGLState::Apply() const { 75void OpenGLState::Apply() const {
@@ -261,6 +263,17 @@ void OpenGLState::Apply() const {
261 glUseProgram(draw.shader_program); 263 glUseProgram(draw.shader_program);
262 } 264 }
263 265
266 // Clip distance
267 for (size_t i = 0; i < clip_distance.size(); ++i) {
268 if (clip_distance[i] != cur_state.clip_distance[i]) {
269 if (clip_distance[i]) {
270 glEnable(GL_CLIP_DISTANCE0 + static_cast<GLenum>(i));
271 } else {
272 glDisable(GL_CLIP_DISTANCE0 + static_cast<GLenum>(i));
273 }
274 }
275 }
276
264 cur_state = *this; 277 cur_state = *this;
265} 278}
266 279
diff --git a/src/video_core/renderer_opengl/gl_state.h b/src/video_core/renderer_opengl/gl_state.h
index 745a74479..437fe34c4 100644
--- a/src/video_core/renderer_opengl/gl_state.h
+++ b/src/video_core/renderer_opengl/gl_state.h
@@ -4,6 +4,7 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <array>
7#include <glad/glad.h> 8#include <glad/glad.h>
8 9
9namespace TextureUnits { 10namespace TextureUnits {
@@ -123,6 +124,8 @@ public:
123 GLuint shader_program; // GL_CURRENT_PROGRAM 124 GLuint shader_program; // GL_CURRENT_PROGRAM
124 } draw; 125 } draw;
125 126
127 std::array<bool, 2> clip_distance; // GL_CLIP_DISTANCE
128
126 OpenGLState(); 129 OpenGLState();
127 130
128 /// Get the currently active OpenGL state 131 /// Get the currently active OpenGL state
diff --git a/src/video_core/shader/shader.cpp b/src/video_core/shader/shader.cpp
index 67ed19ba8..2857d2829 100644
--- a/src/video_core/shader/shader.cpp
+++ b/src/video_core/shader/shader.cpp
@@ -21,7 +21,8 @@ namespace Pica {
21 21
22namespace Shader { 22namespace Shader {
23 23
24OutputVertex OutputVertex::FromAttributeBuffer(const RasterizerRegs& regs, AttributeBuffer& input) { 24OutputVertex OutputVertex::FromAttributeBuffer(const RasterizerRegs& regs,
25 const AttributeBuffer& input) {
25 // Setup output data 26 // Setup output data
26 union { 27 union {
27 OutputVertex ret{}; 28 OutputVertex ret{};
@@ -51,7 +52,8 @@ OutputVertex OutputVertex::FromAttributeBuffer(const RasterizerRegs& regs, Attri
51 // The hardware takes the absolute and saturates vertex colors like this, *before* doing 52 // The hardware takes the absolute and saturates vertex colors like this, *before* doing
52 // interpolation 53 // interpolation
53 for (unsigned i = 0; i < 4; ++i) { 54 for (unsigned i = 0; i < 4; ++i) {
54 ret.color[i] = float24::FromFloat32(std::fmin(std::fabs(ret.color[i].ToFloat32()), 1.0f)); 55 float c = std::fabs(ret.color[i].ToFloat32());
56 ret.color[i] = float24::FromFloat32(c < 1.0f ? c : 1.0f);
55 } 57 }
56 58
57 LOG_TRACE(HW_GPU, "Output vertex: pos(%.2f, %.2f, %.2f, %.2f), quat(%.2f, %.2f, %.2f, %.2f), " 59 LOG_TRACE(HW_GPU, "Output vertex: pos(%.2f, %.2f, %.2f, %.2f), quat(%.2f, %.2f, %.2f, %.2f), "
@@ -82,6 +84,44 @@ void UnitState::WriteOutput(const ShaderRegs& config, AttributeBuffer& output) {
82 } 84 }
83} 85}
84 86
87UnitState::UnitState(GSEmitter* emitter) : emitter_ptr(emitter) {}
88
89GSEmitter::GSEmitter() {
90 handlers = new Handlers;
91}
92
93GSEmitter::~GSEmitter() {
94 delete handlers;
95}
96
97void GSEmitter::Emit(Math::Vec4<float24> (&vertex)[16]) {
98 ASSERT(vertex_id < 3);
99 std::copy(std::begin(vertex), std::end(vertex), buffer[vertex_id].begin());
100 if (prim_emit) {
101 if (winding)
102 handlers->winding_setter();
103 for (size_t i = 0; i < buffer.size(); ++i) {
104 AttributeBuffer output;
105 unsigned int output_i = 0;
106 for (unsigned int reg : Common::BitSet<u32>(output_mask)) {
107 output.attr[output_i++] = buffer[i][reg];
108 }
109 handlers->vertex_handler(output);
110 }
111 }
112}
113
114GSUnitState::GSUnitState() : UnitState(&emitter) {}
115
116void GSUnitState::SetVertexHandler(VertexHandler vertex_handler, WindingSetter winding_setter) {
117 emitter.handlers->vertex_handler = std::move(vertex_handler);
118 emitter.handlers->winding_setter = std::move(winding_setter);
119}
120
121void GSUnitState::ConfigOutput(const ShaderRegs& config) {
122 emitter.output_mask = config.output_mask;
123}
124
85MICROPROFILE_DEFINE(GPU_Shader, "GPU", "Shader", MP_RGB(50, 50, 240)); 125MICROPROFILE_DEFINE(GPU_Shader, "GPU", "Shader", MP_RGB(50, 50, 240));
86 126
87#ifdef ARCHITECTURE_x86_64 127#ifdef ARCHITECTURE_x86_64
diff --git a/src/video_core/shader/shader.h b/src/video_core/shader/shader.h
index e156f6aef..a3789da01 100644
--- a/src/video_core/shader/shader.h
+++ b/src/video_core/shader/shader.h
@@ -6,6 +6,7 @@
6 6
7#include <array> 7#include <array>
8#include <cstddef> 8#include <cstddef>
9#include <functional>
9#include <type_traits> 10#include <type_traits>
10#include <nihstro/shader_bytecode.h> 11#include <nihstro/shader_bytecode.h>
11#include "common/assert.h" 12#include "common/assert.h"
@@ -31,6 +32,12 @@ struct AttributeBuffer {
31 alignas(16) Math::Vec4<float24> attr[16]; 32 alignas(16) Math::Vec4<float24> attr[16];
32}; 33};
33 34
35/// Handler type for receiving vertex outputs from vertex shader or geometry shader
36using VertexHandler = std::function<void(const AttributeBuffer&)>;
37
38/// Handler type for signaling to invert the vertex order of the next triangle
39using WindingSetter = std::function<void()>;
40
34struct OutputVertex { 41struct OutputVertex {
35 Math::Vec4<float24> pos; 42 Math::Vec4<float24> pos;
36 Math::Vec4<float24> quat; 43 Math::Vec4<float24> quat;
@@ -43,7 +50,8 @@ struct OutputVertex {
43 INSERT_PADDING_WORDS(1); 50 INSERT_PADDING_WORDS(1);
44 Math::Vec2<float24> tc2; 51 Math::Vec2<float24> tc2;
45 52
46 static OutputVertex FromAttributeBuffer(const RasterizerRegs& regs, AttributeBuffer& output); 53 static OutputVertex FromAttributeBuffer(const RasterizerRegs& regs,
54 const AttributeBuffer& output);
47}; 55};
48#define ASSERT_POS(var, pos) \ 56#define ASSERT_POS(var, pos) \
49 static_assert(offsetof(OutputVertex, var) == pos * sizeof(float24), "Semantic at wrong " \ 57 static_assert(offsetof(OutputVertex, var) == pos * sizeof(float24), "Semantic at wrong " \
@@ -61,12 +69,36 @@ static_assert(std::is_pod<OutputVertex>::value, "Structure is not POD");
61static_assert(sizeof(OutputVertex) == 24 * sizeof(float), "OutputVertex has invalid size"); 69static_assert(sizeof(OutputVertex) == 24 * sizeof(float), "OutputVertex has invalid size");
62 70
63/** 71/**
72 * This structure contains state information for primitive emitting in geometry shader.
73 */
74struct GSEmitter {
75 std::array<std::array<Math::Vec4<float24>, 16>, 3> buffer;
76 u8 vertex_id;
77 bool prim_emit;
78 bool winding;
79 u32 output_mask;
80
81 // Function objects are hidden behind a raw pointer to make the structure standard layout type,
82 // for JIT to use offsetof to access other members.
83 struct Handlers {
84 VertexHandler vertex_handler;
85 WindingSetter winding_setter;
86 } * handlers;
87
88 GSEmitter();
89 ~GSEmitter();
90 void Emit(Math::Vec4<float24> (&vertex)[16]);
91};
92static_assert(std::is_standard_layout<GSEmitter>::value, "GSEmitter is not standard layout type");
93
94/**
64 * This structure contains the state information that needs to be unique for a shader unit. The 3DS 95 * This structure contains the state information that needs to be unique for a shader unit. The 3DS
65 * has four shader units that process shaders in parallel. At the present, Citra only implements a 96 * has four shader units that process shaders in parallel. At the present, Citra only implements a
66 * single shader unit that processes all shaders serially. Putting the state information in a struct 97 * single shader unit that processes all shaders serially. Putting the state information in a struct
67 * here will make it easier for us to parallelize the shader processing later. 98 * here will make it easier for us to parallelize the shader processing later.
68 */ 99 */
69struct UnitState { 100struct UnitState {
101 explicit UnitState(GSEmitter* emitter = nullptr);
70 struct Registers { 102 struct Registers {
71 // The registers are accessed by the shader JIT using SSE instructions, and are therefore 103 // The registers are accessed by the shader JIT using SSE instructions, and are therefore
72 // required to be 16-byte aligned. 104 // required to be 16-byte aligned.
@@ -82,6 +114,8 @@ struct UnitState {
82 // TODO: How many bits do these actually have? 114 // TODO: How many bits do these actually have?
83 s32 address_registers[3]; 115 s32 address_registers[3];
84 116
117 GSEmitter* emitter_ptr;
118
85 static size_t InputOffset(const SourceRegister& reg) { 119 static size_t InputOffset(const SourceRegister& reg) {
86 switch (reg.GetRegisterType()) { 120 switch (reg.GetRegisterType()) {
87 case RegisterType::Input: 121 case RegisterType::Input:
@@ -125,6 +159,19 @@ struct UnitState {
125 void WriteOutput(const ShaderRegs& config, AttributeBuffer& output); 159 void WriteOutput(const ShaderRegs& config, AttributeBuffer& output);
126}; 160};
127 161
162/**
163 * This is an extended shader unit state that represents the special unit that can run both vertex
164 * shader and geometry shader. It contains an additional primitive emitter and utilities for
165 * geometry shader.
166 */
167struct GSUnitState : public UnitState {
168 GSUnitState();
169 void SetVertexHandler(VertexHandler vertex_handler, WindingSetter winding_setter);
170 void ConfigOutput(const ShaderRegs& config);
171
172 GSEmitter emitter;
173};
174
128struct ShaderSetup { 175struct ShaderSetup {
129 struct { 176 struct {
130 // The float uniforms are accessed by the shader JIT using SSE instructions, and are 177 // The float uniforms are accessed by the shader JIT using SSE instructions, and are
diff --git a/src/video_core/shader/shader_interpreter.cpp b/src/video_core/shader/shader_interpreter.cpp
index aa1cec81f..9d4da4904 100644
--- a/src/video_core/shader/shader_interpreter.cpp
+++ b/src/video_core/shader/shader_interpreter.cpp
@@ -631,11 +631,27 @@ static void RunInterpreter(const ShaderSetup& setup, UnitState& state, DebugData
631 state.address_registers[2] = loop_param.y; 631 state.address_registers[2] = loop_param.y;
632 632
633 Record<DebugDataRecord::LOOP_INT_IN>(debug_data, iteration, loop_param); 633 Record<DebugDataRecord::LOOP_INT_IN>(debug_data, iteration, loop_param);
634 call(program_counter + 1, instr.flow_control.dest_offset - program_counter + 1, 634 call(program_counter + 1, instr.flow_control.dest_offset - program_counter,
635 instr.flow_control.dest_offset + 1, loop_param.x, loop_param.z); 635 instr.flow_control.dest_offset + 1, loop_param.x, loop_param.z);
636 break; 636 break;
637 } 637 }
638 638
639 case OpCode::Id::EMIT: {
640 GSEmitter* emitter = state.emitter_ptr;
641 ASSERT_MSG(emitter, "Execute EMIT on VS");
642 emitter->Emit(state.registers.output);
643 break;
644 }
645
646 case OpCode::Id::SETEMIT: {
647 GSEmitter* emitter = state.emitter_ptr;
648 ASSERT_MSG(emitter, "Execute SETEMIT on VS");
649 emitter->vertex_id = instr.setemit.vertex_id;
650 emitter->prim_emit = instr.setemit.prim_emit != 0;
651 emitter->winding = instr.setemit.winding != 0;
652 break;
653 }
654
639 default: 655 default:
640 LOG_ERROR(HW_GPU, "Unhandled instruction: 0x%02x (%s): 0x%08x", 656 LOG_ERROR(HW_GPU, "Unhandled instruction: 0x%02x (%s): 0x%08x",
641 (int)instr.opcode.Value().EffectiveOpCode(), 657 (int)instr.opcode.Value().EffectiveOpCode(),
diff --git a/src/video_core/shader/shader_jit_x64_compiler.cpp b/src/video_core/shader/shader_jit_x64_compiler.cpp
index 42a57aab1..1b31623bd 100644
--- a/src/video_core/shader/shader_jit_x64_compiler.cpp
+++ b/src/video_core/shader/shader_jit_x64_compiler.cpp
@@ -75,8 +75,8 @@ const JitFunction instr_table[64] = {
75 &JitShader::Compile_IF, // ifu 75 &JitShader::Compile_IF, // ifu
76 &JitShader::Compile_IF, // ifc 76 &JitShader::Compile_IF, // ifc
77 &JitShader::Compile_LOOP, // loop 77 &JitShader::Compile_LOOP, // loop
78 nullptr, // emit 78 &JitShader::Compile_EMIT, // emit
79 nullptr, // sete 79 &JitShader::Compile_SETE, // sete
80 &JitShader::Compile_JMP, // jmpc 80 &JitShader::Compile_JMP, // jmpc
81 &JitShader::Compile_JMP, // jmpu 81 &JitShader::Compile_JMP, // jmpu
82 &JitShader::Compile_CMP, // cmp 82 &JitShader::Compile_CMP, // cmp
@@ -772,6 +772,51 @@ void JitShader::Compile_JMP(Instruction instr) {
772 } 772 }
773} 773}
774 774
775static void Emit(GSEmitter* emitter, Math::Vec4<float24> (*output)[16]) {
776 emitter->Emit(*output);
777}
778
779void JitShader::Compile_EMIT(Instruction instr) {
780 Label have_emitter, end;
781 mov(rax, qword[STATE + offsetof(UnitState, emitter_ptr)]);
782 test(rax, rax);
783 jnz(have_emitter);
784
785 ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
786 mov(ABI_PARAM1, reinterpret_cast<size_t>("Execute EMIT on VS"));
787 CallFarFunction(*this, LogCritical);
788 ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
789 jmp(end);
790
791 L(have_emitter);
792 ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
793 mov(ABI_PARAM1, rax);
794 mov(ABI_PARAM2, STATE);
795 add(ABI_PARAM2, static_cast<Xbyak::uint32>(offsetof(UnitState, registers.output)));
796 CallFarFunction(*this, Emit);
797 ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
798 L(end);
799}
800
801void JitShader::Compile_SETE(Instruction instr) {
802 Label have_emitter, end;
803 mov(rax, qword[STATE + offsetof(UnitState, emitter_ptr)]);
804 test(rax, rax);
805 jnz(have_emitter);
806
807 ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
808 mov(ABI_PARAM1, reinterpret_cast<size_t>("Execute SETEMIT on VS"));
809 CallFarFunction(*this, LogCritical);
810 ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
811 jmp(end);
812
813 L(have_emitter);
814 mov(byte[rax + offsetof(GSEmitter, vertex_id)], instr.setemit.vertex_id);
815 mov(byte[rax + offsetof(GSEmitter, prim_emit)], instr.setemit.prim_emit);
816 mov(byte[rax + offsetof(GSEmitter, winding)], instr.setemit.winding);
817 L(end);
818}
819
775void JitShader::Compile_Block(unsigned end) { 820void JitShader::Compile_Block(unsigned end) {
776 while (program_counter < end) { 821 while (program_counter < end) {
777 Compile_NextInstr(); 822 Compile_NextInstr();
diff --git a/src/video_core/shader/shader_jit_x64_compiler.h b/src/video_core/shader/shader_jit_x64_compiler.h
index 31af0ca48..4aee56b1d 100644
--- a/src/video_core/shader/shader_jit_x64_compiler.h
+++ b/src/video_core/shader/shader_jit_x64_compiler.h
@@ -66,6 +66,8 @@ public:
66 void Compile_JMP(Instruction instr); 66 void Compile_JMP(Instruction instr);
67 void Compile_CMP(Instruction instr); 67 void Compile_CMP(Instruction instr);
68 void Compile_MAD(Instruction instr); 68 void Compile_MAD(Instruction instr);
69 void Compile_EMIT(Instruction instr);
70 void Compile_SETE(Instruction instr);
69 71
70private: 72private:
71 void Compile_Block(unsigned end); 73 void Compile_Block(unsigned end);
diff --git a/src/video_core/swrasterizer/clipper.cpp b/src/video_core/swrasterizer/clipper.cpp
index 6fb923756..c1ed48398 100644
--- a/src/video_core/swrasterizer/clipper.cpp
+++ b/src/video_core/swrasterizer/clipper.cpp
@@ -31,7 +31,7 @@ public:
31 : coeffs(coeffs), bias(bias) {} 31 : coeffs(coeffs), bias(bias) {}
32 32
33 bool IsInside(const Vertex& vertex) const { 33 bool IsInside(const Vertex& vertex) const {
34 return Math::Dot(vertex.pos + bias, coeffs) <= float24::FromFloat32(0); 34 return Math::Dot(vertex.pos + bias, coeffs) >= float24::FromFloat32(0);
35 } 35 }
36 36
37 bool IsOutSide(const Vertex& vertex) const { 37 bool IsOutSide(const Vertex& vertex) const {
@@ -95,6 +95,17 @@ void ProcessTriangle(const OutputVertex& v0, const OutputVertex& v1, const Outpu
95 static const size_t MAX_VERTICES = 9; 95 static const size_t MAX_VERTICES = 9;
96 static_vector<Vertex, MAX_VERTICES> buffer_a = {v0, v1, v2}; 96 static_vector<Vertex, MAX_VERTICES> buffer_a = {v0, v1, v2};
97 static_vector<Vertex, MAX_VERTICES> buffer_b; 97 static_vector<Vertex, MAX_VERTICES> buffer_b;
98
99 auto FlipQuaternionIfOpposite = [](auto& a, const auto& b) {
100 if (Math::Dot(a, b) < float24::Zero())
101 a = a * float24::FromFloat32(-1.0f);
102 };
103
104 // Flip the quaternions if they are opposite to prevent interpolating them over the wrong
105 // direction.
106 FlipQuaternionIfOpposite(buffer_a[1].quat, buffer_a[0].quat);
107 FlipQuaternionIfOpposite(buffer_a[2].quat, buffer_a[0].quat);
108
98 auto* output_list = &buffer_a; 109 auto* output_list = &buffer_a;
99 auto* input_list = &buffer_b; 110 auto* input_list = &buffer_b;
100 111
@@ -105,23 +116,18 @@ void ProcessTriangle(const OutputVertex& v0, const OutputVertex& v1, const Outpu
105 static const float24 f0 = float24::FromFloat32(0.0); 116 static const float24 f0 = float24::FromFloat32(0.0);
106 static const float24 f1 = float24::FromFloat32(1.0); 117 static const float24 f1 = float24::FromFloat32(1.0);
107 static const std::array<ClippingEdge, 7> clipping_edges = {{ 118 static const std::array<ClippingEdge, 7> clipping_edges = {{
108 {Math::MakeVec(f1, f0, f0, -f1)}, // x = +w 119 {Math::MakeVec(-f1, f0, f0, f1)}, // x = +w
109 {Math::MakeVec(-f1, f0, f0, -f1)}, // x = -w 120 {Math::MakeVec(f1, f0, f0, f1)}, // x = -w
110 {Math::MakeVec(f0, f1, f0, -f1)}, // y = +w 121 {Math::MakeVec(f0, -f1, f0, f1)}, // y = +w
111 {Math::MakeVec(f0, -f1, f0, -f1)}, // y = -w 122 {Math::MakeVec(f0, f1, f0, f1)}, // y = -w
112 {Math::MakeVec(f0, f0, f1, f0)}, // z = 0 123 {Math::MakeVec(f0, f0, -f1, f0)}, // z = 0
113 {Math::MakeVec(f0, f0, -f1, -f1)}, // z = -w 124 {Math::MakeVec(f0, f0, f1, f1)}, // z = -w
114 {Math::MakeVec(f0, f0, f0, -f1), Math::Vec4<float24>(f0, f0, f0, EPSILON)}, // w = EPSILON 125 {Math::MakeVec(f0, f0, f0, f1), Math::Vec4<float24>(f0, f0, f0, EPSILON)}, // w = EPSILON
115 }}; 126 }};
116 127
117 // TODO: If one vertex lies outside one of the depth clipping planes, some platforms (e.g. Wii)
118 // drop the whole primitive instead of clipping the primitive properly. We should test if
119 // this happens on the 3DS, too.
120
121 // Simple implementation of the Sutherland-Hodgman clipping algorithm. 128 // Simple implementation of the Sutherland-Hodgman clipping algorithm.
122 // TODO: Make this less inefficient (currently lots of useless buffering overhead happens here) 129 // TODO: Make this less inefficient (currently lots of useless buffering overhead happens here)
123 for (auto edge : clipping_edges) { 130 auto Clip = [&](const ClippingEdge& edge) {
124
125 std::swap(input_list, output_list); 131 std::swap(input_list, output_list);
126 output_list->clear(); 132 output_list->clear();
127 133
@@ -140,12 +146,24 @@ void ProcessTriangle(const OutputVertex& v0, const OutputVertex& v1, const Outpu
140 } 146 }
141 reference_vertex = &vertex; 147 reference_vertex = &vertex;
142 } 148 }
149 };
150
151 for (auto edge : clipping_edges) {
152 Clip(edge);
143 153
144 // Need to have at least a full triangle to continue... 154 // Need to have at least a full triangle to continue...
145 if (output_list->size() < 3) 155 if (output_list->size() < 3)
146 return; 156 return;
147 } 157 }
148 158
159 if (g_state.regs.rasterizer.clip_enable) {
160 ClippingEdge custom_edge{g_state.regs.rasterizer.GetClipCoef()};
161 Clip(custom_edge);
162
163 if (output_list->size() < 3)
164 return;
165 }
166
149 InitScreenCoordinates((*output_list)[0]); 167 InitScreenCoordinates((*output_list)[0]);
150 InitScreenCoordinates((*output_list)[1]); 168 InitScreenCoordinates((*output_list)[1]);
151 169
diff --git a/src/video_core/swrasterizer/framebuffer.cpp b/src/video_core/swrasterizer/framebuffer.cpp
index 7de3aac75..f34eab6cf 100644
--- a/src/video_core/swrasterizer/framebuffer.cpp
+++ b/src/video_core/swrasterizer/framebuffer.cpp
@@ -352,6 +352,8 @@ u8 LogicOp(u8 src, u8 dest, FramebufferRegs::LogicOp op) {
352 case FramebufferRegs::LogicOp::OrInverted: 352 case FramebufferRegs::LogicOp::OrInverted:
353 return ~src | dest; 353 return ~src | dest;
354 } 354 }
355
356 UNREACHABLE();
355}; 357};
356 358
357} // namespace Rasterizer 359} // namespace Rasterizer
diff --git a/src/video_core/swrasterizer/lighting.cpp b/src/video_core/swrasterizer/lighting.cpp
new file mode 100644
index 000000000..5fa748611
--- /dev/null
+++ b/src/video_core/swrasterizer/lighting.cpp
@@ -0,0 +1,308 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "common/math_util.h"
6#include "video_core/swrasterizer/lighting.h"
7
8namespace Pica {
9
10static float LookupLightingLut(const Pica::State::Lighting& lighting, size_t lut_index, u8 index,
11 float delta) {
12 ASSERT_MSG(lut_index < lighting.luts.size(), "Out of range lut");
13 ASSERT_MSG(index < lighting.luts[lut_index].size(), "Out of range index");
14
15 const auto& lut = lighting.luts[lut_index][index];
16
17 float lut_value = lut.ToFloat();
18 float lut_diff = lut.DiffToFloat();
19
20 return lut_value + lut_diff * delta;
21}
22
23std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors(
24 const Pica::LightingRegs& lighting, const Pica::State::Lighting& lighting_state,
25 const Math::Quaternion<float>& normquat, const Math::Vec3<float>& view,
26 const Math::Vec4<u8> (&texture_color)[4]) {
27
28 Math::Vec3<float> surface_normal;
29 Math::Vec3<float> surface_tangent;
30
31 if (lighting.config0.bump_mode != LightingRegs::LightingBumpMode::None) {
32 Math::Vec3<float> perturbation =
33 texture_color[lighting.config0.bump_selector].xyz().Cast<float>() / 127.5f -
34 Math::MakeVec(1.0f, 1.0f, 1.0f);
35 if (lighting.config0.bump_mode == LightingRegs::LightingBumpMode::NormalMap) {
36 if (!lighting.config0.disable_bump_renorm) {
37 const float z_square = 1 - perturbation.xy().Length2();
38 perturbation.z = std::sqrt(std::max(z_square, 0.0f));
39 }
40 surface_normal = perturbation;
41 surface_tangent = Math::MakeVec(1.0f, 0.0f, 0.0f);
42 } else if (lighting.config0.bump_mode == LightingRegs::LightingBumpMode::TangentMap) {
43 surface_normal = Math::MakeVec(0.0f, 0.0f, 1.0f);
44 surface_tangent = perturbation;
45 } else {
46 LOG_ERROR(HW_GPU, "Unknown bump mode %u", lighting.config0.bump_mode.Value());
47 }
48 } else {
49 surface_normal = Math::MakeVec(0.0f, 0.0f, 1.0f);
50 surface_tangent = Math::MakeVec(1.0f, 0.0f, 0.0f);
51 }
52
53 // Use the normalized the quaternion when performing the rotation
54 auto normal = Math::QuaternionRotate(normquat, surface_normal);
55 auto tangent = Math::QuaternionRotate(normquat, surface_tangent);
56
57 Math::Vec4<float> diffuse_sum = {0.0f, 0.0f, 0.0f, 1.0f};
58 Math::Vec4<float> specular_sum = {0.0f, 0.0f, 0.0f, 1.0f};
59
60 for (unsigned light_index = 0; light_index <= lighting.max_light_index; ++light_index) {
61 unsigned num = lighting.light_enable.GetNum(light_index);
62 const auto& light_config = lighting.light[num];
63
64 Math::Vec3<float> refl_value = {};
65 Math::Vec3<float> position = {float16::FromRaw(light_config.x).ToFloat32(),
66 float16::FromRaw(light_config.y).ToFloat32(),
67 float16::FromRaw(light_config.z).ToFloat32()};
68 Math::Vec3<float> light_vector;
69
70 if (light_config.config.directional)
71 light_vector = position;
72 else
73 light_vector = position + view;
74
75 light_vector.Normalize();
76
77 Math::Vec3<float> norm_view = view.Normalized();
78 Math::Vec3<float> half_vector = norm_view + light_vector;
79
80 float dist_atten = 1.0f;
81 if (!lighting.IsDistAttenDisabled(num)) {
82 auto distance = (-view - position).Length();
83 float scale = Pica::float20::FromRaw(light_config.dist_atten_scale).ToFloat32();
84 float bias = Pica::float20::FromRaw(light_config.dist_atten_bias).ToFloat32();
85 size_t lut =
86 static_cast<size_t>(LightingRegs::LightingSampler::DistanceAttenuation) + num;
87
88 float sample_loc = MathUtil::Clamp(scale * distance + bias, 0.0f, 1.0f);
89
90 u8 lutindex =
91 static_cast<u8>(MathUtil::Clamp(std::floor(sample_loc * 256.0f), 0.0f, 255.0f));
92 float delta = sample_loc * 256 - lutindex;
93 dist_atten = LookupLightingLut(lighting_state, lut, lutindex, delta);
94 }
95
96 auto GetLutValue = [&](LightingRegs::LightingLutInput input, bool abs,
97 LightingRegs::LightingScale scale_enum,
98 LightingRegs::LightingSampler sampler) {
99 float result = 0.0f;
100
101 switch (input) {
102 case LightingRegs::LightingLutInput::NH:
103 result = Math::Dot(normal, half_vector.Normalized());
104 break;
105
106 case LightingRegs::LightingLutInput::VH:
107 result = Math::Dot(norm_view, half_vector.Normalized());
108 break;
109
110 case LightingRegs::LightingLutInput::NV:
111 result = Math::Dot(normal, norm_view);
112 break;
113
114 case LightingRegs::LightingLutInput::LN:
115 result = Math::Dot(light_vector, normal);
116 break;
117
118 case LightingRegs::LightingLutInput::SP: {
119 Math::Vec3<s32> spot_dir{light_config.spot_x.Value(), light_config.spot_y.Value(),
120 light_config.spot_z.Value()};
121 result = Math::Dot(light_vector, spot_dir.Cast<float>() / 2047.0f);
122 break;
123 }
124 case LightingRegs::LightingLutInput::CP:
125 if (lighting.config0.config == LightingRegs::LightingConfig::Config7) {
126 const Math::Vec3<float> norm_half_vector = half_vector.Normalized();
127 const Math::Vec3<float> half_vector_proj =
128 norm_half_vector - normal * Math::Dot(normal, norm_half_vector);
129 result = Math::Dot(half_vector_proj, tangent);
130 } else {
131 result = 0.0f;
132 }
133 break;
134 default:
135 LOG_CRITICAL(HW_GPU, "Unknown lighting LUT input %u\n", static_cast<u32>(input));
136 UNIMPLEMENTED();
137 result = 0.0f;
138 }
139
140 u8 index;
141 float delta;
142
143 if (abs) {
144 if (light_config.config.two_sided_diffuse)
145 result = std::abs(result);
146 else
147 result = std::max(result, 0.0f);
148
149 float flr = std::floor(result * 256.0f);
150 index = static_cast<u8>(MathUtil::Clamp(flr, 0.0f, 255.0f));
151 delta = result * 256 - index;
152 } else {
153 float flr = std::floor(result * 128.0f);
154 s8 signed_index = static_cast<s8>(MathUtil::Clamp(flr, -128.0f, 127.0f));
155 delta = result * 128.0f - signed_index;
156 index = static_cast<u8>(signed_index);
157 }
158
159 float scale = lighting.lut_scale.GetScale(scale_enum);
160 return scale *
161 LookupLightingLut(lighting_state, static_cast<size_t>(sampler), index, delta);
162 };
163
164 // If enabled, compute spot light attenuation value
165 float spot_atten = 1.0f;
166 if (!lighting.IsSpotAttenDisabled(num) &&
167 LightingRegs::IsLightingSamplerSupported(
168 lighting.config0.config, LightingRegs::LightingSampler::SpotlightAttenuation)) {
169 auto lut = LightingRegs::SpotlightAttenuationSampler(num);
170 spot_atten = GetLutValue(lighting.lut_input.sp, lighting.abs_lut_input.disable_sp == 0,
171 lighting.lut_scale.sp, lut);
172 }
173
174 // Specular 0 component
175 float d0_lut_value = 1.0f;
176 if (lighting.config1.disable_lut_d0 == 0 &&
177 LightingRegs::IsLightingSamplerSupported(
178 lighting.config0.config, LightingRegs::LightingSampler::Distribution0)) {
179 d0_lut_value =
180 GetLutValue(lighting.lut_input.d0, lighting.abs_lut_input.disable_d0 == 0,
181 lighting.lut_scale.d0, LightingRegs::LightingSampler::Distribution0);
182 }
183
184 Math::Vec3<float> specular_0 = d0_lut_value * light_config.specular_0.ToVec3f();
185
186 // If enabled, lookup ReflectRed value, otherwise, 1.0 is used
187 if (lighting.config1.disable_lut_rr == 0 &&
188 LightingRegs::IsLightingSamplerSupported(lighting.config0.config,
189 LightingRegs::LightingSampler::ReflectRed)) {
190 refl_value.x =
191 GetLutValue(lighting.lut_input.rr, lighting.abs_lut_input.disable_rr == 0,
192 lighting.lut_scale.rr, LightingRegs::LightingSampler::ReflectRed);
193 } else {
194 refl_value.x = 1.0f;
195 }
196
197 // If enabled, lookup ReflectGreen value, otherwise, ReflectRed value is used
198 if (lighting.config1.disable_lut_rg == 0 &&
199 LightingRegs::IsLightingSamplerSupported(lighting.config0.config,
200 LightingRegs::LightingSampler::ReflectGreen)) {
201 refl_value.y =
202 GetLutValue(lighting.lut_input.rg, lighting.abs_lut_input.disable_rg == 0,
203 lighting.lut_scale.rg, LightingRegs::LightingSampler::ReflectGreen);
204 } else {
205 refl_value.y = refl_value.x;
206 }
207
208 // If enabled, lookup ReflectBlue value, otherwise, ReflectRed value is used
209 if (lighting.config1.disable_lut_rb == 0 &&
210 LightingRegs::IsLightingSamplerSupported(lighting.config0.config,
211 LightingRegs::LightingSampler::ReflectBlue)) {
212 refl_value.z =
213 GetLutValue(lighting.lut_input.rb, lighting.abs_lut_input.disable_rb == 0,
214 lighting.lut_scale.rb, LightingRegs::LightingSampler::ReflectBlue);
215 } else {
216 refl_value.z = refl_value.x;
217 }
218
219 // Specular 1 component
220 float d1_lut_value = 1.0f;
221 if (lighting.config1.disable_lut_d1 == 0 &&
222 LightingRegs::IsLightingSamplerSupported(
223 lighting.config0.config, LightingRegs::LightingSampler::Distribution1)) {
224 d1_lut_value =
225 GetLutValue(lighting.lut_input.d1, lighting.abs_lut_input.disable_d1 == 0,
226 lighting.lut_scale.d1, LightingRegs::LightingSampler::Distribution1);
227 }
228
229 Math::Vec3<float> specular_1 =
230 d1_lut_value * refl_value * light_config.specular_1.ToVec3f();
231
232 // Fresnel
233 // Note: only the last entry in the light slots applies the Fresnel factor
234 if (light_index == lighting.max_light_index && lighting.config1.disable_lut_fr == 0 &&
235 LightingRegs::IsLightingSamplerSupported(lighting.config0.config,
236 LightingRegs::LightingSampler::Fresnel)) {
237
238 float lut_value =
239 GetLutValue(lighting.lut_input.fr, lighting.abs_lut_input.disable_fr == 0,
240 lighting.lut_scale.fr, LightingRegs::LightingSampler::Fresnel);
241
242 // Enabled for diffuse lighting alpha component
243 if (lighting.config0.fresnel_selector ==
244 LightingRegs::LightingFresnelSelector::PrimaryAlpha ||
245 lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
246 diffuse_sum.a() = lut_value;
247 }
248
249 // Enabled for the specular lighting alpha component
250 if (lighting.config0.fresnel_selector ==
251 LightingRegs::LightingFresnelSelector::SecondaryAlpha ||
252 lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
253 specular_sum.a() = lut_value;
254 }
255 }
256
257 auto dot_product = Math::Dot(light_vector, normal);
258
259 // Calculate clamp highlights before applying the two-sided diffuse configuration to the dot
260 // product.
261 float clamp_highlights = 1.0f;
262 if (lighting.config0.clamp_highlights) {
263 if (dot_product <= 0.0f)
264 clamp_highlights = 0.0f;
265 else
266 clamp_highlights = 1.0f;
267 }
268
269 if (light_config.config.two_sided_diffuse)
270 dot_product = std::abs(dot_product);
271 else
272 dot_product = std::max(dot_product, 0.0f);
273
274 if (light_config.config.geometric_factor_0 || light_config.config.geometric_factor_1) {
275 float geo_factor = half_vector.Length2();
276 geo_factor = geo_factor == 0.0f ? 0.0f : std::min(dot_product / geo_factor, 1.0f);
277 if (light_config.config.geometric_factor_0) {
278 specular_0 *= geo_factor;
279 }
280 if (light_config.config.geometric_factor_1) {
281 specular_1 *= geo_factor;
282 }
283 }
284
285 auto diffuse =
286 light_config.diffuse.ToVec3f() * dot_product + light_config.ambient.ToVec3f();
287 diffuse_sum += Math::MakeVec(diffuse * dist_atten * spot_atten, 0.0f);
288
289 specular_sum += Math::MakeVec(
290 (specular_0 + specular_1) * clamp_highlights * dist_atten * spot_atten, 0.0f);
291 }
292
293 diffuse_sum += Math::MakeVec(lighting.global_ambient.ToVec3f(), 0.0f);
294
295 auto diffuse = Math::MakeVec<float>(MathUtil::Clamp(diffuse_sum.x, 0.0f, 1.0f) * 255,
296 MathUtil::Clamp(diffuse_sum.y, 0.0f, 1.0f) * 255,
297 MathUtil::Clamp(diffuse_sum.z, 0.0f, 1.0f) * 255,
298 MathUtil::Clamp(diffuse_sum.w, 0.0f, 1.0f) * 255)
299 .Cast<u8>();
300 auto specular = Math::MakeVec<float>(MathUtil::Clamp(specular_sum.x, 0.0f, 1.0f) * 255,
301 MathUtil::Clamp(specular_sum.y, 0.0f, 1.0f) * 255,
302 MathUtil::Clamp(specular_sum.z, 0.0f, 1.0f) * 255,
303 MathUtil::Clamp(specular_sum.w, 0.0f, 1.0f) * 255)
304 .Cast<u8>();
305 return std::make_tuple(diffuse, specular);
306}
307
308} // namespace Pica
diff --git a/src/video_core/swrasterizer/lighting.h b/src/video_core/swrasterizer/lighting.h
new file mode 100644
index 000000000..d807a3d94
--- /dev/null
+++ b/src/video_core/swrasterizer/lighting.h
@@ -0,0 +1,19 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <tuple>
8#include "common/quaternion.h"
9#include "common/vector_math.h"
10#include "video_core/pica_state.h"
11
12namespace Pica {
13
14std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors(
15 const Pica::LightingRegs& lighting, const Pica::State::Lighting& lighting_state,
16 const Math::Quaternion<float>& normquat, const Math::Vec3<float>& view,
17 const Math::Vec4<u8> (&texture_color)[4]);
18
19} // namespace Pica
diff --git a/src/video_core/swrasterizer/rasterizer.cpp b/src/video_core/swrasterizer/rasterizer.cpp
index 512e81c08..862135614 100644
--- a/src/video_core/swrasterizer/rasterizer.cpp
+++ b/src/video_core/swrasterizer/rasterizer.cpp
@@ -13,6 +13,7 @@
13#include "common/logging/log.h" 13#include "common/logging/log.h"
14#include "common/math_util.h" 14#include "common/math_util.h"
15#include "common/microprofile.h" 15#include "common/microprofile.h"
16#include "common/quaternion.h"
16#include "common/vector_math.h" 17#include "common/vector_math.h"
17#include "core/hw/gpu.h" 18#include "core/hw/gpu.h"
18#include "core/memory.h" 19#include "core/memory.h"
@@ -24,6 +25,7 @@
24#include "video_core/regs_texturing.h" 25#include "video_core/regs_texturing.h"
25#include "video_core/shader/shader.h" 26#include "video_core/shader/shader.h"
26#include "video_core/swrasterizer/framebuffer.h" 27#include "video_core/swrasterizer/framebuffer.h"
28#include "video_core/swrasterizer/lighting.h"
27#include "video_core/swrasterizer/proctex.h" 29#include "video_core/swrasterizer/proctex.h"
28#include "video_core/swrasterizer/rasterizer.h" 30#include "video_core/swrasterizer/rasterizer.h"
29#include "video_core/swrasterizer/texturing.h" 31#include "video_core/swrasterizer/texturing.h"
@@ -419,6 +421,26 @@ static void ProcessTriangleInternal(const Vertex& v0, const Vertex& v1, const Ve
419 regs.texturing.tev_combiner_buffer_color.a, 421 regs.texturing.tev_combiner_buffer_color.a,
420 }; 422 };
421 423
424 Math::Vec4<u8> primary_fragment_color = {0, 0, 0, 0};
425 Math::Vec4<u8> secondary_fragment_color = {0, 0, 0, 0};
426
427 if (!g_state.regs.lighting.disable) {
428 Math::Quaternion<float> normquat = Math::Quaternion<float>{
429 {GetInterpolatedAttribute(v0.quat.x, v1.quat.x, v2.quat.x).ToFloat32(),
430 GetInterpolatedAttribute(v0.quat.y, v1.quat.y, v2.quat.y).ToFloat32(),
431 GetInterpolatedAttribute(v0.quat.z, v1.quat.z, v2.quat.z).ToFloat32()},
432 GetInterpolatedAttribute(v0.quat.w, v1.quat.w, v2.quat.w).ToFloat32(),
433 }.Normalized();
434
435 Math::Vec3<float> view{
436 GetInterpolatedAttribute(v0.view.x, v1.view.x, v2.view.x).ToFloat32(),
437 GetInterpolatedAttribute(v0.view.y, v1.view.y, v2.view.y).ToFloat32(),
438 GetInterpolatedAttribute(v0.view.z, v1.view.z, v2.view.z).ToFloat32(),
439 };
440 std::tie(primary_fragment_color, secondary_fragment_color) = ComputeFragmentsColors(
441 g_state.regs.lighting, g_state.lighting, normquat, view, texture_color);
442 }
443
422 for (unsigned tev_stage_index = 0; tev_stage_index < tev_stages.size(); 444 for (unsigned tev_stage_index = 0; tev_stage_index < tev_stages.size();
423 ++tev_stage_index) { 445 ++tev_stage_index) {
424 const auto& tev_stage = tev_stages[tev_stage_index]; 446 const auto& tev_stage = tev_stages[tev_stage_index];
@@ -427,14 +449,13 @@ static void ProcessTriangleInternal(const Vertex& v0, const Vertex& v1, const Ve
427 auto GetSource = [&](Source source) -> Math::Vec4<u8> { 449 auto GetSource = [&](Source source) -> Math::Vec4<u8> {
428 switch (source) { 450 switch (source) {
429 case Source::PrimaryColor: 451 case Source::PrimaryColor:
452 return primary_color;
430 453
431 // HACK: Until we implement fragment lighting, use primary_color
432 case Source::PrimaryFragmentColor: 454 case Source::PrimaryFragmentColor:
433 return primary_color; 455 return primary_fragment_color;
434 456
435 // HACK: Until we implement fragment lighting, use zero
436 case Source::SecondaryFragmentColor: 457 case Source::SecondaryFragmentColor:
437 return {0, 0, 0, 0}; 458 return secondary_fragment_color;
438 459
439 case Source::Texture0: 460 case Source::Texture0:
440 return texture_color[0]; 461 return texture_color[0];
diff --git a/src/video_core/swrasterizer/rasterizer.h b/src/video_core/swrasterizer/rasterizer.h
index 2f0877581..66cd6cfd4 100644
--- a/src/video_core/swrasterizer/rasterizer.h
+++ b/src/video_core/swrasterizer/rasterizer.h
@@ -19,10 +19,9 @@ struct Vertex : Shader::OutputVertex {
19 19
20 // Linear interpolation 20 // Linear interpolation
21 // factor: 0=this, 1=vtx 21 // factor: 0=this, 1=vtx
22 // Note: This function cannot be called after perspective divide
22 void Lerp(float24 factor, const Vertex& vtx) { 23 void Lerp(float24 factor, const Vertex& vtx) {
23 pos = pos * factor + vtx.pos * (float24::FromFloat32(1) - factor); 24 pos = pos * factor + vtx.pos * (float24::FromFloat32(1) - factor);
24
25 // TODO: Should perform perspective correct interpolation here...
26 quat = quat * factor + vtx.quat * (float24::FromFloat32(1) - factor); 25 quat = quat * factor + vtx.quat * (float24::FromFloat32(1) - factor);
27 color = color * factor + vtx.color * (float24::FromFloat32(1) - factor); 26 color = color * factor + vtx.color * (float24::FromFloat32(1) - factor);
28 tc0 = tc0 * factor + vtx.tc0 * (float24::FromFloat32(1) - factor); 27 tc0 = tc0 * factor + vtx.tc0 * (float24::FromFloat32(1) - factor);
@@ -30,12 +29,11 @@ struct Vertex : Shader::OutputVertex {
30 tc0_w = tc0_w * factor + vtx.tc0_w * (float24::FromFloat32(1) - factor); 29 tc0_w = tc0_w * factor + vtx.tc0_w * (float24::FromFloat32(1) - factor);
31 view = view * factor + vtx.view * (float24::FromFloat32(1) - factor); 30 view = view * factor + vtx.view * (float24::FromFloat32(1) - factor);
32 tc2 = tc2 * factor + vtx.tc2 * (float24::FromFloat32(1) - factor); 31 tc2 = tc2 * factor + vtx.tc2 * (float24::FromFloat32(1) - factor);
33
34 screenpos = screenpos * factor + vtx.screenpos * (float24::FromFloat32(1) - factor);
35 } 32 }
36 33
37 // Linear interpolation 34 // Linear interpolation
38 // factor: 0=v0, 1=v1 35 // factor: 0=v0, 1=v1
36 // Note: This function cannot be called after perspective divide
39 static Vertex Lerp(float24 factor, const Vertex& v0, const Vertex& v1) { 37 static Vertex Lerp(float24 factor, const Vertex& v0, const Vertex& v1) {
40 Vertex ret = v0; 38 Vertex ret = v0;
41 ret.Lerp(factor, v1); 39 ret.Lerp(factor, v1);
diff --git a/src/video_core/swrasterizer/texturing.cpp b/src/video_core/swrasterizer/texturing.cpp
index 4f02b93f2..79b1ce841 100644
--- a/src/video_core/swrasterizer/texturing.cpp
+++ b/src/video_core/swrasterizer/texturing.cpp
@@ -89,6 +89,8 @@ Math::Vec3<u8> GetColorModifier(TevStageConfig::ColorModifier factor,
89 case ColorModifier::OneMinusSourceBlue: 89 case ColorModifier::OneMinusSourceBlue:
90 return (Math::Vec3<u8>(255, 255, 255) - values.bbb()).Cast<u8>(); 90 return (Math::Vec3<u8>(255, 255, 255) - values.bbb()).Cast<u8>();
91 } 91 }
92
93 UNREACHABLE();
92}; 94};
93 95
94u8 GetAlphaModifier(TevStageConfig::AlphaModifier factor, const Math::Vec4<u8>& values) { 96u8 GetAlphaModifier(TevStageConfig::AlphaModifier factor, const Math::Vec4<u8>& values) {
@@ -119,6 +121,8 @@ u8 GetAlphaModifier(TevStageConfig::AlphaModifier factor, const Math::Vec4<u8>&
119 case AlphaModifier::OneMinusSourceBlue: 121 case AlphaModifier::OneMinusSourceBlue:
120 return 255 - values.b(); 122 return 255 - values.b();
121 } 123 }
124
125 UNREACHABLE();
122}; 126};
123 127
124Math::Vec3<u8> ColorCombine(TevStageConfig::Operation op, const Math::Vec3<u8> input[3]) { 128Math::Vec3<u8> ColorCombine(TevStageConfig::Operation op, const Math::Vec3<u8> input[3]) {
diff --git a/src/video_core/utils.h b/src/video_core/utils.h
index 7ce83a055..d8567f314 100644
--- a/src/video_core/utils.h
+++ b/src/video_core/utils.h
@@ -8,17 +8,11 @@
8 8
9namespace VideoCore { 9namespace VideoCore {
10 10
11/** 11// 8x8 Z-Order coordinate from 2D coordinates
12 * Interleave the lower 3 bits of each coordinate to get the intra-block offsets, which are
13 * arranged in a Z-order curve. More details on the bit manipulation at:
14 * https://fgiesen.wordpress.com/2009/12/13/decoding-morton-codes/
15 */
16static inline u32 MortonInterleave(u32 x, u32 y) { 12static inline u32 MortonInterleave(u32 x, u32 y) {
17 u32 i = (x & 7) | ((y & 7) << 8); // ---- -210 13 static const u32 xlut[] = {0x00, 0x01, 0x04, 0x05, 0x10, 0x11, 0x14, 0x15};
18 i = (i ^ (i << 2)) & 0x1313; // ---2 --10 14 static const u32 ylut[] = {0x00, 0x02, 0x08, 0x0a, 0x20, 0x22, 0x28, 0x2a};
19 i = (i ^ (i << 1)) & 0x1515; // ---2 -1-0 15 return xlut[x % 8] + ylut[y % 8];
20 i = (i | (i >> 7)) & 0x3F;
21 return i;
22} 16}
23 17
24/** 18/**
diff --git a/src/web_service/CMakeLists.txt b/src/web_service/CMakeLists.txt
index 334d82a8a..c93811892 100644
--- a/src/web_service/CMakeLists.txt
+++ b/src/web_service/CMakeLists.txt
@@ -1,10 +1,12 @@
1set(SRCS 1set(SRCS
2 telemetry_json.cpp 2 telemetry_json.cpp
3 verify_login.cpp
3 web_backend.cpp 4 web_backend.cpp
4 ) 5 )
5 6
6set(HEADERS 7set(HEADERS
7 telemetry_json.h 8 telemetry_json.h
9 verify_login.h
8 web_backend.h 10 web_backend.h
9 ) 11 )
10 12
diff --git a/src/web_service/telemetry_json.cpp b/src/web_service/telemetry_json.cpp
index a2d007e77..6ad2ffcd4 100644
--- a/src/web_service/telemetry_json.cpp
+++ b/src/web_service/telemetry_json.cpp
@@ -3,7 +3,6 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "common/assert.h" 5#include "common/assert.h"
6#include "core/settings.h"
7#include "web_service/telemetry_json.h" 6#include "web_service/telemetry_json.h"
8#include "web_service/web_backend.h" 7#include "web_service/web_backend.h"
9 8
@@ -81,7 +80,7 @@ void TelemetryJson::Complete() {
81 SerializeSection(Telemetry::FieldType::UserFeedback, "UserFeedback"); 80 SerializeSection(Telemetry::FieldType::UserFeedback, "UserFeedback");
82 SerializeSection(Telemetry::FieldType::UserConfig, "UserConfig"); 81 SerializeSection(Telemetry::FieldType::UserConfig, "UserConfig");
83 SerializeSection(Telemetry::FieldType::UserSystem, "UserSystem"); 82 SerializeSection(Telemetry::FieldType::UserSystem, "UserSystem");
84 PostJson(Settings::values.telemetry_endpoint_url, TopSection().dump()); 83 PostJson(endpoint_url, TopSection().dump(), true, username, token);
85} 84}
86 85
87} // namespace WebService 86} // namespace WebService
diff --git a/src/web_service/telemetry_json.h b/src/web_service/telemetry_json.h
index 39038b4f9..9e78c6803 100644
--- a/src/web_service/telemetry_json.h
+++ b/src/web_service/telemetry_json.h
@@ -17,7 +17,9 @@ namespace WebService {
17 */ 17 */
18class TelemetryJson : public Telemetry::VisitorInterface { 18class TelemetryJson : public Telemetry::VisitorInterface {
19public: 19public:
20 TelemetryJson() = default; 20 TelemetryJson(const std::string& endpoint_url, const std::string& username,
21 const std::string& token)
22 : endpoint_url(endpoint_url), username(username), token(token) {}
21 ~TelemetryJson() = default; 23 ~TelemetryJson() = default;
22 24
23 void Visit(const Telemetry::Field<bool>& field) override; 25 void Visit(const Telemetry::Field<bool>& field) override;
@@ -49,6 +51,9 @@ private:
49 51
50 nlohmann::json output; 52 nlohmann::json output;
51 std::array<nlohmann::json, 7> sections; 53 std::array<nlohmann::json, 7> sections;
54 std::string endpoint_url;
55 std::string username;
56 std::string token;
52}; 57};
53 58
54} // namespace WebService 59} // namespace WebService
diff --git a/src/web_service/verify_login.cpp b/src/web_service/verify_login.cpp
new file mode 100644
index 000000000..1bc3b5afe
--- /dev/null
+++ b/src/web_service/verify_login.cpp
@@ -0,0 +1,28 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <json.hpp>
6#include "web_service/verify_login.h"
7#include "web_service/web_backend.h"
8
9namespace WebService {
10
11std::future<bool> VerifyLogin(std::string& username, std::string& token,
12 const std::string& endpoint_url, std::function<void()> func) {
13 auto get_func = [func, username](const std::string& reply) -> bool {
14 func();
15 if (reply.empty())
16 return false;
17 nlohmann::json json = nlohmann::json::parse(reply);
18 std::string result;
19 try {
20 result = json["username"];
21 } catch (const nlohmann::detail::out_of_range&) {
22 }
23 return result == username;
24 };
25 return GetJson<bool>(get_func, endpoint_url, false, username, token);
26}
27
28} // namespace WebService
diff --git a/src/web_service/verify_login.h b/src/web_service/verify_login.h
new file mode 100644
index 000000000..303f5dbbc
--- /dev/null
+++ b/src/web_service/verify_login.h
@@ -0,0 +1,24 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <functional>
8#include <future>
9#include <string>
10
11namespace WebService {
12
13/**
14 * Checks if username and token is valid
15 * @param username Citra username to use for authentication.
16 * @param token Citra token to use for authentication.
17 * @param endpoint_url URL of the services.citra-emu.org endpoint.
18 * @param func A function that gets exectued when the verification is finished
19 * @returns Future with bool indicating whether the verification succeeded
20 */
21std::future<bool> VerifyLogin(std::string& username, std::string& token,
22 const std::string& endpoint_url, std::function<void()> func);
23
24} // namespace WebService
diff --git a/src/web_service/web_backend.cpp b/src/web_service/web_backend.cpp
index 13e4555ac..b17d82f9c 100644
--- a/src/web_service/web_backend.cpp
+++ b/src/web_service/web_backend.cpp
@@ -2,51 +2,139 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#ifdef _WIN32
6#include <winsock.h>
7#endif
8
9#include <cstdlib>
10#include <thread>
5#include <cpr/cpr.h> 11#include <cpr/cpr.h>
6#include <stdlib.h>
7#include "common/logging/log.h" 12#include "common/logging/log.h"
8#include "web_service/web_backend.h" 13#include "web_service/web_backend.h"
9 14
10namespace WebService { 15namespace WebService {
11 16
12static constexpr char API_VERSION[]{"1"}; 17static constexpr char API_VERSION[]{"1"};
13static constexpr char ENV_VAR_USERNAME[]{"CITRA_WEB_SERVICES_USERNAME"};
14static constexpr char ENV_VAR_TOKEN[]{"CITRA_WEB_SERVICES_TOKEN"};
15 18
16static std::string GetEnvironmentVariable(const char* name) { 19static std::unique_ptr<cpr::Session> g_session;
17 const char* value{getenv(name)}; 20
18 if (value) { 21void Win32WSAStartup() {
19 return value; 22#ifdef _WIN32
23 // On Windows, CPR/libcurl does not properly initialize Winsock. The below code is used to
24 // initialize Winsock globally, which fixes this problem. Without this, only the first CPR
25 // session will properly be created, and subsequent ones will fail.
26 WSADATA wsa_data;
27 const int wsa_result{WSAStartup(MAKEWORD(2, 2), &wsa_data)};
28 if (wsa_result) {
29 LOG_CRITICAL(WebService, "WSAStartup failed: %d", wsa_result);
20 } 30 }
21 return {}; 31#endif
22} 32}
23 33
24const std::string& GetUsername() { 34void PostJson(const std::string& url, const std::string& data, bool allow_anonymous,
25 static const std::string username{GetEnvironmentVariable(ENV_VAR_USERNAME)}; 35 const std::string& username, const std::string& token) {
26 return username; 36 if (url.empty()) {
27} 37 LOG_ERROR(WebService, "URL is invalid");
38 return;
39 }
40
41 const bool are_credentials_provided{!token.empty() && !username.empty()};
42 if (!allow_anonymous && !are_credentials_provided) {
43 LOG_ERROR(WebService, "Credentials must be provided for authenticated requests");
44 return;
45 }
28 46
29const std::string& GetToken() { 47 Win32WSAStartup();
30 static const std::string token{GetEnvironmentVariable(ENV_VAR_TOKEN)}; 48
31 return token; 49 // Built request header
50 cpr::Header header;
51 if (are_credentials_provided) {
52 // Authenticated request if credentials are provided
53 header = {{"Content-Type", "application/json"},
54 {"x-username", username.c_str()},
55 {"x-token", token.c_str()},
56 {"api-version", API_VERSION}};
57 } else {
58 // Otherwise, anonymous request
59 header = cpr::Header{{"Content-Type", "application/json"}, {"api-version", API_VERSION}};
60 }
61
62 // Post JSON asynchronously
63 static std::future<void> future;
64 future = cpr::PostCallback(
65 [](cpr::Response r) {
66 if (r.error) {
67 LOG_ERROR(WebService, "POST returned cpr error: %u:%s",
68 static_cast<u32>(r.error.code), r.error.message.c_str());
69 return;
70 }
71 if (r.status_code >= 400) {
72 LOG_ERROR(WebService, "POST returned error status code: %u", r.status_code);
73 return;
74 }
75 if (r.header["content-type"].find("application/json") == std::string::npos) {
76 LOG_ERROR(WebService, "POST returned wrong content: %s",
77 r.header["content-type"].c_str());
78 return;
79 }
80 },
81 cpr::Url{url}, cpr::Body{data}, header);
32} 82}
33 83
34void PostJson(const std::string& url, const std::string& data) { 84template <typename T>
85std::future<T> GetJson(std::function<T(const std::string&)> func, const std::string& url,
86 bool allow_anonymous, const std::string& username,
87 const std::string& token) {
35 if (url.empty()) { 88 if (url.empty()) {
36 LOG_ERROR(WebService, "URL is invalid"); 89 LOG_ERROR(WebService, "URL is invalid");
37 return; 90 return std::async(std::launch::async, [func{std::move(func)}]() { return func(""); });
38 } 91 }
39 92
40 if (GetUsername().empty() || GetToken().empty()) { 93 const bool are_credentials_provided{!token.empty() && !username.empty()};
41 LOG_ERROR(WebService, "Environment variables %s and %s must be set to POST JSON", 94 if (!allow_anonymous && !are_credentials_provided) {
42 ENV_VAR_USERNAME, ENV_VAR_TOKEN); 95 LOG_ERROR(WebService, "Credentials must be provided for authenticated requests");
43 return; 96 return std::async(std::launch::async, [func{std::move(func)}]() { return func(""); });
44 } 97 }
45 98
46 cpr::PostAsync(cpr::Url{url}, cpr::Body{data}, cpr::Header{{"Content-Type", "application/json"}, 99 Win32WSAStartup();
47 {"x-username", GetUsername()}, 100
48 {"x-token", GetToken()}, 101 // Built request header
49 {"api-version", API_VERSION}}); 102 cpr::Header header;
103 if (are_credentials_provided) {
104 // Authenticated request if credentials are provided
105 header = {{"Content-Type", "application/json"},
106 {"x-username", username.c_str()},
107 {"x-token", token.c_str()},
108 {"api-version", API_VERSION}};
109 } else {
110 // Otherwise, anonymous request
111 header = cpr::Header{{"Content-Type", "application/json"}, {"api-version", API_VERSION}};
112 }
113
114 // Get JSON asynchronously
115 return cpr::GetCallback(
116 [func{std::move(func)}](cpr::Response r) {
117 if (r.error) {
118 LOG_ERROR(WebService, "GET returned cpr error: %u:%s",
119 static_cast<u32>(r.error.code), r.error.message.c_str());
120 return func("");
121 }
122 if (r.status_code >= 400) {
123 LOG_ERROR(WebService, "GET returned error code: %u", r.status_code);
124 return func("");
125 }
126 if (r.header["content-type"].find("application/json") == std::string::npos) {
127 LOG_ERROR(WebService, "GET returned wrong content: %s",
128 r.header["content-type"].c_str());
129 return func("");
130 }
131 return func(r.text);
132 },
133 cpr::Url{url}, header);
50} 134}
51 135
136template std::future<bool> GetJson(std::function<bool(const std::string&)> func,
137 const std::string& url, bool allow_anonymous,
138 const std::string& username, const std::string& token);
139
52} // namespace WebService 140} // namespace WebService
diff --git a/src/web_service/web_backend.h b/src/web_service/web_backend.h
index 2753d3b68..a63c75d13 100644
--- a/src/web_service/web_backend.h
+++ b/src/web_service/web_backend.h
@@ -4,28 +4,36 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <functional>
8#include <future>
7#include <string> 9#include <string>
8#include "common/common_types.h" 10#include "common/common_types.h"
9 11
10namespace WebService { 12namespace WebService {
11 13
12/** 14/**
13 * Gets the current username for accessing services.citra-emu.org. 15 * Posts JSON to services.citra-emu.org.
14 * @returns Username as a string, empty if not set. 16 * @param url URL of the services.citra-emu.org endpoint to post data to.
15 */ 17 * @param data String of JSON data to use for the body of the POST request.
16const std::string& GetUsername(); 18 * @param allow_anonymous If true, allow anonymous unauthenticated requests.
17 19 * @param username Citra username to use for authentication.
18/** 20 * @param token Citra token to use for authentication.
19 * Gets the current token for accessing services.citra-emu.org.
20 * @returns Token as a string, empty if not set.
21 */ 21 */
22const std::string& GetToken(); 22void PostJson(const std::string& url, const std::string& data, bool allow_anonymous,
23 const std::string& username = {}, const std::string& token = {});
23 24
24/** 25/**
25 * Posts JSON to services.citra-emu.org. 26 * Gets JSON from services.citra-emu.org.
27 * @param func A function that gets exectued when the json as a string is received
26 * @param url URL of the services.citra-emu.org endpoint to post data to. 28 * @param url URL of the services.citra-emu.org endpoint to post data to.
27 * @param data String of JSON data to use for the body of the POST request. 29 * @param allow_anonymous If true, allow anonymous unauthenticated requests.
30 * @param username Citra username to use for authentication.
31 * @param token Citra token to use for authentication.
32 * @return future that holds the return value T of the func
28 */ 33 */
29void PostJson(const std::string& url, const std::string& data); 34template <typename T>
35std::future<T> GetJson(std::function<T(const std::string&)> func, const std::string& url,
36 bool allow_anonymous, const std::string& username = {},
37 const std::string& token = {});
30 38
31} // namespace WebService 39} // namespace WebService