From 3582488fbc61d81ec3e99a216086c1a9964298aa Mon Sep 17 00:00:00 2001 From: Sasha Szpakowski Date: Fri, 24 Jan 2025 21:20:11 -0400 Subject: [PATCH] update SDL3 to 3.2.0 --- libs/SDL3/.git-hash | 1 + libs/SDL3/.gitignore | 178 - libs/SDL3/.wikiheaders-options | 2 + libs/SDL3/Android.mk | 5 +- libs/SDL3/BUGS.txt | 7 +- libs/SDL3/CMakeLists.txt | 119 +- libs/SDL3/CREDITS.md | 6 +- libs/SDL3/INSTALL.md | 73 +- libs/SDL3/LICENSE.txt | 2 +- libs/SDL3/README-SDL.txt | 13 - libs/SDL3/README.md | 16 +- libs/SDL3/REVISION.txt | 1 + libs/SDL3/VisualC-GDK/SDL/SDL.vcxproj | 13 +- libs/SDL3/VisualC-GDK/SDL/SDL.vcxproj.filters | 13 +- .../VisualC-GDK/tests/testgdk/src/testgdk.cpp | 2 +- libs/SDL3/VisualC/SDL/SDL.vcxproj | 30 +- libs/SDL3/VisualC/SDL/SDL.vcxproj.filters | 33 +- libs/SDL3/WhatsNew.txt | 25 +- libs/SDL3/Xcode/SDL/Info-Framework.plist | 4 +- .../Xcode/SDL/SDL.xcodeproj/project.pbxproj | 685 ++- libs/SDL3/Xcode/SDL/pkg-support/SDL.info | 2 +- .../SDL/pkg-support/resources/INSTALL.md | 43 + .../SDL/pkg-support/resources/License.txt | 19 - .../SDL/pkg-support/resources/ReadMe.txt | 44 - .../SDL/pkg-support/resources/SDL_DS_Store | Bin 10244 -> 10244 bytes .../resources/cmake/SDL3Config.cmake | 2 +- .../resources/cmake/SDL3ConfigVersion.cmake | 57 + .../resources/framework/INSTALL.md | 41 + .../share/cmake/SDL3/SDL3ConfigVersion.cmake | 76 + libs/SDL3/android-project/app/build.gradle | 6 +- .../android-project/app/proguard-rules.pro | 1 + .../app/src/main/AndroidManifest.xml | 3 - .../main/java/org/libsdl/app/SDLActivity.java | 29 +- .../org/libsdl/app/SDLControllerManager.java | 185 +- .../org/libsdl/app/SDLInputConnection.java | 22 +- .../main/java/org/libsdl/app/SDLSurface.java | 188 +- libs/SDL3/android-project/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- libs/SDL3/build-scripts/SDL_migration.cocci | 8 + libs/SDL3/build-scripts/build-release.py | 163 +- libs/SDL3/build-scripts/build-web-examples.pl | 2 +- libs/SDL3/build-scripts/check_stdlib_usage.py | 2 +- libs/SDL3/build-scripts/fnsince.pl | 8 +- .../gen_audio_channel_conversion.c | 4 +- .../build-scripts/makecasefoldhashtable.pl | 4 +- .../pkg-support/android/INSTALL.md.in | 50 +- .../android/{ => aar}/__main__.py.in | 0 .../android/{ => aar}/cmake/SDL3Config.cmake | 0 .../cmake/SDL3ConfigVersion.cmake.in | 0 .../android/{ => aar}/description.json.in | 0 .../pkg-support/mingw/INSTALL.md | 53 + .../pkg-support/mingw/INSTALL.txt | 25 - .../mingw/cmake/SDL3ConfigVersion.cmake | 19 + .../build-scripts/pkg-support/msvc/INSTALL.md | 45 + .../pkg-support/msvc/arm64/INSTALL.md.in | 13 + .../pkg-support/msvc/x64/INSTALL.md.in | 13 + .../pkg-support/msvc/x86/INSTALL.md.in | 13 + .../source/SDL_revision.h.cmake.in | 2 +- .../pkg-support/source/SDL_revision.h.in | 2 +- libs/SDL3/build-scripts/release-info.json | 55 +- libs/SDL3/build-scripts/wikiheaders.pl | 8 +- libs/SDL3/cmake/macros.cmake | 18 - libs/SDL3/cmake/sdlchecks.cmake | 28 +- libs/SDL3/cmake/sdlcompilers.cmake | 4 +- libs/SDL3/cmake/sdltargets.cmake | 16 +- libs/SDL3/docs/INTRO-androidstudio.md | 17 + libs/SDL3/docs/INTRO-cmake.md | 50 + libs/SDL3/docs/INTRO-emscripten.md | 38 + libs/SDL3/docs/INTRO-visualstudio.md | 15 + libs/SDL3/docs/INTRO-xcode.md | 16 + libs/SDL3/docs/README-android.md | 79 +- libs/SDL3/docs/README-bsd.md | 6 + libs/SDL3/docs/README-cmake.md | 180 +- libs/SDL3/docs/README-contributing.md | 2 +- libs/SDL3/docs/README-emscripten.md | 6 +- libs/SDL3/docs/README-git.md | 16 - libs/SDL3/docs/README-haiku.md | 4 + libs/SDL3/docs/README-ios.md | 24 +- libs/SDL3/docs/README-macos.md | 9 +- libs/SDL3/docs/README-migration.md | 26 +- libs/SDL3/docs/README-platforms.md | 42 +- libs/SDL3/docs/README-ps4.md | 3 + libs/SDL3/docs/README-ps5.md | 3 + libs/SDL3/docs/README-raspberrypi.md | 188 - libs/SDL3/docs/README-steamos.md | 10 + libs/SDL3/docs/README-switch.md | 3 + libs/SDL3/docs/README-visualc.md | 113 - libs/SDL3/docs/README-vita.md | 8 +- libs/SDL3/docs/README-windows.md | 56 + libs/SDL3/docs/README.md | 32 +- libs/SDL3/docs/hello.c | 68 + .../01-simple-playback/simple-playback.c | 16 +- .../simple-playback-callback.c | 16 +- libs/SDL3/examples/demo/01-snake/snake.c | 2 +- .../demo/02-woodeneye-008/woodeneye-008.c | 2 +- .../examples/demo/04-bytepusher/bytepusher.c | 2 +- .../pen/01-drawing-lines/drawing-lines.c | 7 +- libs/SDL3/examples/template.html | 22 +- libs/SDL3/include/SDL3/SDL.h | 4 +- libs/SDL3/include/SDL3/SDL_assert.h | 58 +- libs/SDL3/include/SDL3/SDL_asyncio.h | 20 +- libs/SDL3/include/SDL3/SDL_atomic.h | 48 +- libs/SDL3/include/SDL3/SDL_audio.h | 201 +- libs/SDL3/include/SDL3/SDL_begin_code.h | 28 +- libs/SDL3/include/SDL3/SDL_bits.h | 8 +- libs/SDL3/include/SDL3/SDL_blendmode.h | 10 +- libs/SDL3/include/SDL3/SDL_camera.h | 40 +- libs/SDL3/include/SDL3/SDL_clipboard.h | 28 +- libs/SDL3/include/SDL3/SDL_close_code.h | 2 +- libs/SDL3/include/SDL3/SDL_copying.h | 2 +- libs/SDL3/include/SDL3/SDL_cpuinfo.h | 40 +- libs/SDL3/include/SDL3/SDL_dialog.h | 18 +- libs/SDL3/include/SDL3/SDL_egl.h | 2 +- libs/SDL3/include/SDL3/SDL_endian.h | 34 +- libs/SDL3/include/SDL3/SDL_error.h | 16 +- libs/SDL3/include/SDL3/SDL_events.h | 152 +- libs/SDL3/include/SDL3/SDL_filesystem.h | 62 +- libs/SDL3/include/SDL3/SDL_gamepad.h | 178 +- libs/SDL3/include/SDL3/SDL_gpu.h | 709 ++- libs/SDL3/include/SDL3/SDL_guid.h | 8 +- libs/SDL3/include/SDL3/SDL_haptic.h | 136 +- libs/SDL3/include/SDL3/SDL_hidapi.h | 52 +- libs/SDL3/include/SDL3/SDL_hints.h | 674 ++- libs/SDL3/include/SDL3/SDL_init.h | 32 +- libs/SDL3/include/SDL3/SDL_intrin.h | 32 +- libs/SDL3/include/SDL3/SDL_iostream.h | 203 +- libs/SDL3/include/SDL3/SDL_joystick.h | 136 +- libs/SDL3/include/SDL3/SDL_keyboard.h | 58 +- libs/SDL3/include/SDL3/SDL_keycode.h | 20 +- libs/SDL3/include/SDL3/SDL_loadso.h | 10 +- libs/SDL3/include/SDL3/SDL_locale.h | 6 +- libs/SDL3/include/SDL3/SDL_log.h | 44 +- libs/SDL3/include/SDL3/SDL_main.h | 42 +- libs/SDL3/include/SDL3/SDL_main_impl.h | 2 +- libs/SDL3/include/SDL3/SDL_messagebox.h | 31 +- libs/SDL3/include/SDL3/SDL_metal.h | 14 +- libs/SDL3/include/SDL3/SDL_misc.h | 4 +- libs/SDL3/include/SDL3/SDL_mouse.h | 92 +- libs/SDL3/include/SDL3/SDL_mutex.h | 126 +- libs/SDL3/include/SDL3/SDL_oldnames.h | 6 +- libs/SDL3/include/SDL3/SDL_opengl.h | 2 +- libs/SDL3/include/SDL3/SDL_opengles.h | 2 +- libs/SDL3/include/SDL3/SDL_opengles2.h | 2 +- libs/SDL3/include/SDL3/SDL_pen.h | 24 +- libs/SDL3/include/SDL3/SDL_pixels.h | 120 +- libs/SDL3/include/SDL3/SDL_platform.h | 4 +- libs/SDL3/include/SDL3/SDL_platform_defines.h | 72 +- libs/SDL3/include/SDL3/SDL_power.h | 15 +- libs/SDL3/include/SDL3/SDL_process.h | 24 +- libs/SDL3/include/SDL3/SDL_properties.h | 52 +- libs/SDL3/include/SDL3/SDL_rect.h | 46 +- libs/SDL3/include/SDL3/SDL_render.h | 215 +- libs/SDL3/include/SDL3/SDL_revision.h | 36 +- libs/SDL3/include/SDL3/SDL_scancode.h | 4 +- libs/SDL3/include/SDL3/SDL_sensor.h | 40 +- libs/SDL3/include/SDL3/SDL_stdinc.h | 549 +- libs/SDL3/include/SDL3/SDL_storage.h | 273 +- libs/SDL3/include/SDL3/SDL_surface.h | 136 +- libs/SDL3/include/SDL3/SDL_system.h | 88 +- libs/SDL3/include/SDL3/SDL_test.h | 2 +- libs/SDL3/include/SDL3/SDL_test_assert.h | 2 +- libs/SDL3/include/SDL3/SDL_test_common.h | 3 +- libs/SDL3/include/SDL3/SDL_test_compare.h | 4 +- libs/SDL3/include/SDL3/SDL_test_crc32.h | 2 +- libs/SDL3/include/SDL3/SDL_test_font.h | 14 +- libs/SDL3/include/SDL3/SDL_test_fuzzer.h | 2 +- libs/SDL3/include/SDL3/SDL_test_harness.h | 2 +- libs/SDL3/include/SDL3/SDL_test_log.h | 2 +- libs/SDL3/include/SDL3/SDL_test_md5.h | 2 +- libs/SDL3/include/SDL3/SDL_test_memory.h | 2 +- libs/SDL3/include/SDL3/SDL_thread.h | 87 +- libs/SDL3/include/SDL3/SDL_time.h | 34 +- libs/SDL3/include/SDL3/SDL_timer.h | 74 +- libs/SDL3/include/SDL3/SDL_touch.h | 35 +- libs/SDL3/include/SDL3/SDL_tray.h | 149 +- libs/SDL3/include/SDL3/SDL_version.h | 28 +- libs/SDL3/include/SDL3/SDL_video.h | 302 +- libs/SDL3/include/SDL3/SDL_vulkan.h | 36 +- .../include/build_config/SDL_build_config.h | 2 +- .../build_config/SDL_build_config.h.cmake | 2 +- .../build_config/SDL_build_config_android.h | 2 +- .../build_config/SDL_build_config_ios.h | 2 +- .../build_config/SDL_build_config_macos.h | 2 +- .../build_config/SDL_build_config_minimal.h | 2 +- .../build_config/SDL_build_config_windows.h | 2 +- .../build_config/SDL_build_config_wingdk.h | 2 +- .../build_config/SDL_build_config_xbox.h | 2 +- .../include/build_config/SDL_revision.h.cmake | 46 +- libs/SDL3/src/SDL.c | 6 +- libs/SDL3/src/SDL_assert.c | 2 +- libs/SDL3/src/SDL_assert_c.h | 2 +- libs/SDL3/src/SDL_error.c | 12 +- libs/SDL3/src/SDL_error_c.h | 2 +- libs/SDL3/src/SDL_guid.c | 2 +- libs/SDL3/src/SDL_hashtable.c | 29 +- libs/SDL3/src/SDL_hashtable.h | 2 +- libs/SDL3/src/SDL_hints.c | 2 +- libs/SDL3/src/SDL_hints_c.h | 2 +- libs/SDL3/src/SDL_internal.h | 17 +- libs/SDL3/src/SDL_list.c | 2 +- libs/SDL3/src/SDL_list.h | 2 +- libs/SDL3/src/SDL_log.c | 2 +- libs/SDL3/src/SDL_log_c.h | 2 +- libs/SDL3/src/SDL_properties.c | 2 +- libs/SDL3/src/SDL_properties_c.h | 2 +- libs/SDL3/src/SDL_utils.c | 24 +- libs/SDL3/src/SDL_utils_c.h | 5 +- libs/SDL3/src/atomic/SDL_atomic.c | 2 +- libs/SDL3/src/atomic/SDL_spinlock.c | 2 +- libs/SDL3/src/audio/SDL_audio.c | 58 +- libs/SDL3/src/audio/SDL_audio_c.h | 2 +- .../src/audio/SDL_audio_channel_converters.h | 2 +- libs/SDL3/src/audio/SDL_audiocvt.c | 15 +- libs/SDL3/src/audio/SDL_audiodev.c | 2 +- libs/SDL3/src/audio/SDL_audiodev_c.h | 2 +- libs/SDL3/src/audio/SDL_audioqueue.c | 2 +- libs/SDL3/src/audio/SDL_audioqueue.h | 2 +- libs/SDL3/src/audio/SDL_audioresample.c | 2 +- libs/SDL3/src/audio/SDL_audioresample.h | 2 +- libs/SDL3/src/audio/SDL_audiotypecvt.c | 2 +- libs/SDL3/src/audio/SDL_mixer.c | 2 +- libs/SDL3/src/audio/SDL_sysaudio.h | 11 +- libs/SDL3/src/audio/SDL_wave.c | 2 +- libs/SDL3/src/audio/SDL_wave.h | 2 +- libs/SDL3/src/audio/aaudio/SDL_aaudio.c | 2 +- libs/SDL3/src/audio/aaudio/SDL_aaudio.h | 2 +- libs/SDL3/src/audio/aaudio/SDL_aaudiofuncs.h | 2 +- libs/SDL3/src/audio/alsa/SDL_alsa_audio.c | 3 +- libs/SDL3/src/audio/alsa/SDL_alsa_audio.h | 2 +- libs/SDL3/src/audio/coreaudio/SDL_coreaudio.h | 2 +- libs/SDL3/src/audio/coreaudio/SDL_coreaudio.m | 77 +- .../src/audio/directsound/SDL_directsound.c | 2 +- .../src/audio/directsound/SDL_directsound.h | 2 +- libs/SDL3/src/audio/disk/SDL_diskaudio.c | 2 +- libs/SDL3/src/audio/disk/SDL_diskaudio.h | 2 +- libs/SDL3/src/audio/dsp/SDL_dspaudio.c | 2 +- libs/SDL3/src/audio/dsp/SDL_dspaudio.h | 2 +- libs/SDL3/src/audio/dummy/SDL_dummyaudio.c | 2 +- libs/SDL3/src/audio/dummy/SDL_dummyaudio.h | 2 +- .../audio/emscripten/SDL_emscriptenaudio.c | 4 +- .../audio/emscripten/SDL_emscriptenaudio.h | 2 +- libs/SDL3/src/audio/haiku/SDL_haikuaudio.cc | 2 +- libs/SDL3/src/audio/haiku/SDL_haikuaudio.h | 2 +- libs/SDL3/src/audio/jack/SDL_jackaudio.c | 2 +- libs/SDL3/src/audio/jack/SDL_jackaudio.h | 2 +- libs/SDL3/src/audio/n3ds/SDL_n3dsaudio.c | 2 +- libs/SDL3/src/audio/n3ds/SDL_n3dsaudio.h | 2 +- libs/SDL3/src/audio/netbsd/SDL_netbsdaudio.c | 2 +- libs/SDL3/src/audio/netbsd/SDL_netbsdaudio.h | 2 +- libs/SDL3/src/audio/openslES/SDL_openslES.c | 2 +- libs/SDL3/src/audio/openslES/SDL_openslES.h | 2 +- libs/SDL3/src/audio/pipewire/SDL_pipewire.c | 2 +- libs/SDL3/src/audio/pipewire/SDL_pipewire.h | 2 +- libs/SDL3/src/audio/ps2/SDL_ps2audio.c | 2 +- libs/SDL3/src/audio/ps2/SDL_ps2audio.h | 2 +- libs/SDL3/src/audio/psp/SDL_pspaudio.c | 2 +- libs/SDL3/src/audio/psp/SDL_pspaudio.h | 2 +- .../src/audio/pulseaudio/SDL_pulseaudio.c | 2 +- .../src/audio/pulseaudio/SDL_pulseaudio.h | 2 +- libs/SDL3/src/audio/qnx/SDL_qsa_audio.c | 2 +- libs/SDL3/src/audio/qnx/SDL_qsa_audio.h | 2 +- libs/SDL3/src/audio/sndio/SDL_sndioaudio.c | 2 +- libs/SDL3/src/audio/sndio/SDL_sndioaudio.h | 2 +- libs/SDL3/src/audio/vita/SDL_vitaaudio.c | 2 +- libs/SDL3/src/audio/vita/SDL_vitaaudio.h | 2 +- libs/SDL3/src/audio/wasapi/SDL_wasapi.c | 20 +- libs/SDL3/src/audio/wasapi/SDL_wasapi.h | 3 +- libs/SDL3/src/camera/SDL_camera.c | 8 +- libs/SDL3/src/camera/SDL_camera_c.h | 2 +- libs/SDL3/src/camera/SDL_syscamera.h | 2 +- .../src/camera/android/SDL_camera_android.c | 37 +- .../camera/coremedia/SDL_camera_coremedia.m | 2 +- libs/SDL3/src/camera/dummy/SDL_camera_dummy.c | 2 +- .../camera/emscripten/SDL_camera_emscripten.c | 2 +- .../SDL_camera_mediafoundation.c | 2 +- .../src/camera/pipewire/SDL_camera_pipewire.c | 25 +- libs/SDL3/src/camera/v4l2/SDL_camera_v4l2.c | 2 +- libs/SDL3/src/camera/vita/SDL_camera_vita.c | 2 +- libs/SDL3/src/core/SDL_core_unsupported.c | 2 +- libs/SDL3/src/core/android/SDL_android.c | 49 +- libs/SDL3/src/core/android/SDL_android.h | 2 +- .../src/core/freebsd/SDL_evdev_kbd_freebsd.c | 2 +- libs/SDL3/src/core/gdk/SDL_gdk.cpp | 2 +- libs/SDL3/src/core/gdk/SDL_gdk.h | 2 +- libs/SDL3/src/core/haiku/SDL_BApp.h | 2 +- libs/SDL3/src/core/haiku/SDL_BeApp.cc | 2 +- libs/SDL3/src/core/haiku/SDL_BeApp.h | 2 +- libs/SDL3/src/core/linux/SDL_dbus.c | 2 +- libs/SDL3/src/core/linux/SDL_dbus.h | 2 +- libs/SDL3/src/core/linux/SDL_evdev.c | 6 +- libs/SDL3/src/core/linux/SDL_evdev.h | 2 +- .../src/core/linux/SDL_evdev_capabilities.c | 2 +- .../src/core/linux/SDL_evdev_capabilities.h | 2 +- libs/SDL3/src/core/linux/SDL_evdev_kbd.c | 2 +- libs/SDL3/src/core/linux/SDL_evdev_kbd.h | 2 +- .../linux/SDL_evdev_kbd_default_accents.h | 2 +- .../core/linux/SDL_evdev_kbd_default_keymap.h | 2 +- libs/SDL3/src/core/linux/SDL_fcitx.c | 2 +- libs/SDL3/src/core/linux/SDL_fcitx.h | 2 +- libs/SDL3/src/core/linux/SDL_ibus.c | 2 +- libs/SDL3/src/core/linux/SDL_ibus.h | 2 +- libs/SDL3/src/core/linux/SDL_ime.c | 2 +- libs/SDL3/src/core/linux/SDL_ime.h | 2 +- libs/SDL3/src/core/linux/SDL_system_theme.c | 2 +- libs/SDL3/src/core/linux/SDL_system_theme.h | 2 +- libs/SDL3/src/core/linux/SDL_threadprio.c | 2 +- libs/SDL3/src/core/linux/SDL_udev.c | 2 +- libs/SDL3/src/core/linux/SDL_udev.h | 2 +- libs/SDL3/src/core/openbsd/SDL_wscons.h | 2 +- libs/SDL3/src/core/openbsd/SDL_wscons_kbd.c | 2 +- libs/SDL3/src/core/openbsd/SDL_wscons_mouse.c | 2 +- libs/SDL3/src/core/unix/SDL_appid.c | 2 +- libs/SDL3/src/core/unix/SDL_appid.h | 2 +- libs/SDL3/src/core/unix/SDL_poll.c | 2 +- libs/SDL3/src/core/unix/SDL_poll.h | 2 +- libs/SDL3/src/core/windows/SDL_directx.h | 2 +- libs/SDL3/src/core/windows/SDL_hid.c | 2 +- libs/SDL3/src/core/windows/SDL_hid.h | 2 +- libs/SDL3/src/core/windows/SDL_immdevice.c | 2 +- libs/SDL3/src/core/windows/SDL_immdevice.h | 2 +- libs/SDL3/src/core/windows/SDL_windows.c | 2 +- libs/SDL3/src/core/windows/SDL_windows.h | 2 +- libs/SDL3/src/core/windows/SDL_xinput.c | 2 +- libs/SDL3/src/core/windows/SDL_xinput.h | 2 +- libs/SDL3/src/core/windows/pch.c | 2 +- libs/SDL3/src/core/windows/pch_cpp.cpp | 2 +- libs/SDL3/src/core/windows/version.rc | 10 +- libs/SDL3/src/cpuinfo/SDL_cpuinfo.c | 2 +- libs/SDL3/src/cpuinfo/SDL_cpuinfo_c.h | 2 +- libs/SDL3/src/dialog/SDL_dialog.c | 2 +- libs/SDL3/src/dialog/SDL_dialog.h | 2 +- libs/SDL3/src/dialog/SDL_dialog_utils.c | 2 +- libs/SDL3/src/dialog/SDL_dialog_utils.h | 2 +- .../src/dialog/android/SDL_androiddialog.c | 2 +- libs/SDL3/src/dialog/cocoa/SDL_cocoadialog.m | 8 +- libs/SDL3/src/dialog/dummy/SDL_dummydialog.c | 2 +- libs/SDL3/src/dialog/haiku/SDL_haikudialog.cc | 2 +- libs/SDL3/src/dialog/unix/SDL_portaldialog.c | 72 +- libs/SDL3/src/dialog/unix/SDL_portaldialog.h | 2 +- libs/SDL3/src/dialog/unix/SDL_unixdialog.c | 2 +- libs/SDL3/src/dialog/unix/SDL_zenitydialog.c | 2 +- libs/SDL3/src/dialog/unix/SDL_zenitydialog.h | 2 +- .../src/dialog/windows/SDL_windowsdialog.c | 234 +- libs/SDL3/src/dynapi/SDL_dynapi.c | 5 +- libs/SDL3/src/dynapi/SDL_dynapi.h | 2 +- libs/SDL3/src/dynapi/SDL_dynapi.sym | 5 +- libs/SDL3/src/dynapi/SDL_dynapi_overrides.h | 7 +- libs/SDL3/src/dynapi/SDL_dynapi_procs.h | 11 +- libs/SDL3/src/dynapi/SDL_dynapi_unsupported.h | 2 +- libs/SDL3/src/dynapi/gendynapi.py | 2 +- libs/SDL3/src/events/SDL_categories.c | 3 +- libs/SDL3/src/events/SDL_categories_c.h | 2 +- libs/SDL3/src/events/SDL_clipboardevents.c | 13 +- libs/SDL3/src/events/SDL_clipboardevents_c.h | 4 +- libs/SDL3/src/events/SDL_displayevents.c | 2 +- libs/SDL3/src/events/SDL_displayevents_c.h | 2 +- libs/SDL3/src/events/SDL_dropevents.c | 2 +- libs/SDL3/src/events/SDL_dropevents_c.h | 2 +- libs/SDL3/src/events/SDL_events.c | 58 +- libs/SDL3/src/events/SDL_events_c.h | 4 +- libs/SDL3/src/events/SDL_keyboard.c | 13 +- libs/SDL3/src/events/SDL_keyboard_c.h | 2 +- libs/SDL3/src/events/SDL_keymap.c | 58 +- libs/SDL3/src/events/SDL_keymap_c.h | 2 +- libs/SDL3/src/events/SDL_keysym_to_keycode.c | 68 + .../SDL3/src/events/SDL_keysym_to_keycode_c.h | 28 + libs/SDL3/src/events/SDL_keysym_to_scancode.c | 3 +- .../src/events/SDL_keysym_to_scancode_c.h | 2 +- libs/SDL3/src/events/SDL_mouse.c | 85 +- libs/SDL3/src/events/SDL_mouse_c.h | 6 +- libs/SDL3/src/events/SDL_pen.c | 104 +- libs/SDL3/src/events/SDL_pen_c.h | 13 +- libs/SDL3/src/events/SDL_quit.c | 2 +- libs/SDL3/src/events/SDL_scancode_tables.c | 2 +- libs/SDL3/src/events/SDL_scancode_tables_c.h | 2 +- libs/SDL3/src/events/SDL_touch.c | 52 +- libs/SDL3/src/events/SDL_touch_c.h | 4 +- libs/SDL3/src/events/SDL_windowevents.c | 6 +- libs/SDL3/src/events/SDL_windowevents_c.h | 2 +- libs/SDL3/src/events/blank_cursor.h | 2 +- libs/SDL3/src/events/default_cursor.h | 2 +- libs/SDL3/src/events/scancodes_darwin.h | 2 +- libs/SDL3/src/events/scancodes_linux.h | 2 +- libs/SDL3/src/events/scancodes_windows.h | 2 +- libs/SDL3/src/events/scancodes_xfree86.h | 2 +- libs/SDL3/src/filesystem/SDL_filesystem.c | 9 +- libs/SDL3/src/filesystem/SDL_filesystem_c.h | 2 +- libs/SDL3/src/filesystem/SDL_sysfilesystem.h | 4 +- .../filesystem/android/SDL_sysfilesystem.c | 2 +- .../src/filesystem/cocoa/SDL_sysfilesystem.m | 2 +- .../src/filesystem/dummy/SDL_sysfilesystem.c | 2 +- libs/SDL3/src/filesystem/dummy/SDL_sysfsops.c | 4 +- .../filesystem/emscripten/SDL_sysfilesystem.c | 2 +- .../src/filesystem/gdk/SDL_sysfilesystem.cpp | 2 +- .../src/filesystem/haiku/SDL_sysfilesystem.cc | 2 +- .../src/filesystem/n3ds/SDL_sysfilesystem.c | 2 +- libs/SDL3/src/filesystem/posix/SDL_sysfsops.c | 41 +- .../src/filesystem/ps2/SDL_sysfilesystem.c | 2 +- .../src/filesystem/psp/SDL_sysfilesystem.c | 2 +- .../src/filesystem/riscos/SDL_sysfilesystem.c | 2 +- .../src/filesystem/unix/SDL_sysfilesystem.c | 2 +- .../src/filesystem/vita/SDL_sysfilesystem.c | 2 +- .../filesystem/windows/SDL_sysfilesystem.c | 14 +- .../src/filesystem/windows/SDL_sysfsops.c | 43 +- libs/SDL3/src/gpu/SDL_gpu.c | 20 +- libs/SDL3/src/gpu/SDL_sysgpu.h | 10 +- libs/SDL3/src/gpu/d3d12/SDL_gpu_d3d12.c | 447 +- libs/SDL3/src/gpu/metal/SDL_gpu_metal.m | 153 +- libs/SDL3/src/gpu/vulkan/SDL_gpu_vulkan.c | 288 +- .../src/gpu/vulkan/SDL_gpu_vulkan_vkfuncs.h | 2 +- libs/SDL3/src/haptic/SDL_haptic.c | 2 +- libs/SDL3/src/haptic/SDL_haptic_c.h | 2 +- libs/SDL3/src/haptic/SDL_syshaptic.h | 2 +- libs/SDL3/src/haptic/android/SDL_syshaptic.c | 2 +- .../SDL3/src/haptic/android/SDL_syshaptic_c.h | 2 +- libs/SDL3/src/haptic/darwin/SDL_syshaptic.c | 2 +- libs/SDL3/src/haptic/darwin/SDL_syshaptic_c.h | 2 +- libs/SDL3/src/haptic/dummy/SDL_syshaptic.c | 2 +- libs/SDL3/src/haptic/linux/SDL_syshaptic.c | 8 +- .../src/haptic/windows/SDL_dinputhaptic.c | 2 +- .../src/haptic/windows/SDL_dinputhaptic_c.h | 2 +- .../src/haptic/windows/SDL_windowshaptic.c | 2 +- .../src/haptic/windows/SDL_windowshaptic_c.h | 2 +- libs/SDL3/src/hidapi/SDL_hidapi.c | 2 +- libs/SDL3/src/hidapi/SDL_hidapi_android.h | 2 +- libs/SDL3/src/hidapi/SDL_hidapi_c.h | 2 +- libs/SDL3/src/hidapi/SDL_hidapi_ios.h | 2 +- libs/SDL3/src/hidapi/SDL_hidapi_libusb.h | 2 +- libs/SDL3/src/hidapi/SDL_hidapi_linux.h | 2 +- libs/SDL3/src/hidapi/SDL_hidapi_mac.h | 2 +- libs/SDL3/src/hidapi/SDL_hidapi_netbsd.h | 2 +- libs/SDL3/src/hidapi/SDL_hidapi_steamxbox.h | 2 +- libs/SDL3/src/hidapi/SDL_hidapi_windows.h | 2 +- libs/SDL3/src/hidapi/ios/hid.m | 16 +- .../src/hidapi/libusb/hidapi_thread_sdl.h | 2 +- libs/SDL3/src/{file => io}/SDL_asyncio.c | 3 +- libs/SDL3/src/{file => io}/SDL_asyncio_c.h | 2 +- libs/SDL3/src/{file => io}/SDL_iostream.c | 2 +- libs/SDL3/src/{file => io}/SDL_iostream_c.h | 2 +- libs/SDL3/src/{file => io}/SDL_sysasyncio.h | 2 +- .../generic/SDL_asyncio_generic.c | 12 +- .../io_uring/SDL_asyncio_liburing.c | 4 +- .../src/{file => io}/n3ds/SDL_iostreamromfs.c | 2 +- .../src/{file => io}/n3ds/SDL_iostreamromfs.h | 2 +- .../windows/SDL_asyncio_windows_ioring.c | 4 +- libs/SDL3/src/joystick/SDL_gamepad.c | 10 +- libs/SDL3/src/joystick/SDL_gamepad_c.h | 2 +- libs/SDL3/src/joystick/SDL_gamepad_db.h | 10 +- libs/SDL3/src/joystick/SDL_joystick.c | 2 +- libs/SDL3/src/joystick/SDL_joystick_c.h | 2 +- .../src/joystick/SDL_steam_virtual_gamepad.c | 2 +- .../src/joystick/SDL_steam_virtual_gamepad.h | 2 +- libs/SDL3/src/joystick/SDL_sysjoystick.h | 2 +- .../src/joystick/android/SDL_sysjoystick.c | 2 +- .../src/joystick/android/SDL_sysjoystick_c.h | 2 +- .../SDL3/src/joystick/apple/SDL_mfijoystick.m | 464 +- .../src/joystick/apple/SDL_mfijoystick_c.h | 2 +- libs/SDL3/src/joystick/bsd/SDL_bsdjoystick.c | 2 +- .../src/joystick/darwin/SDL_iokitjoystick.c | 2 +- .../src/joystick/darwin/SDL_iokitjoystick_c.h | 2 +- .../SDL3/src/joystick/dummy/SDL_sysjoystick.c | 2 +- .../src/joystick/emscripten/SDL_sysjoystick.c | 24 +- .../joystick/emscripten/SDL_sysjoystick_c.h | 2 +- .../src/joystick/gdk/SDL_gameinputjoystick.c | 2 +- .../src/joystick/haiku/SDL_haikujoystick.cc | 2 +- .../src/joystick/hidapi/SDL_hidapi_combined.c | 2 +- .../src/joystick/hidapi/SDL_hidapi_gamecube.c | 2 +- .../src/joystick/hidapi/SDL_hidapi_luna.c | 2 +- .../src/joystick/hidapi/SDL_hidapi_nintendo.h | 2 +- .../SDL3/src/joystick/hidapi/SDL_hidapi_ps3.c | 2 +- .../SDL3/src/joystick/hidapi/SDL_hidapi_ps4.c | 82 +- .../SDL3/src/joystick/hidapi/SDL_hidapi_ps5.c | 92 +- .../src/joystick/hidapi/SDL_hidapi_rumble.c | 2 +- .../src/joystick/hidapi/SDL_hidapi_rumble.h | 2 +- .../src/joystick/hidapi/SDL_hidapi_shield.c | 12 +- .../src/joystick/hidapi/SDL_hidapi_stadia.c | 2 +- .../src/joystick/hidapi/SDL_hidapi_steam.c | 2 +- .../joystick/hidapi/SDL_hidapi_steam_hori.c | 2 +- .../src/joystick/hidapi/SDL_hidapi_switch.c | 209 +- .../SDL3/src/joystick/hidapi/SDL_hidapi_wii.c | 2 +- .../src/joystick/hidapi/SDL_hidapi_xbox360.c | 2 +- .../src/joystick/hidapi/SDL_hidapi_xbox360w.c | 2 +- .../src/joystick/hidapi/SDL_hidapi_xboxone.c | 2 +- .../src/joystick/hidapi/SDL_hidapijoystick.c | 2 +- .../joystick/hidapi/SDL_hidapijoystick_c.h | 2 +- .../SDL3/src/joystick/linux/SDL_sysjoystick.c | 6 +- .../src/joystick/linux/SDL_sysjoystick_c.h | 2 +- libs/SDL3/src/joystick/n3ds/SDL_sysjoystick.c | 2 +- libs/SDL3/src/joystick/ps2/SDL_sysjoystick.c | 2 +- libs/SDL3/src/joystick/psp/SDL_sysjoystick.c | 2 +- libs/SDL3/src/joystick/usb_ids.h | 2 +- .../joystick/virtual/SDL_virtualjoystick.c | 2 +- .../joystick/virtual/SDL_virtualjoystick_c.h | 2 +- libs/SDL3/src/joystick/vita/SDL_sysjoystick.c | 2 +- .../src/joystick/windows/SDL_dinputjoystick.c | 2 +- .../joystick/windows/SDL_dinputjoystick_c.h | 2 +- .../joystick/windows/SDL_rawinputjoystick.c | 2 +- .../joystick/windows/SDL_rawinputjoystick_c.h | 2 +- .../windows/SDL_windows_gaming_input.c | 13 +- .../joystick/windows/SDL_windowsjoystick.c | 6 +- .../joystick/windows/SDL_windowsjoystick_c.h | 2 +- .../src/joystick/windows/SDL_xinputjoystick.c | 2 +- .../joystick/windows/SDL_xinputjoystick_c.h | 2 +- libs/SDL3/src/libm/math_libm.h | 2 +- libs/SDL3/src/loadso/dlopen/SDL_sysloadso.c | 2 +- libs/SDL3/src/loadso/dummy/SDL_sysloadso.c | 2 +- libs/SDL3/src/loadso/windows/SDL_sysloadso.c | 2 +- libs/SDL3/src/locale/SDL_locale.c | 4 +- libs/SDL3/src/locale/SDL_syslocale.h | 2 +- libs/SDL3/src/locale/android/SDL_syslocale.c | 2 +- libs/SDL3/src/locale/dummy/SDL_syslocale.c | 2 +- .../src/locale/emscripten/SDL_syslocale.c | 2 +- libs/SDL3/src/locale/haiku/SDL_syslocale.cc | 2 +- libs/SDL3/src/locale/macos/SDL_syslocale.m | 2 +- libs/SDL3/src/locale/n3ds/SDL_syslocale.c | 2 +- libs/SDL3/src/locale/psp/SDL_syslocale.c | 2 +- libs/SDL3/src/locale/unix/SDL_syslocale.c | 2 +- libs/SDL3/src/locale/vita/SDL_syslocale.c | 2 +- libs/SDL3/src/locale/windows/SDL_syslocale.c | 2 +- libs/SDL3/src/main/SDL_main_callbacks.c | 2 +- libs/SDL3/src/main/SDL_main_callbacks.h | 2 +- libs/SDL3/src/main/SDL_runapp.c | 2 +- .../main/emscripten/SDL_sysmain_callbacks.c | 2 +- .../src/main/emscripten/SDL_sysmain_runapp.c | 2 +- libs/SDL3/src/main/gdk/SDL_sysmain_runapp.cpp | 2 +- .../src/main/generic/SDL_sysmain_callbacks.c | 45 +- .../SDL3/src/main/ios/SDL_sysmain_callbacks.m | 2 +- libs/SDL3/src/main/n3ds/SDL_sysmain_runapp.c | 2 +- libs/SDL3/src/main/ps2/SDL_sysmain_runapp.c | 2 +- libs/SDL3/src/main/psp/SDL_sysmain_runapp.c | 2 +- .../src/main/windows/SDL_sysmain_runapp.c | 2 +- libs/SDL3/src/misc/SDL_sysurl.h | 2 +- libs/SDL3/src/misc/SDL_url.c | 2 +- libs/SDL3/src/misc/android/SDL_sysurl.c | 2 +- libs/SDL3/src/misc/dummy/SDL_sysurl.c | 2 +- libs/SDL3/src/misc/emscripten/SDL_sysurl.c | 2 +- libs/SDL3/src/misc/haiku/SDL_sysurl.cc | 2 +- libs/SDL3/src/misc/ios/SDL_sysurl.m | 13 +- libs/SDL3/src/misc/macos/SDL_sysurl.m | 2 +- libs/SDL3/src/misc/riscos/SDL_sysurl.c | 2 +- libs/SDL3/src/misc/unix/SDL_sysurl.c | 2 +- libs/SDL3/src/misc/vita/SDL_sysurl.c | 2 +- libs/SDL3/src/misc/windows/SDL_sysurl.c | 2 +- libs/SDL3/src/power/SDL_power.c | 2 +- libs/SDL3/src/power/SDL_syspower.h | 2 +- libs/SDL3/src/power/android/SDL_syspower.c | 2 +- libs/SDL3/src/power/emscripten/SDL_syspower.c | 2 +- libs/SDL3/src/power/haiku/SDL_syspower.c | 2 +- libs/SDL3/src/power/linux/SDL_syspower.c | 2 +- libs/SDL3/src/power/macos/SDL_syspower.c | 2 +- libs/SDL3/src/power/n3ds/SDL_syspower.c | 2 +- libs/SDL3/src/power/psp/SDL_syspower.c | 2 +- libs/SDL3/src/power/uikit/SDL_syspower.h | 2 +- libs/SDL3/src/power/uikit/SDL_syspower.m | 2 +- libs/SDL3/src/power/vita/SDL_syspower.c | 2 +- libs/SDL3/src/power/windows/SDL_syspower.c | 2 +- libs/SDL3/src/process/SDL_process.c | 2 +- libs/SDL3/src/process/SDL_sysprocess.h | 2 +- .../SDL3/src/process/dummy/SDL_dummyprocess.c | 2 +- .../SDL3/src/process/posix/SDL_posixprocess.c | 14 +- .../src/process/windows/SDL_windowsprocess.c | 6 +- libs/SDL3/src/render/SDL_d3dmath.c | 2 +- libs/SDL3/src/render/SDL_d3dmath.h | 2 +- libs/SDL3/src/render/SDL_render.c | 149 +- libs/SDL3/src/render/SDL_render_debug_font.h | 2 +- libs/SDL3/src/render/SDL_render_unsupported.c | 2 +- libs/SDL3/src/render/SDL_sysrender.h | 2 +- libs/SDL3/src/render/SDL_yuv_sw.c | 2 +- libs/SDL3/src/render/SDL_yuv_sw_c.h | 2 +- .../SDL3/src/render/direct3d/SDL_render_d3d.c | 2 +- .../src/render/direct3d/SDL_shaders_d3d.c | 2 +- .../src/render/direct3d/SDL_shaders_d3d.h | 2 +- .../src/render/direct3d11/SDL_render_d3d11.c | 2 +- .../src/render/direct3d11/SDL_shaders_d3d11.c | 2 +- .../src/render/direct3d11/SDL_shaders_d3d11.h | 2 +- .../src/render/direct3d12/SDL_render_d3d12.c | 2 +- .../direct3d12/SDL_render_d3d12_xbox.cpp | 2 +- .../render/direct3d12/SDL_render_d3d12_xbox.h | 2 +- .../src/render/direct3d12/SDL_shaders_d3d12.c | 2 +- .../src/render/direct3d12/SDL_shaders_d3d12.h | 2 +- .../direct3d12/SDL_shaders_d3d12_xboxone.cpp | 2 +- .../SDL_shaders_d3d12_xboxseries.cpp | 2 +- libs/SDL3/src/render/gpu/SDL_gpu_util.h | 2 +- libs/SDL3/src/render/gpu/SDL_pipeline_gpu.c | 2 +- libs/SDL3/src/render/gpu/SDL_pipeline_gpu.h | 2 +- libs/SDL3/src/render/gpu/SDL_render_gpu.c | 68 +- libs/SDL3/src/render/gpu/SDL_shaders_gpu.c | 2 +- libs/SDL3/src/render/gpu/SDL_shaders_gpu.h | 2 +- libs/SDL3/src/render/metal/SDL_render_metal.m | 119 +- .../src/render/metal/SDL_shaders_metal.metal | 159 +- .../src/render/metal/SDL_shaders_metal_ios.h | 4094 +++++++------ .../metal/SDL_shaders_metal_iphonesimulator.h | 5278 ++++++++++------- .../render/metal/SDL_shaders_metal_macos.h | 4012 +++++++------ .../src/render/metal/SDL_shaders_metal_tvos.h | 4094 +++++++------ .../metal/SDL_shaders_metal_tvsimulator.h | 4667 +++++++++------ libs/SDL3/src/render/opengl/SDL_glfuncs.h | 2 +- libs/SDL3/src/render/opengl/SDL_render_gl.c | 6 +- libs/SDL3/src/render/opengl/SDL_shaders_gl.c | 2 +- libs/SDL3/src/render/opengl/SDL_shaders_gl.h | 2 +- .../src/render/opengles2/SDL_gles2funcs.h | 2 +- .../src/render/opengles2/SDL_render_gles2.c | 2 +- .../src/render/opengles2/SDL_shaders_gles2.c | 2 +- .../src/render/opengles2/SDL_shaders_gles2.h | 2 +- libs/SDL3/src/render/ps2/SDL_render_ps2.c | 2 +- libs/SDL3/src/render/psp/SDL_render_psp.c | 2 +- libs/SDL3/src/render/psp/SDL_render_psp_c.h | 2 +- .../src/render/software/SDL_blendfillrect.c | 2 +- .../src/render/software/SDL_blendfillrect.h | 2 +- libs/SDL3/src/render/software/SDL_blendline.c | 2 +- libs/SDL3/src/render/software/SDL_blendline.h | 2 +- .../SDL3/src/render/software/SDL_blendpoint.c | 2 +- .../SDL3/src/render/software/SDL_blendpoint.h | 2 +- libs/SDL3/src/render/software/SDL_draw.h | 2 +- libs/SDL3/src/render/software/SDL_drawline.c | 2 +- libs/SDL3/src/render/software/SDL_drawline.h | 2 +- libs/SDL3/src/render/software/SDL_drawpoint.c | 2 +- libs/SDL3/src/render/software/SDL_drawpoint.h | 2 +- libs/SDL3/src/render/software/SDL_render_sw.c | 2 +- .../src/render/software/SDL_render_sw_c.h | 2 +- libs/SDL3/src/render/software/SDL_rotate.h | 2 +- libs/SDL3/src/render/software/SDL_triangle.c | 2 +- libs/SDL3/src/render/software/SDL_triangle.h | 2 +- .../src/render/vitagxm/SDL_render_vita_gxm.c | 2 +- .../vitagxm/SDL_render_vita_gxm_memory.c | 2 +- .../vitagxm/SDL_render_vita_gxm_memory.h | 2 +- .../vitagxm/SDL_render_vita_gxm_shaders.h | 2 +- .../vitagxm/SDL_render_vita_gxm_tools.c | 2 +- .../vitagxm/SDL_render_vita_gxm_tools.h | 2 +- .../vitagxm/SDL_render_vita_gxm_types.h | 2 +- .../src/render/vulkan/SDL_render_vulkan.c | 10 +- .../src/render/vulkan/SDL_shaders_vulkan.c | 2 +- .../src/render/vulkan/SDL_shaders_vulkan.h | 2 +- libs/SDL3/src/sensor/SDL_sensor.c | 2 +- libs/SDL3/src/sensor/SDL_sensor_c.h | 2 +- libs/SDL3/src/sensor/SDL_syssensor.h | 2 +- .../src/sensor/android/SDL_androidsensor.c | 2 +- .../src/sensor/android/SDL_androidsensor.h | 2 +- .../sensor/coremotion/SDL_coremotionsensor.h | 2 +- .../sensor/coremotion/SDL_coremotionsensor.m | 2 +- libs/SDL3/src/sensor/dummy/SDL_dummysensor.c | 2 +- libs/SDL3/src/sensor/dummy/SDL_dummysensor.h | 2 +- libs/SDL3/src/sensor/n3ds/SDL_n3dssensor.c | 2 +- libs/SDL3/src/sensor/vita/SDL_vitasensor.c | 2 +- libs/SDL3/src/sensor/vita/SDL_vitasensor.h | 2 +- .../src/sensor/windows/SDL_windowssensor.c | 2 +- .../src/sensor/windows/SDL_windowssensor.h | 2 +- libs/SDL3/src/stdlib/SDL_casefolding.h | 2 +- libs/SDL3/src/stdlib/SDL_crc16.c | 2 +- libs/SDL3/src/stdlib/SDL_crc32.c | 2 +- libs/SDL3/src/stdlib/SDL_getenv.c | 2 +- libs/SDL3/src/stdlib/SDL_getenv_c.h | 2 +- libs/SDL3/src/stdlib/SDL_iconv.c | 2 +- libs/SDL3/src/stdlib/SDL_malloc.c | 26 +- libs/SDL3/src/stdlib/SDL_memcpy.c | 2 +- libs/SDL3/src/stdlib/SDL_memmove.c | 2 +- libs/SDL3/src/stdlib/SDL_memset.c | 2 +- libs/SDL3/src/stdlib/SDL_mslibc.c | 10 +- libs/SDL3/src/stdlib/SDL_mslibc_arm64.masm | 26 + libs/SDL3/src/stdlib/SDL_murmur3.c | 2 +- libs/SDL3/src/stdlib/SDL_qsort.c | 2 +- libs/SDL3/src/stdlib/SDL_random.c | 2 +- libs/SDL3/src/stdlib/SDL_stdlib.c | 2 +- libs/SDL3/src/stdlib/SDL_string.c | 66 +- libs/SDL3/src/stdlib/SDL_strtokr.c | 2 +- libs/SDL3/src/stdlib/SDL_sysstdlib.h | 2 +- libs/SDL3/src/stdlib/SDL_vacopy.h | 2 +- libs/SDL3/src/storage/SDL_storage.c | 96 +- libs/SDL3/src/storage/SDL_sysstorage.h | 2 +- .../src/storage/generic/SDL_genericstorage.c | 75 +- .../SDL3/src/storage/steam/SDL_steamstorage.c | 2 +- libs/SDL3/src/test/SDL_test_assert.c | 2 +- libs/SDL3/src/test/SDL_test_common.c | 19 +- libs/SDL3/src/test/SDL_test_compare.c | 2 +- libs/SDL3/src/test/SDL_test_crc32.c | 2 +- libs/SDL3/src/test/SDL_test_font.c | 4 +- libs/SDL3/src/test/SDL_test_fuzzer.c | 12 +- libs/SDL3/src/test/SDL_test_harness.c | 2 +- libs/SDL3/src/test/SDL_test_log.c | 2 +- libs/SDL3/src/test/SDL_test_md5.c | 2 +- libs/SDL3/src/test/SDL_test_memory.c | 6 +- libs/SDL3/src/thread/SDL_systhread.h | 2 +- libs/SDL3/src/thread/SDL_thread.c | 57 +- libs/SDL3/src/thread/SDL_thread_c.h | 4 +- libs/SDL3/src/thread/generic/SDL_syscond.c | 2 +- libs/SDL3/src/thread/generic/SDL_syscond_c.h | 2 +- libs/SDL3/src/thread/generic/SDL_sysmutex.c | 2 +- libs/SDL3/src/thread/generic/SDL_sysmutex_c.h | 2 +- libs/SDL3/src/thread/generic/SDL_sysrwlock.c | 2 +- .../SDL3/src/thread/generic/SDL_sysrwlock_c.h | 2 +- libs/SDL3/src/thread/generic/SDL_syssem.c | 2 +- libs/SDL3/src/thread/generic/SDL_systhread.c | 2 +- .../SDL3/src/thread/generic/SDL_systhread_c.h | 2 +- libs/SDL3/src/thread/generic/SDL_systls.c | 2 +- libs/SDL3/src/thread/n3ds/SDL_syscond.c | 2 +- libs/SDL3/src/thread/n3ds/SDL_sysmutex.c | 2 +- libs/SDL3/src/thread/n3ds/SDL_sysmutex_c.h | 2 +- libs/SDL3/src/thread/n3ds/SDL_syssem.c | 2 +- libs/SDL3/src/thread/n3ds/SDL_systhread.c | 4 +- libs/SDL3/src/thread/n3ds/SDL_systhread_c.h | 2 +- libs/SDL3/src/thread/ps2/SDL_syssem.c | 2 +- libs/SDL3/src/thread/ps2/SDL_systhread.c | 2 +- libs/SDL3/src/thread/ps2/SDL_systhread_c.h | 2 +- libs/SDL3/src/thread/psp/SDL_sysmutex.c | 2 +- libs/SDL3/src/thread/psp/SDL_sysmutex_c.h | 2 +- libs/SDL3/src/thread/psp/SDL_syssem.c | 2 +- libs/SDL3/src/thread/psp/SDL_systhread.c | 2 +- libs/SDL3/src/thread/psp/SDL_systhread_c.h | 2 +- libs/SDL3/src/thread/pthread/SDL_syscond.c | 2 +- libs/SDL3/src/thread/pthread/SDL_sysmutex.c | 2 +- libs/SDL3/src/thread/pthread/SDL_sysmutex_c.h | 2 +- libs/SDL3/src/thread/pthread/SDL_sysrwlock.c | 2 +- libs/SDL3/src/thread/pthread/SDL_syssem.c | 2 +- libs/SDL3/src/thread/pthread/SDL_systhread.c | 16 +- .../SDL3/src/thread/pthread/SDL_systhread_c.h | 2 +- libs/SDL3/src/thread/pthread/SDL_systls.c | 2 +- libs/SDL3/src/thread/vita/SDL_sysmutex.c | 2 +- libs/SDL3/src/thread/vita/SDL_sysmutex_c.h | 2 +- libs/SDL3/src/thread/vita/SDL_syssem.c | 2 +- libs/SDL3/src/thread/vita/SDL_systhread.c | 2 +- libs/SDL3/src/thread/vita/SDL_systhread_c.h | 2 +- libs/SDL3/src/thread/windows/SDL_syscond_cv.c | 2 +- libs/SDL3/src/thread/windows/SDL_sysmutex.c | 2 +- libs/SDL3/src/thread/windows/SDL_sysmutex_c.h | 2 +- .../src/thread/windows/SDL_sysrwlock_srw.c | 2 +- libs/SDL3/src/thread/windows/SDL_syssem.c | 2 +- libs/SDL3/src/thread/windows/SDL_systhread.c | 2 +- .../SDL3/src/thread/windows/SDL_systhread_c.h | 2 +- libs/SDL3/src/thread/windows/SDL_systls.c | 2 +- libs/SDL3/src/time/SDL_time.c | 2 +- libs/SDL3/src/time/SDL_time_c.h | 2 +- libs/SDL3/src/time/n3ds/SDL_systime.c | 2 +- libs/SDL3/src/time/ps2/SDL_systime.c | 2 +- libs/SDL3/src/time/psp/SDL_systime.c | 2 +- libs/SDL3/src/time/unix/SDL_systime.c | 2 +- libs/SDL3/src/time/vita/SDL_systime.c | 2 +- libs/SDL3/src/time/windows/SDL_systime.c | 2 +- libs/SDL3/src/timer/SDL_timer.c | 2 +- libs/SDL3/src/timer/SDL_timer_c.h | 2 +- libs/SDL3/src/timer/haiku/SDL_systimer.c | 2 +- libs/SDL3/src/timer/n3ds/SDL_systimer.c | 2 +- libs/SDL3/src/timer/ps2/SDL_systimer.c | 2 +- libs/SDL3/src/timer/psp/SDL_systimer.c | 2 +- libs/SDL3/src/timer/unix/SDL_systimer.c | 2 +- libs/SDL3/src/timer/vita/SDL_systimer.c | 2 +- libs/SDL3/src/timer/windows/SDL_systimer.c | 2 +- libs/SDL3/src/tray/SDL_tray_utils.c | 91 + libs/SDL3/src/tray/SDL_tray_utils.h | 26 + libs/SDL3/src/tray/cocoa/SDL_tray.m | 196 +- libs/SDL3/src/tray/dummy/SDL_tray.c | 44 +- libs/SDL3/src/tray/unix/SDL_tray.c | 273 +- libs/SDL3/src/tray/windows/SDL_tray.c | 240 +- libs/SDL3/src/video/SDL_RLEaccel.c | 2 +- libs/SDL3/src/video/SDL_RLEaccel_c.h | 2 +- libs/SDL3/src/video/SDL_blit.c | 2 +- libs/SDL3/src/video/SDL_blit.h | 2 +- libs/SDL3/src/video/SDL_blit_0.c | 2 +- libs/SDL3/src/video/SDL_blit_1.c | 2 +- libs/SDL3/src/video/SDL_blit_A.c | 2 +- libs/SDL3/src/video/SDL_blit_N.c | 2 +- libs/SDL3/src/video/SDL_blit_auto.c | 2 +- libs/SDL3/src/video/SDL_blit_auto.h | 2 +- libs/SDL3/src/video/SDL_blit_copy.c | 2 +- libs/SDL3/src/video/SDL_blit_copy.h | 2 +- libs/SDL3/src/video/SDL_blit_slow.c | 2 +- libs/SDL3/src/video/SDL_blit_slow.h | 2 +- libs/SDL3/src/video/SDL_bmp.c | 2 +- libs/SDL3/src/video/SDL_clipboard.c | 95 +- libs/SDL3/src/video/SDL_clipboard_c.h | 7 +- libs/SDL3/src/video/SDL_egl.c | 6 +- libs/SDL3/src/video/SDL_egl_c.h | 2 +- libs/SDL3/src/video/SDL_fillrect.c | 2 +- libs/SDL3/src/video/SDL_pixels.c | 2 +- libs/SDL3/src/video/SDL_pixels_c.h | 2 +- libs/SDL3/src/video/SDL_rect.c | 2 +- libs/SDL3/src/video/SDL_rect_c.h | 2 +- libs/SDL3/src/video/SDL_rect_impl.h | 2 +- libs/SDL3/src/video/SDL_stretch.c | 2 +- libs/SDL3/src/video/SDL_surface.c | 2 +- libs/SDL3/src/video/SDL_surface_c.h | 2 +- libs/SDL3/src/video/SDL_sysvideo.h | 5 +- libs/SDL3/src/video/SDL_video.c | 122 +- libs/SDL3/src/video/SDL_video_c.h | 2 +- libs/SDL3/src/video/SDL_video_unsupported.c | 2 +- libs/SDL3/src/video/SDL_vulkan_internal.h | 2 +- libs/SDL3/src/video/SDL_vulkan_utils.c | 2 +- libs/SDL3/src/video/SDL_yuv.c | 2 +- libs/SDL3/src/video/SDL_yuv_c.h | 2 +- .../src/video/android/SDL_androidclipboard.c | 2 +- .../src/video/android/SDL_androidclipboard.h | 2 +- .../src/video/android/SDL_androidevents.c | 2 +- .../src/video/android/SDL_androidevents.h | 2 +- libs/SDL3/src/video/android/SDL_androidgl.c | 2 +- libs/SDL3/src/video/android/SDL_androidgl.h | 2 +- .../src/video/android/SDL_androidkeyboard.c | 2 +- .../src/video/android/SDL_androidkeyboard.h | 2 +- .../src/video/android/SDL_androidmessagebox.c | 2 +- .../src/video/android/SDL_androidmessagebox.h | 2 +- .../SDL3/src/video/android/SDL_androidmouse.c | 2 +- .../SDL3/src/video/android/SDL_androidmouse.h | 2 +- libs/SDL3/src/video/android/SDL_androidpen.c | 98 + libs/SDL3/src/video/android/SDL_androidpen.h | 25 + .../SDL3/src/video/android/SDL_androidtouch.c | 12 +- .../SDL3/src/video/android/SDL_androidtouch.h | 2 +- .../SDL3/src/video/android/SDL_androidvideo.c | 43 +- .../SDL3/src/video/android/SDL_androidvideo.h | 8 +- .../src/video/android/SDL_androidvulkan.c | 2 +- .../src/video/android/SDL_androidvulkan.h | 2 +- .../src/video/android/SDL_androidwindow.c | 4 +- .../src/video/android/SDL_androidwindow.h | 2 +- .../SDL3/src/video/cocoa/SDL_cocoaclipboard.h | 2 +- .../SDL3/src/video/cocoa/SDL_cocoaclipboard.m | 111 +- libs/SDL3/src/video/cocoa/SDL_cocoaevents.h | 2 +- libs/SDL3/src/video/cocoa/SDL_cocoaevents.m | 16 +- libs/SDL3/src/video/cocoa/SDL_cocoakeyboard.h | 2 +- libs/SDL3/src/video/cocoa/SDL_cocoakeyboard.m | 75 +- .../src/video/cocoa/SDL_cocoamessagebox.h | 2 +- .../src/video/cocoa/SDL_cocoamessagebox.m | 2 +- .../SDL3/src/video/cocoa/SDL_cocoametalview.h | 2 +- .../SDL3/src/video/cocoa/SDL_cocoametalview.m | 2 +- libs/SDL3/src/video/cocoa/SDL_cocoamodes.h | 3 +- libs/SDL3/src/video/cocoa/SDL_cocoamodes.m | 252 +- libs/SDL3/src/video/cocoa/SDL_cocoamouse.h | 3 +- libs/SDL3/src/video/cocoa/SDL_cocoamouse.m | 30 +- libs/SDL3/src/video/cocoa/SDL_cocoaopengl.h | 2 +- libs/SDL3/src/video/cocoa/SDL_cocoaopengl.m | 2 +- libs/SDL3/src/video/cocoa/SDL_cocoaopengles.h | 2 +- libs/SDL3/src/video/cocoa/SDL_cocoaopengles.m | 2 +- libs/SDL3/src/video/cocoa/SDL_cocoapen.h | 2 +- libs/SDL3/src/video/cocoa/SDL_cocoapen.m | 2 +- libs/SDL3/src/video/cocoa/SDL_cocoashape.h | 2 +- libs/SDL3/src/video/cocoa/SDL_cocoashape.m | 2 +- libs/SDL3/src/video/cocoa/SDL_cocoavideo.h | 69 +- libs/SDL3/src/video/cocoa/SDL_cocoavideo.m | 8 +- libs/SDL3/src/video/cocoa/SDL_cocoavulkan.h | 2 +- libs/SDL3/src/video/cocoa/SDL_cocoavulkan.m | 2 +- libs/SDL3/src/video/cocoa/SDL_cocoawindow.h | 6 +- libs/SDL3/src/video/cocoa/SDL_cocoawindow.m | 256 +- libs/SDL3/src/video/directx/SDL_d3d12.h | 2 +- .../src/video/directx/gen_xbox_cmacros.cs | 2 +- libs/SDL3/src/video/dummy/SDL_nullevents.c | 2 +- libs/SDL3/src/video/dummy/SDL_nullevents_c.h | 2 +- .../src/video/dummy/SDL_nullframebuffer.c | 2 +- .../src/video/dummy/SDL_nullframebuffer_c.h | 2 +- libs/SDL3/src/video/dummy/SDL_nullvideo.c | 2 +- libs/SDL3/src/video/dummy/SDL_nullvideo.h | 2 +- .../video/emscripten/SDL_emscriptenevents.c | 108 +- .../video/emscripten/SDL_emscriptenevents.h | 2 +- .../emscripten/SDL_emscriptenframebuffer.c | 2 +- .../emscripten/SDL_emscriptenframebuffer.h | 2 +- .../video/emscripten/SDL_emscriptenmouse.c | 2 +- .../video/emscripten/SDL_emscriptenmouse.h | 2 +- .../video/emscripten/SDL_emscriptenopengles.c | 14 +- .../video/emscripten/SDL_emscriptenopengles.h | 2 +- .../video/emscripten/SDL_emscriptenvideo.c | 42 +- .../video/emscripten/SDL_emscriptenvideo.h | 6 +- libs/SDL3/src/video/gdk/SDL_gdktextinput.cpp | 2 +- libs/SDL3/src/video/gdk/SDL_gdktextinput.h | 2 +- libs/SDL3/src/video/haiku/SDL_BWin.h | 2 +- libs/SDL3/src/video/haiku/SDL_bclipboard.cc | 2 +- libs/SDL3/src/video/haiku/SDL_bclipboard.h | 2 +- libs/SDL3/src/video/haiku/SDL_bevents.cc | 2 +- libs/SDL3/src/video/haiku/SDL_bevents.h | 2 +- libs/SDL3/src/video/haiku/SDL_bframebuffer.cc | 2 +- libs/SDL3/src/video/haiku/SDL_bframebuffer.h | 2 +- libs/SDL3/src/video/haiku/SDL_bkeyboard.cc | 2 +- libs/SDL3/src/video/haiku/SDL_bkeyboard.h | 2 +- libs/SDL3/src/video/haiku/SDL_bmessagebox.cc | 2 +- libs/SDL3/src/video/haiku/SDL_bmessagebox.h | 2 +- libs/SDL3/src/video/haiku/SDL_bmodes.cc | 2 +- libs/SDL3/src/video/haiku/SDL_bmodes.h | 2 +- libs/SDL3/src/video/haiku/SDL_bopengl.cc | 2 +- libs/SDL3/src/video/haiku/SDL_bopengl.h | 2 +- libs/SDL3/src/video/haiku/SDL_bvideo.cc | 2 +- libs/SDL3/src/video/haiku/SDL_bvideo.h | 2 +- libs/SDL3/src/video/haiku/SDL_bwindow.cc | 2 +- libs/SDL3/src/video/haiku/SDL_bwindow.h | 2 +- libs/SDL3/src/video/kmsdrm/SDL_kmsdrmdyn.c | 2 +- libs/SDL3/src/video/kmsdrm/SDL_kmsdrmdyn.h | 2 +- libs/SDL3/src/video/kmsdrm/SDL_kmsdrmevents.c | 2 +- libs/SDL3/src/video/kmsdrm/SDL_kmsdrmevents.h | 2 +- libs/SDL3/src/video/kmsdrm/SDL_kmsdrmmouse.c | 2 +- libs/SDL3/src/video/kmsdrm/SDL_kmsdrmmouse.h | 2 +- .../src/video/kmsdrm/SDL_kmsdrmopengles.c | 2 +- .../src/video/kmsdrm/SDL_kmsdrmopengles.h | 2 +- libs/SDL3/src/video/kmsdrm/SDL_kmsdrmsym.h | 2 +- libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvideo.c | 2 +- libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvideo.h | 2 +- libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvulkan.c | 2 +- libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvulkan.h | 2 +- libs/SDL3/src/video/n3ds/SDL_n3dsevents.c | 2 +- libs/SDL3/src/video/n3ds/SDL_n3dsevents_c.h | 2 +- .../SDL3/src/video/n3ds/SDL_n3dsframebuffer.c | 2 +- .../src/video/n3ds/SDL_n3dsframebuffer_c.h | 2 +- libs/SDL3/src/video/n3ds/SDL_n3dsswkb.c | 2 +- libs/SDL3/src/video/n3ds/SDL_n3dsswkb.h | 2 +- libs/SDL3/src/video/n3ds/SDL_n3dstouch.c | 4 +- libs/SDL3/src/video/n3ds/SDL_n3dstouch.h | 2 +- libs/SDL3/src/video/n3ds/SDL_n3dsvideo.c | 2 +- libs/SDL3/src/video/n3ds/SDL_n3dsvideo.h | 2 +- .../src/video/offscreen/SDL_offscreenevents.c | 2 +- .../video/offscreen/SDL_offscreenevents_c.h | 2 +- .../offscreen/SDL_offscreenframebuffer.c | 2 +- .../offscreen/SDL_offscreenframebuffer_c.h | 2 +- .../video/offscreen/SDL_offscreenopengles.c | 2 +- .../video/offscreen/SDL_offscreenopengles.h | 2 +- .../src/video/offscreen/SDL_offscreenvideo.c | 2 +- .../src/video/offscreen/SDL_offscreenvideo.h | 2 +- .../src/video/offscreen/SDL_offscreenvulkan.c | 2 +- .../src/video/offscreen/SDL_offscreenvulkan.h | 2 +- .../src/video/offscreen/SDL_offscreenwindow.c | 2 +- .../src/video/offscreen/SDL_offscreenwindow.h | 2 +- libs/SDL3/src/video/ps2/SDL_ps2video.c | 2 +- libs/SDL3/src/video/ps2/SDL_ps2video.h | 2 +- libs/SDL3/src/video/psp/SDL_pspevents.c | 2 +- libs/SDL3/src/video/psp/SDL_pspevents_c.h | 2 +- libs/SDL3/src/video/psp/SDL_pspgl.c | 2 +- libs/SDL3/src/video/psp/SDL_pspgl_c.h | 2 +- libs/SDL3/src/video/psp/SDL_pspmouse.c | 2 +- libs/SDL3/src/video/psp/SDL_pspmouse_c.h | 2 +- libs/SDL3/src/video/psp/SDL_pspvideo.c | 2 +- libs/SDL3/src/video/psp/SDL_pspvideo.h | 2 +- libs/SDL3/src/video/raspberry/SDL_rpievents.c | 2 +- .../src/video/raspberry/SDL_rpievents_c.h | 2 +- libs/SDL3/src/video/raspberry/SDL_rpimouse.c | 2 +- libs/SDL3/src/video/raspberry/SDL_rpimouse.h | 2 +- .../src/video/raspberry/SDL_rpiopengles.c | 2 +- .../src/video/raspberry/SDL_rpiopengles.h | 2 +- libs/SDL3/src/video/raspberry/SDL_rpivideo.c | 2 +- libs/SDL3/src/video/raspberry/SDL_rpivideo.h | 2 +- libs/SDL3/src/video/riscos/SDL_riscosdefs.h | 2 +- libs/SDL3/src/video/riscos/SDL_riscosevents.c | 2 +- .../src/video/riscos/SDL_riscosevents_c.h | 2 +- .../src/video/riscos/SDL_riscosframebuffer.c | 2 +- .../video/riscos/SDL_riscosframebuffer_c.h | 2 +- .../src/video/riscos/SDL_riscosmessagebox.c | 2 +- .../src/video/riscos/SDL_riscosmessagebox.h | 2 +- libs/SDL3/src/video/riscos/SDL_riscosmodes.c | 2 +- libs/SDL3/src/video/riscos/SDL_riscosmodes.h | 2 +- libs/SDL3/src/video/riscos/SDL_riscosmouse.c | 2 +- libs/SDL3/src/video/riscos/SDL_riscosmouse.h | 2 +- libs/SDL3/src/video/riscos/SDL_riscosvideo.c | 2 +- libs/SDL3/src/video/riscos/SDL_riscosvideo.h | 2 +- libs/SDL3/src/video/riscos/SDL_riscoswindow.c | 2 +- libs/SDL3/src/video/riscos/SDL_riscoswindow.h | 2 +- libs/SDL3/src/video/riscos/scancodes_riscos.h | 2 +- libs/SDL3/src/video/sdlgenblit.pl | 2 +- .../src/video/uikit/SDL_uikitappdelegate.h | 2 +- .../src/video/uikit/SDL_uikitappdelegate.m | 24 +- .../SDL3/src/video/uikit/SDL_uikitclipboard.h | 2 +- .../SDL3/src/video/uikit/SDL_uikitclipboard.m | 2 +- libs/SDL3/src/video/uikit/SDL_uikitevents.h | 2 +- libs/SDL3/src/video/uikit/SDL_uikitevents.m | 54 +- .../src/video/uikit/SDL_uikitmessagebox.h | 2 +- .../src/video/uikit/SDL_uikitmessagebox.m | 2 +- .../SDL3/src/video/uikit/SDL_uikitmetalview.h | 2 +- .../SDL3/src/video/uikit/SDL_uikitmetalview.m | 2 +- libs/SDL3/src/video/uikit/SDL_uikitmodes.h | 2 +- libs/SDL3/src/video/uikit/SDL_uikitmodes.m | 21 +- libs/SDL3/src/video/uikit/SDL_uikitopengles.h | 2 +- libs/SDL3/src/video/uikit/SDL_uikitopengles.m | 2 +- .../src/video/uikit/SDL_uikitopenglview.h | 2 +- .../src/video/uikit/SDL_uikitopenglview.m | 2 +- libs/SDL3/src/video/uikit/SDL_uikitpen.h | 39 + libs/SDL3/src/video/uikit/SDL_uikitpen.m | 189 + libs/SDL3/src/video/uikit/SDL_uikitvideo.h | 2 +- libs/SDL3/src/video/uikit/SDL_uikitvideo.m | 11 +- libs/SDL3/src/video/uikit/SDL_uikitview.h | 9 +- libs/SDL3/src/video/uikit/SDL_uikitview.m | 389 +- .../src/video/uikit/SDL_uikitviewcontroller.h | 2 +- .../src/video/uikit/SDL_uikitviewcontroller.m | 52 +- libs/SDL3/src/video/uikit/SDL_uikitvulkan.h | 2 +- libs/SDL3/src/video/uikit/SDL_uikitvulkan.m | 2 +- libs/SDL3/src/video/uikit/SDL_uikitwindow.h | 2 +- libs/SDL3/src/video/uikit/SDL_uikitwindow.m | 4 +- .../SDL3/src/video/vita/SDL_vitaframebuffer.c | 2 +- .../SDL3/src/video/vita/SDL_vitaframebuffer.h | 2 +- libs/SDL3/src/video/vita/SDL_vitagl_pvr.c | 2 +- libs/SDL3/src/video/vita/SDL_vitagl_pvr_c.h | 2 +- libs/SDL3/src/video/vita/SDL_vitagles.c | 2 +- libs/SDL3/src/video/vita/SDL_vitagles_c.h | 2 +- libs/SDL3/src/video/vita/SDL_vitagles_pvr.c | 2 +- libs/SDL3/src/video/vita/SDL_vitagles_pvr_c.h | 2 +- libs/SDL3/src/video/vita/SDL_vitakeyboard.c | 2 +- libs/SDL3/src/video/vita/SDL_vitakeyboard.h | 2 +- libs/SDL3/src/video/vita/SDL_vitamessagebox.c | 2 +- libs/SDL3/src/video/vita/SDL_vitamessagebox.h | 2 +- libs/SDL3/src/video/vita/SDL_vitamouse.c | 2 +- libs/SDL3/src/video/vita/SDL_vitamouse_c.h | 2 +- libs/SDL3/src/video/vita/SDL_vitatouch.c | 6 +- libs/SDL3/src/video/vita/SDL_vitatouch.h | 2 +- libs/SDL3/src/video/vita/SDL_vitavideo.c | 2 +- libs/SDL3/src/video/vita/SDL_vitavideo.h | 2 +- .../src/video/vivante/SDL_vivanteopengles.c | 2 +- .../src/video/vivante/SDL_vivanteopengles.h | 2 +- .../src/video/vivante/SDL_vivanteplatform.c | 2 +- .../src/video/vivante/SDL_vivanteplatform.h | 2 +- .../SDL3/src/video/vivante/SDL_vivantevideo.c | 2 +- .../SDL3/src/video/vivante/SDL_vivantevideo.h | 2 +- .../src/video/vivante/SDL_vivantevulkan.c | 2 +- .../src/video/vivante/SDL_vivantevulkan.h | 2 +- .../src/video/wayland/SDL_waylandclipboard.c | 2 +- .../src/video/wayland/SDL_waylandclipboard.h | 2 +- .../video/wayland/SDL_waylanddatamanager.c | 2 +- .../video/wayland/SDL_waylanddatamanager.h | 2 +- libs/SDL3/src/video/wayland/SDL_waylanddyn.c | 2 +- libs/SDL3/src/video/wayland/SDL_waylanddyn.h | 2 +- .../src/video/wayland/SDL_waylandevents.c | 188 +- .../src/video/wayland/SDL_waylandevents_c.h | 10 +- .../src/video/wayland/SDL_waylandkeyboard.c | 2 +- .../src/video/wayland/SDL_waylandkeyboard.h | 2 +- .../src/video/wayland/SDL_waylandmessagebox.c | 2 +- .../src/video/wayland/SDL_waylandmessagebox.h | 2 +- .../SDL3/src/video/wayland/SDL_waylandmouse.c | 5 +- .../SDL3/src/video/wayland/SDL_waylandmouse.h | 2 +- .../src/video/wayland/SDL_waylandopengles.c | 2 +- .../src/video/wayland/SDL_waylandopengles.h | 2 +- .../src/video/wayland/SDL_waylandshmbuffer.c | 2 +- .../src/video/wayland/SDL_waylandshmbuffer.h | 2 +- libs/SDL3/src/video/wayland/SDL_waylandsym.h | 2 +- .../SDL3/src/video/wayland/SDL_waylandvideo.c | 5 +- .../SDL3/src/video/wayland/SDL_waylandvideo.h | 2 +- .../src/video/wayland/SDL_waylandvulkan.c | 2 +- .../src/video/wayland/SDL_waylandvulkan.h | 2 +- .../src/video/wayland/SDL_waylandwindow.c | 112 +- .../src/video/wayland/SDL_waylandwindow.h | 8 +- libs/SDL3/src/video/windows/SDL_msctf.h | 2 +- .../src/video/windows/SDL_surface_utils.c | 8 +- .../src/video/windows/SDL_surface_utils.h | 4 +- .../src/video/windows/SDL_windowsclipboard.c | 181 +- .../src/video/windows/SDL_windowsclipboard.h | 2 +- .../src/video/windows/SDL_windowsevents.c | 319 +- .../src/video/windows/SDL_windowsevents.h | 2 +- .../video/windows/SDL_windowsframebuffer.c | 2 +- .../video/windows/SDL_windowsframebuffer.h | 2 +- .../src/video/windows/SDL_windowsgameinput.c | 2 +- .../src/video/windows/SDL_windowsgameinput.h | 2 +- .../src/video/windows/SDL_windowskeyboard.c | 2 +- .../src/video/windows/SDL_windowskeyboard.h | 2 +- .../src/video/windows/SDL_windowsmessagebox.c | 67 +- .../src/video/windows/SDL_windowsmessagebox.h | 2 +- .../SDL3/src/video/windows/SDL_windowsmodes.c | 2 +- .../SDL3/src/video/windows/SDL_windowsmodes.h | 2 +- .../SDL3/src/video/windows/SDL_windowsmouse.c | 4 +- .../SDL3/src/video/windows/SDL_windowsmouse.h | 2 +- .../src/video/windows/SDL_windowsopengl.c | 2 +- .../src/video/windows/SDL_windowsopengl.h | 2 +- .../src/video/windows/SDL_windowsopengles.c | 2 +- .../src/video/windows/SDL_windowsopengles.h | 2 +- .../src/video/windows/SDL_windowsrawinput.c | 2 +- .../src/video/windows/SDL_windowsrawinput.h | 2 +- .../SDL3/src/video/windows/SDL_windowsshape.c | 2 +- .../SDL3/src/video/windows/SDL_windowsshape.h | 2 +- .../SDL3/src/video/windows/SDL_windowsvideo.c | 4 +- .../SDL3/src/video/windows/SDL_windowsvideo.h | 5 +- .../src/video/windows/SDL_windowsvulkan.c | 2 +- .../src/video/windows/SDL_windowsvulkan.h | 2 +- .../src/video/windows/SDL_windowswindow.c | 118 +- .../src/video/windows/SDL_windowswindow.h | 6 +- libs/SDL3/src/video/windows/wmmsg.h | 2 +- libs/SDL3/src/video/x11/SDL_x11clipboard.c | 2 +- libs/SDL3/src/video/x11/SDL_x11clipboard.h | 2 +- libs/SDL3/src/video/x11/SDL_x11dyn.c | 12 +- libs/SDL3/src/video/x11/SDL_x11dyn.h | 6 +- libs/SDL3/src/video/x11/SDL_x11events.c | 286 +- libs/SDL3/src/video/x11/SDL_x11events.h | 2 +- libs/SDL3/src/video/x11/SDL_x11framebuffer.c | 2 +- libs/SDL3/src/video/x11/SDL_x11framebuffer.h | 2 +- libs/SDL3/src/video/x11/SDL_x11keyboard.c | 401 +- libs/SDL3/src/video/x11/SDL_x11keyboard.h | 4 +- libs/SDL3/src/video/x11/SDL_x11messagebox.c | 14 +- libs/SDL3/src/video/x11/SDL_x11messagebox.h | 2 +- libs/SDL3/src/video/x11/SDL_x11modes.c | 74 +- libs/SDL3/src/video/x11/SDL_x11modes.h | 2 +- libs/SDL3/src/video/x11/SDL_x11mouse.c | 2 +- libs/SDL3/src/video/x11/SDL_x11mouse.h | 2 +- libs/SDL3/src/video/x11/SDL_x11opengl.c | 2 +- libs/SDL3/src/video/x11/SDL_x11opengl.h | 2 +- libs/SDL3/src/video/x11/SDL_x11opengles.c | 2 +- libs/SDL3/src/video/x11/SDL_x11opengles.h | 2 +- libs/SDL3/src/video/x11/SDL_x11pen.c | 2 +- libs/SDL3/src/video/x11/SDL_x11pen.h | 2 +- libs/SDL3/src/video/x11/SDL_x11shape.c | 2 +- libs/SDL3/src/video/x11/SDL_x11shape.h | 2 +- libs/SDL3/src/video/x11/SDL_x11sym.h | 4 +- libs/SDL3/src/video/x11/SDL_x11touch.c | 2 +- libs/SDL3/src/video/x11/SDL_x11touch.h | 2 +- libs/SDL3/src/video/x11/SDL_x11video.c | 2 +- libs/SDL3/src/video/x11/SDL_x11video.h | 18 +- libs/SDL3/src/video/x11/SDL_x11vulkan.c | 2 +- libs/SDL3/src/video/x11/SDL_x11vulkan.h | 2 +- libs/SDL3/src/video/x11/SDL_x11window.c | 95 +- libs/SDL3/src/video/x11/SDL_x11window.h | 9 +- libs/SDL3/src/video/x11/SDL_x11xfixes.c | 2 +- libs/SDL3/src/video/x11/SDL_x11xfixes.h | 2 +- libs/SDL3/src/video/x11/SDL_x11xinput2.c | 6 +- libs/SDL3/src/video/x11/SDL_x11xinput2.h | 2 +- libs/SDL3/src/video/x11/SDL_x11xsync.c | 2 +- libs/SDL3/src/video/x11/SDL_x11xsync.h | 2 +- libs/SDL3/test/CMakeLists.txt | 102 +- libs/SDL3/test/LICENSE.txt | 2 +- libs/SDL3/test/checkkeys.c | 5 +- libs/SDL3/test/gamepad_wired.bmp | Bin 0 -> 1226 bytes libs/SDL3/test/gamepad_wired.h | 106 + libs/SDL3/test/gamepad_wireless.bmp | Bin 0 -> 1162 bytes libs/SDL3/test/gamepad_wireless.h | 100 + libs/SDL3/test/gamepadutils.c | 31 +- libs/SDL3/test/gamepadutils.h | 2 +- libs/SDL3/test/loopwave.c | 2 +- libs/SDL3/test/pretest.c | 2 +- libs/SDL3/test/testasyncio.c | 4 +- libs/SDL3/test/testatomic.c | 2 +- libs/SDL3/test/testaudio.c | 2 +- libs/SDL3/test/testaudiohotplug.c | 2 +- libs/SDL3/test/testaudioinfo.c | 2 +- libs/SDL3/test/testaudiorecording.c | 4 +- .../test/testaudiostreamdynamicresample.c | 2 +- libs/SDL3/test/testautomation.c | 2 +- libs/SDL3/test/testautomation_clipboard.c | 15 +- libs/SDL3/test/testautomation_images.c | 2 +- libs/SDL3/test/testautomation_images.h | 2 +- libs/SDL3/test/testautomation_intrinsics.c | 86 +- libs/SDL3/test/testautomation_main.c | 2 + libs/SDL3/test/testautomation_render.c | 4 +- libs/SDL3/test/testautomation_sdltest.c | 6 +- libs/SDL3/test/testautomation_stdlib.c | 27 + libs/SDL3/test/testautomation_video.c | 9 +- libs/SDL3/test/testbounds.c | 2 +- libs/SDL3/test/testcamera.c | 55 +- libs/SDL3/test/testclipboard.c | 180 + libs/SDL3/test/testcolorspace.c | 2 +- libs/SDL3/test/testcontroller.c | 794 ++- libs/SDL3/test/testcustomcursor.c | 2 +- libs/SDL3/test/testdialog.c | 2 +- libs/SDL3/test/testdisplayinfo.c | 2 +- libs/SDL3/test/testdraw.c | 2 +- libs/SDL3/test/testdrawchessboard.c | 2 +- libs/SDL3/test/testdropfile.c | 2 +- libs/SDL3/test/testerror.c | 2 +- libs/SDL3/test/testevdev.c | 4 +- libs/SDL3/test/testffmpeg.c | 2 +- libs/SDL3/test/testffmpeg_vulkan.c | 2 +- libs/SDL3/test/testffmpeg_vulkan.h | 2 +- libs/SDL3/test/testfile.c | 2 +- libs/SDL3/test/testfilesystem.c | 131 +- libs/SDL3/test/testgeometry.c | 2 +- libs/SDL3/test/testgl.c | 10 +- libs/SDL3/test/testgles.c | 2 +- libs/SDL3/test/testgles2.c | 2 +- libs/SDL3/test/testgles2_sdf.c | 2 +- libs/SDL3/test/testgpu_simple_clear.c | 2 +- libs/SDL3/test/testgpu_spinning_cube.c | 12 +- libs/SDL3/test/testhittesting.c | 2 +- libs/SDL3/test/testhotplug.c | 2 +- libs/SDL3/test/testiconv.c | 2 +- libs/SDL3/test/testime.c | 2 +- libs/SDL3/test/testintersections.c | 2 +- libs/SDL3/test/testkeys.c | 2 +- libs/SDL3/test/testloadso.c | 2 +- libs/SDL3/test/testlocale.c | 2 +- libs/SDL3/test/testlock.c | 2 +- libs/SDL3/test/testmanymouse.c | 2 +- libs/SDL3/test/testmessage.c | 8 +- libs/SDL3/test/testmodal.c | 2 +- libs/SDL3/test/testmouse.c | 2 +- libs/SDL3/test/testmultiaudio.c | 2 +- libs/SDL3/test/testnative.c | 2 +- libs/SDL3/test/testnative.h | 2 +- libs/SDL3/test/testnativew32.c | 2 +- libs/SDL3/test/testnativewayland.c | 2 +- libs/SDL3/test/testnativex11.c | 2 +- libs/SDL3/test/testoffscreen.c | 2 +- libs/SDL3/test/testoverlay.c | 2 +- libs/SDL3/test/testpen.c | 2 +- libs/SDL3/test/testplatform.c | 6 +- libs/SDL3/test/testpopup.c | 2 +- libs/SDL3/test/testpower.c | 2 +- libs/SDL3/test/testqsort.c | 2 +- libs/SDL3/test/testrelative.c | 2 +- libs/SDL3/test/testrendercopyex.c | 2 +- libs/SDL3/test/testrendertarget.c | 2 +- libs/SDL3/test/testresample.c | 2 +- libs/SDL3/test/testrumble.c | 2 +- libs/SDL3/test/testrwlock.c | 2 +- libs/SDL3/test/testscale.c | 2 +- libs/SDL3/test/testsem.c | 2 +- libs/SDL3/test/testsensor.c | 2 +- libs/SDL3/test/testshader.c | 2 +- libs/SDL3/test/testshape.c | 2 +- libs/SDL3/test/testsprite.c | 2 +- libs/SDL3/test/testspriteminimal.c | 2 +- libs/SDL3/test/testspritesurface.c | 2 +- libs/SDL3/test/teststreaming.c | 2 +- libs/SDL3/test/testsurround.c | 2 +- libs/SDL3/test/testthread.c | 2 +- libs/SDL3/test/testtime.c | 2 +- libs/SDL3/test/testtimer.c | 2 +- libs/SDL3/test/testtray.c | 52 +- libs/SDL3/test/testurl.c | 2 +- libs/SDL3/test/testutils.c | 2 +- libs/SDL3/test/testutils.h | 2 +- libs/SDL3/test/testver.c | 2 +- libs/SDL3/test/testviewport.c | 2 +- libs/SDL3/test/testvulkan.c | 2 +- libs/SDL3/test/testwaylandcustom.c | 2 +- libs/SDL3/test/testwm.c | 2 +- libs/SDL3/test/testyuv.c | 2 +- libs/SDL3/test/testyuv_cvt.c | 2 +- libs/SDL3/test/testyuv_cvt.h | 2 +- libs/SDL3/test/torturethread.c | 2 +- 1209 files changed, 26017 insertions(+), 18421 deletions(-) create mode 100644 libs/SDL3/.git-hash delete mode 100644 libs/SDL3/.gitignore delete mode 100644 libs/SDL3/README-SDL.txt create mode 100644 libs/SDL3/REVISION.txt create mode 100644 libs/SDL3/Xcode/SDL/pkg-support/resources/INSTALL.md delete mode 100644 libs/SDL3/Xcode/SDL/pkg-support/resources/License.txt delete mode 100644 libs/SDL3/Xcode/SDL/pkg-support/resources/ReadMe.txt create mode 100644 libs/SDL3/Xcode/SDL/pkg-support/resources/cmake/SDL3ConfigVersion.cmake create mode 100644 libs/SDL3/Xcode/SDL/pkg-support/resources/framework/INSTALL.md create mode 100644 libs/SDL3/Xcode/SDL/pkg-support/share/cmake/SDL3/SDL3ConfigVersion.cmake rename libs/SDL3/build-scripts/pkg-support/android/{ => aar}/__main__.py.in (100%) rename libs/SDL3/build-scripts/pkg-support/android/{ => aar}/cmake/SDL3Config.cmake (100%) rename libs/SDL3/build-scripts/pkg-support/android/{ => aar}/cmake/SDL3ConfigVersion.cmake.in (100%) rename libs/SDL3/build-scripts/pkg-support/android/{ => aar}/description.json.in (100%) create mode 100644 libs/SDL3/build-scripts/pkg-support/mingw/INSTALL.md delete mode 100644 libs/SDL3/build-scripts/pkg-support/mingw/INSTALL.txt create mode 100644 libs/SDL3/build-scripts/pkg-support/mingw/cmake/SDL3ConfigVersion.cmake create mode 100644 libs/SDL3/build-scripts/pkg-support/msvc/INSTALL.md create mode 100644 libs/SDL3/build-scripts/pkg-support/msvc/arm64/INSTALL.md.in create mode 100644 libs/SDL3/build-scripts/pkg-support/msvc/x64/INSTALL.md.in create mode 100644 libs/SDL3/build-scripts/pkg-support/msvc/x86/INSTALL.md.in create mode 100644 libs/SDL3/docs/INTRO-androidstudio.md create mode 100644 libs/SDL3/docs/INTRO-cmake.md create mode 100644 libs/SDL3/docs/INTRO-emscripten.md create mode 100644 libs/SDL3/docs/INTRO-visualstudio.md create mode 100644 libs/SDL3/docs/INTRO-xcode.md create mode 100644 libs/SDL3/docs/README-bsd.md delete mode 100644 libs/SDL3/docs/README-git.md create mode 100644 libs/SDL3/docs/README-haiku.md create mode 100644 libs/SDL3/docs/README-ps4.md create mode 100644 libs/SDL3/docs/README-ps5.md delete mode 100644 libs/SDL3/docs/README-raspberrypi.md create mode 100644 libs/SDL3/docs/README-steamos.md create mode 100644 libs/SDL3/docs/README-switch.md delete mode 100644 libs/SDL3/docs/README-visualc.md create mode 100644 libs/SDL3/docs/hello.c create mode 100644 libs/SDL3/src/events/SDL_keysym_to_keycode.c create mode 100644 libs/SDL3/src/events/SDL_keysym_to_keycode_c.h rename libs/SDL3/src/{file => io}/SDL_asyncio.c (99%) rename libs/SDL3/src/{file => io}/SDL_asyncio_c.h (94%) rename libs/SDL3/src/{file => io}/SDL_iostream.c (99%) rename libs/SDL3/src/{file => io}/SDL_iostream_c.h (95%) rename libs/SDL3/src/{file => io}/SDL_sysasyncio.h (98%) rename libs/SDL3/src/{file => io}/generic/SDL_asyncio_generic.c (97%) rename libs/SDL3/src/{file => io}/io_uring/SDL_asyncio_liburing.c (99%) rename libs/SDL3/src/{file => io}/n3ds/SDL_iostreamromfs.c (97%) rename libs/SDL3/src/{file => io}/n3ds/SDL_iostreamromfs.h (94%) rename libs/SDL3/src/{file => io}/windows/SDL_asyncio_windows_ioring.c (99%) create mode 100644 libs/SDL3/src/stdlib/SDL_mslibc_arm64.masm create mode 100644 libs/SDL3/src/tray/SDL_tray_utils.c create mode 100644 libs/SDL3/src/tray/SDL_tray_utils.h create mode 100644 libs/SDL3/src/video/android/SDL_androidpen.c create mode 100644 libs/SDL3/src/video/android/SDL_androidpen.h create mode 100644 libs/SDL3/src/video/uikit/SDL_uikitpen.h create mode 100644 libs/SDL3/src/video/uikit/SDL_uikitpen.m create mode 100644 libs/SDL3/test/gamepad_wired.bmp create mode 100644 libs/SDL3/test/gamepad_wired.h create mode 100644 libs/SDL3/test/gamepad_wireless.bmp create mode 100644 libs/SDL3/test/gamepad_wireless.h create mode 100644 libs/SDL3/test/testclipboard.c diff --git a/libs/SDL3/.git-hash b/libs/SDL3/.git-hash new file mode 100644 index 00000000..ab09ea1e --- /dev/null +++ b/libs/SDL3/.git-hash @@ -0,0 +1 @@ +535d80badefc83c5c527ec5748f2a20d6a9310fe diff --git a/libs/SDL3/.gitignore b/libs/SDL3/.gitignore deleted file mode 100644 index 394f4b84..00000000 --- a/libs/SDL3/.gitignore +++ /dev/null @@ -1,178 +0,0 @@ -build/ -build-*/ -!build-scripts/ -buildbot/ -/VERSION.txt -__pycache__ - -*.so -*.so.* -*.dll -*.exe -*.o -*.obj -*.res -*.lib -*.a -*.la -*.dSYM -*,e1f -*,ff8 -*.lnk -*.err -*.exp -*.map -*.orig -*~ -*.swp -*.tmp -*.rej - -# for CMake -.cmake -CMakeFiles/ -CMakeCache.txt -cmake_install.cmake -cmake_uninstall.cmake -install_manifest.txt -*Targets.cmake -*Config.cmake -*ConfigVersion.cmake -CTestTestfile.cmake -Testing -compile_commands.json -.cache/ -/include-config-* -/include-revision -/Makefile -.ninja_* -*.ninja -*.pc -test/*.test -wayland-generated-protocols - -# for CLion -.idea -cmake-build-* - -# for Xcode -*.mode1* -*.perspective* -*.pbxuser -(^|/)build($|/) -.DS_Store -xcuserdata -*.xcworkspace -Xcode/build.xcconfig - -# for Visual Studio Code -.vscode/ - -# for Visual C++ -.vs -Debug -Release -*.user -*.ncb -*.suo -*.sdf -VisualC/tests/gamepadmap/axis.bmp -VisualC/tests/gamepadmap/button.bmp -VisualC/tests/gamepadmap/gamepadmap.bmp -VisualC/tests/gamepadmap/gamepadmap_back.bmp -VisualC/tests/loopwave/sample.wav -VisualC/tests/testautomation/*.bmp -VisualC/tests/testgamepad/axis.bmp -VisualC/tests/testgamepad/button.bmp -VisualC/tests/testgamepad/gamepadmap.bmp -VisualC/tests/testgamepad/gamepadmap_back.bmp -VisualC/tests/testoverlay/moose.dat -VisualC/tests/testrendertarget/icon.bmp -VisualC/tests/testrendertarget/sample.bmp -VisualC/tests/testscale/icon.bmp -VisualC/tests/testscale/sample.bmp -VisualC/tests/testsprite/icon.bmp -VisualC/tests/testyuv/testyuv.bmp -VisualC-GDK/**/Layout -src/render/direct3d12/D3D12_*_One.h -src/render/direct3d12/D3D12_*_Series.h -src/gpu/d3d12/D3D12_*_One.h -src/gpu/d3d12/D3D12_*_Series.h - -# for Android -android-project/local.properties -android-project/.gradle/ - -test/checkkeys -test/checkkeysthreads -test/gamepadmap -test/loopwave -test/loopwavequeue -test/testatomic -test/testaudiorecording -test/testaudiohotplug -test/testaudioinfo -test/testautomation -test/testbounds -test/testcustomcursor -test/testdisplayinfo -test/testdraw -test/testdrawchessboard -test/testdropfile -test/testerror -test/testevdev -test/testfile -test/testfilesystem -test/testgamepad -test/testgeometry -test/testgesture -test/testgl -test/testgles -test/testgles2 -test/testhaptic -test/testhittesting -test/testhotplug -test/testiconv -test/testime -test/testintersections -test/testjoystick -test/testkeys -test/testloadso -test/testlocale -test/testlock -test/testmessage -test/testmouse -test/testmultiaudio -test/testnative -test/testoverlay -test/testplatform -test/testpower -test/testqsort -test/testrelative -test/testrendercopyex -test/testrendertarget -test/testresample -test/testrumble -test/testscale -test/testsem -test/testsensor -test/testshader -test/testshape -test/testsprite -test/testspriteminimal -test/teststreaming -test/testsurround -test/testthread -test/testtimer -test/testurl -test/testver -test/testviewport -test/testvulkan -test/testwm -test/testyuv -test/torturethread - -# for Doxygen -docs/output -SDL.tag -doxygen_warn.txt diff --git a/libs/SDL3/.wikiheaders-options b/libs/SDL3/.wikiheaders-options index 99c19dee..11f66687 100644 --- a/libs/SDL3/.wikiheaders-options +++ b/libs/SDL3/.wikiheaders-options @@ -16,7 +16,9 @@ bugreporturl = https://github.com/libsdl-org/sdlwiki/issues/new warn_about_missing = 0 wikipreamble = (This is the documentation for SDL3, which is the current stable version. [SDL2](https://wiki.libsdl.org/SDL2/) was the previous version!) wikiheaderfiletext = Defined in [](https://github.com/libsdl-org/SDL/blob/main/include/SDL3/%fname%) + manpageheaderfiletext = Defined in SDL3/%fname% +manpagesymbolfilterregex = \A[US]int\d+\Z # All SDL_test_* headers become undefined categories, everything else just converts like SDL_audio.h -> Audio # A handful of others we fix up in the header itself with /* WIKI CATEGORY: x */ comments. diff --git a/libs/SDL3/Android.mk b/libs/SDL3/Android.mk index 3e584f9a..b5fe8955 100644 --- a/libs/SDL3/Android.mk +++ b/libs/SDL3/Android.mk @@ -35,8 +35,8 @@ LOCAL_SRC_FILES := \ $(LOCAL_PATH)/src/dialog/android/SDL_androiddialog.c \ $(wildcard $(LOCAL_PATH)/src/dynapi/*.c) \ $(wildcard $(LOCAL_PATH)/src/events/*.c) \ - $(wildcard $(LOCAL_PATH)/src/file/*.c) \ - $(wildcard $(LOCAL_PATH)/src/file/generic/*.c) \ + $(wildcard $(LOCAL_PATH)/src/io/*.c) \ + $(wildcard $(LOCAL_PATH)/src/io/generic/*.c) \ $(wildcard $(LOCAL_PATH)/src/gpu/*.c) \ $(wildcard $(LOCAL_PATH)/src/gpu/vulkan/*.c) \ $(wildcard $(LOCAL_PATH)/src/haptic/*.c) \ @@ -79,6 +79,7 @@ LOCAL_SRC_FILES := \ $(wildcard $(LOCAL_PATH)/src/timer/*.c) \ $(wildcard $(LOCAL_PATH)/src/timer/unix/*.c) \ $(wildcard $(LOCAL_PATH)/src/tray/dummy/*.c) \ + $(wildcard $(LOCAL_PATH)/src/tray/*.c) \ $(wildcard $(LOCAL_PATH)/src/video/*.c) \ $(wildcard $(LOCAL_PATH)/src/video/android/*.c) \ $(wildcard $(LOCAL_PATH)/src/video/yuv2rgb/*.c)) diff --git a/libs/SDL3/BUGS.txt b/libs/SDL3/BUGS.txt index b1463e77..e5b8f28f 100644 --- a/libs/SDL3/BUGS.txt +++ b/libs/SDL3/BUGS.txt @@ -11,6 +11,9 @@ You may also find help at the SDL forums/mailing list: https://discourse.libsdl.org/ -Bug reports are welcome here, but we really appreciate if you use the issue - tracker, as bugs discussed on the mailing list may be forgotten or missed. +or on Discord: + + https://discord.com/invite/BwpFGBWsv8 + +Bug reports are welcome here, but we really appreciate if you use the issue tracker, as bugs discussed on the mailing list or Discord may be forgotten or missed. diff --git a/libs/SDL3/CMakeLists.txt b/libs/SDL3/CMakeLists.txt index f5bcf2a7..ef42f644 100644 --- a/libs/SDL3/CMakeLists.txt +++ b/libs/SDL3/CMakeLists.txt @@ -5,16 +5,16 @@ if(NOT DEFINED CMAKE_BUILD_TYPE) endif() # See docs/release_checklist.md -project(SDL3 LANGUAGES C VERSION "3.1.7") +project(SDL3 LANGUAGES C VERSION "3.2.0") if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) - set(SDL3_SUBPROJECT OFF) + set(SDL3_MAINPROJECT ON) else() - set(SDL3_SUBPROJECT ON) + set(SDL3_MAINPROJECT OFF) endif() # By default, configure SDL3 in RelWithDebInfo configuration -if(NOT SDL3_SUBPROJECT) +if(SDL3_MAINPROJECT) get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) if(is_multi_config) # The first item in CMAKE_CONFIGURATION_TYPES is the default configuration @@ -172,6 +172,11 @@ if(WINDOWS OR MACOS OR IOS OR TVOS OR VISIONOS OR WATCHOS) set(SDL_SYSTEM_ICONV_DEFAULT OFF) endif() +set(SDL_RELOCATABLE_DEFAULT OFF) +if(MSVC) + set(SDL_RELOCATABLE_DEFAULT ON) +endif() + if(MSVC) if(NOT SDL_LIBC) # Make sure /RTC1 is disabled, otherwise it will use functions from the CRT @@ -276,14 +281,20 @@ if(COMMAND SDL_Preseed_CMakeCache) set(SDL_PRESEED_AVAILABLE ON) endif() -# Allow some projects to be built conditionally. -set_option(SDL_DISABLE_INSTALL "Disable installation of SDL3" ${SDL3_SUBPROJECT}) -cmake_dependent_option(SDL_DISABLE_INSTALL_CPACK "Create binary SDL3 archive using CPack" ${SDL3_SUBPROJECT} "NOT SDL_DISABLE_INSTALL" ON) -cmake_dependent_option(SDL_DISABLE_INSTALL_DOCS "Install docs for SDL3" ON "NOT SDL_DISABLE_INSTALL;NOT SDL_FRAMEWORK" ON) -set_option(SDL_DISABLE_UNINSTALL "Disable uninstallation of SDL3" OFF) -cmake_dependent_option(SDL_PRESEED "Preseed CMake cache to speed up configuration" ON "${SDL_PRESEED_AVAILABLE}" OFF) +set(SDL_X11_XRANDR_DEFAULT ON) +if(SOLARIS) + set(SDL_X11_XRANDR_DEFAULT OFF) +endif() -cmake_dependent_option(SDL_DISABLE_ANDROID_JAR "Disable creation of SDL3.jar" ${SDL3_SUBPROJECT} "ANDROID" ON) +# Allow some projects to be built conditionally. +set_option(SDL_INSTALL "Enable installation of SDL3" ${SDL3_MAINPROJECT}) +cmake_dependent_option(SDL_INSTALL_CPACK "Create binary SDL3 archive using CPack" ${SDL3_MAINPROJECT} "SDL_INSTALL" ON) +cmake_dependent_option(SDL_INSTALL_DOCS "Install docs for SDL3" OFF "SDL_INSTALL;NOT SDL_FRAMEWORK" ON) +set_option(SDL_UNINSTALL "Enable uninstallation of SDL3" ${SDL3_MAINPROJECT}) +cmake_dependent_option(SDL_PRESEED "Preseed CMake cache to speed up configuration" ON "${SDL_PRESEED_AVAILABLE}" OFF) +cmake_dependent_option(SDL_RELOCATABLE "Create relocatable SDL package" ${SDL_RELOCATABLE_DEFAULT} "SDL_INSTALL" OFF) + +cmake_dependent_option(SDL_ANDROID_JAR "Enable creation of SDL3.jar" ${SDL3_MAINPROJECT} "ANDROID" ON) option_string(SDL_ASSERTIONS "Enable internal sanity checks (auto/disabled/release/enabled/paranoid)" "auto") set_option(SDL_ASSEMBLY "Enable assembly routines" ${SDL_ASSEMBLY_DEFAULT}) @@ -297,7 +308,6 @@ dep_option(SDL_SSE4_1 "Use SSE4.1 assembly routines" ON "SDL_ASSEMB dep_option(SDL_SSE4_2 "Use SSE4.2 assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) dep_option(SDL_MMX "Use MMX assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) dep_option(SDL_ALTIVEC "Use Altivec assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_POWERPC32 OR SDL_CPU_POWERPC64" OFF) -dep_option(SDL_ARMSIMD "Use SIMD assembly blitters on ARM" OFF "SDL_ASSEMBLY;SDL_CPU_ARM32" OFF) dep_option(SDL_ARMNEON "Use NEON assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_ARM32 OR SDL_CPU_ARM64" OFF) dep_option(SDL_LSX "Use LSX assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_LOONGARCH64" OFF) dep_option(SDL_LASX "Use LASX assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_LOONGARCH64" OFF) @@ -331,11 +341,14 @@ set_option(SDL_RPATH "Use an rpath when linking SDL" ${SDL_RPATH_D set_option(SDL_CLOCK_GETTIME "Use clock_gettime() instead of gettimeofday()" ${SDL_CLOCK_GETTIME_DEFAULT}) dep_option(SDL_X11 "Use X11 video driver" ${UNIX_SYS} "SDL_VIDEO" OFF) dep_option(SDL_X11_SHARED "Dynamically load X11 support" ON "SDL_X11" OFF) -set(SDL_X11_OPTIONS Xcursor Xdbe XInput Xfixes Xrandr Xscrnsaver XShape Xsync) -foreach(_SUB ${SDL_X11_OPTIONS}) - string(TOUPPER "SDL_X11_${_SUB}" _OPT) - dep_option(${_OPT} "Enable ${_SUB} support" ON "SDL_X11" OFF) -endforeach() +dep_option(SDL_X11_XCURSOR "Enable Xcursor support" ON SDL_X11 OFF) +dep_option(SDL_X11_XDBE "Enable Xdbe support" ON SDL_X11 OFF) +dep_option(SDL_X11_XINPUT "Enable XInput support" ON SDL_X11 OFF) +dep_option(SDL_X11_XFIXES "Enable Xfixes support" ON SDL_X11 OFF) +dep_option(SDL_X11_XRANDR "Enable Xrandr support" "${SDL_X11_XRANDR_DEFAULT}" SDL_X11 OFF) +dep_option(SDL_X11_XSCRNSAVER "Enable Xscrnsaver support" ON SDL_X11 OFF) +dep_option(SDL_X11_XSHAPE "Enable XShape support" ON SDL_X11 OFF) +dep_option(SDL_X11_XSYNC "Enable Xsync support" ON SDL_X11 OFF) dep_option(SDL_WAYLAND "Use Wayland video driver" ${UNIX_SYS} "SDL_VIDEO" OFF) dep_option(SDL_WAYLAND_SHARED "Dynamically load Wayland support" ON "SDL_WAYLAND" OFF) dep_option(SDL_WAYLAND_LIBDECOR "Use client-side window decorations on Wayland" ON "SDL_WAYLAND" OFF) @@ -380,7 +393,7 @@ cmake_dependent_option(SDL_STATIC "Build a static version of the library" ${SDL_ option(SDL_TEST_LIBRARY "Build the SDL3_test library" ON) dep_option(SDL_TESTS "Build the test directory" OFF SDL_TEST_LIBRARY OFF) -dep_option(SDL_INSTALL_TESTS "Install test-cases" OFF "NOT SDL_DISABLE_INSTALL;NOT SDL_FRAMEWORK" OFF) +dep_option(SDL_INSTALL_TESTS "Install test-cases" OFF "SDL_INSTALL;NOT SDL_FRAMEWORK" OFF) dep_option(SDL_TESTS_LINK_SHARED "link tests to shared SDL library" "${SDL_SHARED}" "SDL_SHARED;SDL_STATIC" "${SDL_SHARED}") set(SDL_TESTS_TIMEOUT_MULTIPLIER "1" CACHE STRING "Timeout multiplier to account for really slow machines") @@ -484,16 +497,21 @@ else() sdl_include_directories(NO_EXPORT SYSTEM PRIVATE "$") endif() -if(MSVC AND TARGET SDL3-shared) +if(MSVC AND TARGET SDL3-shared AND NOT SDL_LIBC) if(SDL_CPU_X64) enable_language(ASM_MASM) set(asm_src "${SDL3_SOURCE_DIR}/src/stdlib/SDL_mslibc_x64.masm") target_compile_options(SDL3-shared PRIVATE "$<$:/nologo>") set_property(SOURCE "${asm_src}" PROPERTY LANGUAGE "ASM_MASM") target_sources(SDL3-shared PRIVATE "${asm_src}") - elseif(SDL_CPU_ARM32 OR SDL_CPU_ARM64) - # FIXME: ARM assembler (armasm.exe/armasm64.exe) is NOT ASM_MASM, and does currently not work with CMake - # (https://gitlab.kitware.com/cmake/cmake/-/issues/18912) + elseif(SDL_CPU_ARM64) + enable_language(ASM_MARMASM) + set(asm_src "${SDL3_SOURCE_DIR}/src/stdlib/SDL_mslibc_arm64.masm") + target_compile_options(SDL3-shared PRIVATE "$<$:/nologo>") + set_property(SOURCE "${asm_src}" PROPERTY LANGUAGE "ASM_MARMASM") + target_sources(SDL3-shared PRIVATE "${asm_src}") + elseif(SDL_CPU_ARM32) + # FIXME endif() endif() @@ -1140,8 +1158,8 @@ sdl_glob_sources( "${SDL3_SOURCE_DIR}/src/cpuinfo/*.c" "${SDL3_SOURCE_DIR}/src/dynapi/*.c" "${SDL3_SOURCE_DIR}/src/events/*.c" - "${SDL3_SOURCE_DIR}/src/file/*.c" - "${SDL3_SOURCE_DIR}/src/file/generic/*.c" + "${SDL3_SOURCE_DIR}/src/io/*.c" + "${SDL3_SOURCE_DIR}/src/io/generic/*.c" "${SDL3_SOURCE_DIR}/src/filesystem/*.c" "${SDL3_SOURCE_DIR}/src/gpu/*.c" "${SDL3_SOURCE_DIR}/src/joystick/*.c" @@ -1400,7 +1418,7 @@ if(ANDROID) set(HAVE_CLOCK_GETTIME 1) endif() - if(NOT SDL_DISABLE_ANDROID_JAR) + if(SDL_ANDROID_JAR) find_package(Java) find_package(SdlAndroidPlatform MODULE) @@ -1430,7 +1448,7 @@ if(ANDROID) DEPENDS ${SDL_JAVA_SOURCES} ) add_custom_target(SDL3-javasources ALL DEPENDS "${javasourcesjar}") - if(NOT SDL_DISABLE_INSTALL_DOCS) + if(SDL_INSTALL_DOCS) set(javadocdir "${SDL3_BINARY_DIR}/docs/javadoc") set(javadocjar "${SDL3_BINARY_DIR}/SDL3-${SDL3_VERSION}-javadoc.jar") set(javadoc_index_html "${javadocdir}/index.html") @@ -1756,7 +1774,7 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU) endif() if(HAVE_LIBURING_H) - sdl_sources("${SDL3_SOURCE_DIR}/src/file/io_uring/SDL_asyncio_liburing.c") + sdl_sources("${SDL3_SOURCE_DIR}/src/io/io_uring/SDL_asyncio_liburing.c") endif() # Always compiled for Linux, unconditionally: @@ -1871,12 +1889,15 @@ elseif(WINDOWS) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/core/windows/*.c") sdl_glob_sources("${SDL3_SOURCE_DIR}/src/main/windows/*.c") + sdl_glob_sources("${SDL3_SOURCE_DIR}/src/io/windows/*.c") if(TARGET SDL3-shared AND MSVC AND NOT SDL_LIBC) # Prevent codegen that would use the VC runtime libraries. target_compile_options(SDL3-shared PRIVATE $<$:/GS-> $<$:/Gs1048576>) + target_compile_options(SDL_uclibc PRIVATE $<$:/GS-> $<$:/Gs1048576>) if(SDL_CPU_X86) target_compile_options(SDL3-shared PRIVATE "/arch:SSE") + target_compile_options(SDL3-SDL_uclibc PRIVATE "/arch:SSE") endif() endif() @@ -2377,6 +2398,8 @@ elseif(APPLE) endif() if(SDL_FRAMEWORK_COCOA) sdl_link_dependency(cocoa LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,Cocoa") + # macOS 11.0+ iOS 14.0+ tvOS 14.0+ + sdl_link_dependency(uniformtypeidentifiers LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-weak_framework,UniformTypeIdentifiers") endif() if(SDL_FRAMEWORK_IOKIT) sdl_link_dependency(iokit LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,IOKit") @@ -2411,25 +2434,17 @@ elseif(APPLE) if(SDL_FRAMEWORK_GAMECONTROLLER) find_library(GAMECONTROLLER GameController) if(GAMECONTROLLER) - sdl_link_dependency(game_controller LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-weak_framework,GameController") + sdl_link_dependency(game_controller LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,GameController") endif() endif() if(SDL_FRAMEWORK_METAL) - if(IOS OR TVOS OR VISIONOS OR WATCHOS) - sdl_link_dependency(metal LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,Metal") - else() - sdl_link_dependency(metal LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-weak_framework,Metal") - endif() + sdl_link_dependency(metal LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,Metal") endif() if(SDL_FRAMEWORK_OPENGLES) sdl_link_dependency(opengles LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,OpenGLES") endif() if(SDL_FRAMEWORK_QUARTZCORE) - if(IOS OR TVOS OR VISIONOS OR WATCHOS) - sdl_link_dependency(quartz_core LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,QuartzCore") - else() - sdl_link_dependency(metal LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-weak_framework,QuartzCore") - endif() + sdl_link_dependency(quartz_core LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,QuartzCore") endif() if(SDL_FRAMEWORK_UIKIT) sdl_link_dependency(ui_kit LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,UIKit") @@ -2437,7 +2452,8 @@ elseif(APPLE) if(SDL_FRAMEWORK_COREHAPTICS) find_library(COREHAPTICS CoreHaptics) if(COREHAPTICS) - sdl_link_dependency(core_haptics LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,CoreHaptics") + # macOS 10.15+ iOS 13.0+ tvOS 14.0+ + sdl_link_dependency(core_haptics LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-weak_framework,CoreHaptics") endif() endif() @@ -2897,7 +2913,7 @@ elseif(N3DS) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/locale/n3ds/*.c") set(HAVE_SDL_LOCALE TRUE) - sdl_glob_sources("${SDL3_SOURCE_DIR}/src/file/n3ds/*.c") + sdl_glob_sources("${SDL3_SOURCE_DIR}/src/io/n3ds/*.c") endif() sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/SDL_dialog.c) @@ -2919,7 +2935,6 @@ if (SDL_DIALOG) set(HAVE_SDL_DIALOG TRUE) elseif(MACOS) sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/cocoa/SDL_cocoadialog.m) - sdl_link_dependency(uniformtypeidentifiers LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-weak_framework,UniformTypeIdentifiers") set(HAVE_SDL_DIALOG TRUE) endif() endif() @@ -3231,7 +3246,6 @@ else() endif() if(SDL_CLANG_TIDY) - cmake_minimum_required(VERSION 3.6) find_program(CLANG_TIDY_BINARY clang-tidy) if(CLANG_TIDY_BINARY) @@ -3316,8 +3330,8 @@ endif() set_source_files_properties(src/dynapi/SDL_dynapi.c PROPERTIES SKIP_PRECOMPILE_HEADERS 1) set(SDL_FRAMEWORK_RESOURCES - Xcode/SDL/pkg-support/resources/ReadMe.txt LICENSE.txt + README.md ) if(SDL_FRAMEWORK) sdl_sources(${SDL_FRAMEWORK_RESOURCES}) @@ -3374,6 +3388,17 @@ if(SDL_SHARED) # (__rt_sdiv, __rt_udiv, __rt_sdiv64, _rt_udiv64, __dtou64, __u64tod, __i64tos) target_link_libraries(SDL3-shared PRIVATE msvcrt.lib) endif() + find_library(HAVE_ONECORE_LIB NAMES "onecore.lib") + if(HAVE_ONECORE_LIB) + # SDL_malloc.c: __imp_MapViewOfFileNuma2 referenced in function MapViewOfFile2 + target_link_libraries(SDL3-shared PRIVATE onecore.lib) + endif() + find_library(HAVE_VOLATILEACCESSU_LIB NAMES "volatileaccessu.lib") + if(HAVE_VOLATILEACCESSU_LIB) + # SDL_malloc.c : RtlSetVolatileMemory referenced in function RtlFillVolatileMemory + # SDL_malloc.c : RtlFillDeviceMemory referenced in function RtlZeroDeviceMemory + target_link_libraries(SDL3-shared PRIVATE volatileaccessu.lib) + endif() endif() if(HAS_Q_NO_USE_LIBIRC) target_compile_options(SDL3-shared PRIVATE /Q_no-use-libirc) @@ -3577,7 +3602,7 @@ if(sdl_cmake_modules) execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${sdl_cmake_modules} "${SDL3_BINARY_DIR}") endif() -if(NOT SDL_DISABLE_INSTALL) +if(SDL_INSTALL) ##### sdl3.pc ##### configure_sdl3_pc() @@ -3677,7 +3702,7 @@ if(NOT SDL_DISABLE_INSTALL) install(FILES "LICENSE.txt" DESTINATION "${SDL_INSTALL_LICENSEDIR}") endif() - if(NOT SDL_DISABLE_INSTALL_CPACK) + if(SDL_INSTALL_CPACK) if(SDL_FRAMEWORK) set(CPACK_GENERATOR "DragNDrop") elseif(MSVC) @@ -3718,7 +3743,7 @@ if(NOT SDL_DISABLE_INSTALL) endif() endif() - if(NOT SDL_DISABLE_INSTALL_DOCS) + if(SDL_INSTALL_DOCS) SDL_generate_manpages( HEADERS_DIR "${PROJECT_SOURCE_DIR}/include/SDL3" SYMBOL "SDL_Init" @@ -3735,7 +3760,7 @@ endif() ##### Uninstall target ##### -if(NOT SDL_DISABLE_UNINSTALL) +if(SDL_UNINSTALL) if(NOT TARGET uninstall) configure_file(cmake/cmake_uninstall.cmake.in cmake_uninstall.cmake IMMEDIATE @ONLY) diff --git a/libs/SDL3/CREDITS.md b/libs/SDL3/CREDITS.md index 370bcec0..55105a88 100644 --- a/libs/SDL3/CREDITS.md +++ b/libs/SDL3/CREDITS.md @@ -4,6 +4,10 @@ Thanks to everyone who made this possible, including: - Cliff Matthews, for giving me a reason to start this project. :) -- Executor rocks! *grin* - Ryan Gordon for helping everybody out and keeping the dream alive. :) +- Frank Praznik for his Wayland support and general windowing development. +- Ozkan Sezer for sanity checks and make sure the i's are dotted and t's are crossed. +- Anonymous Maarten for CMake support and build system development. +- Evan Hemsley, Caleb Cornett, and Ethan Lee for SDL GPU development. - Gabriel Jacobo for his work on the Android port and generally helping out all around. - Philipp Wiesemann for his attention to detail reviewing the entire SDL code base and proposes patches. - Andreas Schiffler for his dedication to unit tests, Visual Studio projects, and managing the Google Summer of Code. @@ -24,7 +28,7 @@ Thanks to everyone who made this possible, including: - Holmes Futrell for his port of SDL to the iPhone and iPod Touch during the Google Summer of Code 2008. - Jon Atkins for SDL_image, SDL_mixer and SDL_net documentation. -- Everybody at Loki Software, Inc. for their great contributions! +- Everybody at Loki Software, Inc. and Valve Corporation for their great contributions! And a big hand to everyone else who has contributed over the years. diff --git a/libs/SDL3/INSTALL.md b/libs/SDL3/INSTALL.md index b8b0afb2..b33c2111 100644 --- a/libs/SDL3/INSTALL.md +++ b/libs/SDL3/INSTALL.md @@ -1,68 +1,47 @@ -# To compile and install SDL: +# To build and use SDL: -## Windows with Visual Studio: +SDL supports a number of development environments: +- [CMake](docs/INTRO-cmake.md) +- [Visual Studio on Windows](docs/INTRO-visualstudio.md) +- [Xcode on Apple platforms](docs/INTRO-xcode.md) +- [Android Studio](docs/INTRO-androidstudio.md) +- [Emscripten for web](docs/INTRO-emscripten.md) -Read ./docs/README-visualc.md +SDL is also usable in other environments. The basic steps are to use CMake to build the library and then use the headers and library that you built in your project. You can search online to see if anyone has specific steps for your setup. -## Windows building with mingw-w64 for x86: +# Documentation -Run: `cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=build-scripts/cmake-toolchain-mingw64-i686.cmake && cmake --build build && cmake --install build` +An API reference, tutorials, and additional documentation is available at: -## Windows building with mingw-w64 for x64: - -Run: `cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=build-scripts/cmake-toolchain-mingw64-x86_64.cmake && cmake --build build && cmake --install build` - -## macOS with Xcode: - -Read docs/README-macos.md - -## macOS from the command line: - -Run: `cmake -S . -B build && cmake --build build && cmake --install build` - -### macOS for universal architecture: - -Run: `cmake -S . -B build -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" && cmake --build build && cmake --install build` - -## Linux and other UNIX systems: - -Run: `cmake -S . -B build && cmake --build build --parallel $(nproc) && cmake --install build` - -## Android: - -Read docs/README-android.md - -## iOS: - -Read docs/README-ios.md - -## Using CMake: - -Read docs/README-cmake.md +https://wiki.libsdl.org/SDL3 # Example code -Look at the example programs in ./test, and check out the online -documentation at https://wiki.libsdl.org/SDL3/ +There are simple example programs in the examples directory, and you can view them online at: -# Discussion +https://examples.libsdl.org/SDL3 + +More in-depth test programs are available in the tests directory and can be built by adding `-DSDL_TESTS=ON` to the CMake command line when building SDL. + +# Discussions + +## Discord + +You can join the official Discord server at: + +https://discord.com/invite/BwpFGBWsv8 ## Forums/mailing lists -Join the SDL developer discussions, sign up on +You can join SDL development discussions at: https://discourse.libsdl.org/ -and go to the development forum - -https://discourse.libsdl.org/c/sdl-development/6 - -Once you sign up, you can use the forum through the website, or as a mailing -list from your email client. +Once you sign up, you can use the forum through the website or as a mailing list from your email client. ## Announcement list -Sign up for the announcement list through the web interface: +You can sign up for the low traffic announcement list at: https://www.libsdl.org/mailing-list.php diff --git a/libs/SDL3/LICENSE.txt b/libs/SDL3/LICENSE.txt index 74bb56cd..23abb73f 100644 --- a/libs/SDL3/LICENSE.txt +++ b/libs/SDL3/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (C) 1997-2024 Sam Lantinga +Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/README-SDL.txt b/libs/SDL3/README-SDL.txt deleted file mode 100644 index 8d92955a..00000000 --- a/libs/SDL3/README-SDL.txt +++ /dev/null @@ -1,13 +0,0 @@ - -Please distribute this file with the SDL runtime environment: - -The Simple DirectMedia Layer (SDL for short) is a cross-platform library -designed to make it easy to write multi-media software, such as games -and emulators. - -The Simple DirectMedia Layer library source code is available from: -https://www.libsdl.org/ - -This library is distributed under the terms of the zlib license: -http://www.zlib.net/zlib_license.html - diff --git a/libs/SDL3/README.md b/libs/SDL3/README.md index c4861c70..68b0923a 100644 --- a/libs/SDL3/README.md +++ b/libs/SDL3/README.md @@ -1,16 +1,16 @@ -# Simple DirectMedia Layer (SDL) Version 3.0 +Simple DirectMedia Layer (SDL for short) is a cross-platform library +designed to make it easy to write multi-media software, such as games +and emulators. +You can find the latest release and additional information at: https://www.libsdl.org/ -Simple DirectMedia Layer is a cross-platform development library designed -to provide low level access to audio, keyboard, mouse, joystick, and graphics -hardware. It is used by video playback software, emulators, and popular games -including Valve's award winning catalog and many Humble Bundle games. +Installation instructions and a quick introduction is available in +[INSTALL.md](INSTALL.md) -More extensive documentation is available in the docs directory, starting -with [README.md](docs/README.md). If you are migrating to SDL 3.0 from SDL 2.0, -the changes are extensively documented in [README-migration.md](docs/README-migration.md). +This library is distributed under the terms of the zlib license, +available in [LICENSE.txt](LICENSE.txt). Enjoy! diff --git a/libs/SDL3/REVISION.txt b/libs/SDL3/REVISION.txt new file mode 100644 index 00000000..dd04808f --- /dev/null +++ b/libs/SDL3/REVISION.txt @@ -0,0 +1 @@ +release-3.2.0-0-g535d80bad diff --git a/libs/SDL3/VisualC-GDK/SDL/SDL.vcxproj b/libs/SDL3/VisualC-GDK/SDL/SDL.vcxproj index 2b6437fb..07a9b3be 100644 --- a/libs/SDL3/VisualC-GDK/SDL/SDL.vcxproj +++ b/libs/SDL3/VisualC-GDK/SDL/SDL.vcxproj @@ -441,8 +441,8 @@ - - + + @@ -529,9 +529,9 @@ - - - + + + @@ -673,7 +673,7 @@ - + true true @@ -838,6 +838,7 @@ true true + diff --git a/libs/SDL3/VisualC-GDK/SDL/SDL.vcxproj.filters b/libs/SDL3/VisualC-GDK/SDL/SDL.vcxproj.filters index 5ae2609c..247bbdc0 100644 --- a/libs/SDL3/VisualC-GDK/SDL/SDL.vcxproj.filters +++ b/libs/SDL3/VisualC-GDK/SDL/SDL.vcxproj.filters @@ -45,7 +45,7 @@ - + @@ -204,9 +204,9 @@ - - - + + + @@ -220,6 +220,7 @@ + @@ -465,8 +466,8 @@ - - + + diff --git a/libs/SDL3/VisualC-GDK/tests/testgdk/src/testgdk.cpp b/libs/SDL3/VisualC-GDK/tests/testgdk/src/testgdk.cpp index b3aa9ec8..d2a92091 100644 --- a/libs/SDL3/VisualC-GDK/tests/testgdk/src/testgdk.cpp +++ b/libs/SDL3/VisualC-GDK/tests/testgdk/src/testgdk.cpp @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/VisualC/SDL/SDL.vcxproj b/libs/SDL3/VisualC/SDL/SDL.vcxproj index 42d0c13d..134c730c 100644 --- a/libs/SDL3/VisualC/SDL/SDL.vcxproj +++ b/libs/SDL3/VisualC/SDL/SDL.vcxproj @@ -43,7 +43,6 @@ - @@ -113,13 +112,14 @@ DLL_EXPORT;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) false StreamingSIMDExtensions - Level3 + Level4 OldStyle OnlyExplicitInline Use SDL_internal.h true MultiThreadedDebug + 4100;4127;4152;4201 _DEBUG;%(PreprocessorDefinitions) @@ -144,13 +144,14 @@ %(AdditionalUsingDirectories) DLL_EXPORT;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) false - Level3 + Level4 OldStyle OnlyExplicitInline Use SDL_internal.h true MultiThreadedDebug + 4100;4127;4152;4201 _DEBUG;%(PreprocessorDefinitions) @@ -179,13 +180,14 @@ DLL_EXPORT;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) false StreamingSIMDExtensions - Level3 + Level4 ProgramDatabase OnlyExplicitInline Use SDL_internal.h true MultiThreaded + 4100;4127;4152;4201 NDEBUG;%(PreprocessorDefinitions) @@ -211,13 +213,14 @@ %(AdditionalUsingDirectories) DLL_EXPORT;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) false - Level3 + Level4 ProgramDatabase OnlyExplicitInline Use SDL_internal.h true MultiThreaded + 4100;4127;4152;4201 NDEBUG;%(PreprocessorDefinitions) @@ -353,8 +356,8 @@ - - + + @@ -416,12 +419,12 @@ - + - - + + @@ -554,7 +557,7 @@ - + @@ -647,9 +650,6 @@ - - NotUsing - @@ -673,6 +673,7 @@ + @@ -728,6 +729,5 @@ - diff --git a/libs/SDL3/VisualC/SDL/SDL.vcxproj.filters b/libs/SDL3/VisualC/SDL/SDL.vcxproj.filters index d1d24865..176bea64 100644 --- a/libs/SDL3/VisualC/SDL/SDL.vcxproj.filters +++ b/libs/SDL3/VisualC/SDL/SDL.vcxproj.filters @@ -25,7 +25,7 @@ {5e27e19f-b3f8-4e2d-b323-b00b2040ec86} - + {a3ab9cff-8495-4a5c-8af6-27e43199a712} @@ -211,10 +211,10 @@ {00009d5ded166cc6c6680ec771a30000} - + {00004d6806b6238cae0ed62db5440000} - + {000028b2ea36d7190d13777a4dc70000} @@ -447,11 +447,11 @@ filesystem - - file + + io - - file + + io main @@ -965,14 +965,14 @@ filesystem\windows - - file\generic + + io\generic - - file + + io - - file\windows + + io\windows main\generic @@ -1085,8 +1085,8 @@ events - - file + + io filesystem\windows @@ -1235,6 +1235,9 @@ video + + video + video diff --git a/libs/SDL3/WhatsNew.txt b/libs/SDL3/WhatsNew.txt index 63d34758..22b1a0f8 100644 --- a/libs/SDL3/WhatsNew.txt +++ b/libs/SDL3/WhatsNew.txt @@ -2,32 +2,13 @@ This is a list of major changes in SDL's version history. --------------------------------------------------------------------------- -3.1.0: +3.2.0: --------------------------------------------------------------------------- -This is a preview release of the new SDL 3.0 API. - -The ABI hasn't been locked down yet, but it's fairly stable and feedback is welcome! - Check out [migration guide](docs/README-migration.md) for details on API changes since SDL 2.0, and tips on transitioning your code from SDL2 code to SDL3. There have been too many changes to list them all, but here are some of the highlights: -* The API has been significantly reworked to be easier to use and more consistent -* The 2D rendering API now has support for more advanced colorspaces and HDR rendering -* The 2D rendering API now has a Vulkan backend -* An example of hardware accelerated video playback using ffmpeg has been added in test/testffmpeg.c -* The shaped window API has been replaced with transparent windows -* Time and date functions have been added in SDL_time.h -* Support for webcam video recording has been added in SDL_camera.h -* Support for handling pens and tablets has been added in SDL_pen.h -* Support for file open and save dialogs has been added in SDL_dialog.h -* Cross-platform functions for working with files and directories are available in SDL_filesystem.h -* A cross-platform abstraction for working with user and game data has been added in SDL_storage.h -* Handling of main() has been moved to a header library and an optional callback-based program flow is available -* Support for simple object properties has been added in SDL_properties.h. These properties are available on many SDL objects, and can be used for more advanced functionality. -Please let us know about issues and feedback at: https://github.com/libsdl-org/SDL/issues +https://wiki.libsdl.org/SDL3/NewFeatures -The development team is focused on code, moving towards the final release, and we would love volunteers to help improve the documentation. Please send e-mail to slouken@libsdl.org if you'd like to help out! - -Finally, a giant thank you to all the people who have contributed code and feedback to the SDL 3.0 improvements! +Thank you to all the people who have contributed code and feedback to the SDL 3.0 release! diff --git a/libs/SDL3/Xcode/SDL/Info-Framework.plist b/libs/SDL3/Xcode/SDL/Info-Framework.plist index 23c3d509..c9cb1e5c 100644 --- a/libs/SDL3/Xcode/SDL/Info-Framework.plist +++ b/libs/SDL3/Xcode/SDL/Info-Framework.plist @@ -19,10 +19,10 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.1.7 + 3.2.0 CFBundleSignature SDLX CFBundleVersion - 3.1.7 + 3.2.0 diff --git a/libs/SDL3/Xcode/SDL/SDL.xcodeproj/project.pbxproj b/libs/SDL3/Xcode/SDL/SDL.xcodeproj/project.pbxproj index 08dfd070..bb655606 100644 --- a/libs/SDL3/Xcode/SDL/SDL.xcodeproj/project.pbxproj +++ b/libs/SDL3/Xcode/SDL/SDL.xcodeproj/project.pbxproj @@ -46,27 +46,27 @@ 000098E9DAA43EF6FF7F0000 /* SDL_camera.c in Sources */ = {isa = PBXBuildFile; fileRef = 0000035D38C3899C7EFD0000 /* SDL_camera.c */; }; 0000A03C0F32C43816F40000 /* SDL_asyncio_windows_ioring.c in Sources */ = {isa = PBXBuildFile; fileRef = 000030DD21496B5C0F210000 /* SDL_asyncio_windows_ioring.c */; }; 0000A4DA2F45A31DC4F00000 /* SDL_sysmain_callbacks.m in Sources */ = {isa = PBXBuildFile; fileRef = 0000BB287BA0A0178C1A0000 /* SDL_sysmain_callbacks.m */; }; + 0000A877C7DB9FA935FC0000 /* SDL_uikitpen.m in Sources */ = {isa = PBXBuildFile; fileRef = 000053D344416737F6050000 /* SDL_uikitpen.m */; }; 0000AEB9AE90228CA2D60000 /* SDL_asyncio.c in Sources */ = {isa = PBXBuildFile; fileRef = 00003928A612EC33D42C0000 /* SDL_asyncio.c */; }; 0000D5B526B85DE7AB1C0000 /* SDL_cocoapen.m in Sources */ = {isa = PBXBuildFile; fileRef = 0000CCA310B73A7B59910000 /* SDL_cocoapen.m */; }; 007317A40858DECD00B2BC32 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0073179D0858DECD00B2BC32 /* Cocoa.framework */; platformFilters = (macos, ); }; 007317A60858DECD00B2BC32 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0073179F0858DECD00B2BC32 /* IOKit.framework */; platformFilters = (ios, maccatalyst, macos, ); }; 00CFA89D106B4BA100758660 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00CFA89C106B4BA100758660 /* ForceFeedback.framework */; platformFilters = (macos, ); }; - 00D0D08410675DD9004B05EF /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00D0D08310675DD9004B05EF /* CoreFoundation.framework */; platformFilters = (ios, maccatalyst, macos, tvos, watchos, ); }; + 00D0D08410675DD9004B05EF /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00D0D08310675DD9004B05EF /* CoreFoundation.framework */; platformFilters = (ios, maccatalyst, macos, tvos, ); settings = {ATTRIBUTES = (Required, ); }; }; 00D0D0D810675E46004B05EF /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 007317C10858E15000B2BC32 /* Carbon.framework */; platformFilters = (macos, ); }; 1485C3312BBA4AF30063985B /* UniformTypeIdentifiers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1485C32F2BBA4A0C0063985B /* UniformTypeIdentifiers.framework */; platformFilters = (maccatalyst, macos, ); settings = {ATTRIBUTES = (Weak, ); }; }; - 557D0CFA254586CA003913E3 /* CoreHaptics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F37DC5F225350EBC0002E6F7 /* CoreHaptics.framework */; platformFilters = (ios, maccatalyst, macos, tvos, ); }; - 557D0CFB254586D7003913E3 /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A75FDABD23E28B6200529352 /* GameController.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 557D0CFA254586CA003913E3 /* CoreHaptics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F37DC5F225350EBC0002E6F7 /* CoreHaptics.framework */; platformFilters = (ios, maccatalyst, macos, tvos, ); settings = {ATTRIBUTES = (Weak, ); }; }; + 557D0CFB254586D7003913E3 /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A75FDABD23E28B6200529352 /* GameController.framework */; settings = {ATTRIBUTES = (Required, ); }; }; 5616CA4C252BB2A6005D5928 /* SDL_url.c in Sources */ = {isa = PBXBuildFile; fileRef = 5616CA49252BB2A5005D5928 /* SDL_url.c */; }; 5616CA4D252BB2A6005D5928 /* SDL_sysurl.h in Headers */ = {isa = PBXBuildFile; fileRef = 5616CA4A252BB2A6005D5928 /* SDL_sysurl.h */; }; 5616CA4E252BB2A6005D5928 /* SDL_sysurl.m in Sources */ = {isa = PBXBuildFile; fileRef = 5616CA4B252BB2A6005D5928 /* SDL_sysurl.m */; }; - 564624361FF821C20074AC87 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 564624351FF821B80074AC87 /* QuartzCore.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 564624381FF821DA0074AC87 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 564624371FF821CB0074AC87 /* Metal.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 564624361FF821C20074AC87 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 564624351FF821B80074AC87 /* QuartzCore.framework */; settings = {ATTRIBUTES = (Required, ); }; }; + 564624381FF821DA0074AC87 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 564624371FF821CB0074AC87 /* Metal.framework */; settings = {ATTRIBUTES = (Required, ); }; }; 566E26CF246274CC00718109 /* SDL_syslocale.m in Sources */ = {isa = PBXBuildFile; fileRef = 566E26CC246274CB00718109 /* SDL_syslocale.m */; }; 566E26D8246274CC00718109 /* SDL_locale.c in Sources */ = {isa = PBXBuildFile; fileRef = 566E26CD246274CB00718109 /* SDL_locale.c */; }; 566E26E1246274CC00718109 /* SDL_syslocale.h in Headers */ = {isa = PBXBuildFile; fileRef = 566E26CE246274CC00718109 /* SDL_syslocale.h */; }; 56A2373329F9C113003CCA5F /* SDL_sysrwlock.c in Sources */ = {isa = PBXBuildFile; fileRef = 56A2373229F9C113003CCA5F /* SDL_sysrwlock.c */; }; 6312C66D2B42341400A7BB00 /* SDL_murmur3.c in Sources */ = {isa = PBXBuildFile; fileRef = 6312C66C2B42341400A7BB00 /* SDL_murmur3.c */; }; - 63134A222A7902CF0021E9A6 /* SDL_pen.h in Headers */ = {isa = PBXBuildFile; fileRef = 63134A212A7902CF0021E9A6 /* SDL_pen.h */; settings = {ATTRIBUTES = (Public, ); }; }; 63134A252A7902FD0021E9A6 /* SDL_pen_c.h in Headers */ = {isa = PBXBuildFile; fileRef = 63134A232A7902FD0021E9A6 /* SDL_pen_c.h */; }; 63134A262A7902FD0021E9A6 /* SDL_pen.c in Sources */ = {isa = PBXBuildFile; fileRef = 63134A242A7902FD0021E9A6 /* SDL_pen.c */; }; 75E0915A241EA924004729E1 /* SDL_virtualjoystick.c in Sources */ = {isa = PBXBuildFile; fileRef = 75E09158241EA924004729E1 /* SDL_virtualjoystick.c */; }; @@ -76,11 +76,9 @@ A1626A522617008D003F1973 /* SDL_triangle.h in Headers */ = {isa = PBXBuildFile; fileRef = A1626A512617008C003F1973 /* SDL_triangle.h */; }; A1BB8B6327F6CF330057CFA8 /* SDL_list.c in Sources */ = {isa = PBXBuildFile; fileRef = A1BB8B6127F6CF320057CFA8 /* SDL_list.c */; }; A1BB8B6C27F6CF330057CFA8 /* SDL_list.h in Headers */ = {isa = PBXBuildFile; fileRef = A1BB8B6227F6CF330057CFA8 /* SDL_list.h */; }; - A7381E961D8B69D600B177DD /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7381E951D8B69D600B177DD /* CoreAudio.framework */; platformFilters = (ios, maccatalyst, macos, tvos, watchos, ); }; + A7381E961D8B69D600B177DD /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7381E951D8B69D600B177DD /* CoreAudio.framework */; platformFilters = (ios, maccatalyst, macos, tvos, ); settings = {ATTRIBUTES = (Required, ); }; }; A7381E971D8B6A0300B177DD /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7381E931D8B69C300B177DD /* AudioToolbox.framework */; platformFilters = (ios, maccatalyst, macos, tvos, ); }; A75FDB5823E39E6100529352 /* hidapi.h in Headers */ = {isa = PBXBuildFile; fileRef = A75FDB5723E39E6100529352 /* hidapi.h */; }; - A75FDBB723E4CBC700529352 /* License.txt in Resources */ = {isa = PBXBuildFile; fileRef = 00794D3F09D0C461003FC8A1 /* License.txt */; }; - A75FDBB823E4CBC700529352 /* ReadMe.txt in Resources */ = {isa = PBXBuildFile; fileRef = F59C710300D5CB5801000001 /* ReadMe.txt */; }; A75FDBC523EA380300529352 /* SDL_hidapi_rumble.h in Headers */ = {isa = PBXBuildFile; fileRef = A75FDBC323EA380300529352 /* SDL_hidapi_rumble.h */; }; A75FDBCE23EA380300529352 /* SDL_hidapi_rumble.c in Sources */ = {isa = PBXBuildFile; fileRef = A75FDBC423EA380300529352 /* SDL_hidapi_rumble.c */; }; A79745702B2E9D39009D224A /* SDL_hidapi_steamdeck.c in Sources */ = {isa = PBXBuildFile; fileRef = A797456F2B2E9D39009D224A /* SDL_hidapi_steamdeck.c */; }; @@ -353,12 +351,10 @@ A7D8BBE923E2574800DCD162 /* SDL_uikitvulkan.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A62523E2513D00DCD162 /* SDL_uikitvulkan.m */; }; A7D8BBEA23E2574800DCD162 /* SDL_uikitwindow.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A62723E2513D00DCD162 /* SDL_uikitwindow.h */; }; A7D8BBEB23E2574800DCD162 /* SDL_uikitwindow.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A61A23E2513D00DCD162 /* SDL_uikitwindow.m */; }; - E41D20152BA9577D003073FA /* SDL_storage.h in Headers */ = {isa = PBXBuildFile; fileRef = E41D20142BA9577D003073FA /* SDL_storage.h */; settings = {ATTRIBUTES = (Public, ); }; }; E479118D2BA9555500CE3B7F /* SDL_storage.c in Sources */ = {isa = PBXBuildFile; fileRef = E47911872BA9555500CE3B7F /* SDL_storage.c */; }; E479118E2BA9555500CE3B7F /* SDL_sysstorage.h in Headers */ = {isa = PBXBuildFile; fileRef = E47911882BA9555500CE3B7F /* SDL_sysstorage.h */; }; E479118F2BA9555500CE3B7F /* SDL_genericstorage.c in Sources */ = {isa = PBXBuildFile; fileRef = E479118A2BA9555500CE3B7F /* SDL_genericstorage.c */; }; E4A568B62AF763940062EEC4 /* SDL_sysmain_callbacks.c in Sources */ = {isa = PBXBuildFile; fileRef = E4A568B52AF763940062EEC4 /* SDL_sysmain_callbacks.c */; }; - E4F257712C818FE200FCEAFC /* SDL_gpu.h in Headers */ = {isa = PBXBuildFile; fileRef = E4F257702C818FE200FCEAFC /* SDL_gpu.h */; settings = {ATTRIBUTES = (Public, ); }; }; E4F257912C81903800FCEAFC /* Metal_Blit.h in Headers */ = {isa = PBXBuildFile; fileRef = E4F2577E2C81903800FCEAFC /* Metal_Blit.h */; }; E4F257922C81903800FCEAFC /* Metal_Blit.metal in Sources */ = {isa = PBXBuildFile; fileRef = E4F2577F2C81903800FCEAFC /* Metal_Blit.metal */; }; E4F257932C81903800FCEAFC /* SDL_gpu_metal.m in Sources */ = {isa = PBXBuildFile; fileRef = E4F257802C81903800FCEAFC /* SDL_gpu_metal.m */; }; @@ -388,8 +384,10 @@ F32DDAD42AB795A30041EAA5 /* SDL_audioresample.c in Sources */ = {isa = PBXBuildFile; fileRef = F32DDACE2AB795A30041EAA5 /* SDL_audioresample.c */; }; F338A1182D1B37D8007CDFDF /* SDL_tray.m in Sources */ = {isa = PBXBuildFile; fileRef = F338A1172D1B37D8007CDFDF /* SDL_tray.m */; }; F338A11A2D1B37E4007CDFDF /* SDL_tray.c in Sources */ = {isa = PBXBuildFile; fileRef = F338A1192D1B37E4007CDFDF /* SDL_tray.c */; }; + F34400342D40217A003F26D7 /* LICENSE.txt in Resources */ = {isa = PBXBuildFile; fileRef = F373DA182D388A1E002158FA /* LICENSE.txt */; }; + F34400362D40217A003F26D7 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = F373DA192D388A1E002158FA /* README.md */; }; + F344003D2D4022E1003F26D7 /* INSTALL.md in Resources */ = {isa = PBXBuildFile; fileRef = F344003C2D4022E1003F26D7 /* INSTALL.md */; }; F34B9895291DEFF500AAC96E /* SDL_hidapi_steam.c in Sources */ = {isa = PBXBuildFile; fileRef = A75FDAAC23E2795C00529352 /* SDL_hidapi_steam.c */; }; - F35B79632D03A7B900C6D591 /* SDL_asyncio.h in Headers */ = {isa = PBXBuildFile; fileRef = 00004945A946DF5B1AED0000 /* SDL_asyncio.h */; settings = {ATTRIBUTES = (Public, ); }; }; F362B9192B3349E200D30B94 /* controller_list.h in Headers */ = {isa = PBXBuildFile; fileRef = F362B9152B3349E200D30B94 /* controller_list.h */; }; F362B91A2B3349E200D30B94 /* SDL_gamepad_c.h in Headers */ = {isa = PBXBuildFile; fileRef = F362B9162B3349E200D30B94 /* SDL_gamepad_c.h */; }; F362B91B2B3349E200D30B94 /* SDL_steam_virtual_gamepad.h in Headers */ = {isa = PBXBuildFile; fileRef = F362B9172B3349E200D30B94 /* SDL_steam_virtual_gamepad.h */; }; @@ -401,11 +399,8 @@ F36C7AD1294BA009004D61C3 /* SDL_runapp.c in Sources */ = {isa = PBXBuildFile; fileRef = F36C7AD0294BA009004D61C3 /* SDL_runapp.c */; }; F376F6552559B4E300CFC0BC /* SDL_hidapi.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A81423E2513F00DCD162 /* SDL_hidapi.c */; }; F37A8E1A28405AA100C38E95 /* CMake in Resources */ = {isa = PBXBuildFile; fileRef = F37A8E1928405AA100C38E95 /* CMake */; }; - F37E184E2B8C097D0098C111 /* SDL_camera.h in Headers */ = {isa = PBXBuildFile; fileRef = 000084ED0A56E3ED52F90000 /* SDL_camera.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F37E18522BA50E760098C111 /* SDL_dialog.h in Headers */ = {isa = PBXBuildFile; fileRef = F37E18512BA50E750098C111 /* SDL_dialog.h */; settings = {ATTRIBUTES = (Public, ); }; }; F37E18582BA50F3B0098C111 /* SDL_cocoadialog.m in Sources */ = {isa = PBXBuildFile; fileRef = F37E18572BA50F3B0098C111 /* SDL_cocoadialog.m */; }; F37E185A2BA50F450098C111 /* SDL_dummydialog.c in Sources */ = {isa = PBXBuildFile; fileRef = F37E18592BA50F450098C111 /* SDL_dummydialog.c */; }; - F37E185C2BAA3EF90098C111 /* SDL_time.h in Headers */ = {isa = PBXBuildFile; fileRef = F37E185B2BAA3EF90098C111 /* SDL_time.h */; settings = {ATTRIBUTES = (Public, ); }; }; F37E18622BAA40090098C111 /* SDL_sysfilesystem.h in Headers */ = {isa = PBXBuildFile; fileRef = F37E18612BAA40090098C111 /* SDL_sysfilesystem.h */; }; F37E18642BAA40670098C111 /* SDL_time_c.h in Headers */ = {isa = PBXBuildFile; fileRef = F37E18632BAA40670098C111 /* SDL_time_c.h */; }; F3820713284F3609004DD584 /* controller_type.c in Sources */ = {isa = PBXBuildFile; fileRef = F3820712284F3609004DD584 /* controller_type.c */; }; @@ -434,87 +429,97 @@ F3A9AE9B2C8A13C100AAC390 /* SDL_pipeline_gpu.h in Headers */ = {isa = PBXBuildFile; fileRef = F3A9AE952C8A13C100AAC390 /* SDL_pipeline_gpu.h */; }; F3A9AE9C2C8A13C100AAC390 /* SDL_pipeline_gpu.c in Sources */ = {isa = PBXBuildFile; fileRef = F3A9AE962C8A13C100AAC390 /* SDL_pipeline_gpu.c */; }; F3A9AE9D2C8A13C100AAC390 /* SDL_shaders_gpu.h in Headers */ = {isa = PBXBuildFile; fileRef = F3A9AE972C8A13C100AAC390 /* SDL_shaders_gpu.h */; }; - F3B38CCF296E2E52005DA6D3 /* SDL_main_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = F3B38CCA296E2E52005DA6D3 /* SDL_main_impl.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3B38CD3296E2E52005DA6D3 /* SDL_platform_defines.h in Headers */ = {isa = PBXBuildFile; fileRef = F3B38CCB296E2E52005DA6D3 /* SDL_platform_defines.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3B38CD7296E2E52005DA6D3 /* SDL_init.h in Headers */ = {isa = PBXBuildFile; fileRef = F3B38CCC296E2E52005DA6D3 /* SDL_init.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3B38CDB296E2E52005DA6D3 /* SDL_oldnames.h in Headers */ = {isa = PBXBuildFile; fileRef = F3B38CCD296E2E52005DA6D3 /* SDL_oldnames.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3B38CDF296E2E52005DA6D3 /* SDL_intrin.h in Headers */ = {isa = PBXBuildFile; fileRef = F3B38CCE296E2E52005DA6D3 /* SDL_intrin.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3B439482C93595900792030 /* SDL_process.h in Headers */ = {isa = PBXBuildFile; fileRef = F3B439472C93595900792030 /* SDL_process.h */; settings = {ATTRIBUTES = (Public, ); }; }; F3B439512C935C2400792030 /* SDL_dummyprocess.c in Sources */ = {isa = PBXBuildFile; fileRef = F3B439502C935C2400792030 /* SDL_dummyprocess.c */; }; F3B439532C935C2C00792030 /* SDL_posixprocess.c in Sources */ = {isa = PBXBuildFile; fileRef = F3B439522C935C2C00792030 /* SDL_posixprocess.c */; }; F3B439562C937DAB00792030 /* SDL_process.c in Sources */ = {isa = PBXBuildFile; fileRef = F3B439542C937DAB00792030 /* SDL_process.c */; }; F3B439572C937DAB00792030 /* SDL_sysprocess.h in Headers */ = {isa = PBXBuildFile; fileRef = F3B439552C937DAB00792030 /* SDL_sysprocess.h */; }; + F3C1BD752D1F1A3000846529 /* SDL_tray_utils.c in Sources */ = {isa = PBXBuildFile; fileRef = F3C1BD742D1F1A3000846529 /* SDL_tray_utils.c */; }; + F3C1BD762D1F1A3000846529 /* SDL_tray_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = F3C1BD732D1F1A3000846529 /* SDL_tray_utils.h */; }; F3C2CB222C5DDDB2004D7998 /* SDL_categories_c.h in Headers */ = {isa = PBXBuildFile; fileRef = F3C2CB202C5DDDB2004D7998 /* SDL_categories_c.h */; }; F3C2CB232C5DDDB2004D7998 /* SDL_categories.c in Sources */ = {isa = PBXBuildFile; fileRef = F3C2CB212C5DDDB2004D7998 /* SDL_categories.c */; }; + F3D46ACA2D20625800D9CBDF /* SDL_storage.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46ABF2D20625800D9CBDF /* SDL_storage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46ACB2D20625800D9CBDF /* SDL_sensor.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46ABD2D20625800D9CBDF /* SDL_sensor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46ACC2D20625800D9CBDF /* SDL_properties.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AB82D20625800D9CBDF /* SDL_properties.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46ACD2D20625800D9CBDF /* SDL_bits.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A862D20625800D9CBDF /* SDL_bits.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46ACE2D20625800D9CBDF /* SDL_keyboard.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A9D2D20625800D9CBDF /* SDL_keyboard.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46ACF2D20625800D9CBDF /* SDL_opengles2_khrplatform.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AB12D20625800D9CBDF /* SDL_opengles2_khrplatform.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AD02D20625800D9CBDF /* SDL_gpu.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A942D20625800D9CBDF /* SDL_gpu.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AD12D20625800D9CBDF /* SDL_mutex.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AA82D20625800D9CBDF /* SDL_mutex.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AD22D20625800D9CBDF /* SDL_touch.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AC52D20625800D9CBDF /* SDL_touch.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AD32D20625800D9CBDF /* SDL_metal.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AA52D20625800D9CBDF /* SDL_metal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AD42D20625800D9CBDF /* SDL_process.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AB72D20625800D9CBDF /* SDL_process.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AD52D20625800D9CBDF /* SDL_clipboard.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A892D20625800D9CBDF /* SDL_clipboard.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AD62D20625800D9CBDF /* SDL_events.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A912D20625800D9CBDF /* SDL_events.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AD72D20625800D9CBDF /* SDL_opengles2_gl2platform.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AB02D20625800D9CBDF /* SDL_opengles2_gl2platform.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AD82D20625800D9CBDF /* SDL_joystick.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A9C2D20625800D9CBDF /* SDL_joystick.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AD92D20625800D9CBDF /* SDL_opengl.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AAA2D20625800D9CBDF /* SDL_opengl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46ADA2D20625800D9CBDF /* SDL_stdinc.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46ABE2D20625800D9CBDF /* SDL_stdinc.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46ADB2D20625800D9CBDF /* SDL_pen.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AB22D20625800D9CBDF /* SDL_pen.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46ADC2D20625800D9CBDF /* SDL_render.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46ABA2D20625800D9CBDF /* SDL_render.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46ADD2D20625800D9CBDF /* SDL_assert.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A812D20625800D9CBDF /* SDL_assert.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46ADE2D20625800D9CBDF /* SDL_atomic.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A832D20625800D9CBDF /* SDL_atomic.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46ADF2D20625800D9CBDF /* SDL_begin_code.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A852D20625800D9CBDF /* SDL_begin_code.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AE02D20625800D9CBDF /* SDL_log.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AA12D20625800D9CBDF /* SDL_log.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AE12D20625800D9CBDF /* SDL_pixels.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AB32D20625800D9CBDF /* SDL_pixels.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AE22D20625800D9CBDF /* SDL_main_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AA32D20625800D9CBDF /* SDL_main_impl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AE32D20625800D9CBDF /* SDL_vulkan.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AC92D20625800D9CBDF /* SDL_vulkan.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AE42D20625800D9CBDF /* SDL_intrin.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A9A2D20625800D9CBDF /* SDL_intrin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AE52D20625800D9CBDF /* SDL_platform_defines.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AB52D20625800D9CBDF /* SDL_platform_defines.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AE62D20625800D9CBDF /* SDL_messagebox.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AA42D20625800D9CBDF /* SDL_messagebox.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AE72D20625800D9CBDF /* SDL_main.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AA22D20625800D9CBDF /* SDL_main.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AE82D20625800D9CBDF /* SDL_version.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AC72D20625800D9CBDF /* SDL_version.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AE92D20625800D9CBDF /* SDL_haptic.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A962D20625800D9CBDF /* SDL_haptic.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AEA2D20625800D9CBDF /* SDL_endian.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A8F2D20625800D9CBDF /* SDL_endian.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AEB2D20625800D9CBDF /* SDL_opengles2_gl2ext.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AAF2D20625800D9CBDF /* SDL_opengles2_gl2ext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AEC2D20625800D9CBDF /* SDL_gamepad.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A932D20625800D9CBDF /* SDL_gamepad.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AED2D20625800D9CBDF /* SDL_timer.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AC42D20625800D9CBDF /* SDL_timer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AEE2D20625800D9CBDF /* SDL_tray.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AC62D20625800D9CBDF /* SDL_tray.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AEF2D20625800D9CBDF /* SDL_init.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A992D20625800D9CBDF /* SDL_init.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AF02D20625800D9CBDF /* SDL_power.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AB62D20625800D9CBDF /* SDL_power.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AF12D20625800D9CBDF /* SDL_copying.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A8B2D20625800D9CBDF /* SDL_copying.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AF22D20625800D9CBDF /* SDL_video.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AC82D20625800D9CBDF /* SDL_video.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AF32D20625800D9CBDF /* SDL_misc.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AA62D20625800D9CBDF /* SDL_misc.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AF42D20625800D9CBDF /* SDL_error.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A902D20625800D9CBDF /* SDL_error.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AF52D20625800D9CBDF /* SDL.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A802D20625800D9CBDF /* SDL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AF62D20625800D9CBDF /* SDL_camera.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A882D20625800D9CBDF /* SDL_camera.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AF72D20625800D9CBDF /* SDL_locale.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AA02D20625800D9CBDF /* SDL_locale.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AF82D20625800D9CBDF /* SDL_opengles2.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AAD2D20625800D9CBDF /* SDL_opengles2.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AF92D20625800D9CBDF /* SDL_oldnames.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AA92D20625800D9CBDF /* SDL_oldnames.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AFA2D20625800D9CBDF /* SDL_hidapi.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A972D20625800D9CBDF /* SDL_hidapi.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AFB2D20625800D9CBDF /* SDL_rect.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AB92D20625800D9CBDF /* SDL_rect.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AFC2D20625800D9CBDF /* SDL_opengles2_gl2.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AAE2D20625800D9CBDF /* SDL_opengles2_gl2.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AFD2D20625800D9CBDF /* SDL_mouse.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AA72D20625800D9CBDF /* SDL_mouse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AFE2D20625800D9CBDF /* SDL_audio.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A842D20625800D9CBDF /* SDL_audio.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46AFF2D20625800D9CBDF /* SDL_close_code.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A8A2D20625800D9CBDF /* SDL_close_code.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B002D20625800D9CBDF /* SDL_surface.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AC02D20625800D9CBDF /* SDL_surface.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B012D20625800D9CBDF /* SDL_blendmode.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A872D20625800D9CBDF /* SDL_blendmode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B022D20625800D9CBDF /* SDL_guid.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A952D20625800D9CBDF /* SDL_guid.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B032D20625800D9CBDF /* SDL_iostream.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A9B2D20625800D9CBDF /* SDL_iostream.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B042D20625800D9CBDF /* SDL_opengl_glext.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AAB2D20625800D9CBDF /* SDL_opengl_glext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B052D20625800D9CBDF /* SDL_keycode.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A9E2D20625800D9CBDF /* SDL_keycode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B062D20625800D9CBDF /* SDL_opengles.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AAC2D20625800D9CBDF /* SDL_opengles.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B072D20625800D9CBDF /* SDL_loadso.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A9F2D20625800D9CBDF /* SDL_loadso.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B082D20625800D9CBDF /* SDL_dialog.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A8D2D20625800D9CBDF /* SDL_dialog.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B092D20625800D9CBDF /* SDL_hints.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A982D20625800D9CBDF /* SDL_hints.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B0A2D20625800D9CBDF /* SDL_system.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AC12D20625800D9CBDF /* SDL_system.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B0B2D20625800D9CBDF /* SDL_time.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AC32D20625800D9CBDF /* SDL_time.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B0C2D20625800D9CBDF /* SDL_asyncio.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A822D20625800D9CBDF /* SDL_asyncio.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B0D2D20625800D9CBDF /* SDL_platform.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AB42D20625800D9CBDF /* SDL_platform.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B0E2D20625800D9CBDF /* SDL_scancode.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46ABC2D20625800D9CBDF /* SDL_scancode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B0F2D20625800D9CBDF /* SDL_revision.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46ABB2D20625800D9CBDF /* SDL_revision.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B102D20625800D9CBDF /* SDL_cpuinfo.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A8C2D20625800D9CBDF /* SDL_cpuinfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B112D20625800D9CBDF /* SDL_thread.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46AC22D20625800D9CBDF /* SDL_thread.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B122D20625800D9CBDF /* SDL_egl.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A8E2D20625800D9CBDF /* SDL_egl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D46B132D20625800D9CBDF /* SDL_filesystem.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D46A922D20625800D9CBDF /* SDL_filesystem.h */; settings = {ATTRIBUTES = (Public, ); }; }; F3D60A8328C16A1900788A3A /* SDL_hidapi_wii.c in Sources */ = {isa = PBXBuildFile; fileRef = F3D60A8228C16A1800788A3A /* SDL_hidapi_wii.c */; }; F3DDCC562AFD42B600B0842B /* SDL_clipboard_c.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DDCC4D2AFD42B500B0842B /* SDL_clipboard_c.h */; }; F3DDCC5B2AFD42B600B0842B /* SDL_video_c.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DDCC522AFD42B600B0842B /* SDL_video_c.h */; }; F3DDCC5D2AFD42B600B0842B /* SDL_rect_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = F3DDCC542AFD42B600B0842B /* SDL_rect_impl.h */; }; F3E5A6EB2AD5E0E600293D83 /* SDL_properties.c in Sources */ = {isa = PBXBuildFile; fileRef = F3E5A6EA2AD5E0E600293D83 /* SDL_properties.c */; }; - F3E5A6ED2AD5E10800293D83 /* SDL_properties.h in Headers */ = {isa = PBXBuildFile; fileRef = F3E5A6EC2AD5E10800293D83 /* SDL_properties.h */; settings = {ATTRIBUTES = (Public, ); }; }; F3F07D5A269640160074468B /* SDL_hidapi_luna.c in Sources */ = {isa = PBXBuildFile; fileRef = F3F07D59269640160074468B /* SDL_hidapi_luna.c */; }; F3F15D7F2D011912007AE210 /* SDL_dialog.c in Sources */ = {isa = PBXBuildFile; fileRef = F3F15D7D2D011912007AE210 /* SDL_dialog.c */; }; F3F15D802D011912007AE210 /* SDL_dialog_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F15D7E2D011912007AE210 /* SDL_dialog_utils.h */; }; F3F15D812D011912007AE210 /* SDL_dialog.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F15D7C2D011912007AE210 /* SDL_dialog.h */; }; - F3F7D8ED2933074E00816151 /* SDL_audio.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8AA2933074900816151 /* SDL_audio.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D8F12933074E00816151 /* SDL_platform.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8AB2933074900816151 /* SDL_platform.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D8F52933074E00816151 /* SDL_stdinc.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8AC2933074900816151 /* SDL_stdinc.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D8F92933074E00816151 /* SDL_haptic.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8AD2933074900816151 /* SDL_haptic.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D8FD2933074E00816151 /* SDL_opengles2_gl2.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8AE2933074900816151 /* SDL_opengles2_gl2.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9012933074E00816151 /* SDL_touch.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8AF2933074900816151 /* SDL_touch.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9052933074E00816151 /* SDL_main.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8B02933074900816151 /* SDL_main.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9092933074E00816151 /* SDL_opengles2_khrplatform.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8B12933074900816151 /* SDL_opengles2_khrplatform.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D90D2933074E00816151 /* SDL_timer.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8B22933074900816151 /* SDL_timer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9112933074E00816151 /* SDL_hints.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8B32933074900816151 /* SDL_hints.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9152933074E00816151 /* SDL_revision.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8B42933074900816151 /* SDL_revision.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9192933074E00816151 /* SDL_pixels.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8B52933074A00816151 /* SDL_pixels.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D91D2933074E00816151 /* SDL_messagebox.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8B62933074A00816151 /* SDL_messagebox.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9212933074E00816151 /* SDL_log.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8B72933074A00816151 /* SDL_log.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9252933074E00816151 /* SDL_egl.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8B82933074A00816151 /* SDL_egl.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9292933074E00816151 /* SDL_atomic.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8B92933074A00816151 /* SDL_atomic.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9312933074E00816151 /* SDL_surface.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8BB2933074A00816151 /* SDL_surface.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9352933074E00816151 /* SDL_error.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8BC2933074A00816151 /* SDL_error.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9392933074E00816151 /* SDL_opengles2_gl2ext.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8BD2933074A00816151 /* SDL_opengles2_gl2ext.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D93D2933074E00816151 /* SDL_endian.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8BE2933074A00816151 /* SDL_endian.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9452933074E00816151 /* SDL_opengl_glext.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8C02933074A00816151 /* SDL_opengl_glext.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9492933074E00816151 /* SDL_scancode.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8C12933074B00816151 /* SDL_scancode.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D94D2933074E00816151 /* SDL_sensor.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8C22933074B00816151 /* SDL_sensor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9512933074E00816151 /* SDL_keyboard.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8C32933074B00816151 /* SDL_keyboard.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9552933074E00816151 /* SDL_locale.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8C42933074B00816151 /* SDL_locale.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9592933074E00816151 /* SDL_video.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8C52933074B00816151 /* SDL_video.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D95D2933074E00816151 /* SDL_opengles.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8C62933074B00816151 /* SDL_opengles.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9612933074E00816151 /* SDL_opengles2.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8C72933074B00816151 /* SDL_opengles2.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9652933074E00816151 /* SDL_iostream.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8C82933074B00816151 /* SDL_iostream.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9692933074E00816151 /* SDL_opengles2_gl2platform.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8C92933074B00816151 /* SDL_opengles2_gl2platform.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D96D2933074E00816151 /* SDL_hidapi.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8CA2933074B00816151 /* SDL_hidapi.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9712933074E00816151 /* SDL_events.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8CB2933074B00816151 /* SDL_events.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9752933074E00816151 /* SDL_keycode.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8CC2933074B00816151 /* SDL_keycode.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9792933074E00816151 /* SDL_thread.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8CD2933074C00816151 /* SDL_thread.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D97D2933074E00816151 /* SDL_blendmode.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8CE2933074C00816151 /* SDL_blendmode.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9812933074E00816151 /* SDL.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8CF2933074C00816151 /* SDL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9852933074E00816151 /* SDL_gamepad.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8D02933074C00816151 /* SDL_gamepad.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9892933074E00816151 /* SDL_guid.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8D12933074C00816151 /* SDL_guid.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D98D2933074E00816151 /* SDL_metal.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8D22933074C00816151 /* SDL_metal.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9912933074E00816151 /* SDL_joystick.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8D32933074C00816151 /* SDL_joystick.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9952933074E00816151 /* SDL_vulkan.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8D42933074C00816151 /* SDL_vulkan.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9992933074E00816151 /* SDL_misc.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8D52933074C00816151 /* SDL_misc.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D99D2933074E00816151 /* SDL_filesystem.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8D62933074C00816151 /* SDL_filesystem.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9A12933074E00816151 /* SDL_clipboard.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8D72933074C00816151 /* SDL_clipboard.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9A52933074E00816151 /* SDL_bits.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8D82933074C00816151 /* SDL_bits.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9A92933074E00816151 /* SDL_loadso.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8D92933074C00816151 /* SDL_loadso.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9AD2933074E00816151 /* SDL_mouse.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8DA2933074D00816151 /* SDL_mouse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9B12933074E00816151 /* SDL_power.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8DB2933074D00816151 /* SDL_power.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9B92933074E00816151 /* SDL_cpuinfo.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8DD2933074D00816151 /* SDL_cpuinfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9BD2933074E00816151 /* SDL_render.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8DE2933074D00816151 /* SDL_render.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9C52933074E00816151 /* SDL_assert.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8E02933074D00816151 /* SDL_assert.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9C92933074E00816151 /* SDL_opengl.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8E12933074D00816151 /* SDL_opengl.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9CD2933074E00816151 /* SDL_rect.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8E22933074D00816151 /* SDL_rect.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9D12933074E00816151 /* SDL_copying.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8E32933074D00816151 /* SDL_copying.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9D52933074E00816151 /* SDL_version.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8E42933074D00816151 /* SDL_version.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9D92933074E00816151 /* SDL_close_code.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8E52933074D00816151 /* SDL_close_code.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9DD2933074E00816151 /* SDL_mutex.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8E62933074E00816151 /* SDL_mutex.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9E12933074E00816151 /* SDL_begin_code.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8E72933074E00816151 /* SDL_begin_code.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3F7D9E52933074E00816151 /* SDL_system.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8E82933074E00816151 /* SDL_system.h */; settings = {ATTRIBUTES = (Public, ); }; }; F3FA5A1D2B59ACE000FEAD97 /* yuv_rgb_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = F3FA5A142B59ACE000FEAD97 /* yuv_rgb_internal.h */; }; F3FA5A1E2B59ACE000FEAD97 /* yuv_rgb_lsx_func.h in Headers */ = {isa = PBXBuildFile; fileRef = F3FA5A152B59ACE000FEAD97 /* yuv_rgb_lsx_func.h */; }; F3FA5A1F2B59ACE000FEAD97 /* yuv_rgb_sse.h in Headers */ = {isa = PBXBuildFile; fileRef = F3FA5A162B59ACE000FEAD97 /* yuv_rgb_sse.h */; }; @@ -526,7 +531,7 @@ F3FA5A252B59ACE000FEAD97 /* yuv_rgb_common.h in Headers */ = {isa = PBXBuildFile; fileRef = F3FA5A1C2B59ACE000FEAD97 /* yuv_rgb_common.h */; }; F3FD042E2C9B755700824C4C /* SDL_hidapi_nintendo.h in Headers */ = {isa = PBXBuildFile; fileRef = F3FD042C2C9B755700824C4C /* SDL_hidapi_nintendo.h */; }; F3FD042F2C9B755700824C4C /* SDL_hidapi_steam_hori.c in Sources */ = {isa = PBXBuildFile; fileRef = F3FD042D2C9B755700824C4C /* SDL_hidapi_steam_hori.c */; }; - FA73671D19A540EF004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73671C19A540EF004122E4 /* CoreVideo.framework */; platformFilters = (ios, maccatalyst, macos, tvos, watchos, ); }; + FA73671D19A540EF004122E4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA73671C19A540EF004122E4 /* CoreVideo.framework */; platformFilters = (ios, maccatalyst, macos, tvos, ); settings = {ATTRIBUTES = (Required, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -560,13 +565,13 @@ 00003260407E1002EAC10000 /* SDL_main_callbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_main_callbacks.h; sourceTree = ""; }; 00003928A612EC33D42C0000 /* SDL_asyncio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_asyncio.c; sourceTree = ""; }; 00003F472C51CE7DF6160000 /* SDL_systime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_systime.c; sourceTree = ""; }; - 00004945A946DF5B1AED0000 /* SDL_asyncio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_asyncio.h; path = SDL3/SDL_asyncio.h; sourceTree = ""; }; + 000053D344416737F6050000 /* SDL_uikitpen.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_uikitpen.m; sourceTree = ""; }; 0000585B2CAB450B40540000 /* SDL_sysasyncio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_sysasyncio.h; sourceTree = ""; }; 00005BD74B46358B33A20000 /* SDL_camera_dummy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_camera_dummy.c; sourceTree = ""; }; 00005D3EB902478835E20000 /* SDL_syscamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_syscamera.h; sourceTree = ""; }; + 000063D3D80F97ADC7770000 /* SDL_uikitpen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_uikitpen.h; sourceTree = ""; }; 0000641A9BAC11AB3FBE0000 /* SDL_time.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_time.c; sourceTree = ""; }; 000078E1881E857EBB6C0000 /* SDL_hashtable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_hashtable.c; sourceTree = ""; }; - 000084ED0A56E3ED52F90000 /* SDL_camera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_camera.h; path = SDL3/SDL_camera.h; sourceTree = ""; }; 00008B79BF08CBCEAC460000 /* SDL_camera_coremedia.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_camera_coremedia.m; sourceTree = ""; }; 00009003C7148E1126CA0000 /* SDL_camera_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_camera_c.h; sourceTree = ""; }; 0000919399B1A908267F0000 /* SDL_asyncio_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_asyncio_c.h; sourceTree = ""; }; @@ -580,7 +585,6 @@ 0073179D0858DECD00B2BC32 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 0073179F0858DECD00B2BC32 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; 007317C10858E15000B2BC32 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; - 00794D3F09D0C461003FC8A1 /* License.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = License.txt; sourceTree = ""; }; 00CFA89C106B4BA100758660 /* ForceFeedback.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ForceFeedback.framework; path = System/Library/Frameworks/ForceFeedback.framework; sourceTree = SDKROOT; }; 00D0D08310675DD9004B05EF /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; 1485C32F2BBA4A0C0063985B /* UniformTypeIdentifiers.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UniformTypeIdentifiers.framework; path = System/Library/Frameworks/UniformTypeIdentifiers.framework; sourceTree = SDKROOT; }; @@ -594,7 +598,6 @@ 566E26CE246274CC00718109 /* SDL_syslocale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_syslocale.h; path = locale/SDL_syslocale.h; sourceTree = ""; }; 56A2373229F9C113003CCA5F /* SDL_sysrwlock.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_sysrwlock.c; sourceTree = ""; }; 6312C66C2B42341400A7BB00 /* SDL_murmur3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_murmur3.c; sourceTree = ""; }; - 63134A212A7902CF0021E9A6 /* SDL_pen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_pen.h; path = SDL3/SDL_pen.h; sourceTree = ""; }; 63134A232A7902FD0021E9A6 /* SDL_pen_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_pen_c.h; sourceTree = ""; }; 63134A242A7902FD0021E9A6 /* SDL_pen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_pen.c; sourceTree = ""; }; 75E09158241EA924004729E1 /* SDL_virtualjoystick.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_virtualjoystick.c; sourceTree = ""; }; @@ -896,12 +899,10 @@ BECDF66B0761BA81005FE872 /* Info-Framework.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-Framework.plist"; sourceTree = ""; }; BECDF66C0761BA81005FE872 /* SDL3.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDL3.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E2D187D228A5673500D2B4F1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E41D20142BA9577D003073FA /* SDL_storage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_storage.h; path = SDL3/SDL_storage.h; sourceTree = ""; }; E47911872BA9555500CE3B7F /* SDL_storage.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_storage.c; sourceTree = ""; }; E47911882BA9555500CE3B7F /* SDL_sysstorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_sysstorage.h; sourceTree = ""; }; E479118A2BA9555500CE3B7F /* SDL_genericstorage.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_genericstorage.c; sourceTree = ""; }; E4A568B52AF763940062EEC4 /* SDL_sysmain_callbacks.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_sysmain_callbacks.c; sourceTree = ""; }; - E4F257702C818FE200FCEAFC /* SDL_gpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_gpu.h; path = SDL3/SDL_gpu.h; sourceTree = ""; }; E4F2577E2C81903800FCEAFC /* Metal_Blit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Metal_Blit.h; sourceTree = ""; }; E4F2577F2C81903800FCEAFC /* Metal_Blit.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; path = Metal_Blit.metal; sourceTree = ""; }; E4F257802C81903800FCEAFC /* SDL_gpu_metal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_gpu_metal.m; sourceTree = ""; }; @@ -931,6 +932,7 @@ F32DDACE2AB795A30041EAA5 /* SDL_audioresample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_audioresample.c; sourceTree = ""; }; F338A1172D1B37D8007CDFDF /* SDL_tray.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDL_tray.m; sourceTree = ""; }; F338A1192D1B37E4007CDFDF /* SDL_tray.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = SDL_tray.c; sourceTree = ""; }; + F344003C2D4022E1003F26D7 /* INSTALL.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = INSTALL.md; sourceTree = ""; }; F362B9152B3349E200D30B94 /* controller_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = controller_list.h; sourceTree = ""; }; F362B9162B3349E200D30B94 /* SDL_gamepad_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_gamepad_c.h; sourceTree = ""; }; F362B9172B3349E200D30B94 /* SDL_steam_virtual_gamepad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_steam_virtual_gamepad.h; sourceTree = ""; }; @@ -940,6 +942,9 @@ F36C342F2C0F876500991150 /* SDL_offscreenvulkan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_offscreenvulkan.h; sourceTree = ""; }; F36C34302C0F876500991150 /* SDL_offscreenvulkan.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_offscreenvulkan.c; sourceTree = ""; }; F36C7AD0294BA009004D61C3 /* SDL_runapp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_runapp.c; sourceTree = ""; }; + F373DA172D3889EE002158FA /* INSTALL.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = INSTALL.md; sourceTree = ""; }; + F373DA182D388A1E002158FA /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = LICENSE.txt; path = ../../../../LICENSE.txt; sourceTree = ""; }; + F373DA192D388A1E002158FA /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../../../../README.md; sourceTree = ""; }; F376F6182559B29300CFC0BC /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.1.sdk/System/Library/Frameworks/OpenGLES.framework; sourceTree = DEVELOPER_DIR; }; F376F61A2559B2AF00CFC0BC /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/iOSSupport/System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; F376F6312559B31D00CFC0BC /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/iOSSupport/System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; }; @@ -957,10 +962,8 @@ F37A8E1928405AA100C38E95 /* CMake */ = {isa = PBXFileReference; lastKnownFileType = folder; path = CMake; sourceTree = ""; }; F37DC5F225350EBC0002E6F7 /* CoreHaptics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreHaptics.framework; path = System/Library/Frameworks/CoreHaptics.framework; sourceTree = SDKROOT; }; F37DC5F425350ECC0002E6F7 /* CoreHaptics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreHaptics.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS14.0.sdk/System/Library/Frameworks/CoreHaptics.framework; sourceTree = DEVELOPER_DIR; }; - F37E18512BA50E750098C111 /* SDL_dialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_dialog.h; path = SDL3/SDL_dialog.h; sourceTree = ""; }; F37E18572BA50F3B0098C111 /* SDL_cocoadialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoadialog.m; sourceTree = ""; }; F37E18592BA50F450098C111 /* SDL_dummydialog.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_dummydialog.c; sourceTree = ""; }; - F37E185B2BAA3EF90098C111 /* SDL_time.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_time.h; path = SDL3/SDL_time.h; sourceTree = ""; }; F37E18612BAA40090098C111 /* SDL_sysfilesystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_sysfilesystem.h; sourceTree = ""; }; F37E18632BAA40670098C111 /* SDL_time_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_time_c.h; sourceTree = ""; }; F3820712284F3609004DD584 /* controller_type.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = controller_type.c; sourceTree = ""; }; @@ -989,88 +992,98 @@ F3A9AE962C8A13C100AAC390 /* SDL_pipeline_gpu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_pipeline_gpu.c; sourceTree = ""; }; F3A9AE972C8A13C100AAC390 /* SDL_shaders_gpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_shaders_gpu.h; sourceTree = ""; }; F3ADAB8D2576F0B300A6B1D9 /* SDL_sysurl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_sysurl.m; sourceTree = ""; }; - F3B38CCA296E2E52005DA6D3 /* SDL_main_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_main_impl.h; path = SDL3/SDL_main_impl.h; sourceTree = ""; }; - F3B38CCB296E2E52005DA6D3 /* SDL_platform_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_platform_defines.h; path = SDL3/SDL_platform_defines.h; sourceTree = ""; }; - F3B38CCC296E2E52005DA6D3 /* SDL_init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_init.h; path = SDL3/SDL_init.h; sourceTree = ""; }; - F3B38CCD296E2E52005DA6D3 /* SDL_oldnames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_oldnames.h; path = SDL3/SDL_oldnames.h; sourceTree = ""; }; - F3B38CCE296E2E52005DA6D3 /* SDL_intrin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_intrin.h; path = SDL3/SDL_intrin.h; sourceTree = ""; }; - F3B439472C93595900792030 /* SDL_process.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_process.h; path = SDL3/SDL_process.h; sourceTree = ""; }; F3B439502C935C2400792030 /* SDL_dummyprocess.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_dummyprocess.c; sourceTree = ""; }; F3B439522C935C2C00792030 /* SDL_posixprocess.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_posixprocess.c; sourceTree = ""; }; F3B439542C937DAB00792030 /* SDL_process.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_process.c; sourceTree = ""; }; F3B439552C937DAB00792030 /* SDL_sysprocess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_sysprocess.h; sourceTree = ""; }; + F3C1BD732D1F1A3000846529 /* SDL_tray_utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_tray_utils.h; sourceTree = ""; }; + F3C1BD742D1F1A3000846529 /* SDL_tray_utils.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = SDL_tray_utils.c; sourceTree = ""; }; F3C2CB202C5DDDB2004D7998 /* SDL_categories_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_categories_c.h; sourceTree = ""; }; F3C2CB212C5DDDB2004D7998 /* SDL_categories.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_categories.c; sourceTree = ""; }; + F3D46A802D20625800D9CBDF /* SDL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL.h; sourceTree = ""; }; + F3D46A812D20625800D9CBDF /* SDL_assert.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_assert.h; sourceTree = ""; }; + F3D46A822D20625800D9CBDF /* SDL_asyncio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_asyncio.h; sourceTree = ""; }; + F3D46A832D20625800D9CBDF /* SDL_atomic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_atomic.h; sourceTree = ""; }; + F3D46A842D20625800D9CBDF /* SDL_audio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_audio.h; sourceTree = ""; }; + F3D46A852D20625800D9CBDF /* SDL_begin_code.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_begin_code.h; sourceTree = ""; }; + F3D46A862D20625800D9CBDF /* SDL_bits.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_bits.h; sourceTree = ""; }; + F3D46A872D20625800D9CBDF /* SDL_blendmode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_blendmode.h; sourceTree = ""; }; + F3D46A882D20625800D9CBDF /* SDL_camera.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_camera.h; sourceTree = ""; }; + F3D46A892D20625800D9CBDF /* SDL_clipboard.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_clipboard.h; sourceTree = ""; }; + F3D46A8A2D20625800D9CBDF /* SDL_close_code.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_close_code.h; sourceTree = ""; }; + F3D46A8B2D20625800D9CBDF /* SDL_copying.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_copying.h; sourceTree = ""; }; + F3D46A8C2D20625800D9CBDF /* SDL_cpuinfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_cpuinfo.h; sourceTree = ""; }; + F3D46A8D2D20625800D9CBDF /* SDL_dialog.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_dialog.h; sourceTree = ""; }; + F3D46A8E2D20625800D9CBDF /* SDL_egl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_egl.h; sourceTree = ""; }; + F3D46A8F2D20625800D9CBDF /* SDL_endian.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_endian.h; sourceTree = ""; }; + F3D46A902D20625800D9CBDF /* SDL_error.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_error.h; sourceTree = ""; }; + F3D46A912D20625800D9CBDF /* SDL_events.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_events.h; sourceTree = ""; }; + F3D46A922D20625800D9CBDF /* SDL_filesystem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_filesystem.h; sourceTree = ""; }; + F3D46A932D20625800D9CBDF /* SDL_gamepad.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_gamepad.h; sourceTree = ""; }; + F3D46A942D20625800D9CBDF /* SDL_gpu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_gpu.h; sourceTree = ""; }; + F3D46A952D20625800D9CBDF /* SDL_guid.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_guid.h; sourceTree = ""; }; + F3D46A962D20625800D9CBDF /* SDL_haptic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_haptic.h; sourceTree = ""; }; + F3D46A972D20625800D9CBDF /* SDL_hidapi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_hidapi.h; sourceTree = ""; }; + F3D46A982D20625800D9CBDF /* SDL_hints.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_hints.h; sourceTree = ""; }; + F3D46A992D20625800D9CBDF /* SDL_init.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_init.h; sourceTree = ""; }; + F3D46A9A2D20625800D9CBDF /* SDL_intrin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_intrin.h; sourceTree = ""; }; + F3D46A9B2D20625800D9CBDF /* SDL_iostream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_iostream.h; sourceTree = ""; }; + F3D46A9C2D20625800D9CBDF /* SDL_joystick.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_joystick.h; sourceTree = ""; }; + F3D46A9D2D20625800D9CBDF /* SDL_keyboard.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_keyboard.h; sourceTree = ""; }; + F3D46A9E2D20625800D9CBDF /* SDL_keycode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_keycode.h; sourceTree = ""; }; + F3D46A9F2D20625800D9CBDF /* SDL_loadso.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_loadso.h; sourceTree = ""; }; + F3D46AA02D20625800D9CBDF /* SDL_locale.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_locale.h; sourceTree = ""; }; + F3D46AA12D20625800D9CBDF /* SDL_log.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_log.h; sourceTree = ""; }; + F3D46AA22D20625800D9CBDF /* SDL_main.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_main.h; sourceTree = ""; }; + F3D46AA32D20625800D9CBDF /* SDL_main_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_main_impl.h; sourceTree = ""; }; + F3D46AA42D20625800D9CBDF /* SDL_messagebox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_messagebox.h; sourceTree = ""; }; + F3D46AA52D20625800D9CBDF /* SDL_metal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_metal.h; sourceTree = ""; }; + F3D46AA62D20625800D9CBDF /* SDL_misc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_misc.h; sourceTree = ""; }; + F3D46AA72D20625800D9CBDF /* SDL_mouse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_mouse.h; sourceTree = ""; }; + F3D46AA82D20625800D9CBDF /* SDL_mutex.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_mutex.h; sourceTree = ""; }; + F3D46AA92D20625800D9CBDF /* SDL_oldnames.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_oldnames.h; sourceTree = ""; }; + F3D46AAA2D20625800D9CBDF /* SDL_opengl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_opengl.h; sourceTree = ""; }; + F3D46AAB2D20625800D9CBDF /* SDL_opengl_glext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_opengl_glext.h; sourceTree = ""; }; + F3D46AAC2D20625800D9CBDF /* SDL_opengles.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_opengles.h; sourceTree = ""; }; + F3D46AAD2D20625800D9CBDF /* SDL_opengles2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_opengles2.h; sourceTree = ""; }; + F3D46AAE2D20625800D9CBDF /* SDL_opengles2_gl2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_opengles2_gl2.h; sourceTree = ""; }; + F3D46AAF2D20625800D9CBDF /* SDL_opengles2_gl2ext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_opengles2_gl2ext.h; sourceTree = ""; }; + F3D46AB02D20625800D9CBDF /* SDL_opengles2_gl2platform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_opengles2_gl2platform.h; sourceTree = ""; }; + F3D46AB12D20625800D9CBDF /* SDL_opengles2_khrplatform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_opengles2_khrplatform.h; sourceTree = ""; }; + F3D46AB22D20625800D9CBDF /* SDL_pen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_pen.h; sourceTree = ""; }; + F3D46AB32D20625800D9CBDF /* SDL_pixels.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_pixels.h; sourceTree = ""; }; + F3D46AB42D20625800D9CBDF /* SDL_platform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_platform.h; sourceTree = ""; }; + F3D46AB52D20625800D9CBDF /* SDL_platform_defines.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_platform_defines.h; sourceTree = ""; }; + F3D46AB62D20625800D9CBDF /* SDL_power.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_power.h; sourceTree = ""; }; + F3D46AB72D20625800D9CBDF /* SDL_process.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_process.h; sourceTree = ""; }; + F3D46AB82D20625800D9CBDF /* SDL_properties.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_properties.h; sourceTree = ""; }; + F3D46AB92D20625800D9CBDF /* SDL_rect.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_rect.h; sourceTree = ""; }; + F3D46ABA2D20625800D9CBDF /* SDL_render.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_render.h; sourceTree = ""; }; + F3D46ABB2D20625800D9CBDF /* SDL_revision.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_revision.h; sourceTree = ""; }; + F3D46ABC2D20625800D9CBDF /* SDL_scancode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_scancode.h; sourceTree = ""; }; + F3D46ABD2D20625800D9CBDF /* SDL_sensor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_sensor.h; sourceTree = ""; }; + F3D46ABE2D20625800D9CBDF /* SDL_stdinc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_stdinc.h; sourceTree = ""; }; + F3D46ABF2D20625800D9CBDF /* SDL_storage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_storage.h; sourceTree = ""; }; + F3D46AC02D20625800D9CBDF /* SDL_surface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_surface.h; sourceTree = ""; }; + F3D46AC12D20625800D9CBDF /* SDL_system.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_system.h; sourceTree = ""; }; + F3D46AC22D20625800D9CBDF /* SDL_thread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_thread.h; sourceTree = ""; }; + F3D46AC32D20625800D9CBDF /* SDL_time.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_time.h; sourceTree = ""; }; + F3D46AC42D20625800D9CBDF /* SDL_timer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_timer.h; sourceTree = ""; }; + F3D46AC52D20625800D9CBDF /* SDL_touch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_touch.h; sourceTree = ""; }; + F3D46AC62D20625800D9CBDF /* SDL_tray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_tray.h; sourceTree = ""; }; + F3D46AC72D20625800D9CBDF /* SDL_version.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_version.h; sourceTree = ""; }; + F3D46AC82D20625800D9CBDF /* SDL_video.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_video.h; sourceTree = ""; }; + F3D46AC92D20625800D9CBDF /* SDL_vulkan.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_vulkan.h; sourceTree = ""; }; F3D60A8228C16A1800788A3A /* SDL_hidapi_wii.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_hidapi_wii.c; sourceTree = ""; }; F3DDCC4D2AFD42B500B0842B /* SDL_clipboard_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_clipboard_c.h; sourceTree = ""; }; F3DDCC522AFD42B600B0842B /* SDL_video_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_video_c.h; sourceTree = ""; }; F3DDCC542AFD42B600B0842B /* SDL_rect_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_rect_impl.h; sourceTree = ""; }; F3E5A6EA2AD5E0E600293D83 /* SDL_properties.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_properties.c; sourceTree = ""; }; - F3E5A6EC2AD5E10800293D83 /* SDL_properties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_properties.h; path = SDL3/SDL_properties.h; sourceTree = ""; }; F3F07D59269640160074468B /* SDL_hidapi_luna.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_hidapi_luna.c; sourceTree = ""; }; F3F15D7C2D011912007AE210 /* SDL_dialog.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_dialog.h; sourceTree = ""; }; F3F15D7D2D011912007AE210 /* SDL_dialog.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = SDL_dialog.c; sourceTree = ""; }; F3F15D7E2D011912007AE210 /* SDL_dialog_utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_dialog_utils.h; sourceTree = ""; }; F3F7BE3B2CBD79D200C984AF /* config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = config.xcconfig; sourceTree = ""; }; - F3F7D8AA2933074900816151 /* SDL_audio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_audio.h; path = SDL3/SDL_audio.h; sourceTree = ""; }; - F3F7D8AB2933074900816151 /* SDL_platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_platform.h; path = SDL3/SDL_platform.h; sourceTree = ""; }; - F3F7D8AC2933074900816151 /* SDL_stdinc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_stdinc.h; path = SDL3/SDL_stdinc.h; sourceTree = ""; }; - F3F7D8AD2933074900816151 /* SDL_haptic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_haptic.h; path = SDL3/SDL_haptic.h; sourceTree = ""; }; - F3F7D8AE2933074900816151 /* SDL_opengles2_gl2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_opengles2_gl2.h; path = SDL3/SDL_opengles2_gl2.h; sourceTree = ""; }; - F3F7D8AF2933074900816151 /* SDL_touch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_touch.h; path = SDL3/SDL_touch.h; sourceTree = ""; }; - F3F7D8B02933074900816151 /* SDL_main.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_main.h; path = SDL3/SDL_main.h; sourceTree = ""; }; - F3F7D8B12933074900816151 /* SDL_opengles2_khrplatform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_opengles2_khrplatform.h; path = SDL3/SDL_opengles2_khrplatform.h; sourceTree = ""; }; - F3F7D8B22933074900816151 /* SDL_timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_timer.h; path = SDL3/SDL_timer.h; sourceTree = ""; }; - F3F7D8B32933074900816151 /* SDL_hints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_hints.h; path = SDL3/SDL_hints.h; sourceTree = ""; }; - F3F7D8B42933074900816151 /* SDL_revision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_revision.h; path = SDL3/SDL_revision.h; sourceTree = ""; }; - F3F7D8B52933074A00816151 /* SDL_pixels.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_pixels.h; path = SDL3/SDL_pixels.h; sourceTree = ""; }; - F3F7D8B62933074A00816151 /* SDL_messagebox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_messagebox.h; path = SDL3/SDL_messagebox.h; sourceTree = ""; }; - F3F7D8B72933074A00816151 /* SDL_log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_log.h; path = SDL3/SDL_log.h; sourceTree = ""; }; - F3F7D8B82933074A00816151 /* SDL_egl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_egl.h; path = SDL3/SDL_egl.h; sourceTree = ""; }; - F3F7D8B92933074A00816151 /* SDL_atomic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_atomic.h; path = SDL3/SDL_atomic.h; sourceTree = ""; }; - F3F7D8BB2933074A00816151 /* SDL_surface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_surface.h; path = SDL3/SDL_surface.h; sourceTree = ""; }; - F3F7D8BC2933074A00816151 /* SDL_error.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_error.h; path = SDL3/SDL_error.h; sourceTree = ""; }; - F3F7D8BD2933074A00816151 /* SDL_opengles2_gl2ext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_opengles2_gl2ext.h; path = SDL3/SDL_opengles2_gl2ext.h; sourceTree = ""; }; - F3F7D8BE2933074A00816151 /* SDL_endian.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_endian.h; path = SDL3/SDL_endian.h; sourceTree = ""; }; - F3F7D8C02933074A00816151 /* SDL_opengl_glext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_opengl_glext.h; path = SDL3/SDL_opengl_glext.h; sourceTree = ""; }; - F3F7D8C12933074B00816151 /* SDL_scancode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_scancode.h; path = SDL3/SDL_scancode.h; sourceTree = ""; }; - F3F7D8C22933074B00816151 /* SDL_sensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_sensor.h; path = SDL3/SDL_sensor.h; sourceTree = ""; }; - F3F7D8C32933074B00816151 /* SDL_keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_keyboard.h; path = SDL3/SDL_keyboard.h; sourceTree = ""; }; - F3F7D8C42933074B00816151 /* SDL_locale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_locale.h; path = SDL3/SDL_locale.h; sourceTree = ""; }; - F3F7D8C52933074B00816151 /* SDL_video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_video.h; path = SDL3/SDL_video.h; sourceTree = ""; }; - F3F7D8C62933074B00816151 /* SDL_opengles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_opengles.h; path = SDL3/SDL_opengles.h; sourceTree = ""; }; - F3F7D8C72933074B00816151 /* SDL_opengles2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_opengles2.h; path = SDL3/SDL_opengles2.h; sourceTree = ""; }; - F3F7D8C82933074B00816151 /* SDL_iostream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_iostream.h; path = SDL3/SDL_iostream.h; sourceTree = ""; }; - F3F7D8C92933074B00816151 /* SDL_opengles2_gl2platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_opengles2_gl2platform.h; path = SDL3/SDL_opengles2_gl2platform.h; sourceTree = ""; }; - F3F7D8CA2933074B00816151 /* SDL_hidapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_hidapi.h; path = SDL3/SDL_hidapi.h; sourceTree = ""; }; - F3F7D8CB2933074B00816151 /* SDL_events.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_events.h; path = SDL3/SDL_events.h; sourceTree = ""; }; - F3F7D8CC2933074B00816151 /* SDL_keycode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_keycode.h; path = SDL3/SDL_keycode.h; sourceTree = ""; }; - F3F7D8CD2933074C00816151 /* SDL_thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_thread.h; path = SDL3/SDL_thread.h; sourceTree = ""; }; - F3F7D8CE2933074C00816151 /* SDL_blendmode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_blendmode.h; path = SDL3/SDL_blendmode.h; sourceTree = ""; }; - F3F7D8CF2933074C00816151 /* SDL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL.h; path = SDL3/SDL.h; sourceTree = ""; }; - F3F7D8D02933074C00816151 /* SDL_gamepad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_gamepad.h; path = SDL3/SDL_gamepad.h; sourceTree = ""; }; - F3F7D8D12933074C00816151 /* SDL_guid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_guid.h; path = SDL3/SDL_guid.h; sourceTree = ""; }; - F3F7D8D22933074C00816151 /* SDL_metal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_metal.h; path = SDL3/SDL_metal.h; sourceTree = ""; }; - F3F7D8D32933074C00816151 /* SDL_joystick.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_joystick.h; path = SDL3/SDL_joystick.h; sourceTree = ""; }; - F3F7D8D42933074C00816151 /* SDL_vulkan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_vulkan.h; path = SDL3/SDL_vulkan.h; sourceTree = ""; }; - F3F7D8D52933074C00816151 /* SDL_misc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_misc.h; path = SDL3/SDL_misc.h; sourceTree = ""; }; - F3F7D8D62933074C00816151 /* SDL_filesystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_filesystem.h; path = SDL3/SDL_filesystem.h; sourceTree = ""; }; - F3F7D8D72933074C00816151 /* SDL_clipboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_clipboard.h; path = SDL3/SDL_clipboard.h; sourceTree = ""; }; - F3F7D8D82933074C00816151 /* SDL_bits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_bits.h; path = SDL3/SDL_bits.h; sourceTree = ""; }; - F3F7D8D92933074C00816151 /* SDL_loadso.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_loadso.h; path = SDL3/SDL_loadso.h; sourceTree = ""; }; - F3F7D8DA2933074D00816151 /* SDL_mouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_mouse.h; path = SDL3/SDL_mouse.h; sourceTree = ""; }; - F3F7D8DB2933074D00816151 /* SDL_power.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_power.h; path = SDL3/SDL_power.h; sourceTree = ""; }; - F3F7D8DD2933074D00816151 /* SDL_cpuinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_cpuinfo.h; path = SDL3/SDL_cpuinfo.h; sourceTree = ""; }; - F3F7D8DE2933074D00816151 /* SDL_render.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_render.h; path = SDL3/SDL_render.h; sourceTree = ""; }; - F3F7D8E02933074D00816151 /* SDL_assert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_assert.h; path = SDL3/SDL_assert.h; sourceTree = ""; }; - F3F7D8E12933074D00816151 /* SDL_opengl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_opengl.h; path = SDL3/SDL_opengl.h; sourceTree = ""; }; - F3F7D8E22933074D00816151 /* SDL_rect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_rect.h; path = SDL3/SDL_rect.h; sourceTree = ""; }; - F3F7D8E32933074D00816151 /* SDL_copying.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_copying.h; path = SDL3/SDL_copying.h; sourceTree = ""; }; - F3F7D8E42933074D00816151 /* SDL_version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_version.h; path = SDL3/SDL_version.h; sourceTree = ""; }; - F3F7D8E52933074D00816151 /* SDL_close_code.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_close_code.h; path = SDL3/SDL_close_code.h; sourceTree = ""; }; - F3F7D8E62933074E00816151 /* SDL_mutex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_mutex.h; path = SDL3/SDL_mutex.h; sourceTree = ""; }; - F3F7D8E72933074E00816151 /* SDL_begin_code.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_begin_code.h; path = SDL3/SDL_begin_code.h; sourceTree = ""; }; - F3F7D8E82933074E00816151 /* SDL_system.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_system.h; path = SDL3/SDL_system.h; sourceTree = ""; }; F3FA5A142B59ACE000FEAD97 /* yuv_rgb_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yuv_rgb_internal.h; sourceTree = ""; }; F3FA5A152B59ACE000FEAD97 /* yuv_rgb_lsx_func.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yuv_rgb_lsx_func.h; sourceTree = ""; }; F3FA5A162B59ACE000FEAD97 /* yuv_rgb_sse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yuv_rgb_sse.h; sourceTree = ""; }; @@ -1082,7 +1095,6 @@ F3FA5A1C2B59ACE000FEAD97 /* yuv_rgb_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yuv_rgb_common.h; sourceTree = ""; }; F3FD042C2C9B755700824C4C /* SDL_hidapi_nintendo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_hidapi_nintendo.h; sourceTree = ""; }; F3FD042D2C9B755700824C4C /* SDL_hidapi_steam_hori.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = SDL_hidapi_steam_hori.c; sourceTree = ""; }; - F59C710300D5CB5801000001 /* ReadMe.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = ReadMe.txt; sourceTree = ""; }; F59C710600D5CB5801000001 /* SDL.info */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SDL.info; sourceTree = ""; }; F5A2EF3900C6A39A01000001 /* BUGS.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = BUGS.txt; path = ../../BUGS.txt; sourceTree = SOURCE_ROOT; }; FA73671C19A540EF004122E4 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; @@ -1205,82 +1217,83 @@ 0153844A006D81B07F000001 /* Public Headers */ = { isa = PBXGroup; children = ( - F3F7D8CF2933074C00816151 /* SDL.h */, - F3F7D8E02933074D00816151 /* SDL_assert.h */, - 00004945A946DF5B1AED0000 /* SDL_asyncio.h */, - F3F7D8B92933074A00816151 /* SDL_atomic.h */, - F3F7D8AA2933074900816151 /* SDL_audio.h */, - F3F7D8E72933074E00816151 /* SDL_begin_code.h */, - F3F7D8D82933074C00816151 /* SDL_bits.h */, - F3F7D8CE2933074C00816151 /* SDL_blendmode.h */, - 000084ED0A56E3ED52F90000 /* SDL_camera.h */, - F3F7D8D72933074C00816151 /* SDL_clipboard.h */, - F3F7D8E52933074D00816151 /* SDL_close_code.h */, - F3F7D8E32933074D00816151 /* SDL_copying.h */, - F3F7D8DD2933074D00816151 /* SDL_cpuinfo.h */, - F37E18512BA50E750098C111 /* SDL_dialog.h */, - F3F7D8B82933074A00816151 /* SDL_egl.h */, - F3F7D8BE2933074A00816151 /* SDL_endian.h */, - F3F7D8BC2933074A00816151 /* SDL_error.h */, - F3F7D8CB2933074B00816151 /* SDL_events.h */, - F3F7D8D62933074C00816151 /* SDL_filesystem.h */, - F3F7D8D02933074C00816151 /* SDL_gamepad.h */, - E4F257702C818FE200FCEAFC /* SDL_gpu.h */, - F3F7D8D12933074C00816151 /* SDL_guid.h */, - F3F7D8AD2933074900816151 /* SDL_haptic.h */, - F3F7D8CA2933074B00816151 /* SDL_hidapi.h */, - F3F7D8B32933074900816151 /* SDL_hints.h */, - F3B38CCC296E2E52005DA6D3 /* SDL_init.h */, - F3B38CCE296E2E52005DA6D3 /* SDL_intrin.h */, - F3F7D8C82933074B00816151 /* SDL_iostream.h */, - F3F7D8D32933074C00816151 /* SDL_joystick.h */, - F3F7D8C32933074B00816151 /* SDL_keyboard.h */, - F3F7D8CC2933074B00816151 /* SDL_keycode.h */, - F3F7D8D92933074C00816151 /* SDL_loadso.h */, - F3F7D8C42933074B00816151 /* SDL_locale.h */, - F3F7D8B72933074A00816151 /* SDL_log.h */, - F3F7D8B02933074900816151 /* SDL_main.h */, - F3B38CCA296E2E52005DA6D3 /* SDL_main_impl.h */, - F3F7D8B62933074A00816151 /* SDL_messagebox.h */, - F3F7D8D22933074C00816151 /* SDL_metal.h */, - F3F7D8D52933074C00816151 /* SDL_misc.h */, - F3F7D8DA2933074D00816151 /* SDL_mouse.h */, - F3F7D8E62933074E00816151 /* SDL_mutex.h */, - F3B38CCD296E2E52005DA6D3 /* SDL_oldnames.h */, - F3F7D8E12933074D00816151 /* SDL_opengl.h */, - F3F7D8C02933074A00816151 /* SDL_opengl_glext.h */, - F3F7D8C62933074B00816151 /* SDL_opengles.h */, - F3F7D8C72933074B00816151 /* SDL_opengles2.h */, - F3F7D8AE2933074900816151 /* SDL_opengles2_gl2.h */, - F3F7D8BD2933074A00816151 /* SDL_opengles2_gl2ext.h */, - F3F7D8C92933074B00816151 /* SDL_opengles2_gl2platform.h */, - F3F7D8B12933074900816151 /* SDL_opengles2_khrplatform.h */, - 63134A212A7902CF0021E9A6 /* SDL_pen.h */, - F3F7D8B52933074A00816151 /* SDL_pixels.h */, - F3F7D8AB2933074900816151 /* SDL_platform.h */, - F3B38CCB296E2E52005DA6D3 /* SDL_platform_defines.h */, - F3F7D8DB2933074D00816151 /* SDL_power.h */, - F3B439472C93595900792030 /* SDL_process.h */, - F3E5A6EC2AD5E10800293D83 /* SDL_properties.h */, - F3F7D8E22933074D00816151 /* SDL_rect.h */, - F3F7D8DE2933074D00816151 /* SDL_render.h */, - F3F7D8B42933074900816151 /* SDL_revision.h */, - F3F7D8C12933074B00816151 /* SDL_scancode.h */, - F3F7D8C22933074B00816151 /* SDL_sensor.h */, - F3F7D8AC2933074900816151 /* SDL_stdinc.h */, - E41D20142BA9577D003073FA /* SDL_storage.h */, - F3F7D8BB2933074A00816151 /* SDL_surface.h */, - F3F7D8E82933074E00816151 /* SDL_system.h */, - F3F7D8CD2933074C00816151 /* SDL_thread.h */, - F37E185B2BAA3EF90098C111 /* SDL_time.h */, - F3F7D8B22933074900816151 /* SDL_timer.h */, - F3F7D8AF2933074900816151 /* SDL_touch.h */, - F3F7D8E42933074D00816151 /* SDL_version.h */, - F3F7D8C52933074B00816151 /* SDL_video.h */, - F3F7D8D42933074C00816151 /* SDL_vulkan.h */, + F3D46A802D20625800D9CBDF /* SDL.h */, + F3D46A812D20625800D9CBDF /* SDL_assert.h */, + F3D46A822D20625800D9CBDF /* SDL_asyncio.h */, + F3D46A832D20625800D9CBDF /* SDL_atomic.h */, + F3D46A842D20625800D9CBDF /* SDL_audio.h */, + F3D46A852D20625800D9CBDF /* SDL_begin_code.h */, + F3D46A862D20625800D9CBDF /* SDL_bits.h */, + F3D46A872D20625800D9CBDF /* SDL_blendmode.h */, + F3D46A882D20625800D9CBDF /* SDL_camera.h */, + F3D46A892D20625800D9CBDF /* SDL_clipboard.h */, + F3D46A8A2D20625800D9CBDF /* SDL_close_code.h */, + F3D46A8B2D20625800D9CBDF /* SDL_copying.h */, + F3D46A8C2D20625800D9CBDF /* SDL_cpuinfo.h */, + F3D46A8D2D20625800D9CBDF /* SDL_dialog.h */, + F3D46A8E2D20625800D9CBDF /* SDL_egl.h */, + F3D46A8F2D20625800D9CBDF /* SDL_endian.h */, + F3D46A902D20625800D9CBDF /* SDL_error.h */, + F3D46A912D20625800D9CBDF /* SDL_events.h */, + F3D46A922D20625800D9CBDF /* SDL_filesystem.h */, + F3D46A932D20625800D9CBDF /* SDL_gamepad.h */, + F3D46A942D20625800D9CBDF /* SDL_gpu.h */, + F3D46A952D20625800D9CBDF /* SDL_guid.h */, + F3D46A962D20625800D9CBDF /* SDL_haptic.h */, + F3D46A972D20625800D9CBDF /* SDL_hidapi.h */, + F3D46A982D20625800D9CBDF /* SDL_hints.h */, + F3D46A992D20625800D9CBDF /* SDL_init.h */, + F3D46A9A2D20625800D9CBDF /* SDL_intrin.h */, + F3D46A9B2D20625800D9CBDF /* SDL_iostream.h */, + F3D46A9C2D20625800D9CBDF /* SDL_joystick.h */, + F3D46A9D2D20625800D9CBDF /* SDL_keyboard.h */, + F3D46A9E2D20625800D9CBDF /* SDL_keycode.h */, + F3D46A9F2D20625800D9CBDF /* SDL_loadso.h */, + F3D46AA02D20625800D9CBDF /* SDL_locale.h */, + F3D46AA12D20625800D9CBDF /* SDL_log.h */, + F3D46AA22D20625800D9CBDF /* SDL_main.h */, + F3D46AA32D20625800D9CBDF /* SDL_main_impl.h */, + F3D46AA42D20625800D9CBDF /* SDL_messagebox.h */, + F3D46AA52D20625800D9CBDF /* SDL_metal.h */, + F3D46AA62D20625800D9CBDF /* SDL_misc.h */, + F3D46AA72D20625800D9CBDF /* SDL_mouse.h */, + F3D46AA82D20625800D9CBDF /* SDL_mutex.h */, + F3D46AA92D20625800D9CBDF /* SDL_oldnames.h */, + F3D46AAA2D20625800D9CBDF /* SDL_opengl.h */, + F3D46AAB2D20625800D9CBDF /* SDL_opengl_glext.h */, + F3D46AAC2D20625800D9CBDF /* SDL_opengles.h */, + F3D46AAD2D20625800D9CBDF /* SDL_opengles2.h */, + F3D46AAE2D20625800D9CBDF /* SDL_opengles2_gl2.h */, + F3D46AAF2D20625800D9CBDF /* SDL_opengles2_gl2ext.h */, + F3D46AB02D20625800D9CBDF /* SDL_opengles2_gl2platform.h */, + F3D46AB12D20625800D9CBDF /* SDL_opengles2_khrplatform.h */, + F3D46AB22D20625800D9CBDF /* SDL_pen.h */, + F3D46AB32D20625800D9CBDF /* SDL_pixels.h */, + F3D46AB42D20625800D9CBDF /* SDL_platform.h */, + F3D46AB52D20625800D9CBDF /* SDL_platform_defines.h */, + F3D46AB62D20625800D9CBDF /* SDL_power.h */, + F3D46AB72D20625800D9CBDF /* SDL_process.h */, + F3D46AB82D20625800D9CBDF /* SDL_properties.h */, + F3D46AB92D20625800D9CBDF /* SDL_rect.h */, + F3D46ABA2D20625800D9CBDF /* SDL_render.h */, + F3D46ABB2D20625800D9CBDF /* SDL_revision.h */, + F3D46ABC2D20625800D9CBDF /* SDL_scancode.h */, + F3D46ABD2D20625800D9CBDF /* SDL_sensor.h */, + F3D46ABE2D20625800D9CBDF /* SDL_stdinc.h */, + F3D46ABF2D20625800D9CBDF /* SDL_storage.h */, + F3D46AC02D20625800D9CBDF /* SDL_surface.h */, + F3D46AC12D20625800D9CBDF /* SDL_system.h */, + F3D46AC22D20625800D9CBDF /* SDL_thread.h */, + F3D46AC32D20625800D9CBDF /* SDL_time.h */, + F3D46AC42D20625800D9CBDF /* SDL_timer.h */, + F3D46AC52D20625800D9CBDF /* SDL_touch.h */, + F3D46AC62D20625800D9CBDF /* SDL_tray.h */, + F3D46AC72D20625800D9CBDF /* SDL_version.h */, + F3D46AC82D20625800D9CBDF /* SDL_video.h */, + F3D46AC92D20625800D9CBDF /* SDL_vulkan.h */, ); name = "Public Headers"; - path = ../../include; + path = ../../include/SDL3; sourceTree = ""; }; 034768DDFF38A45A11DB9C8B /* Products */ = { @@ -1322,7 +1335,7 @@ F37E18542BA50EB40098C111 /* dialog */, A7D8A5D723E2513D00DCD162 /* dynapi */, A7D8A92923E2514000DCD162 /* events */, - A7D8A7DA23E2513E00DCD162 /* file */, + A7D8A7DA23E2513E00DCD162 /* io */, A7D8A7F623E2513F00DCD162 /* filesystem */, E4F257872C81903800FCEAFC /* gpu */, A7D8A5C223E2513D00DCD162 /* haptic */, @@ -1675,6 +1688,8 @@ A7D8A62523E2513D00DCD162 /* SDL_uikitvulkan.m */, A7D8A62723E2513D00DCD162 /* SDL_uikitwindow.h */, A7D8A61A23E2513D00DCD162 /* SDL_uikitwindow.m */, + 000063D3D80F97ADC7770000 /* SDL_uikitpen.h */, + 000053D344416737F6050000 /* SDL_uikitpen.m */, ); path = uikit; sourceTree = ""; @@ -1907,7 +1922,7 @@ path = darwin; sourceTree = ""; }; - A7D8A7DA23E2513E00DCD162 /* file */ = { + A7D8A7DA23E2513E00DCD162 /* io */ = { isa = PBXGroup; children = ( A7D8A7DB23E2513F00DCD162 /* SDL_iostream.c */, @@ -1917,7 +1932,7 @@ 000013C0F2EADC24ADC10000 /* generic */, 000064F9A2AAE947C1CD0000 /* windows */, ); - path = file; + path = io; sourceTree = ""; }; A7D8A7DF23E2513F00DCD162 /* power */ = { @@ -2278,6 +2293,8 @@ children = ( F338A1162D1B378D007CDFDF /* cocoa */, F338A1152D1B3786007CDFDF /* dummy */, + F3C1BD732D1F1A3000846529 /* SDL_tray_utils.h */, + F3C1BD742D1F1A3000846529 /* SDL_tray_utils.c */, ); path = tray; sourceTree = ""; @@ -2298,6 +2315,14 @@ path = cocoa; sourceTree = ""; }; + F344003B2D40229E003F26D7 /* framework */ = { + isa = PBXGroup; + children = ( + F344003C2D4022E1003F26D7 /* INSTALL.md */, + ); + path = framework; + sourceTree = ""; + }; F36C7ACF294B9F5E004D61C3 /* core */ = { isa = PBXGroup; children = ( @@ -2395,9 +2420,11 @@ F59C710100D5CB5801000001 /* resources */ = { isa = PBXGroup; children = ( + F344003B2D40229E003F26D7 /* framework */, F37A8E1928405AA100C38E95 /* CMake */, - 00794D3F09D0C461003FC8A1 /* License.txt */, - F59C710300D5CB5801000001 /* ReadMe.txt */, + F373DA182D388A1E002158FA /* LICENSE.txt */, + F373DA192D388A1E002158FA /* README.md */, + F373DA172D3889EE002158FA /* INSTALL.md */, ); path = resources; sourceTree = ""; @@ -2409,35 +2436,26 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - F3F7D9812933074E00816151 /* SDL.h in Headers */, E4F257942C81903800FCEAFC /* SDL_gpu_vulkan_vkfuncs.h in Headers */, + F3C1BD762D1F1A3000846529 /* SDL_tray_utils.h in Headers */, F310138D2C1F2CB700FBE946 /* SDL_getenv_c.h in Headers */, A7D8B39E23E2514200DCD162 /* SDL_RLEaccel_c.h in Headers */, - F3F7D9C52933074E00816151 /* SDL_assert.h in Headers */, A7D8B61723E2514300DCD162 /* SDL_assert_c.h in Headers */, - F3F7D9292933074E00816151 /* SDL_atomic.h in Headers */, F3A9AE9D2C8A13C100AAC390 /* SDL_shaders_gpu.h in Headers */, - F3F7D8ED2933074E00816151 /* SDL_audio.h in Headers */, A7D8B7A023E2514400DCD162 /* SDL_audio_c.h in Headers */, F32DDACF2AB795A30041EAA5 /* SDL_audio_channel_converters.h in Headers */, A7D8B7B223E2514400DCD162 /* SDL_audiodev_c.h in Headers */, F32DDAD32AB795A30041EAA5 /* SDL_audioqueue.h in Headers */, F32DDAD02AB795A30041EAA5 /* SDL_audioresample.h in Headers */, - F3F7D9E12933074E00816151 /* SDL_begin_code.h in Headers */, - F3F7D9A52933074E00816151 /* SDL_bits.h in Headers */, A7D8BA0123E2514400DCD162 /* SDL_blendfillrect.h in Headers */, A7D8B9E923E2514400DCD162 /* SDL_blendline.h in Headers */, - F3F7D97D2933074E00816151 /* SDL_blendmode.h in Headers */, A7D8BA0D23E2514400DCD162 /* SDL_blendpoint.h in Headers */, A7D8B3B623E2514200DCD162 /* SDL_blit.h in Headers */, A7D8B2BA23E2514200DCD162 /* SDL_blit_auto.h in Headers */, A7D8B39823E2514200DCD162 /* SDL_blit_copy.h in Headers */, A7D8ADEC23E2514100DCD162 /* SDL_blit_slow.h in Headers */, - F37E184E2B8C097D0098C111 /* SDL_camera.h in Headers */, - F3F7D9A12933074E00816151 /* SDL_clipboard.h in Headers */, F3DDCC562AFD42B600B0842B /* SDL_clipboard_c.h in Headers */, A7D8BB6F23E2514500DCD162 /* SDL_clipboardevents_c.h in Headers */, - F3F7D9D92933074E00816151 /* SDL_close_code.h in Headers */, A7D8AECA23E2514100DCD162 /* SDL_cocoaclipboard.h in Headers */, A7D8AF1223E2514100DCD162 /* SDL_cocoaevents.h in Headers */, A7D8AE8E23E2514100DCD162 /* SDL_cocoakeyboard.h in Headers */, @@ -2447,17 +2465,88 @@ A7D8AF1E23E2514100DCD162 /* SDL_cocoamouse.h in Headers */, A7D8AEDC23E2514100DCD162 /* SDL_cocoaopengl.h in Headers */, A7D8AEEE23E2514100DCD162 /* SDL_cocoaopengles.h in Headers */, + F3D46ACA2D20625800D9CBDF /* SDL_storage.h in Headers */, + F3D46ACB2D20625800D9CBDF /* SDL_sensor.h in Headers */, + F3D46ACC2D20625800D9CBDF /* SDL_properties.h in Headers */, + F3D46ACD2D20625800D9CBDF /* SDL_bits.h in Headers */, + F3D46ACE2D20625800D9CBDF /* SDL_keyboard.h in Headers */, + F3D46ACF2D20625800D9CBDF /* SDL_opengles2_khrplatform.h in Headers */, + F3D46AD02D20625800D9CBDF /* SDL_gpu.h in Headers */, + F3D46AD12D20625800D9CBDF /* SDL_mutex.h in Headers */, + F3D46AD22D20625800D9CBDF /* SDL_touch.h in Headers */, + F3D46AD32D20625800D9CBDF /* SDL_metal.h in Headers */, + F3D46AD42D20625800D9CBDF /* SDL_process.h in Headers */, + F3D46AD52D20625800D9CBDF /* SDL_clipboard.h in Headers */, + F3D46AD62D20625800D9CBDF /* SDL_events.h in Headers */, + F3D46AD72D20625800D9CBDF /* SDL_opengles2_gl2platform.h in Headers */, + F3D46AD82D20625800D9CBDF /* SDL_joystick.h in Headers */, + F3D46AD92D20625800D9CBDF /* SDL_opengl.h in Headers */, + F3D46ADA2D20625800D9CBDF /* SDL_stdinc.h in Headers */, + F3D46ADB2D20625800D9CBDF /* SDL_pen.h in Headers */, + F3D46ADC2D20625800D9CBDF /* SDL_render.h in Headers */, + F3D46ADD2D20625800D9CBDF /* SDL_assert.h in Headers */, + F3D46ADE2D20625800D9CBDF /* SDL_atomic.h in Headers */, + F3D46ADF2D20625800D9CBDF /* SDL_begin_code.h in Headers */, + F3D46AE02D20625800D9CBDF /* SDL_log.h in Headers */, + F3D46AE12D20625800D9CBDF /* SDL_pixels.h in Headers */, + F3D46AE22D20625800D9CBDF /* SDL_main_impl.h in Headers */, + F3D46AE32D20625800D9CBDF /* SDL_vulkan.h in Headers */, + F3D46AE42D20625800D9CBDF /* SDL_intrin.h in Headers */, + F3D46AE52D20625800D9CBDF /* SDL_platform_defines.h in Headers */, + F3D46AE62D20625800D9CBDF /* SDL_messagebox.h in Headers */, + F3D46AE72D20625800D9CBDF /* SDL_main.h in Headers */, + F3D46AE82D20625800D9CBDF /* SDL_version.h in Headers */, + F3D46AE92D20625800D9CBDF /* SDL_haptic.h in Headers */, + F3D46AEA2D20625800D9CBDF /* SDL_endian.h in Headers */, + F3D46AEB2D20625800D9CBDF /* SDL_opengles2_gl2ext.h in Headers */, + F3D46AEC2D20625800D9CBDF /* SDL_gamepad.h in Headers */, + F3D46AED2D20625800D9CBDF /* SDL_timer.h in Headers */, + F3D46AEE2D20625800D9CBDF /* SDL_tray.h in Headers */, + F3D46AEF2D20625800D9CBDF /* SDL_init.h in Headers */, + F3D46AF02D20625800D9CBDF /* SDL_power.h in Headers */, + F3D46AF12D20625800D9CBDF /* SDL_copying.h in Headers */, + F3D46AF22D20625800D9CBDF /* SDL_video.h in Headers */, + F3D46AF32D20625800D9CBDF /* SDL_misc.h in Headers */, + F3D46AF42D20625800D9CBDF /* SDL_error.h in Headers */, + F3D46AF52D20625800D9CBDF /* SDL.h in Headers */, + F3D46AF62D20625800D9CBDF /* SDL_camera.h in Headers */, + F3D46AF72D20625800D9CBDF /* SDL_locale.h in Headers */, + F3D46AF82D20625800D9CBDF /* SDL_opengles2.h in Headers */, + F3D46AF92D20625800D9CBDF /* SDL_oldnames.h in Headers */, + F3D46AFA2D20625800D9CBDF /* SDL_hidapi.h in Headers */, + F3D46AFB2D20625800D9CBDF /* SDL_rect.h in Headers */, + F3D46AFC2D20625800D9CBDF /* SDL_opengles2_gl2.h in Headers */, + F3D46AFD2D20625800D9CBDF /* SDL_mouse.h in Headers */, + F3D46AFE2D20625800D9CBDF /* SDL_audio.h in Headers */, + F3D46AFF2D20625800D9CBDF /* SDL_close_code.h in Headers */, + F3D46B002D20625800D9CBDF /* SDL_surface.h in Headers */, + F3D46B012D20625800D9CBDF /* SDL_blendmode.h in Headers */, + F3D46B022D20625800D9CBDF /* SDL_guid.h in Headers */, + F3D46B032D20625800D9CBDF /* SDL_iostream.h in Headers */, + F3D46B042D20625800D9CBDF /* SDL_opengl_glext.h in Headers */, + F3D46B052D20625800D9CBDF /* SDL_keycode.h in Headers */, + F3D46B062D20625800D9CBDF /* SDL_opengles.h in Headers */, + F3D46B072D20625800D9CBDF /* SDL_loadso.h in Headers */, + F3D46B082D20625800D9CBDF /* SDL_dialog.h in Headers */, + F3D46B092D20625800D9CBDF /* SDL_hints.h in Headers */, + F3D46B0A2D20625800D9CBDF /* SDL_system.h in Headers */, + F3D46B0B2D20625800D9CBDF /* SDL_time.h in Headers */, + F3D46B0C2D20625800D9CBDF /* SDL_asyncio.h in Headers */, + F3D46B0D2D20625800D9CBDF /* SDL_platform.h in Headers */, + F3D46B0E2D20625800D9CBDF /* SDL_scancode.h in Headers */, + F3D46B0F2D20625800D9CBDF /* SDL_revision.h in Headers */, + F3D46B102D20625800D9CBDF /* SDL_cpuinfo.h in Headers */, + F3D46B112D20625800D9CBDF /* SDL_thread.h in Headers */, + F3D46B122D20625800D9CBDF /* SDL_egl.h in Headers */, + F3D46B132D20625800D9CBDF /* SDL_filesystem.h in Headers */, F3681E812B7AA6240002C6FD /* SDL_cocoashape.h in Headers */, A7D8AF0023E2514100DCD162 /* SDL_cocoavideo.h in Headers */, A7D8AEE823E2514100DCD162 /* SDL_cocoavulkan.h in Headers */, A7D8AEFA23E2514100DCD162 /* SDL_cocoawindow.h in Headers */, - F3F7D9D12933074E00816151 /* SDL_copying.h in Headers */, A7D8B8CC23E2514400DCD162 /* SDL_coreaudio.h in Headers */, A7D8A96F23E2514000DCD162 /* SDL_coremotionsensor.h in Headers */, - F3F7D9B92933074E00816151 /* SDL_cpuinfo.h in Headers */, A7D8B98023E2514400DCD162 /* SDL_d3dmath.h in Headers */, A7D8B8A223E2514400DCD162 /* SDL_diskaudio.h in Headers */, - F3B439482C93595900792030 /* SDL_process.h in Headers */, A7D8BB3F23E2514500DCD162 /* SDL_displayevents_c.h in Headers */, F3F15D802D011912007AE210 /* SDL_dialog_utils.h in Headers */, F3F15D812D011912007AE210 /* SDL_dialog.h in Headers */, @@ -2473,55 +2562,29 @@ A7D8AB1023E2514100DCD162 /* SDL_dynapi_overrides.h in Headers */, A7D8AB1C23E2514100DCD162 /* SDL_dynapi_procs.h in Headers */, E4F7981C2AD8D85500669F54 /* SDL_dynapi_unsupported.h in Headers */, - F3F7D9252933074E00816151 /* SDL_egl.h in Headers */, F3A9AE982C8A13C100AAC390 /* SDL_gpu_util.h in Headers */, A7D8ABD923E2514100DCD162 /* SDL_egl_c.h in Headers */, - F3F7D93D2933074E00816151 /* SDL_endian.h in Headers */, - F3F7D9352933074E00816151 /* SDL_error.h in Headers */, A7D8A95D23E2514000DCD162 /* SDL_error_c.h in Headers */, - F3F7D9712933074E00816151 /* SDL_events.h in Headers */, A7D8BBA523E2514500DCD162 /* SDL_events_c.h in Headers */, - E4F257712C818FE200FCEAFC /* SDL_gpu.h in Headers */, - F3F7D99D2933074E00816151 /* SDL_filesystem.h in Headers */, - F3F7D9852933074E00816151 /* SDL_gamepad.h in Headers */, F362B91A2B3349E200D30B94 /* SDL_gamepad_c.h in Headers */, A7D8B4AC23E2514300DCD162 /* SDL_gamepad_db.h in Headers */, A7D8BA5523E2514400DCD162 /* SDL_gles2funcs.h in Headers */, A7D8BA7923E2514400DCD162 /* SDL_glfuncs.h in Headers */, - F3F7D9892933074E00816151 /* SDL_guid.h in Headers */, - F3F7D8F92933074E00816151 /* SDL_haptic.h in Headers */, A7D8AABC23E2514100DCD162 /* SDL_haptic_c.h in Headers */, - F3F7D96D2933074E00816151 /* SDL_hidapi.h in Headers */, F3990E042A788303000D8759 /* SDL_hidapi_c.h in Headers */, F3990E062A788303000D8759 /* SDL_hidapi_ios.h in Headers */, F3990E052A788303000D8759 /* SDL_hidapi_mac.h in Headers */, A75FDBC523EA380300529352 /* SDL_hidapi_rumble.h in Headers */, A7D8B55723E2514300DCD162 /* SDL_hidapijoystick_c.h in Headers */, - F3F7D9112933074E00816151 /* SDL_hints.h in Headers */, A7D8B94A23E2514400DCD162 /* SDL_hints_c.h in Headers */, - F3B38CD7296E2E52005DA6D3 /* SDL_init.h in Headers */, A7D8A99923E2514000DCD162 /* SDL_internal.h in Headers */, - F3B38CDF296E2E52005DA6D3 /* SDL_intrin.h in Headers */, F395C1932569C68F00942BFF /* SDL_iokitjoystick_c.h in Headers */, - F3F7D9912933074E00816151 /* SDL_joystick.h in Headers */, A7D8B58723E2514300DCD162 /* SDL_joystick_c.h in Headers */, - F3F7D9512933074E00816151 /* SDL_keyboard.h in Headers */, A7D8BB8723E2514500DCD162 /* SDL_keyboard_c.h in Headers */, - F3F7D9752933074E00816151 /* SDL_keycode.h in Headers */, A1BB8B6C27F6CF330057CFA8 /* SDL_list.h in Headers */, - F3F7D9A92933074E00816151 /* SDL_loadso.h in Headers */, - F3F7D9552933074E00816151 /* SDL_locale.h in Headers */, - F3F7D9212933074E00816151 /* SDL_log.h in Headers */, F386F6E72884663E001840AA /* SDL_log_c.h in Headers */, - F3F7D9052933074E00816151 /* SDL_main.h in Headers */, - F3B38CCF296E2E52005DA6D3 /* SDL_main_impl.h in Headers */, - F3F7D91D2933074E00816151 /* SDL_messagebox.h in Headers */, - F3F7D98D2933074E00816151 /* SDL_metal.h in Headers */, F395C1BA2569C6A000942BFF /* SDL_mfijoystick_c.h in Headers */, - F3F7D9992933074E00816151 /* SDL_misc.h in Headers */, - F3F7D9AD2933074E00816151 /* SDL_mouse.h in Headers */, A7D8BB1B23E2514500DCD162 /* SDL_mouse_c.h in Headers */, - F3F7D9DD2933074E00816151 /* SDL_mutex.h in Headers */, A7D8ABFD23E2514100DCD162 /* SDL_nullevents_c.h in Headers */, A7D8ABE523E2514100DCD162 /* SDL_nullframebuffer_c.h in Headers */, A7D8ABF723E2514100DCD162 /* SDL_nullvideo.h in Headers */, @@ -2530,39 +2593,17 @@ F31A92C828D4CB39003BFD6A /* SDL_offscreenopengles.h in Headers */, A7D8AB6D23E2514100DCD162 /* SDL_offscreenvideo.h in Headers */, A7D8AB8523E2514100DCD162 /* SDL_offscreenwindow.h in Headers */, - F35B79632D03A7B900C6D591 /* SDL_asyncio.h in Headers */, F37E18642BAA40670098C111 /* SDL_time_c.h in Headers */, - F3B38CDB296E2E52005DA6D3 /* SDL_oldnames.h in Headers */, - F3F7D9C92933074E00816151 /* SDL_opengl.h in Headers */, - F3F7D9452933074E00816151 /* SDL_opengl_glext.h in Headers */, - F3F7D95D2933074E00816151 /* SDL_opengles.h in Headers */, - F3F7D9612933074E00816151 /* SDL_opengles2.h in Headers */, - F3F7D8FD2933074E00816151 /* SDL_opengles2_gl2.h in Headers */, - F3F7D9392933074E00816151 /* SDL_opengles2_gl2ext.h in Headers */, - F3F7D9692933074E00816151 /* SDL_opengles2_gl2platform.h in Headers */, - F3F7D9092933074E00816151 /* SDL_opengles2_khrplatform.h in Headers */, F31013C82C24E98200FBE946 /* SDL_keymap_c.h in Headers */, - 63134A222A7902CF0021E9A6 /* SDL_pen.h in Headers */, 63134A252A7902FD0021E9A6 /* SDL_pen_c.h in Headers */, F36C34312C0F876500991150 /* SDL_offscreenvulkan.h in Headers */, - F3F7D9192933074E00816151 /* SDL_pixels.h in Headers */, A7D8B2C023E2514200DCD162 /* SDL_pixels_c.h in Headers */, - F3F7D8F12933074E00816151 /* SDL_platform.h in Headers */, - F3B38CD3296E2E52005DA6D3 /* SDL_platform_defines.h in Headers */, - F3F7D9B12933074E00816151 /* SDL_power.h in Headers */, - F3E5A6ED2AD5E10800293D83 /* SDL_properties.h in Headers */, F37E18622BAA40090098C111 /* SDL_sysfilesystem.h in Headers */, - F3F7D9CD2933074E00816151 /* SDL_rect.h in Headers */, A7D8AC0323E2514100DCD162 /* SDL_rect_c.h in Headers */, F3DDCC5D2AFD42B600B0842B /* SDL_rect_impl.h in Headers */, - F3F7D9BD2933074E00816151 /* SDL_render.h in Headers */, A7D8B9FB23E2514400DCD162 /* SDL_render_sw_c.h in Headers */, E4F257972C81903800FCEAFC /* SDL_sysgpu.h in Headers */, - F3F7D9152933074E00816151 /* SDL_revision.h in Headers */, A7D8BA3123E2514400DCD162 /* SDL_rotate.h in Headers */, - F3F7D9652933074E00816151 /* SDL_iostream.h in Headers */, - F3F7D9492933074E00816151 /* SDL_scancode.h in Headers */, - F3F7D94D2933074E00816151 /* SDL_sensor.h in Headers */, A7D8A98D23E2514000DCD162 /* SDL_sensor_c.h in Headers */, A7D8BA7323E2514400DCD162 /* SDL_shaders_gl.h in Headers */, A7D8BA4F23E2514400DCD162 /* SDL_shaders_gles2.h in Headers */, @@ -2570,9 +2611,7 @@ A7D8B99B23E2514400DCD162 /* SDL_shaders_metal_macos.h in Headers */, A7D8B9A123E2514400DCD162 /* SDL_shaders_metal_tvos.h in Headers */, F310138F2C1F2CB700FBE946 /* SDL_sysstdlib.h in Headers */, - F3F7D8F52933074E00816151 /* SDL_stdinc.h in Headers */, F362B91B2B3349E200D30B94 /* SDL_steam_virtual_gamepad.h in Headers */, - F3F7D9312933074E00816151 /* SDL_surface.h in Headers */, A7D8B85A23E2514400DCD162 /* SDL_sysaudio.h in Headers */, A7D8AAD423E2514100DCD162 /* SDL_syshaptic.h in Headers */, A7D8AAE023E2514100DCD162 /* SDL_syshaptic_c.h in Headers */, @@ -2583,24 +2622,19 @@ A7D8B61123E2514300DCD162 /* SDL_syspower.h in Headers */, A7D8B9D723E2514400DCD162 /* SDL_sysrender.h in Headers */, A7D8A97B23E2514000DCD162 /* SDL_syssensor.h in Headers */, - F3F7D9E52933074E00816151 /* SDL_system.h in Headers */, A7D8B3E623E2514300DCD162 /* SDL_systhread.h in Headers */, A7D8B42823E2514300DCD162 /* SDL_systhread_c.h in Headers */, 5616CA4D252BB2A6005D5928 /* SDL_sysurl.h in Headers */, A7D8AC3F23E2514100DCD162 /* SDL_sysvideo.h in Headers */, - F3F7D9792933074E00816151 /* SDL_thread.h in Headers */, A7D8B3EC23E2514300DCD162 /* SDL_thread_c.h in Headers */, F3B439572C937DAB00792030 /* SDL_sysprocess.h in Headers */, E4F257912C81903800FCEAFC /* Metal_Blit.h in Headers */, - F3F7D90D2933074E00816151 /* SDL_timer.h in Headers */, A7D8AB3123E2514100DCD162 /* SDL_timer_c.h in Headers */, - F3F7D9012933074E00816151 /* SDL_touch.h in Headers */, A7D8BB6323E2514500DCD162 /* SDL_touch_c.h in Headers */, A1626A522617008D003F1973 /* SDL_triangle.h in Headers */, A7D8BBD223E2574800DCD162 /* SDL_uikitappdelegate.h in Headers */, A7D8BBD423E2574800DCD162 /* SDL_uikitclipboard.h in Headers */, A7D8BBD623E2574800DCD162 /* SDL_uikitevents.h in Headers */, - F37E185C2BAA3EF90098C111 /* SDL_time.h in Headers */, A7D8BBD823E2574800DCD162 /* SDL_uikitmessagebox.h in Headers */, A7D8BBDA23E2574800DCD162 /* SDL_uikitmetalview.h in Headers */, A7D8BBDC23E2574800DCD162 /* SDL_uikitmodes.h in Headers */, @@ -2613,11 +2647,8 @@ A7D8BBEA23E2574800DCD162 /* SDL_uikitwindow.h in Headers */, F386F6F02884663E001840AA /* SDL_utils_c.h in Headers */, F3973FA228A59BDD00B84553 /* SDL_vacopy.h in Headers */, - F3F7D9D52933074E00816151 /* SDL_version.h in Headers */, - F3F7D9592933074E00816151 /* SDL_video.h in Headers */, F3DDCC5B2AFD42B600B0842B /* SDL_video_c.h in Headers */, 75E09163241EA924004729E1 /* SDL_virtualjoystick_c.h in Headers */, - F3F7D9952933074E00816151 /* SDL_vulkan.h in Headers */, A7D8AD1D23E2514100DCD162 /* SDL_vulkan_internal.h in Headers */, A7D8B86C23E2514400DCD162 /* SDL_wave.h in Headers */, A7D8BBAB23E2514500DCD162 /* SDL_windowevents_c.h in Headers */, @@ -2649,8 +2680,6 @@ A7D8B2A823E2514200DCD162 /* vulkan_core.h in Headers */, F3FD042E2C9B755700824C4C /* SDL_hidapi_nintendo.h in Headers */, F3A9AE9B2C8A13C100AAC390 /* SDL_pipeline_gpu.h in Headers */, - E41D20152BA9577D003073FA /* SDL_storage.h in Headers */, - F37E18522BA50E760098C111 /* SDL_dialog.h in Headers */, A7D8B27223E2514200DCD162 /* vulkan_fuchsia.h in Headers */, A7D8B2A223E2514200DCD162 /* vulkan_ios.h in Headers */, A7D8B28423E2514200DCD162 /* vulkan_macos.h in Headers */, @@ -2738,9 +2767,10 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + F344003D2D4022E1003F26D7 /* INSTALL.md in Resources */, + F34400342D40217A003F26D7 /* LICENSE.txt in Resources */, + F34400362D40217A003F26D7 /* README.md in Resources */, F37A8E1A28405AA100C38E95 /* CMake in Resources */, - A75FDBB823E4CBC700529352 /* ReadMe.txt in Resources */, - A75FDBB723E4CBC700529352 /* License.txt in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2763,7 +2793,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "set -ex\n\nmkdir -p build/dmg-tmp/share/cmake/SDL3\ncp -a build/SDL3.xcframework build/dmg-tmp/\n\ncp pkg-support/resources/License.txt build/dmg-tmp\ncp pkg-support/resources/ReadMe.txt build/dmg-tmp\ncp pkg-support/share/cmake/SDL3/SDL3Config.cmake build/dmg-tmp/share/cmake/SDL3\ncp pkg-support/share/cmake/SDL3/SDL3ConfigVersion.cmake build/dmg-tmp/share/cmake/SDL3\n\n# remove the .DS_Store files if any (we may want to provide one in the future for fancy .dmgs)\nfind build/dmg-tmp -name .DS_Store -exec rm -f \"{}\" \\;\n\n# for fancy .dmg\nmkdir -p build/dmg-tmp/.logo\ncp pkg-support/resources/SDL_DS_Store build/dmg-tmp/.DS_Store\ncp pkg-support/sdl_logo.pdf build/dmg-tmp/.logo\n\n# create the dmg\nhdiutil create -ov -fs HFS+ -volname SDL3 -srcfolder build/dmg-tmp build/SDL3.dmg\n\n# clean up\nrm -rf build/dmg-tmp\n"; + shellScript = "set -ex\n\nmkdir -p build/dmg-tmp/share/cmake/SDL3\ncp -a build/SDL3.xcframework build/dmg-tmp/\n\ncp ../../LICENSE.txt build/dmg-tmp\ncp ../../README.md build/dmg-tmp\ncp pkg-support/resources/INSTALL.md build/dmg-tmp\ncp pkg-support/share/cmake/SDL3/SDL3Config.cmake build/dmg-tmp/share/cmake/SDL3\ncp pkg-support/share/cmake/SDL3/SDL3ConfigVersion.cmake build/dmg-tmp/share/cmake/SDL3\n\n# remove the .DS_Store files if any (we may want to provide one in the future for fancy .dmgs)\nfind build/dmg-tmp -name .DS_Store -exec rm -f \"{}\" \\;\n\n# for fancy .dmg\nmkdir -p build/dmg-tmp/.logo\ncp pkg-support/resources/SDL_DS_Store build/dmg-tmp/.DS_Store\ncp pkg-support/sdl_logo.pdf build/dmg-tmp/.logo\n\n# create the dmg\nhdiutil create -ov -fs HFS+ -volname SDL3 -srcfolder build/dmg-tmp build/SDL3.dmg\n\n# clean up\nrm -rf build/dmg-tmp\n"; }; F3B38CF0296F63D1005DA6D3 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; @@ -2818,6 +2848,7 @@ 5616CA4E252BB2A6005D5928 /* SDL_sysurl.m in Sources */, F3B439562C937DAB00792030 /* SDL_process.c in Sources */, A7D8A97523E2514000DCD162 /* SDL_coremotionsensor.m in Sources */, + F3C1BD752D1F1A3000846529 /* SDL_tray_utils.c in Sources */, F382071D284F362F004DD584 /* SDL_guid.c in Sources */, A7D8BB8D23E2514500DCD162 /* SDL_touch.c in Sources */, F31A92D228D4CB39003BFD6A /* SDL_offscreenopengles.c in Sources */, @@ -3008,6 +3039,7 @@ 0000AEB9AE90228CA2D60000 /* SDL_asyncio.c in Sources */, 00004D0B73767647AD550000 /* SDL_asyncio_generic.c in Sources */, 0000A03C0F32C43816F40000 /* SDL_asyncio_windows_ioring.c in Sources */, + 0000A877C7DB9FA935FC0000 /* SDL_uikitpen.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3029,8 +3061,8 @@ CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; DEPLOYMENT_POSTPROCESSING = YES; - DYLIB_COMPATIBILITY_VERSION = 108.0.0; - DYLIB_CURRENT_VERSION = 108.0.0; + DYLIB_COMPATIBILITY_VERSION = 201.0.0; + DYLIB_CURRENT_VERSION = 201.0.0; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_ALTIVEC_EXTENSIONS = YES; @@ -3039,7 +3071,10 @@ GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 3; - GCC_PREPROCESSOR_DEFINITIONS = "$(CONFIG_PREPROCESSOR_DEFINITIONS)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(CONFIG_PREPROCESSOR_DEFINITIONS)", + NDEBUG, + ); GCC_SYMBOLS_PRIVATE_EXTERN = YES; HEADER_SEARCH_PATHS = ( ../../include, @@ -3051,7 +3086,7 @@ /usr/X11R6/include, ); INFOPLIST_FILE = "Info-Framework.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -3061,15 +3096,15 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.11; - MARKETING_VERSION = 3.1.7; + MACOSX_DEPLOYMENT_TARGET = 10.13; + MARKETING_VERSION = 3.2.0; OTHER_LDFLAGS = "$(CONFIG_FRAMEWORK_LDFLAGS)"; PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL3; PRODUCT_NAME = SDL3; STRIP_STYLE = "non-global"; SUPPORTED_PLATFORMS = "xrsimulator xros macosx iphonesimulator iphoneos appletvsimulator appletvos"; SUPPORTS_MACCATALYST = YES; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 11.0; XROS_DEPLOYMENT_TARGET = 1.0; }; name = Release; @@ -3090,8 +3125,8 @@ ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; - DYLIB_COMPATIBILITY_VERSION = 108.0.0; - DYLIB_CURRENT_VERSION = 108.0.0; + DYLIB_COMPATIBILITY_VERSION = 201.0.0; + DYLIB_CURRENT_VERSION = 201.0.0; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -3112,7 +3147,7 @@ /usr/X11R6/include, ); INFOPLIST_FILE = "Info-Framework.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -3122,8 +3157,8 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.11; - MARKETING_VERSION = 3.1.7; + MACOSX_DEPLOYMENT_TARGET = 10.13; + MARKETING_VERSION = 3.2.0; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "$(CONFIG_FRAMEWORK_LDFLAGS)"; PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL3; @@ -3131,7 +3166,7 @@ STRIP_INSTALLED_PRODUCT = NO; SUPPORTED_PLATFORMS = "xrsimulator xros macosx iphonesimulator iphoneos appletvsimulator appletvos"; SUPPORTS_MACCATALYST = YES; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 11.0; XROS_DEPLOYMENT_TARGET = 1.0; }; name = Debug; diff --git a/libs/SDL3/Xcode/SDL/pkg-support/SDL.info b/libs/SDL3/Xcode/SDL/pkg-support/SDL.info index 38315815..b80d1f58 100644 --- a/libs/SDL3/Xcode/SDL/pkg-support/SDL.info +++ b/libs/SDL3/Xcode/SDL/pkg-support/SDL.info @@ -1,4 +1,4 @@ -Title SDL 3.1.7 +Title SDL 3.2.0 Version 1 Description SDL Library for macOS (http://www.libsdl.org) DefaultLocation /Library/Frameworks diff --git a/libs/SDL3/Xcode/SDL/pkg-support/resources/INSTALL.md b/libs/SDL3/Xcode/SDL/pkg-support/resources/INSTALL.md new file mode 100644 index 00000000..e50e084d --- /dev/null +++ b/libs/SDL3/Xcode/SDL/pkg-support/resources/INSTALL.md @@ -0,0 +1,43 @@ + +# Using this package + +This package contains SDL built for Xcode, and includes support for macOS, iOS and tvOS. + +To use this package in Xcode, drag `SDL3.xcframework` into your project. + +To use this package in a CMake project, copy both `SDL3.xcframework` and `share` to `~/Library/Frameworks`. + +# Documentation + +An API reference, tutorials, and additional documentation is available at: + +https://wiki.libsdl.org/SDL3 + +# Example code + +There are simple example programs available at: + +https://examples.libsdl.org/SDL3 + +# Discussions + +## Discord + +You can join the official Discord server at: + +https://discord.com/invite/BwpFGBWsv8 + +## Forums/mailing lists + +You can join SDL development discussions at: + +https://discourse.libsdl.org/ + +Once you sign up, you can use the forum through the website or as a mailing list from your email client. + +## Announcement list + +You can sign up for the low traffic announcement list at: + +https://www.libsdl.org/mailing-list.php + diff --git a/libs/SDL3/Xcode/SDL/pkg-support/resources/License.txt b/libs/SDL3/Xcode/SDL/pkg-support/resources/License.txt deleted file mode 100644 index 42f37361..00000000 --- a/libs/SDL3/Xcode/SDL/pkg-support/resources/License.txt +++ /dev/null @@ -1,19 +0,0 @@ - -Simple DirectMedia Layer -Copyright (C) 1997-2024 Sam Lantinga - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. diff --git a/libs/SDL3/Xcode/SDL/pkg-support/resources/ReadMe.txt b/libs/SDL3/Xcode/SDL/pkg-support/resources/ReadMe.txt deleted file mode 100644 index 6ea93478..00000000 --- a/libs/SDL3/Xcode/SDL/pkg-support/resources/ReadMe.txt +++ /dev/null @@ -1,44 +0,0 @@ -The Simple DirectMedia Layer (SDL for short) is a cross-platform -library designed to make it easy to write multi-media software, -such as games and emulators. - -The Simple DirectMedia Layer library source code is available from: -http://www.libsdl.org/ - -This library is distributed under the terms of the zlib license: -http://zlib.net/zlib_license.html - - -This packages contains the SDL framework for macOS. -Conforming with Apple guidelines, this framework -contains both the SDL runtime component and development header files. - - -To Install: -Copy "SDL3.xcframework" and "share" to /Library/Frameworks - -You may alternatively install it in /Library/Frameworks -if your access privileges are not high enough. - - -Use in CMake projects: -SDL3.xcframework can be used in CMake projects using the following pattern: -```cmake -find_package(SDL3 REQUIRED COMPONENTS SDL3) -add_executable(my_game ${MY_SOURCES}) -target_link_libraries(my_game PRIVATE SDL3::SDL3) -``` -If SDL3.framework is installed in a non-standard location, -please refer to the following link for ways to configure CMake: -https://cmake.org/cmake/help/latest/command/find_package.html#config-mode-search-procedure - - -Additional References: - - - Screencast tutorials for getting started with OpenSceneGraph/macOS are - available at: - http://www.openscenegraph.org/projects/osg/wiki/Support/Tutorials/MacOSXTips - Though these are OpenSceneGraph centric, the same exact concepts apply to - SDL, thus the videos are recommended for everybody getting started with - developing on macOS. (You can skim over the PlugIns stuff since SDL - doesn't have any PlugIns to worry about.) diff --git a/libs/SDL3/Xcode/SDL/pkg-support/resources/SDL_DS_Store b/libs/SDL3/Xcode/SDL/pkg-support/resources/SDL_DS_Store index 15519334371b712cc92952247564dbf6835bc7da..5a71413734b7193e94269f42433f40ec7b73415e 100644 GIT binary patch literal 10244 zcmeHMO>7(25uRO>5oycz>JL#}2VGPt;G&{Li3~+K20~GkDgjRInu;wWP9*-UC{`;j zyStL?x^CIPaEtb01ZdDh3b;TIJ@m&%_fS9wr3GJOH|q90S#$Pfi)! zy>ip8d;WpZp&*Pv7=bVXVFbbmgc0~(hydl1g>b)Z;@_mNoT4 z(S&u(Z;Iihd**mM)%jiI5wM~6Rm;`1xUK)F=esJZOn ztYbTF-rllSjN=~Gxma-;=Ur=CuCFt0akEsjX6$;&TlTH1ezE>7X!Ljb#XJ|R>hm4Z z(zPbW40Z%!%vW8@YCKzW>(z5>Yo6sVck!362p4>7bFs1JV19PvT+^>R4ez4mdZ5qQ zrLtw8Yvdi@cQ!AVT({JyS@~@TKEb@G4_71SG8Acr{;_`t7`{F{yPHg70mZxF!CP&qPRNE11Uwv*aqJv zIM?6$^`RZ~^eKKDytp>B`|y029X~CGpQb&|9itP}OCD9prWK$=HQ*REAz7p2bQo7p zkqUH{Qq)fa<6@5SJyXyC9UZ^u*jt;HH!dQ?-j3u>Nk6dhm?$aOXZF-+R(R#E2?WFdYeo0@|%ld|H>kZw}ef@^i z)`R_iGBBm&w?MJqoB4cF{c=|glhn0|Xo1fv-G1=HiXQ-fO7SN6s^W9tZz^7UjYw@1 zGQhWQ_rT(Yv>1J(>^K`|9w9))NHTc{6tIbSwnK;T(aG!q;a{|hvFPJA#~MRLpV|t@ zrEGU+$Y2@lGc|#uz%xLu1|qPLs(=9m?O>k;?fYuQLHiZe4(45l?p5FqfIm_5u#+>t ze|hdnw16yt)CNVWXF`GzbC$oucemav#6*9BwGqP<$#(w7D%X#1`unBAdZv*cD?*iFQ zkiXe`Ct`tJ@l%mqA_pH}UEJ5bH-dfsG#}W$n739WqK$Ieo*mzT0O4#KJd$m=hG^ycs{LU z=7>!2Hd>4AWL3H!K z?>mkUdH%spn};mm+5JHv@3RPgSO)N_G(v= z@p!EFUlxK7C@;^K{PlKuDND^Os%*SeulnnvZp#Ux4&5Ez;Le5iHRRYJ#&^)+SXKZKtBHSA>;*hX{NL zu?L8Gj$qs(&C;CEoP&;!`@-L=rF{WfsV=QJU4X_6YLBNuA7tlw%q|tA9iv^TjA8x? z>KB(v@Xw+h)HE(_?6de=SnThz_)z_>)Tw{qeYy{T$!R1qo1WrCPEU$N{wEKBhpuzq zc8;PxTt_5bvi3$$=ZDejT@e)N4nJW8K06V>9mimDK{khbh6|4n!U%*B`2UK47AX`9 zd8|38j`lB~i)$0O3S{7MElGt6KBE2x6?G&U{6IMcp!qcT1L1nsqn66cXr3ScBQPxKO~Zaqu7ld)y19N89Q5# zcecCZI3+b0goH$+Hb^{GC@O;Y=AjQr2+0pTK*K{GD#Sw(JRtE>2_qG$LRH~AckZn1 zbpru`K zND(^l5Gep;4Ap{w6AU0#DT`9>1`=;TO3)NCXsXB*LkXIrUX^-9DR%=IG$%zSAByZ* zkr|32dWU^gsFP9*Wb}+Y5P9IZ2ZG!^RoZUUO77wOUDJN8w4I2xKXNh->RMTy@3ae`7Zovm(zuoo<=Kw@_9nRViPW z6NvpV_yI!GewXM8r_gb#v+HzsPolT4e_-%4pB?IZ^mAt(dwey~U$V*@>vf*hl;?VN z)7^5Ocde4+&R0#(_r1;4L{9^=y-@b5m+H>-inG1!J2(7=%GaFLL|;qu%Z~lkgQ~@s zYtR`us1RLzx$ZdC=ho{Ldwy-L;rPpk@YNO3m+x#|sIGai&;8BU{EAm?Tyg3R$g5Vp zZdKPE^W`I^FKk-t&ZJwh8p{<7m4_$nF4U}YrMffVb^*+&)TGEU27&vqmhy$al%V>b;^XVbe$s?#<+Z__5$pasw{epf=f25C>W2+O?DnZk1DozU(I-nrmcz_-9d zV7`1}Sb}<_JS-FpJhVr9FN#-O=0Q%r{i~lX0zLuex#@+;jHc&jlC!zYR8lWY6_S(2 zjF~K$Sz}U5PfeMVGhv^W=r>M(I>-GBi)>ZQ{RHOvCI%DwOq>q93;iq4iDRQswnHkN@7G{i`8Lsg+(T>-)b&b)jSSQ3TVi)or)GS@k>1%~_-Y}ds-OAcIBb!ZU zaz;8=a&oq#r_+{|F`9wpI0(W`Mw=*mn<=YSa~*yr8&=gWc{fsZ$Fh^#^@{H_n`(|| zlR2o+#?oVUI(HDQcpox_(dy?sco0V`7vp9+9Ie_^tV6I3h$GZpsnZMmdx<$h?MciL z>b}G(aF=YW0f$jZ*(3UXXa|`0CR5)YBB`wBXqA_3`CiFu+w%P;KC2vo3A*>8%lo2D z{m+ay+*@qBiD5s)Jmdi|?^`~MUEm=p8HalKmNoZ8))*_5%DSD;74mkjq#J47${BV( zZP*#D;1tHvx}GU$+2-;c2mjWd;9*kgdc${pTzgSsYR6Yx-lYCvhSAaS-^wtIe3~0laSXS9evzDk88LLS-1!}xDt858%O(8xX)g`;5}^nLksbf zFjH!#dMD$Z@lVL;WEK}>bXMsKvJzw;Q(o1#DpjX`C>?xYo*3_lcZkF - mCursors; protected static int mLastCursorID; - protected static SDLGenericMotionListener_API12 mMotionListener; + protected static SDLGenericMotionListener_API14 mMotionListener; protected static HIDDeviceManager mHIDDeviceManager; // This is what SDL runs in. It invokes SDL_main(), eventually @@ -231,15 +231,16 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh protected static boolean mSDLMainFinished = false; protected static boolean mActivityCreated = false; private static SDLFileDialogState mFileDialogState = null; + protected static boolean mDispatchingKeyEvent = false; - protected static SDLGenericMotionListener_API12 getMotionListener() { + protected static SDLGenericMotionListener_API14 getMotionListener() { if (mMotionListener == null) { if (Build.VERSION.SDK_INT >= 26 /* Android 8.0 (O) */) { mMotionListener = new SDLGenericMotionListener_API26(); } else if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */) { mMotionListener = new SDLGenericMotionListener_API24(); } else { - mMotionListener = new SDLGenericMotionListener_API12(); + mMotionListener = new SDLGenericMotionListener_API14(); } } @@ -807,7 +808,14 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh ) { return false; } - return super.dispatchKeyEvent(event); + mDispatchingKeyEvent = true; + boolean result = super.dispatchKeyEvent(event); + mDispatchingKeyEvent = false; + return result; + } + + public static boolean dispatchingKeyEvent() { + return mDispatchingKeyEvent; } /* Transition to next state */ @@ -928,6 +936,10 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh if (Build.VERSION.SDK_INT >= 28 /* Android 9 (Pie) */) { window.getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; } + if (Build.VERSION.SDK_INT >= 30 /* Android 11 (R) */ && + Build.VERSION.SDK_INT < 35 /* Android 15 */) { + SDLActivity.onNativeInsetsChanged(0, 0, 0, 0); + } } } else { Log.e(TAG, "error handling message, getContext() returned no Activity"); @@ -1059,6 +1071,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh public static native void onNativeTouch(int touchDevId, int pointerFingerId, int action, float x, float y, float p); + public static native void onNativePen(int penId, int button, int action, float x, float y, float p); public static native void onNativeAccel(float x, float y, float z); public static native void onNativeClipboardChanged(); public static native void onNativeSurfaceCreated(); @@ -1490,7 +1503,6 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh // on some devices key events are sent for mouse BUTTON_BACK/FORWARD presses // they are ignored here because sending them as mouse input to SDL is messy if ((keyCode == KeyEvent.KEYCODE_BACK) || (keyCode == KeyEvent.KEYCODE_FORWARD)) { - Log.v("SDL", "keycode is back or forward"); switch (event.getAction()) { case KeyEvent.ACTION_DOWN: case KeyEvent.ACTION_UP: @@ -1503,6 +1515,8 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh } if (event.getAction() == KeyEvent.ACTION_DOWN) { + onNativeKeyDown(keyCode); + if (isTextInputEvent(event)) { if (ic != null) { ic.commitText(String.valueOf((char) event.getUnicodeChar()), 1); @@ -1510,7 +1524,6 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh SDLInputConnection.nativeCommitText(String.valueOf((char) event.getUnicodeChar()), 1); } } - onNativeKeyDown(keyCode); return true; } else if (event.getAction() == KeyEvent.ACTION_UP) { onNativeKeyUp(keyCode); diff --git a/libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java b/libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java index b7faee89..dc6fb9d1 100644 --- a/libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java +++ b/libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java @@ -662,44 +662,61 @@ class SDLHapticHandler { } } -class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener { +class SDLGenericMotionListener_API14 implements View.OnGenericMotionListener { // Generic Motion (mouse hover, joystick...) events go here @Override public boolean onGenericMotion(View v, MotionEvent event) { + if (event.getSource() == InputDevice.SOURCE_JOYSTICK) + return SDLControllerManager.handleJoystickMotionEvent(event); + float x, y; - int action; + int action = event.getActionMasked(); + int pointerCount = event.getPointerCount(); + boolean consumed = false; - switch ( event.getSource() ) { - case InputDevice.SOURCE_JOYSTICK: - return SDLControllerManager.handleJoystickMotionEvent(event); + for (int i = 0; i < pointerCount; i++) { + int toolType = event.getToolType(i); - case InputDevice.SOURCE_MOUSE: - action = event.getActionMasked(); + if (toolType == MotionEvent.TOOL_TYPE_MOUSE) { switch (action) { case MotionEvent.ACTION_SCROLL: - x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, 0); - y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, 0); + x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, i); + y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, i); SDLActivity.onNativeMouse(0, action, x, y, false); - return true; + consumed = true; + break; case MotionEvent.ACTION_HOVER_MOVE: - x = event.getX(0); - y = event.getY(0); + x = getEventX(event, i); + y = getEventY(event, i); - SDLActivity.onNativeMouse(0, action, x, y, false); - return true; + SDLActivity.onNativeMouse(0, action, x, y, checkRelativeEvent(event)); + consumed = true; + break; default: break; } - break; + } else if (toolType == MotionEvent.TOOL_TYPE_STYLUS || toolType == MotionEvent.TOOL_TYPE_ERASER) { + switch (action) { + case MotionEvent.ACTION_HOVER_ENTER: + case MotionEvent.ACTION_HOVER_MOVE: + case MotionEvent.ACTION_HOVER_EXIT: + x = event.getX(i); + y = event.getY(i); + float p = event.getPressure(i); - default: - break; + // BUTTON_STYLUS_PRIMARY is 2^5, so shift by 4 + int buttons = event.getButtonState() >> 4; + + SDLActivity.onNativePen(event.getPointerId(i), buttons, action, x, y, p); + consumed = true; + break; + } + } } - // Event was not managed - return false; + return consumed; } public boolean supportsRelativeMouse() { @@ -714,46 +731,29 @@ class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener { return false; } - public void reclaimRelativeMouseModeIfNeeded() - { + public void reclaimRelativeMouseModeIfNeeded() { } - public float getEventX(MotionEvent event) { - return event.getX(0); + public boolean checkRelativeEvent(MotionEvent event) { + return inRelativeMode(); } - public float getEventY(MotionEvent event) { - return event.getY(0); + public float getEventX(MotionEvent event, int pointerIndex) { + return event.getX(pointerIndex); + } + + public float getEventY(MotionEvent event, int pointerIndex) { + return event.getY(pointerIndex); } } -class SDLGenericMotionListener_API24 extends SDLGenericMotionListener_API12 { +class SDLGenericMotionListener_API24 extends SDLGenericMotionListener_API14 { // Generic Motion (mouse hover, joystick...) events go here private boolean mRelativeModeEnabled; - @Override - public boolean onGenericMotion(View v, MotionEvent event) { - - // Handle relative mouse mode - if (mRelativeModeEnabled) { - if (event.getSource() == InputDevice.SOURCE_MOUSE) { - int action = event.getActionMasked(); - if (action == MotionEvent.ACTION_HOVER_MOVE) { - float x = event.getAxisValue(MotionEvent.AXIS_RELATIVE_X); - float y = event.getAxisValue(MotionEvent.AXIS_RELATIVE_Y); - SDLActivity.onNativeMouse(0, action, x, y, true); - return true; - } - } - } - - // Event was not managed, call SDLGenericMotionListener_API12 method - return super.onGenericMotion(v, event); - } - @Override public boolean supportsRelativeMouse() { return true; @@ -771,20 +771,20 @@ class SDLGenericMotionListener_API24 extends SDLGenericMotionListener_API12 { } @Override - public float getEventX(MotionEvent event) { - if (mRelativeModeEnabled) { - return event.getAxisValue(MotionEvent.AXIS_RELATIVE_X); + public float getEventX(MotionEvent event, int pointerIndex) { + if (mRelativeModeEnabled && event.getToolType(pointerIndex) == MotionEvent.TOOL_TYPE_MOUSE) { + return event.getAxisValue(MotionEvent.AXIS_RELATIVE_X, pointerIndex); } else { - return event.getX(0); + return event.getX(pointerIndex); } } @Override - public float getEventY(MotionEvent event) { - if (mRelativeModeEnabled) { - return event.getAxisValue(MotionEvent.AXIS_RELATIVE_Y); + public float getEventY(MotionEvent event, int pointerIndex) { + if (mRelativeModeEnabled && event.getToolType(pointerIndex) == MotionEvent.TOOL_TYPE_MOUSE) { + return event.getAxisValue(MotionEvent.AXIS_RELATIVE_Y, pointerIndex); } else { - return event.getY(0); + return event.getY(pointerIndex); } } } @@ -793,65 +793,6 @@ class SDLGenericMotionListener_API26 extends SDLGenericMotionListener_API24 { // Generic Motion (mouse hover, joystick...) events go here private boolean mRelativeModeEnabled; - @Override - public boolean onGenericMotion(View v, MotionEvent event) { - float x, y; - int action; - - switch ( event.getSource() ) { - case InputDevice.SOURCE_JOYSTICK: - return SDLControllerManager.handleJoystickMotionEvent(event); - - case InputDevice.SOURCE_MOUSE: - // DeX desktop mouse cursor is a separate non-standard input type. - case InputDevice.SOURCE_MOUSE | InputDevice.SOURCE_TOUCHSCREEN: - action = event.getActionMasked(); - switch (action) { - case MotionEvent.ACTION_SCROLL: - x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, 0); - y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, 0); - SDLActivity.onNativeMouse(0, action, x, y, false); - return true; - - case MotionEvent.ACTION_HOVER_MOVE: - x = event.getX(0); - y = event.getY(0); - SDLActivity.onNativeMouse(0, action, x, y, false); - return true; - - default: - break; - } - break; - - case InputDevice.SOURCE_MOUSE_RELATIVE: - action = event.getActionMasked(); - switch (action) { - case MotionEvent.ACTION_SCROLL: - x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, 0); - y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, 0); - SDLActivity.onNativeMouse(0, action, x, y, false); - return true; - - case MotionEvent.ACTION_HOVER_MOVE: - x = event.getX(0); - y = event.getY(0); - SDLActivity.onNativeMouse(0, action, x, y, true); - return true; - - default: - break; - } - break; - - default: - break; - } - - // Event was not managed - return false; - } - @Override public boolean supportsRelativeMouse() { return (!SDLActivity.isDeXMode() || Build.VERSION.SDK_INT >= 27 /* Android 8.1 (O_MR1) */); @@ -878,22 +819,26 @@ class SDLGenericMotionListener_API26 extends SDLGenericMotionListener_API24 { } @Override - public void reclaimRelativeMouseModeIfNeeded() - { + public void reclaimRelativeMouseModeIfNeeded() { if (mRelativeModeEnabled && !SDLActivity.isDeXMode()) { SDLActivity.getContentView().requestPointerCapture(); } } @Override - public float getEventX(MotionEvent event) { - // Relative mouse in capture mode will only have relative for X/Y - return event.getX(0); + public boolean checkRelativeEvent(MotionEvent event) { + return event.getSource() == InputDevice.SOURCE_MOUSE_RELATIVE; } @Override - public float getEventY(MotionEvent event) { + public float getEventX(MotionEvent event, int pointerIndex) { // Relative mouse in capture mode will only have relative for X/Y - return event.getY(0); + return event.getX(pointerIndex); + } + + @Override + public float getEventY(MotionEvent event, int pointerIndex) { + // Relative mouse in capture mode will only have relative for X/Y + return event.getY(pointerIndex); } } diff --git a/libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLInputConnection.java b/libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLInputConnection.java index e1d29a88..accce4ba 100644 --- a/libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLInputConnection.java +++ b/libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLInputConnection.java @@ -111,18 +111,20 @@ public class SDLInputConnection extends BaseInputConnection if (matchLength < text.length()) { String pendingText = text.subSequence(matchLength, text.length()).toString(); - for (offset = 0; offset < pendingText.length(); ) { - int codePoint = pendingText.codePointAt(offset); - if (codePoint == '\n') { - if (SDLActivity.onNativeSoftReturnKey()) { - return; + if (!SDLActivity.dispatchingKeyEvent()) { + for (offset = 0; offset < pendingText.length(); ) { + int codePoint = pendingText.codePointAt(offset); + if (codePoint == '\n') { + if (SDLActivity.onNativeSoftReturnKey()) { + return; + } } + /* Higher code points don't generate simulated scancodes */ + if (codePoint > 0 && codePoint < 128) { + nativeGenerateScancodeForUnichar((char)codePoint); + } + offset += Character.charCount(codePoint); } - /* Higher code points don't generate simulated scancodes */ - if (codePoint < 128) { - nativeGenerateScancodeForUnichar((char)codePoint); - } - offset += Character.charCount(codePoint); } SDLInputConnection.nativeCommitText(pendingText, 0); } diff --git a/libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLSurface.java b/libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLSurface.java index d896f6ce..16588213 100644 --- a/libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLSurface.java +++ b/libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLSurface.java @@ -239,93 +239,64 @@ public class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, int touchDevId = event.getDeviceId(); final int pointerCount = event.getPointerCount(); int action = event.getActionMasked(); - int pointerFingerId; - int i = -1; + int pointerId; + int i = 0; float x,y,p; - // 12290 = Samsung DeX mode desktop mouse - // 12290 = 0x3002 = 0x2002 | 0x1002 = SOURCE_MOUSE | SOURCE_TOUCHSCREEN - // 0x2 = SOURCE_CLASS_POINTER - if (event.getSource() == InputDevice.SOURCE_MOUSE || event.getSource() == (InputDevice.SOURCE_MOUSE | InputDevice.SOURCE_TOUCHSCREEN)) { - int mouseButton = 1; - try { - Object object = event.getClass().getMethod("getButtonState").invoke(event); - if (object != null) { - mouseButton = (Integer) object; + if (action == MotionEvent.ACTION_POINTER_UP || action == MotionEvent.ACTION_POINTER_DOWN) + i = event.getActionIndex(); + + do { + int toolType = event.getToolType(i); + + if (toolType == MotionEvent.TOOL_TYPE_MOUSE) { + int buttonState = event.getButtonState(); + boolean relative = false; + + // We need to check if we're in relative mouse mode and get the axis offset rather than the x/y values + // if we are. We'll leverage our existing mouse motion listener + SDLGenericMotionListener_API14 motionListener = SDLActivity.getMotionListener(); + x = motionListener.getEventX(event, i); + y = motionListener.getEventY(event, i); + relative = motionListener.inRelativeMode(); + + SDLActivity.onNativeMouse(buttonState, action, x, y, relative); + } else if (toolType == MotionEvent.TOOL_TYPE_STYLUS || toolType == MotionEvent.TOOL_TYPE_ERASER) { + pointerId = event.getPointerId(i); + x = event.getX(i); + y = event.getY(i); + p = event.getPressure(i); + if (p > 1.0f) { + // may be larger than 1.0f on some devices + // see the documentation of getPressure(i) + p = 1.0f; } - } catch(Exception ignored) { + + // BUTTON_STYLUS_PRIMARY is 2^5, so shift by 4, and apply SDL_PEN_INPUT_DOWN/SDL_PEN_INPUT_ERASER_TIP + int buttonState = (event.getButtonState() >> 4) | (1 << (toolType == MotionEvent.TOOL_TYPE_STYLUS ? 0 : 30)); + + SDLActivity.onNativePen(pointerId, buttonState, action, x, y, p); + } else if (toolType == MotionEvent.TOOL_TYPE_FINGER) { + pointerId = event.getPointerId(i); + x = getNormalizedX(event.getX(i)); + y = getNormalizedY(event.getY(i)); + p = event.getPressure(i); + if (p > 1.0f) { + // may be larger than 1.0f on some devices + // see the documentation of getPressure(i) + p = 1.0f; + } + + SDLActivity.onNativeTouch(touchDevId, pointerId, action, x, y, p); } - // We need to check if we're in relative mouse mode and get the axis offset rather than the x/y values - // if we are. We'll leverage our existing mouse motion listener - SDLGenericMotionListener_API12 motionListener = SDLActivity.getMotionListener(); - x = motionListener.getEventX(event); - y = motionListener.getEventY(event); - - SDLActivity.onNativeMouse(mouseButton, action, x, y, motionListener.inRelativeMode()); - } else { - switch(action) { - case MotionEvent.ACTION_MOVE: - for (i = 0; i < pointerCount; i++) { - pointerFingerId = event.getPointerId(i); - x = getNormalizedX(event.getX(i)); - y = getNormalizedY(event.getY(i)); - p = event.getPressure(i); - if (p > 1.0f) { - // may be larger than 1.0f on some devices - // see the documentation of getPressure(i) - p = 1.0f; - } - SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p); - } - break; - - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_DOWN: - // Primary pointer up/down, the index is always zero - i = 0; - /* fallthrough */ - case MotionEvent.ACTION_POINTER_UP: - case MotionEvent.ACTION_POINTER_DOWN: - // Non primary pointer up/down - if (i == -1) { - i = event.getActionIndex(); - } - - pointerFingerId = event.getPointerId(i); - x = getNormalizedX(event.getX(i)); - y = getNormalizedY(event.getY(i)); - p = event.getPressure(i); - if (p > 1.0f) { - // may be larger than 1.0f on some devices - // see the documentation of getPressure(i) - p = 1.0f; - } - SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p); - break; - - case MotionEvent.ACTION_CANCEL: - for (i = 0; i < pointerCount; i++) { - pointerFingerId = event.getPointerId(i); - x = getNormalizedX(event.getX(i)); - y = getNormalizedY(event.getY(i)); - p = event.getPressure(i); - if (p > 1.0f) { - // may be larger than 1.0f on some devices - // see the documentation of getPressure(i) - p = 1.0f; - } - SDLActivity.onNativeTouch(touchDevId, pointerFingerId, MotionEvent.ACTION_UP, x, y, p); - } - break; - - default: - break; - } - } + // Non-primary up/down + if (action == MotionEvent.ACTION_POINTER_UP || action == MotionEvent.ACTION_POINTER_DOWN) + break; + } while (++i < pointerCount); return true; - } + } // Sensor events public void enableSensor(int sensortype, boolean enabled) { @@ -395,39 +366,42 @@ public class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, public boolean onCapturedPointerEvent(MotionEvent event) { int action = event.getActionMasked(); + int pointerCount = event.getPointerCount(); - float x, y; - switch (action) { - case MotionEvent.ACTION_SCROLL: - x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, 0); - y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, 0); - SDLActivity.onNativeMouse(0, action, x, y, false); - return true; + for (int i = 0; i < pointerCount; i++) { + float x, y; + switch (action) { + case MotionEvent.ACTION_SCROLL: + x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, i); + y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, i); + SDLActivity.onNativeMouse(0, action, x, y, false); + return true; - case MotionEvent.ACTION_HOVER_MOVE: - case MotionEvent.ACTION_MOVE: - x = event.getX(0); - y = event.getY(0); - SDLActivity.onNativeMouse(0, action, x, y, true); - return true; + case MotionEvent.ACTION_HOVER_MOVE: + case MotionEvent.ACTION_MOVE: + x = event.getX(i); + y = event.getY(i); + SDLActivity.onNativeMouse(0, action, x, y, true); + return true; - case MotionEvent.ACTION_BUTTON_PRESS: - case MotionEvent.ACTION_BUTTON_RELEASE: + case MotionEvent.ACTION_BUTTON_PRESS: + case MotionEvent.ACTION_BUTTON_RELEASE: - // Change our action value to what SDL's code expects. - if (action == MotionEvent.ACTION_BUTTON_PRESS) { - action = MotionEvent.ACTION_DOWN; - } else { /* MotionEvent.ACTION_BUTTON_RELEASE */ - action = MotionEvent.ACTION_UP; - } + // Change our action value to what SDL's code expects. + if (action == MotionEvent.ACTION_BUTTON_PRESS) { + action = MotionEvent.ACTION_DOWN; + } else { /* MotionEvent.ACTION_BUTTON_RELEASE */ + action = MotionEvent.ACTION_UP; + } - x = event.getX(0); - y = event.getY(0); - int button = event.getButtonState(); + x = event.getX(i); + y = event.getY(i); + int button = event.getButtonState(); - SDLActivity.onNativeMouse(button, action, x, y, true); - return true; - } + SDLActivity.onNativeMouse(button, action, x, y, true); + return true; + } + } return false; } diff --git a/libs/SDL3/android-project/build.gradle b/libs/SDL3/android-project/build.gradle index 2c911c6f..ed2299cb 100644 --- a/libs/SDL3/android-project/build.gradle +++ b/libs/SDL3/android-project/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:8.1.1' + classpath 'com.android.tools.build:gradle:8.7.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/libs/SDL3/android-project/gradle/wrapper/gradle-wrapper.properties b/libs/SDL3/android-project/gradle/wrapper/gradle-wrapper.properties index 5b9d7599..99fbfa03 100644 --- a/libs/SDL3/android-project/gradle/wrapper/gradle-wrapper.properties +++ b/libs/SDL3/android-project/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Thu Nov 11 18:20:34 PST 2021 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/libs/SDL3/build-scripts/SDL_migration.cocci b/libs/SDL3/build-scripts/SDL_migration.cocci index 27a549fd..dac94493 100644 --- a/libs/SDL3/build-scripts/SDL_migration.cocci +++ b/libs/SDL3/build-scripts/SDL_migration.cocci @@ -3731,3 +3731,11 @@ typedef SDL_bool, bool; @@ - SDL_GLattr + SDL_GLAttr +@@ +@@ +- SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE ++ SDL_HINT_JOYSTICK_ENHANCED_REPORTS +@@ +@@ +- SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE ++ SDL_HINT_JOYSTICK_ENHANCED_REPORTS diff --git a/libs/SDL3/build-scripts/build-release.py b/libs/SDL3/build-scripts/build-release.py index 2002039e..f3faa06c 100644 --- a/libs/SDL3/build-scripts/build-release.py +++ b/libs/SDL3/build-scripts/build-release.py @@ -37,6 +37,8 @@ logger = logging.getLogger(__name__) GIT_HASH_FILENAME = ".git-hash" REVISION_TXT = "REVISION.txt" +RE_ILLEGAL_MINGW_LIBRARIES = re.compile(r"(?:lib)?(?:gcc|(?:std)?c[+][+]|(?:win)?pthread).*", flags=re.I) + def safe_isotime_to_datetime(str_isotime: str) -> datetime.datetime: try: @@ -339,6 +341,12 @@ class ArchiveFileTree: def add_file(self, file: NodeInArchive): self._tree[file.arcpath] = file + def __iter__(self) -> typing.Iterable[NodeInArchive]: + yield from self._tree.values() + + def __contains__(self, value: str) -> bool: + return value in self._tree + def get_latest_mod_time(self) -> datetime.datetime: return max(item.time for item in self._tree.values() if item.time) @@ -353,7 +361,6 @@ class ArchiveFileTree: target = dest_dir + s.symtarget while True: new_target, n = re.subn(r"([^/]+/+[.]{2}/)", "", target) - print(f"{target=} {new_target=}") target = new_target if not n: break @@ -527,6 +534,15 @@ class SourceCollector: return path_times +class AndroidApiVersion: + def __init__(self, name: str, ints: tuple[int, ...]): + self.name = name + self.ints = ints + + def __repr__(self) -> str: + return f"<{self.name} ({'.'.join(str(v) for v in self.ints)})>" + + class Releaser: def __init__(self, release_info: dict, commit: str, revision: str, root: Path, dist_path: Path, section_printer: SectionPrinter, executer: Executer, cmake_generator: str, deps_path: Path, overwrite: bool, github: bool, fast: bool): self.release_info = release_info @@ -587,12 +603,22 @@ class Releaser: def create_source_archives(self) -> None: source_collector = SourceCollector(root=self.root, commit=self.commit, executer=self.executer, filter=self._path_filter) print(f"Collecting sources of {self.project}...") - archive_tree = source_collector.get_archive_file_tree() + archive_tree: ArchiveFileTree = source_collector.get_archive_file_tree() latest_mod_time = archive_tree.get_latest_mod_time() archive_tree.add_file(NodeInArchive.from_text(arcpath=REVISION_TXT, text=f"{self.revision}\n", time=latest_mod_time)) archive_tree.add_file(NodeInArchive.from_text(arcpath=f"{GIT_HASH_FILENAME}", text=f"{self.commit}\n", time=latest_mod_time)) archive_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["source"].get("files", {}), file_mapping_root=self.root, context=self.get_context(), time=latest_mod_time) + if "Makefile.am" in archive_tree: + patched_time = latest_mod_time + datetime.timedelta(minutes=1) + print(f"Makefile.am detected -> touching aclocal.m4, */Makefile.in, configure") + for node_data in archive_tree: + arc_name = os.path.basename(node_data.arcpath) + arc_name_we, arc_name_ext = os.path.splitext(arc_name) + if arc_name in ("aclocal.m4", "configure", "Makefile.in"): + print(f"Bumping time of {node_data.arcpath}") + node_data.time = patched_time + archive_base = f"{self.project}-{self.version}" zip_path = self.dist_path / f"{archive_base}.zip" tgz_path = self.dist_path / f"{archive_base}.tar.gz" @@ -669,6 +695,15 @@ class Releaser: def git_hash_data(self) -> bytes: return f"{self.commit}\n".encode() + def verify_mingw_library(self, triplet: str, path: Path): + objdump_output = self.executer.check_output([f"{triplet}-objdump", "-p", str(path)]) + libraries = re.findall(r"DLL Name: ([^\n]+)", objdump_output) + logger.info("%s (%s) libraries: %r", path, triplet, libraries) + illegal_libraries = list(filter(RE_ILLEGAL_MINGW_LIBRARIES.match, libraries)) + logger.error("Detected 'illegal' libraries: %r", illegal_libraries) + if illegal_libraries: + raise Exception(f"{path} links to illegal libraries: {illegal_libraries}") + def create_mingw_archives(self) -> None: build_type = "Release" build_parent_dir = self.root / "build-mingw" @@ -767,11 +802,15 @@ class Releaser: f"--bindir=${{prefix}}/bin", f"--host={triplet}", f"--build=x86_64-none-linux-gnu", + "CFLAGS=-O2", + "CXXFLAGS=-O2", + "LDFLAGS=-Wl,-s", ] + extra_args, cwd=build_path, env=new_env) with self.section_printer.group(f"Build MinGW {triplet} (autotools)"): self.executer.run(["make", f"-j{self.cpu_count}"], cwd=build_path, env=new_env) with self.section_printer.group(f"Install MinGW {triplet} (autotools)"): self.executer.run(["make", "install"], cwd=build_path, env=new_env) + self.verify_mingw_library(triplet=ARCH_TO_TRIPLET[arch], path=install_path / "bin" / f"{self.project}.dll") archive_file_tree.add_directory_tree(arc_dir=arc_join(arc_root, triplet), path=install_path, time=self.arc_time) print("Recording arch-dependent extra files for MinGW development archive ...") @@ -827,6 +866,7 @@ class Releaser: self.executer.run(["cmake", "--build", str(build_path), "--verbose", "--config", build_type], cwd=build_path, env=new_env) with self.section_printer.group(f"Install MinGW {triplet} (CMake)"): self.executer.run(["cmake", "--install", str(build_path)], cwd=build_path, env=new_env) + self.verify_mingw_library(triplet=ARCH_TO_TRIPLET[arch], path=install_path / "bin" / f"{self.project}.dll") archive_file_tree.add_directory_tree(arc_dir=arc_join(arc_root, triplet), path=install_path, time=self.arc_time) print("Recording arch-dependent extra files for MinGW development archive ...") @@ -854,22 +894,25 @@ class Releaser: self.artifacts["mingw-devel-tar-gz"] = tgz_path self.artifacts["mingw-devel-tar-xz"] = txz_path - def _detect_android_api(self, android_home: str) -> typing.Optional[int]: + def _detect_android_api(self, android_home: str) -> typing.Optional[AndroidApiVersion]: platform_dirs = list(Path(p) for p in glob.glob(f"{android_home}/platforms/android-*")) - re_platform = re.compile("android-([0-9]+)") - platform_versions = [] + re_platform = re.compile("^android-([0-9]+)(?:-ext([0-9]+))?$") + platform_versions: list[AndroidApiVersion] = [] for platform_dir in platform_dirs: logger.debug("Found Android Platform SDK: %s", platform_dir) + if not (platform_dir / "android.jar").is_file(): + logger.debug("Skipping SDK, missing android.jar") + continue if m:= re_platform.match(platform_dir.name): - platform_versions.append(int(m.group(1))) - platform_versions.sort() + platform_versions.append(AndroidApiVersion(name=platform_dir.name, ints=(int(m.group(1)), int(m.group(2) or 0)))) + platform_versions.sort(key=lambda v: v.ints) logger.info("Available platform versions: %s", platform_versions) - platform_versions = list(filter(lambda v: v >= self._android_api_minimum, platform_versions)) - logger.info("Valid platform versions (>=%d): %s", self._android_api_minimum, platform_versions) + platform_versions = list(filter(lambda v: v.ints >= self._android_api_minimum.ints, platform_versions)) + logger.info("Valid platform versions (>=%s): %s", self._android_api_minimum.ints, platform_versions) if not platform_versions: return None android_api = platform_versions[0] - logger.info("Selected API version %d", android_api) + logger.info("Selected API version %s", android_api) return android_api def _get_prefab_json_text(self) -> str: @@ -893,8 +936,19 @@ class Releaser: return json.dumps(module_json_dict, indent=4) @property - def _android_api_minimum(self): - return self.release_info["android"]["api-minimum"] + def _android_api_minimum(self) -> AndroidApiVersion: + value = self.release_info["android"]["api-minimum"] + if isinstance(value, int): + ints = (value, ) + elif isinstance(value, str): + ints = tuple(split(".")) + else: + raise ValueError("Invalid android.api-minimum: must be X or X.Y") + match len(ints): + case 1: name = f"android-{ints[0]}" + case 2: name = f"android-{ints[0]}-ext-{ints[1]}" + case _: raise ValueError("Invalid android.api-minimum: must be X or X.Y") + return AndroidApiVersion(name=name, ints=ints) @property def _android_api_target(self): @@ -907,7 +961,7 @@ class Releaser: def _get_prefab_abi_json_text(self, abi: str, cpp: bool, shared: bool) -> str: abi_json_dict = { "abi": abi, - "api": self._android_api_minimum, + "api": self._android_api_minimum.ints[0], "ndk": self._android_ndk_minimum, "stl": "c++_shared" if cpp else "none", "static": not shared, @@ -920,7 +974,7 @@ class Releaser: xmlns:android="http://schemas.android.com/apk/res/android" package="org.libsdl.android.{self.project}" android:versionCode="1" android:versionName="1.0"> - """) @@ -930,7 +984,8 @@ class Releaser: if not cmake_toolchain_file.exists(): logger.error("CMake toolchain file does not exist (%s)", cmake_toolchain_file) raise SystemExit(1) - aar_path = self.dist_path / f"{self.project}-{self.version}.aar" + aar_path = self.root / "build-android" / f"{self.project}-{self.version}.aar" + android_dist_path = self.dist_path / f"{self.project}-devel-{self.version}-android.zip" android_abis = self.release_info["android"]["abis"] java_jars_added = False module_data_added = False @@ -938,14 +993,24 @@ class Releaser: shutil.rmtree(android_deps_path, ignore_errors=True) for dep, depinfo in self.release_info["android"].get("dependencies", {}).items(): - android_aar = self.deps_path / glob.glob(depinfo["artifact"], root_dir=self.deps_path)[0] - with self.section_printer.group(f"Extracting Android dependency {dep} ({android_aar.name})"): - self.executer.run([sys.executable, str(android_aar), "-o", str(android_deps_path)]) + dep_devel_zip = self.deps_path / glob.glob(depinfo["artifact"], root_dir=self.deps_path)[0] + + dep_extract_path = self.deps_path / f"extract/android/{dep}" + shutil.rmtree(dep_extract_path, ignore_errors=True) + dep_extract_path.mkdir(parents=True, exist_ok=True) + + with self.section_printer.group(f"Extracting Android dependency {dep} ({dep_devel_zip})"): + with zipfile.ZipFile(dep_devel_zip, "r") as zf: + zf.extractall(dep_extract_path) + + dep_devel_aar = dep_extract_path / glob.glob("*.aar", root_dir=dep_extract_path)[0] + self.executer.run([sys.executable, str(dep_devel_aar), "-o", str(android_deps_path)]) for module_name, module_info in self.release_info["android"]["modules"].items(): assert "type" in module_info and module_info["type"] in ("interface", "library"), f"module {module_name} must have a valid type" - archive_file_tree = ArchiveFileTree() + aar_file_tree = ArchiveFileTree() + android_devel_file_tree = ArchiveFileTree() for android_abi in android_abis: with self.section_printer.group(f"Building for Android {android_api} {android_abi}"): @@ -996,20 +1061,20 @@ class Releaser: assert library.suffix in (".so", ".a") assert library.is_file(), f"CMake should have built library '{library}' for module {module_name}" arcdir_prefab_libs = f"{arcdir_prefab_module}/libs/android.{android_abi}" - archive_file_tree.add_file(NodeInArchive.from_fs(arcpath=f"{arcdir_prefab_libs}/{library.name}", path=library, time=self.arc_time)) - archive_file_tree.add_file(NodeInArchive.from_text(arcpath=f"{arcdir_prefab_libs}/abi.json", text=self._get_prefab_abi_json_text(abi=android_abi, cpp=False, shared=library.suffix == ".so"), time=self.arc_time)) + aar_file_tree.add_file(NodeInArchive.from_fs(arcpath=f"{arcdir_prefab_libs}/{library.name}", path=library, time=self.arc_time)) + aar_file_tree.add_file(NodeInArchive.from_text(arcpath=f"{arcdir_prefab_libs}/abi.json", text=self._get_prefab_abi_json_text(abi=android_abi, cpp=False, shared=library.suffix == ".so"), time=self.arc_time)) if not module_data_added: library_name = None if module_info["type"] == "library": library_name = Path(module_info["library"]).stem.removeprefix("lib") export_libraries = module_info.get("export-libraries", []) - archive_file_tree.add_file(NodeInArchive.from_text(arcpath=arc_join(arcdir_prefab_module, "module.json"), text=self._get_prefab_module_json_text(library_name=library_name, export_libraries=export_libraries), time=self.arc_time)) + aar_file_tree.add_file(NodeInArchive.from_text(arcpath=arc_join(arcdir_prefab_module, "module.json"), text=self._get_prefab_module_json_text(library_name=library_name, export_libraries=export_libraries), time=self.arc_time)) arcdir_prefab_include = f"prefab/modules/{module_name}/include" if "includes" in module_info: - archive_file_tree.add_file_mapping(arc_dir=arcdir_prefab_include, file_mapping=module_info["includes"], file_mapping_root=install_dir, context=self.get_context(), time=self.arc_time) + aar_file_tree.add_file_mapping(arc_dir=arcdir_prefab_include, file_mapping=module_info["includes"], file_mapping_root=install_dir, context=self.get_context(), time=self.arc_time) else: - archive_file_tree.add_file(NodeInArchive.from_text(arcpath=arc_join(arcdir_prefab_include, ".keep"), text="\n", time=self.arc_time)) + aar_file_tree.add_file(NodeInArchive.from_text(arcpath=arc_join(arcdir_prefab_include, ".keep"), text="\n", time=self.arc_time)) module_data_added = True if not java_jars_added: @@ -1022,21 +1087,28 @@ class Releaser: assert sources_jar_path.is_file(), f"CMake should have archived the java sources into a JAR ({sources_jar_path})" assert doc_jar_path.is_file(), f"CMake should have archived javadoc into a JAR ({doc_jar_path})" - archive_file_tree.add_file(NodeInArchive.from_fs(arcpath="classes.jar", path=classes_jar_path, time=self.arc_time)) - archive_file_tree.add_file(NodeInArchive.from_fs(arcpath="classes-sources.jar", path=sources_jar_path, time=self.arc_time)) - archive_file_tree.add_file(NodeInArchive.from_fs(arcpath="classes-doc.jar", path=doc_jar_path, time=self.arc_time)) + aar_file_tree.add_file(NodeInArchive.from_fs(arcpath="classes.jar", path=classes_jar_path, time=self.arc_time)) + aar_file_tree.add_file(NodeInArchive.from_fs(arcpath="classes-sources.jar", path=sources_jar_path, time=self.arc_time)) + aar_file_tree.add_file(NodeInArchive.from_fs(arcpath="classes-doc.jar", path=doc_jar_path, time=self.arc_time)) assert ("jars" in self.release_info["android"] and java_jars_added) or "jars" not in self.release_info["android"], "Must have archived java JAR archives" - archive_file_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["android"].get("files", {}), file_mapping_root=self.root, context=self.get_context(), time=self.arc_time) + aar_file_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["android"]["aar-files"], file_mapping_root=self.root, context=self.get_context(), time=self.arc_time) - archive_file_tree.add_file(NodeInArchive.from_text(arcpath="prefab/prefab.json", text=self._get_prefab_json_text(), time=self.arc_time)) - archive_file_tree.add_file(NodeInArchive.from_text(arcpath="AndroidManifest.xml", text=self._get_android_manifest_text(), time=self.arc_time)) + aar_file_tree.add_file(NodeInArchive.from_text(arcpath="prefab/prefab.json", text=self._get_prefab_json_text(), time=self.arc_time)) + aar_file_tree.add_file(NodeInArchive.from_text(arcpath="AndroidManifest.xml", text=self._get_android_manifest_text(), time=self.arc_time)) with Archiver(zip_path=aar_path) as archiver: - archive_file_tree.add_to_archiver(archive_base="", archiver=archiver) + aar_file_tree.add_to_archiver(archive_base="", archiver=archiver) archiver.add_git_hash(arcdir="", commit=self.commit, time=self.arc_time) - self.artifacts[f"android-aar"] = aar_path + + android_devel_file_tree.add_file(NodeInArchive.from_fs(arcpath=aar_path.name, path=aar_path)) + android_devel_file_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["android"]["files"], file_mapping_root=self.root, context=self.get_context(), time=self.arc_time) + with Archiver(zip_path=android_dist_path) as archiver: + android_devel_file_tree.add_to_archiver(archive_base="", archiver=archiver) + archiver.add_git_hash(arcdir="", commit=self.commit, time=self.arc_time) + + self.artifacts[f"android-aar"] = android_dist_path def download_dependencies(self): shutil.rmtree(self.deps_path, ignore_errors=True) @@ -1073,7 +1145,7 @@ class Releaser: assert len(msvc_matches) == 1, f"Exactly one archive matches msvc {dep} dependency: {msvc_matches}" if "android" in self.release_info: android_matches = glob.glob(self.release_info["android"]["dependencies"][dep]["artifact"], root_dir=self.deps_path) - assert len(android_matches) == 1, f"Exactly one archive matches msvc {dep} dependency: {msvc_matches}" + assert len(android_matches) == 1, f"Exactly one archive matches msvc {dep} dependency: {android_matches}" @staticmethod def _arch_to_vs_platform(arch: str, configuration: str="Release") -> VsArchPlatformConfig: @@ -1199,6 +1271,10 @@ class Releaser: platform_context = self.get_context(extra_context=arch_platform.extra_context()) build_type = "Release" + extra_context = { + "ARCH": arch_platform.arch, + "PLATFORM": arch_platform.platform, + } built_paths = set(install_path / configure_text(f, context=platform_context) for file_mapping in (self.release_info["msvc"]["cmake"]["files-lib"], self.release_info["msvc"]["cmake"]["files-devel"]) for files_list in file_mapping.values() for f in files_list) logger.info("CMake builds these files, to be included in the package: %s", built_paths) @@ -1249,7 +1325,7 @@ class Releaser: logger.info("Collecting files...") archive_file_tree = ArchiveFileTree() archive_file_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["msvc"]["cmake"]["files-lib"], file_mapping_root=install_path, context=platform_context, time=self.arc_time) - archive_file_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["msvc"]["files-lib"], file_mapping_root=self.root, context=self.get_context(), time=self.arc_time) + archive_file_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["msvc"]["files-lib"], file_mapping_root=self.root, context=self.get_context(extra_context=extra_context), time=self.arc_time) logger.info("Creating %s", zip_path) with Archiver(zip_path=zip_path) as archiver: @@ -1313,7 +1389,7 @@ def main(argv=None) -> int: parser.add_argument("--actions", choices=["download", "source", "android", "mingw", "msvc", "dmg"], required=True, nargs="+", dest="actions", help="What to do?") parser.set_defaults(loglevel=logging.INFO) parser.add_argument('--vs-year', dest="vs_year", help="Visual Studio year") - parser.add_argument('--android-api', type=int, dest="android_api", help="Android API version") + parser.add_argument('--android-api', dest="android_api", help="Android API version") parser.add_argument('--android-home', dest="android_home", default=os.environ.get("ANDROID_HOME"), help="Android Home folder") parser.add_argument('--android-ndk-home', dest="android_ndk_home", default=os.environ.get("ANDROID_NDK_HOME"), help="Android NDK Home folder") parser.add_argument('--cmake-generator', dest="cmake_generator", default="Ninja", help="CMake Generator") @@ -1440,14 +1516,27 @@ def main(argv=None) -> int: if args.android_api is None: with section_printer.group("Detect Android APIS"): args.android_api = releaser._detect_android_api(android_home=args.android_home) - if args.android_api is None or not (Path(args.android_home) / f"platforms/android-{args.android_api}").is_dir(): + else: + try: + android_api_ints = tuple(int(v) for v in args.android_api.split(".")) + match len(android_api_ints): + case 1: android_api_name = f"android-{android_api_ints[0]}" + case 2: android_api_name = f"android-{android_api_ints[0]}-ext-{android_api_ints[1]}" + case _: raise ValueError + except ValueError: + logger.error("Invalid --android-api, must be a 'X' or 'X.Y' version") + args.android_api = AndroidApiVersion(ints=android_api_ints, name=android_api_name) + if args.android_api is None: parser.error("Invalid --android-api, and/or could not be detected") + android_api_path = Path(args.android_home) / f"platforms/{args.android_api.name}" + if not android_api_path.is_dir(): + parser.error(f"Android API directory does not exist ({android_api_path})") with section_printer.group("Android arguments"): print(f"android_home = {args.android_home}") print(f"android_ndk_home = {args.android_ndk_home}") print(f"android_api = {args.android_api}") releaser.create_android_archives( - android_api=args.android_api, + android_api=args.android_api.ints[0], android_home=args.android_home, android_ndk_home=args.android_ndk_home, ) diff --git a/libs/SDL3/build-scripts/build-web-examples.pl b/libs/SDL3/build-scripts/build-web-examples.pl index 211682e1..c255ea3a 100644 --- a/libs/SDL3/build-scripts/build-web-examples.pl +++ b/libs/SDL3/build-scripts/build-web-examples.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl -w # Simple DirectMedia Layer -# Copyright (C) 1997-2024 Sam Lantinga +# Copyright (C) 1997-2025 Sam Lantinga # # This software is provided 'as-is', without any express or implied # warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/build-scripts/check_stdlib_usage.py b/libs/SDL3/build-scripts/check_stdlib_usage.py index 525b58a8..9ab65e09 100644 --- a/libs/SDL3/build-scripts/check_stdlib_usage.py +++ b/libs/SDL3/build-scripts/check_stdlib_usage.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # # Simple DirectMedia Layer -# Copyright (C) 1997-2024 Sam Lantinga +# Copyright (C) 1997-2025 Sam Lantinga # # This software is provided 'as-is', without any express or implied # warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/build-scripts/fnsince.pl b/libs/SDL3/build-scripts/fnsince.pl index 8e8ec48e..9d987fc4 100644 --- a/libs/SDL3/build-scripts/fnsince.pl +++ b/libs/SDL3/build-scripts/fnsince.pl @@ -90,15 +90,9 @@ foreach my $release (@releases) { my $tag = $fulltags{$release}; my $blobname = "$tag:src/dynapi/SDL_dynapi_overrides.h"; - if ($release =~ /\A3\.(0\.\d+|1\.[0123])/) { # make everything up to the first SDL3 prerelease look like 3.1.3 (ABI lock version). - $release = '3.1.3'; - } - - # !!! FIXME: REMOVE ME WHEN 3.2.0 SHIPS! - elsif (not $release =~ /\A3\.1\.\d+/) { # a couple of releases after the initial 3.1.3, let them through. + if ($release =~ /\A3\.[01]\.\d+\Z/) { # make everything up to the first SDL3 official release look like 3.2.0. $release = '3.2.0'; } - # !!! FIXME: REMOVE ME WHEN 3.2.0 SHIPS! open(PIPEFH, '-|', "git show '$blobname'") or die "Failed to read git blob '$blobname': $!\n"; while () { diff --git a/libs/SDL3/build-scripts/gen_audio_channel_conversion.c b/libs/SDL3/build-scripts/gen_audio_channel_conversion.c index f774e7db..85a856e7 100644 --- a/libs/SDL3/build-scripts/gen_audio_channel_conversion.c +++ b/libs/SDL3/build-scripts/gen_audio_channel_conversion.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -406,7 +406,7 @@ int main(void) printf( "/*\n" " Simple DirectMedia Layer\n" - " Copyright (C) 1997-2024 Sam Lantinga \n" + " Copyright (C) 1997-2025 Sam Lantinga \n" "\n" " This software is provided 'as-is', without any express or implied\n" " warranty. In no event will the authors be held liable for any damages\n" diff --git a/libs/SDL3/build-scripts/makecasefoldhashtable.pl b/libs/SDL3/build-scripts/makecasefoldhashtable.pl index bca7baaa..efe35340 100644 --- a/libs/SDL3/build-scripts/makecasefoldhashtable.pl +++ b/libs/SDL3/build-scripts/makecasefoldhashtable.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl -w # Simple DirectMedia Layer -# Copyright (C) 1997-2024 Sam Lantinga +# Copyright (C) 1997-2025 Sam Lantinga # # This software is provided 'as-is', without any express or implied # warranty. In no event will the authors be held liable for any damages @@ -36,7 +36,7 @@ my $mem_used = 0; print <<__EOF__; /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/build-scripts/pkg-support/android/INSTALL.md.in b/libs/SDL3/build-scripts/pkg-support/android/INSTALL.md.in index 6780fe9a..60267733 100644 --- a/libs/SDL3/build-scripts/pkg-support/android/INSTALL.md.in +++ b/libs/SDL3/build-scripts/pkg-support/android/INSTALL.md.in @@ -1,7 +1,13 @@ -This Android archive allows use of @<@PROJECT_NAME@>@ in your Android project, without needing to copy any SDL source. + +# Using this package + +This package contains SDL built for the Android platform. + +## Gradle integration + For integration with CMake/ndk-build, it uses [prefab](https://google.github.io/prefab/). -Copy this archive (@<@PROJECT_NAME@>@-@<@PROJECT_VERSION@>@.aar) to a `app/libs` directory of your project. +Copy the aar archive (@<@PROJECT_NAME@>@-@<@PROJECT_VERSION@>@.aar) to a `app/libs` directory of your project. In `app/build.gradle` of your Android project, add: ``` @@ -40,22 +46,46 @@ $(call import-module,prefab/@<@PROJECT_NAME@>@) --- -For advanced users: +## Other build systems (advanced) -If you want to build a 3rd party library outside Gradle, +If you want to build a project without Gradle, running the following command will extract the Android archive into a more common directory structure. ``` python @<@PROJECT_NAME@>@-@<@PROJECT_VERSION@>@.aar -o android_prefix ``` Add `--help` for a list of all available options. +# Documentation -Look at the example programs in ./test (of the source archive), and check out online documentation: - https://wiki.libsdl.org/SDL3/FrontPage +An API reference, tutorials, and additional documentation is available at: -Join the SDL discourse server if you want to join the community: - https://discourse.libsdl.org/ +https://wiki.libsdl.org/SDL3 +# Example code + +There are simple example programs available at: + +https://examples.libsdl.org/SDL3 + +# Discussions + +## Discord + +You can join the official Discord server at: + +https://discord.com/invite/BwpFGBWsv8 + +## Forums/mailing lists + +You can join SDL development discussions at: + +https://discourse.libsdl.org/ + +Once you sign up, you can use the forum through the website or as a mailing list from your email client. + +## Announcement list + +You can sign up for the low traffic announcement list at: + +https://www.libsdl.org/mailing-list.php -That's it! -Sam Lantinga diff --git a/libs/SDL3/build-scripts/pkg-support/android/__main__.py.in b/libs/SDL3/build-scripts/pkg-support/android/aar/__main__.py.in similarity index 100% rename from libs/SDL3/build-scripts/pkg-support/android/__main__.py.in rename to libs/SDL3/build-scripts/pkg-support/android/aar/__main__.py.in diff --git a/libs/SDL3/build-scripts/pkg-support/android/cmake/SDL3Config.cmake b/libs/SDL3/build-scripts/pkg-support/android/aar/cmake/SDL3Config.cmake similarity index 100% rename from libs/SDL3/build-scripts/pkg-support/android/cmake/SDL3Config.cmake rename to libs/SDL3/build-scripts/pkg-support/android/aar/cmake/SDL3Config.cmake diff --git a/libs/SDL3/build-scripts/pkg-support/android/cmake/SDL3ConfigVersion.cmake.in b/libs/SDL3/build-scripts/pkg-support/android/aar/cmake/SDL3ConfigVersion.cmake.in similarity index 100% rename from libs/SDL3/build-scripts/pkg-support/android/cmake/SDL3ConfigVersion.cmake.in rename to libs/SDL3/build-scripts/pkg-support/android/aar/cmake/SDL3ConfigVersion.cmake.in diff --git a/libs/SDL3/build-scripts/pkg-support/android/description.json.in b/libs/SDL3/build-scripts/pkg-support/android/aar/description.json.in similarity index 100% rename from libs/SDL3/build-scripts/pkg-support/android/description.json.in rename to libs/SDL3/build-scripts/pkg-support/android/aar/description.json.in diff --git a/libs/SDL3/build-scripts/pkg-support/mingw/INSTALL.md b/libs/SDL3/build-scripts/pkg-support/mingw/INSTALL.md new file mode 100644 index 00000000..83ea472e --- /dev/null +++ b/libs/SDL3/build-scripts/pkg-support/mingw/INSTALL.md @@ -0,0 +1,53 @@ + +# Using this package + +This package contains SDL built for the mingw-w64 toolchain. + +The files for 32-bit architecture are in i686-w64-mingw32 +The files for 64-bit architecture are in x86_64-w64-mingw32 + +You can install them to another location, just type `make` for help. + +To use this package, point your include path at _arch_/include and your library path at _arch_/lib, link with the SDL3 library and copy _arch_/bin/SDL3.dll next to your executable. + +e.g. +```sh +gcc -o hello.exe hello.c -Ix86_64-w64-mingw32/include -Lx86_64-w64-mingw32/lib -lSDL3 +cp x86_64-w64-mingw32/bin/SDL3.dll . +./hello.exe +``` + +# Documentation + +An API reference, tutorials, and additional documentation is available at: + +https://wiki.libsdl.org/SDL3 + +# Example code + +There are simple example programs available at: + +https://examples.libsdl.org/SDL3 + +# Discussions + +## Discord + +You can join the official Discord server at: + +https://discord.com/invite/BwpFGBWsv8 + +## Forums/mailing lists + +You can join SDL development discussions at: + +https://discourse.libsdl.org/ + +Once you sign up, you can use the forum through the website or as a mailing list from your email client. + +## Announcement list + +You can sign up for the low traffic announcement list at: + +https://www.libsdl.org/mailing-list.php + diff --git a/libs/SDL3/build-scripts/pkg-support/mingw/INSTALL.txt b/libs/SDL3/build-scripts/pkg-support/mingw/INSTALL.txt deleted file mode 100644 index 41025e07..00000000 --- a/libs/SDL3/build-scripts/pkg-support/mingw/INSTALL.txt +++ /dev/null @@ -1,25 +0,0 @@ - -The 32-bit files are in i686-w64-mingw32 -The 64-bit files are in x86_64-w64-mingw32 - -To install SDL for 32-bit x86 executables (i686): - make install-i686 - -To install SDL for 64-bit x86 executables (x86_64): - make install-x86_64 - -To install both: - make install-all - -Use DESTDIR to change the target location - mkdir $HOME/mingw32-prefix - make install-i686 DESTDIR=$HOME/mingw32-prefix - -Look at the example programs in ./test, and check out online documentation: - https://wiki.libsdl.org/SDL3/FrontPage - -Join the SDL discourse server if you want to join the community: - https://discourse.libsdl.org/ - -That's it! -Sam Lantinga diff --git a/libs/SDL3/build-scripts/pkg-support/mingw/cmake/SDL3ConfigVersion.cmake b/libs/SDL3/build-scripts/pkg-support/mingw/cmake/SDL3ConfigVersion.cmake new file mode 100644 index 00000000..5a78c11e --- /dev/null +++ b/libs/SDL3/build-scripts/pkg-support/mingw/cmake/SDL3ConfigVersion.cmake @@ -0,0 +1,19 @@ +# SDL3 CMake version configuration file: +# This file is meant to be placed in a cmake subfolder of SDL3-devel-3.x.y-mingw + +if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(sdl3_config_path "${CMAKE_CURRENT_LIST_DIR}/../i686-w64-mingw32/lib/cmake/SDL3/SDL3ConfigVersion.cmake") +elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(sdl3_config_path "${CMAKE_CURRENT_LIST_DIR}/../x86_64-w64-mingw32/lib/cmake/SDL3/SDL3ConfigVersion.cmake") +else() + set(PACKAGE_VERSION_UNSUITABLE TRUE) + return() +endif() + +if(NOT EXISTS "${sdl3_config_path}") + message(WARNING "${sdl3_config_path} does not exist: MinGW development package is corrupted") + set(PACKAGE_VERSION_UNSUITABLE TRUE) + return() +endif() + +include("${sdl3_config_path}") diff --git a/libs/SDL3/build-scripts/pkg-support/msvc/INSTALL.md b/libs/SDL3/build-scripts/pkg-support/msvc/INSTALL.md new file mode 100644 index 00000000..82f812f3 --- /dev/null +++ b/libs/SDL3/build-scripts/pkg-support/msvc/INSTALL.md @@ -0,0 +1,45 @@ + +# Using this package + +This package contains SDL built for Visual Studio. + +To use this package, edit your project properties: +- Add the include directory to "VC++ Directories" -> "Include Directories" +- Add the lib/_arch_ directory to "VC++ Directories" -> "Library Directories" +- Add SDL3.lib to Linker -> Input -> "Additional Dependencies" +- Copy lib/_arch_/SDL3.dll to your project directory. + +# Documentation + +An API reference, tutorials, and additional documentation is available at: + +https://wiki.libsdl.org/SDL3 + +# Example code + +There are simple example programs available at: + +https://examples.libsdl.org/SDL3 + +# Discussions + +## Discord + +You can join the official Discord server at: + +https://discord.com/invite/BwpFGBWsv8 + +## Forums/mailing lists + +You can join SDL development discussions at: + +https://discourse.libsdl.org/ + +Once you sign up, you can use the forum through the website or as a mailing list from your email client. + +## Announcement list + +You can sign up for the low traffic announcement list at: + +https://www.libsdl.org/mailing-list.php + diff --git a/libs/SDL3/build-scripts/pkg-support/msvc/arm64/INSTALL.md.in b/libs/SDL3/build-scripts/pkg-support/msvc/arm64/INSTALL.md.in new file mode 100644 index 00000000..c185171a --- /dev/null +++ b/libs/SDL3/build-scripts/pkg-support/msvc/arm64/INSTALL.md.in @@ -0,0 +1,13 @@ + +# Using this package + +This package contains @<@PROJECT_NAME@>@ built for arm64 Windows. + +To use this package, simply replace an existing 64-bit ARM @<@PROJECT_NAME@>@.dll with the one included here. + +# Development packages + +If you're looking for packages with headers and libraries, you can download one of these: +- @<@PROJECT_NAME@>@-devel-@<@PROJECT_VERSION@>@-VC.zip, for development using Visual Studio +- @<@PROJECT_NAME@>@-devel-@<@PROJECT_VERSION@>@-mingw.zip, for development using mingw-w64 + diff --git a/libs/SDL3/build-scripts/pkg-support/msvc/x64/INSTALL.md.in b/libs/SDL3/build-scripts/pkg-support/msvc/x64/INSTALL.md.in new file mode 100644 index 00000000..74cd6785 --- /dev/null +++ b/libs/SDL3/build-scripts/pkg-support/msvc/x64/INSTALL.md.in @@ -0,0 +1,13 @@ + +# Using this package + +This package contains @<@PROJECT_NAME@>@ built for x64 Windows. + +To use this package, simply replace an existing 64-bit @<@PROJECT_NAME@>@.dll with the one included here. + +# Development packages + +If you're looking for packages with headers and libraries, you can download one of these: +- @<@PROJECT_NAME@>@-devel-@<@PROJECT_VERSION@>@-VC.zip, for development using Visual Studio +- @<@PROJECT_NAME@>@-devel-@<@PROJECT_VERSION@>@-mingw.zip, for development using mingw-w64 + diff --git a/libs/SDL3/build-scripts/pkg-support/msvc/x86/INSTALL.md.in b/libs/SDL3/build-scripts/pkg-support/msvc/x86/INSTALL.md.in new file mode 100644 index 00000000..041c1163 --- /dev/null +++ b/libs/SDL3/build-scripts/pkg-support/msvc/x86/INSTALL.md.in @@ -0,0 +1,13 @@ + +# Using this package + +This package contains @<@PROJECT_NAME@>@ built for x86 Windows. + +To use this package, simply replace an existing 32-bit @<@PROJECT_NAME@>@.dll with the one included here. + +# Development packages + +If you're looking for packages with headers and libraries, you can download one of these: +- @<@PROJECT_NAME@>@-devel-@<@PROJECT_VERSION@>@-VC.zip, for development using Visual Studio +- @<@PROJECT_NAME@>@-devel-@<@PROJECT_VERSION@>@-mingw.zip, for development using mingw-w64 + diff --git a/libs/SDL3/build-scripts/pkg-support/source/SDL_revision.h.cmake.in b/libs/SDL3/build-scripts/pkg-support/source/SDL_revision.h.cmake.in index 1689aeb8..99e9f80c 100644 --- a/libs/SDL3/build-scripts/pkg-support/source/SDL_revision.h.cmake.in +++ b/libs/SDL3/build-scripts/pkg-support/source/SDL_revision.h.cmake.in @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/build-scripts/pkg-support/source/SDL_revision.h.in b/libs/SDL3/build-scripts/pkg-support/source/SDL_revision.h.in index 93073f58..7dd6bc13 100644 --- a/libs/SDL3/build-scripts/pkg-support/source/SDL_revision.h.in +++ b/libs/SDL3/build-scripts/pkg-support/source/SDL_revision.h.in @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/build-scripts/release-info.json b/libs/SDL3/build-scripts/release-info.json index b47c3d2b..dc0bd31b 100644 --- a/libs/SDL3/build-scripts/release-info.json +++ b/libs/SDL3/build-scripts/release-info.json @@ -36,32 +36,23 @@ "-DSDL_SHARED=ON", "-DSDL_STATIC=OFF", "-DSDL_DISABLE_INSTALL_DOCS=ON", + "-DSDL_RELOCATABLE=ON", "-DSDL_TEST_LIBRARY=ON", - "-DSDL_VENDOR_INFO=libsdl.org", - "-DSDL_TESTS=OFF" + "-DSDL_TESTS=OFF", + "-DSDL_VENDOR_INFO=libsdl.org" ], "shared-static": "args" }, "files": { "": [ - "build-scripts/pkg-support/mingw/INSTALL.txt", + "build-scripts/pkg-support/mingw/INSTALL.md", "build-scripts/pkg-support/mingw/Makefile", - "BUGS.txt", - "CREDITS.md", - "README-SDL.txt", - "WhatsNew.txt", "LICENSE.txt", "README.md" ], "cmake": [ "build-scripts/pkg-support/mingw/cmake/SDL3Config.cmake", "build-scripts/pkg-support/mingw/cmake/SDL3ConfigVersion.cmake" - ], - "docs": [ - "docs/*" - ], - "test": [ - "test/*" ] } }, @@ -100,6 +91,7 @@ "-DSDL_TEST_LIBRARY=ON", "-DSDL_TESTS=OFF", "-DSDL_DISABLE_INSTALL_DOCS=ON", + "-DSDL_RELOCATABLE=ON", "-DSDL_VENDOR_INFO=libsdl.org" ], "files-lib": { @@ -118,25 +110,22 @@ }, "files-lib": { "": [ - "README-SDL.txt" + "build-scripts/pkg-support/msvc/@<@ARCH@>@/INSTALL.md.in:INSTALL.md", + "LICENSE.txt", + "README.md" ] }, "files-devel": { "": [ - "README-SDL.txt", - "BUGS.txt", + "build-scripts/pkg-support/msvc/INSTALL.md", "LICENSE.txt", - "README.md", - "WhatsNew.txt" + "README.md" ], "cmake": [ "build-scripts/pkg-support/msvc/cmake/SDL3Config.cmake.in:SDL3Config.cmake", "build-scripts/pkg-support/msvc/cmake/SDL3ConfigVersion.cmake.in:SDL3ConfigVersion.cmake", "cmake/sdlcpu.cmake" ], - "docs": [ - "docs/*" - ], "include/SDL3": [ "include/SDL3/*.h" ] @@ -149,9 +138,9 @@ "-DSDL_STATIC=OFF", "-DSDL_TEST_LIBRARY=ON", "-DSDL_TESTS=OFF", - "-DSDL_DISABLE_ANDROID_JAR=OFF", - "-DSDL_DISABLE_INSTALL=OFF", - "-DSDL_DISABLE_INSTALL_DOCS=OFF", + "-DSDL_ANDROID_JAR=ON", + "-DSDL_INSTALL=ON", + "-DSDL_INSTALL_DOCS=ON", "-DSDL_VENDOR_INFO=libsdl.org" ] }, @@ -195,20 +184,26 @@ "api-minimum": 19, "api-target": 29, "ndk-minimum": 21, - "files": { + "aar-files": { "": [ "android-project/app/proguard-rules.pro:proguard.txt", - "build-scripts/pkg-support/android/INSTALL.md.in:INSTALL.md", - "build-scripts/pkg-support/android/__main__.py.in:__main__.py", - "build-scripts/pkg-support/android/description.json.in:description.json" + "build-scripts/pkg-support/android/aar/__main__.py.in:__main__.py", + "build-scripts/pkg-support/android/aar/description.json.in:description.json" ], "META-INF": [ "LICENSE.txt" ], "cmake": [ "cmake/sdlcpu.cmake", - "build-scripts/pkg-support/android/cmake/SDL3Config.cmake", - "build-scripts/pkg-support/android/cmake/SDL3ConfigVersion.cmake.in:SDL3ConfigVersion.cmake" + "build-scripts/pkg-support/android/aar/cmake/SDL3Config.cmake", + "build-scripts/pkg-support/android/aar/cmake/SDL3ConfigVersion.cmake.in:SDL3ConfigVersion.cmake" + ] + }, + "files": { + "": [ + "build-scripts/pkg-support/android/INSTALL.md.in:INSTALL.md", + "LICENSE.txt", + "README.md" ] } } diff --git a/libs/SDL3/build-scripts/wikiheaders.pl b/libs/SDL3/build-scripts/wikiheaders.pl index 2ea852f7..98591493 100644 --- a/libs/SDL3/build-scripts/wikiheaders.pl +++ b/libs/SDL3/build-scripts/wikiheaders.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl -w # Simple DirectMedia Layer -# Copyright (C) 1997-2024 Sam Lantinga +# Copyright (C) 1997-2025 Sam Lantinga # # This software is provided 'as-is', without any express or implied # warranty. In no event will the authors be held liable for any damages @@ -50,6 +50,7 @@ my $optionsfname = undef; my $wikipreamble = undef; my $wikiheaderfiletext = 'Defined in %fname%'; my $manpageheaderfiletext = 'Defined in %fname%'; +my $manpagesymbolfilterregex = undef; my $headercategoryeval = undef; my $quickrefenabled = 0; my @quickrefcategoryorder; @@ -127,6 +128,7 @@ if (defined $optionsfname) { $wikipreamble = $val, next if $key eq 'wikipreamble'; $wikiheaderfiletext = $val, next if $key eq 'wikiheaderfiletext'; $manpageheaderfiletext = $val, next if $key eq 'manpageheaderfiletext'; + $manpagesymbolfilterregex = $val, next if $key eq 'manpagesymbolfilterregex'; $headercategoryeval = $val, next if $key eq 'headercategoryeval'; $quickrefenabled = int($val), next if $key eq 'quickrefenabled'; @quickrefcategoryorder = split(/,/, $val), next if $key eq 'quickrefcategoryorder'; @@ -2758,6 +2760,7 @@ __EOF__ my $sym = $_; next if not defined $wikisyms{$sym}; # don't have a page for that function, skip it. next if $sym =~ /\A\[category documentation\]/; # not real symbols + next if (defined $manpagesymbolfilterregex) && ($sym =~ /$manpagesymbolfilterregex/); my $symtype = $headersymstype{$sym}; my $wikitype = $wikitypes{$sym}; my $sectionsref = $wikisyms{$sym}; @@ -2789,7 +2792,8 @@ __EOF__ my $decl = $headerdecls{$sym}; my $str = ''; - $brief = "$brief"; + # the "$brief" makes sure this is a copy of the string, which is doing some weird reference thing otherwise. + $brief = defined $brief ? "$brief" : ''; $brief =~ s/\A[\s\n]*\= .*? \=\s*?\n+//ms; $brief =~ s/\A[\s\n]*\=\= .*? \=\=\s*?\n+//ms; $brief =~ s/\A(.*?\.) /$1\n/; # \brief should only be one sentence, delimited by a period+space. Split if necessary. diff --git a/libs/SDL3/cmake/macros.cmake b/libs/SDL3/cmake/macros.cmake index 82dded49..3885abae 100644 --- a/libs/SDL3/cmake/macros.cmake +++ b/libs/SDL3/cmake/macros.cmake @@ -376,24 +376,6 @@ function(SDL_PrintSummary) message(STATUS "") endif() - if(WARN_ABOUT_ARM_SIMD_ASM_MIT) - message(STATUS "SDL is being built with ARM SIMD optimizations, which") - message(STATUS "uses code licensed under the MIT license. If this is a") - message(STATUS "problem, please disable that code by rerunning CMake with:") - message(STATUS "") - message(STATUS " -DSDL_ARMSIMD=OFF") - message(STATUS "") - endif() - - if(WARN_ABOUT_ARM_NEON_ASM_MIT) - message(STATUS "SDL is being built with ARM NEON optimizations, which") - message(STATUS "uses code licensed under the MIT license. If this is a") - message(STATUS "problem, please disable that code by rerunning CMake with:") - message(STATUS "") - message(STATUS " -DSDL_ARMNEON=OFF") - message(STATUS "") - endif() - if(UNIX AND NOT (ANDROID OR APPLE OR EMSCRIPTEN OR HAIKU OR RISCOS)) if(NOT (HAVE_X11 OR HAVE_WAYLAND)) if(NOT SDL_UNIX_CONSOLE_BUILD) diff --git a/libs/SDL3/cmake/sdlchecks.cmake b/libs/SDL3/cmake/sdlchecks.cmake index c0bdabc4..d95cbfa3 100644 --- a/libs/SDL3/cmake/sdlchecks.cmake +++ b/libs/SDL3/cmake/sdlchecks.cmake @@ -313,10 +313,7 @@ macro(CheckX11) find_file(HAVE_XDBE_H NAMES "X11/extensions/Xdbe.h" HINTS "${X11_INCLUDEDIR}") find_file(HAVE_XEXT_H NAMES "X11/extensions/Xext.h" HINTS "${X11_INCLUDEDIR}") - if(X11_LIB) - if(NOT HAVE_XEXT_H) - message(FATAL_ERROR "Missing Xext.h, maybe you need to install the libxext-dev package?") - endif() + if(X11_LIB AND HAVE_XEXT_H) set(HAVE_X11 TRUE) set(HAVE_SDL_VIDEO TRUE) @@ -629,6 +626,7 @@ macro(CheckCOCOA) endif() if(HAVE_COCOA) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/cocoa/*.m") + set(SDL_FRAMEWORK_IOKIT 1) set(SDL_VIDEO_DRIVER_COCOA 1) set(HAVE_SDL_VIDEO TRUE) endif() @@ -822,7 +820,11 @@ macro(CheckPTHREAD) set(PTHREAD_LDFLAGS "-lpthread") elseif(SOLARIS) set(PTHREAD_CFLAGS "-D_REENTRANT") - set(PTHREAD_LDFLAGS "-pthread -lposix4") + if(CMAKE_C_COMPILER_ID MATCHES "SunPro") + set(PTHREAD_LDFLAGS "-mt -lpthread") + else() + set(PTHREAD_LDFLAGS "-pthread -lposix4") + endif() elseif(SYSV5) set(PTHREAD_CFLAGS "-D_REENTRANT -Kthread") set(PTHREAD_LDFLAGS "") @@ -1243,7 +1245,21 @@ endmacro() macro(CheckLibUnwind) if(TARGET SDL3_test) set(found_libunwind FALSE) - set(_libunwind_src "#include \nint main() {unw_context_t context; unw_getcontext(&context); return 0;}") + set(_libunwind_src [==[ + #include + int main(int argc, char *argv[]) { + (void)argc; (void)argv; + unw_context_t context; + unw_cursor_t cursor; + unw_word_t pc; + char sym[256]; + unw_word_t offset; + unw_getcontext(&context); + unw_step(&cursor); + unw_get_reg(&cursor, UNW_REG_IP, &pc); + unw_get_proc_name(&cursor, sym, sizeof(sym), &offset); + return 0; + }]==]) if(NOT found_libunwind) cmake_push_check_state() diff --git a/libs/SDL3/cmake/sdlcompilers.cmake b/libs/SDL3/cmake/sdlcompilers.cmake index ec3b6124..c3d8c470 100644 --- a/libs/SDL3/cmake/sdlcompilers.cmake +++ b/libs/SDL3/cmake/sdlcompilers.cmake @@ -34,7 +34,7 @@ function(SDL_AddCommonCompilerFlags TARGET) cmake_push_check_state() check_c_compiler_flag("/W3" COMPILER_SUPPORTS_W3) if(COMPILER_SUPPORTS_W3) - target_compile_options(${TARGET} PRIVATE "/W3") + target_compile_options(${TARGET} PRIVATE "$<$:/W3>") endif() cmake_pop_check_state() endif() @@ -131,7 +131,7 @@ function(SDL_AddCommonCompilerFlags TARGET) if(MSVC) check_c_compiler_flag(/WX HAVE_WX) if(HAVE_WX) - target_compile_options(${TARGET} PRIVATE "/WX") + target_compile_options(${TARGET} PRIVATE "$<$:/WX>") endif() elseif(USE_GCC OR USE_CLANG OR USE_INTELCC OR USE_QNX) check_c_compiler_flag(-Werror HAVE_WERROR) diff --git a/libs/SDL3/cmake/sdltargets.cmake b/libs/SDL3/cmake/sdltargets.cmake index 781ca01c..d658eb3f 100644 --- a/libs/SDL3/cmake/sdltargets.cmake +++ b/libs/SDL3/cmake/sdltargets.cmake @@ -338,13 +338,17 @@ function(configure_sdl3_pc) message(STATUS "\"pkg-config --static --libs sdl3\" will return invalid information") endif() - # Calculate prefix relative to location of sdl3.pc - if(NOT IS_ABSOLUTE "${CMAKE_INSTALL_PREFIX}") - set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_PREFIX}") + if(SDL_RELOCATABLE) + # Calculate prefix relative to location of sdl3.pc + if(NOT IS_ABSOLUTE "${CMAKE_INSTALL_PREFIX}") + set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_PREFIX}") + endif() + file(RELATIVE_PATH SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG "${CMAKE_INSTALL_PREFIX}/${SDL_PKGCONFIG_INSTALLDIR}" "${CMAKE_INSTALL_PREFIX}") + string(REGEX REPLACE "[/]+$" "" SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG "${SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG}") + set(SDL_PKGCONFIG_PREFIX "\${pcfiledir}/${SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG}") + else() + set(SDL_PKGCONFIG_PREFIX "${CMAKE_INSTALL_PREFIX}") endif() - file(RELATIVE_PATH SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG "${CMAKE_INSTALL_PREFIX}/${SDL_PKGCONFIG_INSTALLDIR}" "${CMAKE_INSTALL_PREFIX}") - string(REGEX REPLACE "[/]+$" "" SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG "${SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG}") - set(SDL_PKGCONFIG_PREFIX "\${pcfiledir}/${SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG}") if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}") set(INCLUDEDIR_FOR_PKG_CONFIG "${CMAKE_INSTALL_INCLUDEDIR}") diff --git a/libs/SDL3/docs/INTRO-androidstudio.md b/libs/SDL3/docs/INTRO-androidstudio.md new file mode 100644 index 00000000..f4d8ecca --- /dev/null +++ b/libs/SDL3/docs/INTRO-androidstudio.md @@ -0,0 +1,17 @@ + +# Introduction to SDL with Android Studio + +We'll start by creating a simple project to build and run [hello.c](hello.c) + +- Use our handy script to create a template project: +```sh +./build-scripts/create-android-project.py org.libsdl.hello docs/hello.c +``` +- Run Android Studio and open the newly created build/org.libsdl.hello directory +- Build and run! + +A more complete example is available at: + +https://github.com/Ravbug/sdl3-sample + +Additional information and troubleshooting is available in [README-android.md](README-android.md) diff --git a/libs/SDL3/docs/INTRO-cmake.md b/libs/SDL3/docs/INTRO-cmake.md new file mode 100644 index 00000000..e6ccace3 --- /dev/null +++ b/libs/SDL3/docs/INTRO-cmake.md @@ -0,0 +1,50 @@ + +# Introduction to SDL with CMake + +The easiest way to use SDL is to include it as a subproject in your project. + +We'll start by creating a simple project to build and run [hello.c](hello.c) + +Create the file CMakeLists.txt +```cmake +cmake_minimum_required(VERSION 3.16) +project(hello) + +# set the output directory for built objects. +# This makes sure that the dynamic library goes into the build directory automatically. +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$") +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$") + +# This assumes the SDL source is available in vendored/SDL +add_subdirectory(vendored/SDL EXCLUDE_FROM_ALL) + +# Create your game executable target as usual +add_executable(hello WIN32 hello.c) + +# Link to the actual SDL3 library. +target_link_libraries(hello PRIVATE SDL3::SDL3) +``` + +Build: +```sh +cmake -S . -B build +cmake --build build +``` + +Run: +- On Windows the executable is in the build Debug directory: +```sh +cd build/Debug +./hello +``` +- On other platforms the executable is in the build directory: +```sh +cd build +./hello +``` + +A more complete example is available at: + +https://github.com/Ravbug/sdl3-sample + +Additional information and troubleshooting is available in [README-cmake.md](README-cmake.md) diff --git a/libs/SDL3/docs/INTRO-emscripten.md b/libs/SDL3/docs/INTRO-emscripten.md new file mode 100644 index 00000000..89831248 --- /dev/null +++ b/libs/SDL3/docs/INTRO-emscripten.md @@ -0,0 +1,38 @@ + +# Introduction to SDL with Emscripten + +First, you should have the Emscripten SDK installed from: + +https://emscripten.org/docs/getting_started/downloads.html + +We'll start by creating a simple project to build and run [hello.c](hello.c) + +## Building SDL + +Once you have a command line interface with the Emscripten SDK set up and you've changed directory to the SDL directory, you can build SDL like this: + +```sh +mkdir hello +cd hello +emcmake cmake .. +emmake make +``` + +## Building your app + +In this case we'll just run a simple command to compile our source with the SDL library we just built: +```sh +emcc -o index.html ../docs/hello.c -I../include -L. -lSDL3 +``` + +## Running your app + +You can now run your app by pointing a webserver at your build directory and connecting a web browser to it. + +## More information + +A more complete example is available at: + +https://github.com/Ravbug/sdl3-sample + +Additional information and troubleshooting is available in [README-emscripten.md](README-emscripten.md) diff --git a/libs/SDL3/docs/INTRO-visualstudio.md b/libs/SDL3/docs/INTRO-visualstudio.md new file mode 100644 index 00000000..31a16e0a --- /dev/null +++ b/libs/SDL3/docs/INTRO-visualstudio.md @@ -0,0 +1,15 @@ + +# Introduction to SDL with Visual Studio + +The easiest way to use SDL is to include it as a subproject in your project. + +We'll start by creating a simple project to build and run [hello.c](hello.c) + +- Create a new project in Visual Studio, using the C++ Empty Project template +- Add hello.c to the Source Files +- Right click the solution, select add an existing project, navigate to VisualC/SDL and add SDL.vcxproj +- Select your main project and go to Project -> Project Dependencies and select SDL3 +- Select your main project and go to Project -> Properties, set the filter at the top to "All Configurations" and "All Platforms", select VC++ Directories and add the SDL include directory to "Include Directories" +- Select your main project and go to Project -> Add Reference and select SDL3 +- Build and run! + diff --git a/libs/SDL3/docs/INTRO-xcode.md b/libs/SDL3/docs/INTRO-xcode.md new file mode 100644 index 00000000..5f0a62ab --- /dev/null +++ b/libs/SDL3/docs/INTRO-xcode.md @@ -0,0 +1,16 @@ + +# Introduction to SDL with Xcode + +The easiest way to use SDL is to include it as a subproject in your project. + +We'll start by creating a simple project to build and run [hello.c](hello.c) + +- Create a new project in Xcode, using the App template and selecting Objective C as the language +- Remove the .h and .m files that were automatically added to the project +- Remove the main storyboard that was automatically added to the project +- On iOS projects, select the project, select the main target, select the Info tab, look for "Custom iOS Target Properties", and remove "Main storyboard base file name" and "Application Scene Manifest" +- Right click the project and select "Add Files to [project]", navigate to the SDL docs directory and add the file hello.c +- Right click the project and select "Add Files to [project]", navigate to the SDL Xcode/SDL directory and add SDL.xcodeproj +- Select the project, select the main target, select the General tab, look for "Frameworks, Libaries, and Embedded Content", and add SDL3.framework +- Build and run! + diff --git a/libs/SDL3/docs/README-android.md b/libs/SDL3/docs/README-android.md index 4077813d..37905c46 100644 --- a/libs/SDL3/docs/README-android.md +++ b/libs/SDL3/docs/README-android.md @@ -10,7 +10,7 @@ The rest of this README covers the Android gradle style build process. Requirements ================================================================================ -Android SDK (version 34 or later) +Android SDK (version 35 or later) https://developer.android.com/sdk/index.html Android NDK r15c or later @@ -37,7 +37,7 @@ dispatches to native functions implemented in the SDL library: src/core/android/SDL_android.c -Building an app +Building a simple app ================================================================================ For simple projects you can use the script located at build-scripts/create-android-project.py @@ -67,40 +67,38 @@ Finally, a word of caution: re running create-android-project.py wipes any chang done in the build directory for the app! +Building a more complex app +================================================================================ + For more complex projects, follow these instructions: -1. Get the source code for SDL and copy the 'android-project' directory located at SDL/android-project to a suitable location. Also make sure to rename it to your project name (In these examples: YOURPROJECT). +1. Get the source code for SDL and copy the 'android-project' directory located at SDL/android-project to a suitable location in your project. - (The 'android-project' directory can basically be seen as a sort of starting point for the android-port of your project. It contains the glue code between the Android Java 'frontend' and the SDL code 'backend'. It also contains some standard behaviour, like how events should be handled, which you will be able to change.) + The 'android-project' directory can basically be seen as a sort of starting point for the android-port of your project. It contains the glue code between the Android Java 'frontend' and the SDL code 'backend'. It also contains some standard behaviour, like how events should be handled, which you will be able to change. -2. Move or [symlink](https://en.wikipedia.org/wiki/Symbolic_link) the SDL directory into the "YOURPROJECT/app/jni" directory +2. If you are _not_ already building SDL as a part of your project (e.g. via CMake add_subdirectory() or FetchContent) move or [symlink](https://en.wikipedia.org/wiki/Symbolic_link) the SDL directory into the 'android-project/app/jni' directory. Alternatively you can [use the SDL3 Android Archive (.aar)](#using-the-sdl3-android-archive-aar), see bellow for more details. -(This is needed as the source of SDL has to be compiled by the Android compiler) + This is needed as SDL has to be compiled by the Android compiler. -3. Edit "YOURPROJECT/app/jni/src/Android.mk" to include your source files. +3. Edit 'android-project/app/build.gradle' to include any assets that your app needs by adding 'assets.srcDirs' in 'sourceSets.main'. -(They should be separated by spaces after the "LOCAL_SRC_FILES := " declaration) + For example: `assets.srcDirs = ['../../assets', '../../shaders']` -4a. If you want to use Android Studio, simply open your 'YOURPROJECT' directory and start building. +If using CMake: -4b. If you want to build manually, run './gradlew installDebug' in the project directory. This compiles the .java, creates an .apk with the native code embedded, and installs it on any connected Android device +4. Edit 'android-project/app/build.gradle' to set 'buildWithCMake' to true and set 'externalNativeBuild' cmake path to your top level CMakeLists.txt. + For example: `path '../../CMakeLists.txt'` -If you already have a project that uses CMake, the instructions change somewhat: +5. Change the target containing your main function to be built as a shared library called "main" when compiling for Android. (e.g. add_executable(MyGame main.c) should become add_library(main SHARED main.c) on Android) -1. Do points 1 and 2 from the instruction above. -2. Edit "YOURPROJECT/app/build.gradle" to comment out or remove sections containing ndk-build - and uncomment the cmake sections. Add arguments to the CMake invocation as needed. -3. Edit "YOURPROJECT/app/jni/CMakeLists.txt" to include your project (it defaults to - adding the "src" subdirectory). Note that you'll have SDL3 and SDL3-static - as targets in your project, so you should have "target_link_libraries(yourgame SDL3)" - in your CMakeLists.txt file. Also be aware that you should use add_library() instead of - add_executable() for the target containing your "main" function. +If using Android Makefiles: -If you wish to use Android Studio, you can skip the last step. +4. Edit 'android-project/app/jni/src/Android.mk' to include your source files. They should be separated by spaces after the 'LOCAL_SRC_FILES := ' declaration. -4. Run './gradlew installDebug' or './gradlew installRelease' in the project directory. It will build and install your .apk on any - connected Android device +To build your app, run `./gradlew installDebug` or `./gradlew installRelease` in the project directory. It will build and install your .apk on any connected Android device. If you want to use Android Studio, simply open your 'android-project' directory and start building. + +Additionally the [SDL_helloworld](https://github.com/libsdl-org/SDL_helloworld) project contains a small example program with a functional Android port that you can use as a reference. Here's an explanation of the files in the Android project, so you can customize them: @@ -170,13 +168,13 @@ build-scripts/create-android-project.py --variant aar com.yourcompany.yourapp < Customizing your application name ================================================================================ -To customize your application name, edit AndroidManifest.xml and replace +To customize your application name, edit AndroidManifest.xml and build.gradle to replace "org.libsdl.app" with an identifier for your product package. Then create a Java class extending SDLActivity and place it in a directory under src matching your package, e.g. - src/com/gamemaker/game/MyGame.java + app/src/main/java/com/gamemaker/game/MyGame.java Here's an example of a minimal class file: @@ -316,6 +314,17 @@ You can control activity re-creation (eg. onCreate()) behaviour. This allows you to choose whether to keep or re-initialize java and native static datas, see SDL_HINT_ANDROID_ALLOW_RECREATE_ACTIVITY in SDL_hints.h. + +Insets and Safe Areas +================================================================================ + +As of Android 15, SDL windows cover the entire screen, extending under notches +and system bars. The OS expects you to take those into account when displaying +content and SDL provides the function SDL_GetWindowSafeArea() so you know what +area is available for interaction. Outside of the safe area can be potentially +covered by system bars or used by OS gestures. + + Mouse / Touch events ================================================================================ @@ -325,6 +334,7 @@ To enable/disable this behavior, see SDL_hints.h: - SDL_HINT_TOUCH_MOUSE_EVENTS - SDL_HINT_MOUSE_TOUCH_EVENTS + Misc ================================================================================ @@ -334,6 +344,7 @@ before creating a window: SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); + Threads and the Java VM ================================================================================ @@ -359,6 +370,7 @@ in your native thread. see: https://developer.android.com/training/articles/perf-jni#faq:-why-didnt-findclass-find-my-class + Using STL ================================================================================ @@ -526,15 +538,6 @@ The Tegra Graphics Debugger is available from NVidia here: https://developer.nvidia.com/tegra-graphics-debugger -Why is API level 19 the minimum required? -================================================================================ - -The latest NDK toolchain doesn't support targeting earlier than API level 19. -As of this writing, according to https://www.composables.com/tools/distribution-chart -about 99.7% of the Android devices accessing Google Play support API level 19 or -higher (August 2023). - - A note regarding the use of the "dirty rectangles" rendering technique ================================================================================ @@ -545,12 +548,6 @@ This is caused by SDL's use of EGL as the support system to handle OpenGL ES/ES2 contexts, in particular the use of the eglSwapBuffers function. As stated in the documentation for the function "The contents of ancillary buffers are always undefined after calling eglSwapBuffers". -Setting the EGL_SWAP_BEHAVIOR attribute of the surface to EGL_BUFFER_PRESERVED -is not possible for SDL as it requires EGL 1.4, available only on the API level -17+, so the only workaround available on this platform is to redraw the entire -screen each frame. - -Reference: http://www.khronos.org/registry/egl/specs/EGLTechNote0001.html Ending your application @@ -570,12 +567,14 @@ Don't call exit() as it stops the activity badly. NB: "Back button" can be handled as a SDL_EVENT_KEY_DOWN/UP events, with Keycode SDLK_AC_BACK, for any purpose. + Known issues ================================================================================ - The number of buttons reported for each joystick is hardcoded to be 36, which is the current maximum number of buttons Android can report. + Building the SDL tests ================================================================================ @@ -651,4 +650,4 @@ There is also a convenience target which will build, install and start a test: cmake --build . --target build-install-start-testsprite ``` -Not all tests provide a GUI. For those, you can use `adb logcat` to read the output of stdout. +Not all tests provide a GUI. For those, you can use `adb logcat` to read the output. diff --git a/libs/SDL3/docs/README-bsd.md b/libs/SDL3/docs/README-bsd.md new file mode 100644 index 00000000..d823060d --- /dev/null +++ b/libs/SDL3/docs/README-bsd.md @@ -0,0 +1,6 @@ +# FreeBSD / OpenBSD / NetBSD + +SDL is fully supported on BSD platforms, and is built using [CMake](README-cmake.md). + +If you want to run on the console, you can take a look at [KMSDRM support on BSD](README-kmsbsd.md) + diff --git a/libs/SDL3/docs/README-cmake.md b/libs/SDL3/docs/README-cmake.md index ef5ce53c..f2e4759c 100644 --- a/libs/SDL3/docs/README-cmake.md +++ b/libs/SDL3/docs/README-cmake.md @@ -2,60 +2,72 @@ [www.cmake.org](https://www.cmake.org/) -The CMake build system is supported on the following platforms: +The CMake build system is supported with the following environments: -* FreeBSD -* Linux -* Microsoft Visual C -* MinGW and Msys -* macOS, iOS, tvOS, and visionOS with support for XCode * Android * Emscripten -* NetBSD +* FreeBSD * Haiku +* Linux +* macOS, iOS, tvOS, and visionOS with support for XCode +* Microsoft Visual Studio +* MinGW and Msys +* NetBSD * Nintendo 3DS * PlayStation 2 * PlayStation Portable * PlayStation Vita -* QNX 7.x/8.x -* RiscOS +* RISC OS -## Building SDL +## Building SDL on Windows -Assuming the source tree of SDL is located at `~/sdl`, -this will configure and build SDL in the `~/build` directory: +Assuming you're in the SDL source directory, building and installing to C:/SDL can be done with: ```sh -cmake -S ~/sdl -B ~/build -cmake --build ~/build +cmake -S . -B build +cmake --build build --config RelWithDebInfo +cmake --install build --config RelWithDebInfo --prefix C:/SDL ``` -Installation can be done using: +## Building SDL on UNIX + +SDL will build with very few dependencies, but for full functionality you should install the packages detailed in [README-linux.md](README-linux.md). + +Assuming you're in the SDL source directory, building and installing to /usr/local can be done with: ```sh -cmake --install ~/build --prefix /usr/local # '--install' requires CMake 3.15, or newer +cmake -S . -B build +cmake --build build +sudo cmake --install build --prefix /usr/local ``` -This will install SDL to /usr/local. +## Building SDL on macOS -### Building SDL tests +Assuming you're in the SDL source directory, building and installing to ~/SDL can be done with: +```sh +cmake -S . -B build -DSDL_FRAMEWORK=ON -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" +cmake --build build +cmake --install build --prefix ~/SDL +``` + +## Building SDL tests You can build the SDL test programs by adding `-DSDL_TESTS=ON` to the first cmake command above: ```sh -cmake -S ~/sdl -B ~/build -DSDL_TEST_LIBRARY=ON -DSDL_TESTS=ON +cmake -S . -B build -DSDL_TESTS=ON ``` -and then building normally. In this example, the test programs will be built and can be run from `~/build/tests/`. +and then building normally. The test programs will be built and can be run from `build/test/`. -### Building SDL examples +## Building SDL examples You can build the SDL example programs by adding `-DSDL_EXAMPLES=ON` to the first cmake command above: ```sh -cmake -S ~/sdl -B ~/build -DSDL_EXAMPLES=ON +cmake -S . -B build -DSDL_EXAMPLES=ON ``` -and then building normally. In this example, the example programs will be built and can be run from `~/build/examples/`. +and then building normally. The example programs will be built and can be run from `build/examples/`. ## Including SDL in your project SDL can be included in your project in 2 major ways: -- using a system SDL library, provided by your (*nix) distribution or a package manager +- using a system SDL library, provided by your (UNIX) distribution or a package manager - using a vendored SDL library: this is SDL copied or symlinked in a subfolder. The following CMake script supports both, depending on the value of `MYGAME_VENDORED`. @@ -131,6 +143,13 @@ Exceptions exist: - some platforms don't support dynamic libraries, so only `-DSDL_STATIC=ON` makes sense. - a static Apple framework is not supported +### Man pages + +Configuring with `-DSDL_INSTALL_DOCS=TRUE` installs man pages. + +We recommend package managers of unix distributions to install SDL3's man pages. +This adds an extra build-time dependency on Perl. + ### Pass custom compile options to the compiler - Use [`CMAKE__FLAGS`](https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_FLAGS.html) to pass extra @@ -174,7 +193,7 @@ Only shared frameworks are supported, no static ones. #### Platforms -Use `-DCMAKE_PLATFORM_NAME=` to configure the platform. CMake can target only one platform at a time. +Use `-DCMAKE_SYSTEM_NAME=` to configure the platform. CMake can target only one platform at a time. | Apple platform | `CMAKE_SYSTEM_NAME` value | |-----------------|---------------------------| @@ -343,114 +362,3 @@ However, by default CMake builds static libraries as non-relocatable. Configuring SDL with `-DCMAKE_POSITION_INDEPENDENT_CODE=ON` will result in a static `libSDL3.a` library which you can link against to create a shared library. -## Help, it doesn't work! - -Below, a SDL3 CMake project can be found that builds 99.9% of time (assuming you have internet connectivity). -When you have a problem with building or using SDL, please modify it until it reproduces your issue. - -```cmake -cmake_minimum_required(VERSION 3.16) -project(sdl_issue) - -# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -# !!!!!! !!!!!! -# !!!!!! This CMake script is not using "CMake best practices". !!!!!! -# !!!!!! Don't use it in your project. !!!!!! -# !!!!!! !!!!!! -# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -# 1. Try system SDL3 package first -find_package(SDL3 QUIET) -if(SDL3_FOUND) - message(STATUS "Using SDL3 via find_package") -endif() - -# 2. Try using a vendored SDL library -if(NOT SDL3_FOUND AND EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL/CMakeLists.txt") - add_subdirectory(SDL EXCLUDE_FROM_ALL) - message(STATUS "Using SDL3 via add_subdirectory") - set(SDL3_FOUND TRUE) -endif() - -# 3. Download SDL, and use that. -if(NOT SDL3_FOUND) - include(FetchContent) - set(SDL_SHARED TRUE CACHE BOOL "Build a SDL shared library (if available)") - set(SDL_STATIC TRUE CACHE BOOL "Build a SDL static library (if available)") - FetchContent_Declare( - SDL - GIT_REPOSITORY https://github.com/libsdl-org/SDL.git - GIT_TAG main # Replace this with a particular git tag or git hash - GIT_SHALLOW TRUE - GIT_PROGRESS TRUE - ) - message(STATUS "Using SDL3 via FetchContent") - FetchContent_MakeAvailable(SDL) - set_property(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/_deps/sdl-src" PROPERTY EXCLUDE_FROM_ALL TRUE) -endif() - -file(WRITE main.c [===========================================[ -/** - * Modify this source such that it reproduces your problem. - */ - -/* START of source modifications */ - -#include -/* - * SDL3/SDL_main.h is explicitly not included such that a terminal window would appear on Windows. - */ - -int main(int argc, char *argv[]) { - (void)argc; - (void)argv; - - if (!SDL_Init(SDL_INIT_VIDEO)) { - SDL_Log("SDL_Init failed (%s)", SDL_GetError()); - return 1; - } - - SDL_Window *window = NULL; - SDL_Renderer *renderer = NULL; - - if (!SDL_CreateWindowAndRenderer("SDL issue", 640, 480, 0, &window, &renderer)) { - SDL_Log("SDL_CreateWindowAndRenderer failed (%s)", SDL_GetError()); - SDL_Quit(); - return 1; - } - - while (1) { - int finished = 0; - SDL_Event event; - while (SDL_PollEvent(&event)) { - if (event.type == SDL_EVENT_QUIT) { - finished = 1; - break; - } - } - if (finished) { - break; - } - - SDL_SetRenderDrawColor(renderer, 80, 80, 80, SDL_ALPHA_OPAQUE); - SDL_RenderClear(renderer); - SDL_RenderPresent(renderer); - } - - SDL_DestroyRenderer(renderer); - SDL_DestroyWindow(window); - - SDL_Quit(); - return 0; -} - -/* END of source modifications */ - -]===========================================]) - -add_executable(sdl_issue main.c) - -target_link_libraries(sdl_issue PRIVATE SDL3::SDL3) -# target_link_libraries(sdl_issue PRIVATE SDL3::SDL3-shared) -# target_link_libraries(sdl_issue PRIVATE SDL3::SDL3-static) -``` diff --git a/libs/SDL3/docs/README-contributing.md b/libs/SDL3/docs/README-contributing.md index e6435f78..02a37bf7 100644 --- a/libs/SDL3/docs/README-contributing.md +++ b/libs/SDL3/docs/README-contributing.md @@ -57,7 +57,7 @@ If you had already forked the repository, you may update it from the web page us Code formatting is done using a custom `.clang-format` file, you can learn more about how to run it [here](https://clang.llvm.org/docs/ClangFormat.html). -Some legacy code may not be formatted, as such avoid formatting the whole file at once and only format around your changes. +Some legacy code may not be formatted, so please avoid formatting the whole file at once and only format around your changes. For your commit message to be properly displayed on GitHub, it should contain: diff --git a/libs/SDL3/docs/README-emscripten.md b/libs/SDL3/docs/README-emscripten.md index 6bf1cacc..2b814689 100644 --- a/libs/SDL3/docs/README-emscripten.md +++ b/libs/SDL3/docs/README-emscripten.md @@ -239,13 +239,13 @@ If you want to build with thread support, something like this works: ```bash mkdir build cd build -emcmake cmake -DSDL_THREADS=On .. +emcmake cmake -DSDL_THREADS=ON .. # you can also do `emcmake cmake -G Ninja ..` and then use `ninja` instead of this command. emmake make -j4 ``` -To build the tests, add `-DSDL_TESTS=On` to the `emcmake cmake` command line. -To build the examples, add `-DSDL_EXAMPLES=On` to the `emcmake cmake` command line. +To build the tests, add `-DSDL_TESTS=ON` to the `emcmake cmake` command line. +To build the examples, add `-DSDL_EXAMPLES=ON` to the `emcmake cmake` command line. ## Building your app diff --git a/libs/SDL3/docs/README-git.md b/libs/SDL3/docs/README-git.md deleted file mode 100644 index aa0aa405..00000000 --- a/libs/SDL3/docs/README-git.md +++ /dev/null @@ -1,16 +0,0 @@ -git -========= - -The latest development version of SDL is available via git. -Git allows you to get up-to-the-minute fixes and enhancements; -as a developer works on a source tree, you can use "git" to mirror that -source tree instead of waiting for an official release. Please look -at the Git website ( https://git-scm.com/ ) for more -information on using git, where you can also download software for -macOS, Windows, and Unix systems. - - git clone https://github.com/libsdl-org/SDL - -There is a web interface to the Git repository at: - http://github.com/libsdl-org/SDL/ - diff --git a/libs/SDL3/docs/README-haiku.md b/libs/SDL3/docs/README-haiku.md new file mode 100644 index 00000000..960bc3c7 --- /dev/null +++ b/libs/SDL3/docs/README-haiku.md @@ -0,0 +1,4 @@ +# Haiku OS + +SDL is fully supported on Haiku OS, and is built using [CMake](README-cmake.md). + diff --git a/libs/SDL3/docs/README-ios.md b/libs/SDL3/docs/README-ios.md index efa067e1..dbd70f5a 100644 --- a/libs/SDL3/docs/README-ios.md +++ b/libs/SDL3/docs/README-ios.md @@ -1,10 +1,10 @@ iOS ====== -Building the Simple DirectMedia Layer for iOS 9.0+ +Building the Simple DirectMedia Layer for iOS 11.0+ ============================================================================== -Requirements: macOS 10.9 or later and the iOS 9.0 or newer SDK. +Please note that building SDL requires at least Xcode 12.2 and the iOS 14.2 SDK. Instructions: @@ -146,18 +146,9 @@ From iOS 17 onward, the key now defaults to true. Notes -- Reading and Writing files ============================================================================== -Each application installed on iPhone resides in a sandbox which includes its own Application Home directory. Your application may not access files outside this directory. +Each application installed on iPhone resides in a sandbox which includes its own application home directory. Your application may not access files outside this directory. -Once your application is installed its directory tree looks like: - - MySDLApp Home/ - MySDLApp.app - Documents/ - Library/ - Preferences/ - tmp/ - -When your SDL based iPhone application starts up, it sets the working directory to the main bundle (MySDLApp Home/MySDLApp.app), where your application resources are stored. You cannot write to this directory. Instead, I advise you to write document files to "../Documents/" and preferences to "../Library/Preferences". +When your SDL based iPhone application starts up, it sets the working directory to the main bundle, where your application resources are stored. You cannot write to this directory. Instead, you should write document files to the directory returned by SDL_GetUserFolder(SDL_FOLDER_DOCUMENTS) and preferences to the directory returned by SDL_GetPrefPath(). More information on this subject is available here: http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html @@ -176,7 +167,7 @@ This target requires Xcode 11 or later. The target will simply fail to build if In addition, on Apple platforms, main() cannot be in a dynamically loaded library. However, unlike in SDL2, in SDL3 SDL_main is implemented inline in SDL_main.h, so you don't need to link against a static libSDL3main.lib, and you don't need to copy a .c file from the SDL3 source either. -This means that iOS apps which used the statically-linked libSDL3.lib and now link with the xcframwork can just `#include ` in the source file that contains their standard `int main(int argc; char *argv[])` function to get a header-only SDL_main implementation that calls the `SDL_RunApp()` with your standard main function. +This means that iOS apps which used the statically-linked libSDL3.lib and now link with the xcframwork can just `#include ` in the source file that contains their standard `int main(int argc, char *argv[])` function to get a header-only SDL_main implementation that calls the `SDL_RunApp()` with your standard main function. Using an xcFramework is similar to using a regular framework. However, issues have been seen with the build system not seeing the headers in the xcFramework. To remedy this, add the path to the xcFramework in your app's target ==> Build Settings ==> Framework Search Paths and mark it recursive (this is critical). Also critical is to remove "*.framework" from Build Settings ==> Sub-Directories to Exclude in Recursive Searches. Clean the build folder, and on your next build the build system should be able to see any of these in your code, as expected: @@ -194,9 +185,6 @@ Windows: Textures: The optimal texture formats on iOS are SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XBGR8888, and SDL_PIXELFORMAT_RGB24 pixel formats. -Loading Shared Objects: - This is disabled by default since it seems to break the terms of the iOS SDK agreement for iOS versions prior to iOS 8. It can be re-enabled in SDL_config_ios.h. - Notes -- CoreBluetooth.framework ============================================================================== @@ -258,7 +246,7 @@ Note that if you are using main callbacks instead of a standard C main() functio Deploying to older versions of iOS ============================================================================== -SDL supports deploying to older versions of iOS than are supported by the latest version of Xcode, all the way back to iOS 8.0 +SDL supports deploying to older versions of iOS than are supported by the latest version of Xcode, all the way back to iOS 11.0 In order to do that you need to download an older version of Xcode: https://developer.apple.com/download/more/?name=Xcode diff --git a/libs/SDL3/docs/README-macos.md b/libs/SDL3/docs/README-macos.md index d2f22c7f..fb0639b6 100644 --- a/libs/SDL3/docs/README-macos.md +++ b/libs/SDL3/docs/README-macos.md @@ -13,7 +13,7 @@ To build SDL using the command line, use the CMake build script: ```bash mkdir build cd build -cmake .. -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11 +cmake .. -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 cmake --build . sudo cmake --install . ``` @@ -25,15 +25,12 @@ You can also build SDL as a Universal library (a single binary for both ```bash mkdir build cd build -cmake .. "-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11 +cmake .. "-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 cmake --build . sudo cmake --install . ``` -Please note that building SDL requires at least Xcode 12.2 and the 11.0 SDK. -PowerPC support for macOS has been officially dropped as of SDL 2.0.2. -32-bit Intel and macOS 10.8 runtime support has been officially dropped as -of SDL 2.24.0. +Please note that building SDL requires at least Xcode 12.2 and the macOS 11.0 SDK. To use the library once it's built, you essential have two possibilities: use the traditional autoconf/automake/make method, or use Xcode. diff --git a/libs/SDL3/docs/README-migration.md b/libs/SDL3/docs/README-migration.md index 59f3914a..84bf315b 100644 --- a/libs/SDL3/docs/README-migration.md +++ b/libs/SDL3/docs/README-migration.md @@ -399,8 +399,6 @@ should be changed to: SDL_Keymod mod = event.key.mod; ``` -The keycode in key events is affected by modifiers by default. e.g. pressing the A key would generate the keycode `SDLK_A`, or 'a', and pressing it while holding the shift key would generate the keycode `SDLK_A`, or 'A'. This behavior can be customized with `SDL_HINT_KEYCODE_OPTIONS`. - The gamepad event structures caxis, cbutton, cdevice, ctouchpad, and csensor have been renamed gaxis, gbutton, gdevice, gtouchpad, and gsensor. The mouseX and mouseY fields of SDL_MouseWheelEvent have been renamed mouse_x and mouse_y. @@ -805,16 +803,18 @@ The environment variables SDL_VIDEO_X11_WMCLASS and SDL_VIDEO_WAYLAND_WMCLASS ha The environment variable AUDIODEV is used exclusively to specify the audio device for the OSS and NetBSD audio drivers. Its use in the ALSA driver has been replaced with the hint SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE and in the sndio driver with the environment variable AUDIODEVICE. The following hints have been renamed: -* SDL_HINT_VIDEODRIVER => SDL_HINT_VIDEO_DRIVER -* SDL_HINT_AUDIODRIVER => SDL_HINT_AUDIO_DRIVER * SDL_HINT_ALLOW_TOPMOST => SDL_HINT_WINDOW_ALLOW_TOPMOST +* SDL_HINT_AUDIODRIVER => SDL_HINT_AUDIO_DRIVER * SDL_HINT_DIRECTINPUT_ENABLED => SDL_HINT_JOYSTICK_DIRECTINPUT * SDL_HINT_GDK_TEXTINPUT_DEFAULT => SDL_HINT_GDK_TEXTINPUT_DEFAULT_TEXT * SDL_HINT_JOYSTICK_GAMECUBE_RUMBLE_BRAKE => SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE +* SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE => SDL_HINT_JOYSTICK_ENHANCED_REPORTS +* SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE => SDL_HINT_JOYSTICK_ENHANCED_REPORTS * SDL_HINT_LINUX_DIGITAL_HATS => SDL_HINT_JOYSTICK_LINUX_DIGITAL_HATS * SDL_HINT_LINUX_HAT_DEADZONES => SDL_HINT_JOYSTICK_LINUX_HAT_DEADZONES * SDL_HINT_LINUX_JOYSTICK_CLASSIC => SDL_HINT_JOYSTICK_LINUX_CLASSIC * SDL_HINT_LINUX_JOYSTICK_DEADZONES => SDL_HINT_JOYSTICK_LINUX_DEADZONES +* SDL_HINT_VIDEODRIVER => SDL_HINT_VIDEO_DRIVER * SDL_HINT_VIDEO_WAYLAND_EMULATE_MOUSE_WARP => SDL_HINT_MOUSE_EMULATE_WARP_WITH_RELATIVE The following hints have been removed: @@ -1031,6 +1031,9 @@ The following structures have been removed: SDL_Keycode is now Uint32 and the SDLK_* constants are now defines instead of an enum, to more clearly reflect that they are a subset of the possible values of an SDL_Keycode. +In addition to the `SDLK_SCANCODE_MASK` bit found on key codes that directly map to scancodes, there is now the +`SDLK_EXTENDED_MASK` bit used to denote key codes that don't have a corresponding scancode, and aren't a unicode value. + The following symbols have been removed: * KMOD_RESERVED - No replacement. A bit named "RESERVED" probably shouldn't be used in an app, but if you need it, this was equivalent to KMOD_SCROLL (0x8000) in SDL2. @@ -1262,6 +1265,7 @@ The following symbols have been renamed: The following functions have been removed: * SDL_FreeFormat() * SDL_SetPixelFormatPalette() +* SDL_CalculateGammaRamp() The following macros have been removed: * SDL_Colour - use SDL_Color instead @@ -2177,7 +2181,7 @@ Windows now have an explicit fullscreen mode that is set, using SDL_SetWindowFul SDL_WINDOW_FULLSCREEN_DESKTOP has been removed, and you can call SDL_GetWindowFullscreenMode() to see whether an exclusive fullscreen mode will be used or the borderless fullscreen desktop mode will be used when the window is fullscreen. -SDL_SetWindowBrightness and SDL_SetWindowGammaRamp have been removed from the API, because they interact poorly with modern operating systems and aren't able to limit their effects to the SDL window. +SDL_SetWindowBrightness(), SDL_GetWindowBrightness, SDL_SetWindowGammaRamp(), and SDL_GetWindowGammaRamp have been removed from the API, because they interact poorly with modern operating systems and aren't able to limit their effects to the SDL window. Programs which have access to shaders can implement more robust versions of those functions using custom shader code rendered as a post-process effect. @@ -2216,14 +2220,22 @@ The following functions have been removed: * SDL_GetNumVideoDisplays() - replaced with SDL_GetDisplays() * SDL_SetWindowGrab() - use SDL_SetWindowMouseGrab() instead, along with SDL_SetWindowKeyboardGrab() if you also set SDL_HINT_GRAB_KEYBOARD. * SDL_GetWindowGrab() - use SDL_GetWindowMouseGrab() instead, along with SDL_GetWindowKeyboardGrab() if you also set SDL_HINT_GRAB_KEYBOARD. -* SDL_GetWindowData() - use SDL_GetWindowProperties() instead -* SDL_SetWindowData() - use SDL_GetWindowProperties() instead +* SDL_GetWindowData() - use SDL_GetPointerProperty() instead, along with SDL_GetWindowProperties() +* SDL_SetWindowData() - use SDL_SetPointerProperty() instead, along with SDL_GetWindowProperties() * SDL_CreateWindowFrom() - use SDL_CreateWindowWithProperties() with the properties that allow you to wrap an existing window * SDL_SetWindowInputFocus() - use SDL_RaiseWindow() instead * SDL_SetWindowModalFor() - use SDL_SetWindowParent() with SDL_SetWindowModal() instead +* SDL_SetWindowBrightness() - use a shader or other in-game effect. +* SDL_GetWindowBrightness() - use a shader or other in-game effect. +* SDL_SetWindowGammaRamp() - use a shader or other in-game effect. +* SDL_GetWindowGammaRamp() - use a shader or other in-game effect. The SDL_Window id type is named SDL_WindowID +The following environment variables have been removed: +* SDL_VIDEO_GL_DRIVER - replaced with the hint SDL_HINT_OPENGL_LIBRARY +* SDL_VIDEO_EGL_DRIVER - replaced with the hint SDL_HINT_EGL_LIBRARY + The following symbols have been renamed: * SDL_DISPLAYEVENT_DISCONNECTED => SDL_EVENT_DISPLAY_REMOVED * SDL_DISPLAYEVENT_MOVED => SDL_EVENT_DISPLAY_MOVED diff --git a/libs/SDL3/docs/README-platforms.md b/libs/SDL3/docs/README-platforms.md index 14454ec5..77ae411d 100644 --- a/libs/SDL3/docs/README-platforms.md +++ b/libs/SDL3/docs/README-platforms.md @@ -1,8 +1,40 @@ -Platforms -========= +# Platforms -We maintain the list of supported platforms on our wiki now, and how to -build and install SDL for those platforms: +## Supported Platforms - https://wiki.libsdl.org/Installation +- [Android](README-android.md) +- [Emscripten](README-emscripten.md) +- [FreeBSD](README-bsd.md) +- [Haiku OS](README-haiku.md) +- [iOS](README-ios.md) +- [Linux](README-linux.md) +- [macOS](README-macos.md) +- [NetBSD](README-bsd.md) +- [Nintendo Switch](README-switch.md) +- [Nintendo 3DS](README-3ds.md) +- [OpenBSD](README-bsd.md) +- [PlayStation 2](README-ps2.md) +- [PlayStation 4](README-ps4.md) +- [PlayStation 5](README-ps5.md) +- [PlayStation Portable](README-psp.md) +- [PlayStation Vita](README-vita.md) +- [RISC OS](README-riscos.md) +- [SteamOS](README-steamos.md) +- [tvOS](README-ios.md) +- [Windows](README-windows.md) +- [Windows GDK](README-gdk.md) +- [Xbox](README-gdk.md) +## Unsupported Platforms + +If your favorite system is listed below, we aren't working on it. However, if you send reasonable patches and are willing to support the port in the long term, we are happy to take a look! + +All of these still work with [SDL2](/SDL2), which is an incompatible API, but an option if you need to support these platforms still. + +- Google Stadia +- NaCL +- Nokia N-Gage +- OS/2 +- QNX +- WinPhone +- WinRT/UWP diff --git a/libs/SDL3/docs/README-ps4.md b/libs/SDL3/docs/README-ps4.md new file mode 100644 index 00000000..29b5a939 --- /dev/null +++ b/libs/SDL3/docs/README-ps4.md @@ -0,0 +1,3 @@ +# Sony PlayStation 4 + +SDL3 runs on the PS4! There are commercial games shipping with this port. This port is kept in a separate repository, but is available for free, under the zlib license, to anyone that is under NDA for PlayStation development with Sony. Please contact Ryan (icculus at icculus dot org) for details. diff --git a/libs/SDL3/docs/README-ps5.md b/libs/SDL3/docs/README-ps5.md new file mode 100644 index 00000000..55470d43 --- /dev/null +++ b/libs/SDL3/docs/README-ps5.md @@ -0,0 +1,3 @@ +# Sony PlayStation 5 + +SDL3 runs on the PS5! There are commercial games shipping with this port. This port is kept in a separate repository, but is available for free, under the zlib license, to anyone that is under NDA for PlayStation development with Sony. Please contact Ryan (icculus at icculus dot org) for details. diff --git a/libs/SDL3/docs/README-raspberrypi.md b/libs/SDL3/docs/README-raspberrypi.md deleted file mode 100644 index ba34f47b..00000000 --- a/libs/SDL3/docs/README-raspberrypi.md +++ /dev/null @@ -1,188 +0,0 @@ -Raspberry Pi -============ - -Requirements: - -Raspberry Pi OS (other Linux distros may work as well). - -In modern times, the Raspberry Pi works mostly like any other Linux device: -for video, you can use X11, Wayland, or KMSDRM. For audio, you can use ALSA, -PulseAudio, or PipeWire, etc. OpenGL, OpenGL ES, and Vulkan are known to work. - -There is a video backend in SDL called "rpi" that uses a deprecated Broadcom -interface (named "dispmanx") to draw directly to the console without X11. -Newer Raspberry Pi OS releases don't support this (and work fine with our -"kmsdrm" backend for the same purposes, a standard Linux interface). Don't -panic if you can't use this backend, or CMake says it can't find libraries it -needs for this. - -SDL has, in past times, worked on the original Raspberry Pi and the RPi 2, but -these devices are no longer targets we actively test; if they broke, please -report bugs or send patches! - -The Raspberry Pi 3 and later (in 32-bit and 64-bit mode) are still known to -work well at the time of this writing. The Raspberry Pi Zero and Zero 2 are -also known to work well. - - -## Documentation Out Of Date - -The rest of this document is likely out of date; a lot has changed in recent -years in both SDL and the Raspberry Pi universe, and this document has not -been updated to reflect those details. Take the rest of this information with -a grain of salt! - - - -NEON ----- - -If your Pi has NEON support, make sure you add -mfpu=neon to your CFLAGS so -that SDL will select some otherwise-disabled highly-optimized code. The -original Pi and Pi Zero units don't have NEON; everything from the Pi2/PiZero2 -and later do. - - -Cross compiling from x86 Linux ------------------------------- - -To cross compile SDL for Raspbian from your desktop machine, you'll need a -Raspbian system root and the cross compilation tools. We'll assume these tools -will be placed in /opt/rpi-tools - - sudo git clone --depth 1 https://github.com/raspberrypi/tools /opt/rpi-tools - -You'll also need a Raspbian binary image. -Get it from: http://downloads.raspberrypi.org/raspbian_latest -After unzipping, you'll get file with a name like: "-wheezy-raspbian.img" -Let's assume the sysroot will be built in /opt/rpi-sysroot. - - export SYSROOT=/opt/rpi-sysroot - sudo kpartx -a -v .img - sudo mount -o loop /dev/mapper/loop0p2 /mnt - sudo cp -r /mnt $SYSROOT - sudo apt-get install qemu binfmt-support qemu-user-static - sudo cp /usr/bin/qemu-arm-static $SYSROOT/usr/bin - sudo mount --bind /dev $SYSROOT/dev - sudo mount --bind /proc $SYSROOT/proc - sudo mount --bind /sys $SYSROOT/sys - -Now, before chrooting into the ARM sysroot, you'll need to apply a workaround, -edit $SYSROOT/etc/ld.so.preload and comment out all lines in it. - - sudo chroot $SYSROOT - apt-get install libudev-dev libasound2-dev libdbus-1-dev libraspberrypi0 libraspberrypi-bin libraspberrypi-dev libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxss-dev - exit - sudo umount $SYSROOT/dev - sudo umount $SYSROOT/proc - sudo umount $SYSROOT/sys - sudo umount /mnt - -There's one more fix required, as the libdl.so symlink uses an absolute path -which doesn't quite work in our setup. - - sudo rm -rf $SYSROOT/usr/lib/arm-linux-gnueabihf/libdl.so - sudo ln -s ../../../lib/arm-linux-gnueabihf/libdl.so.2 $SYSROOT/usr/lib/arm-linux-gnueabihf/libdl.so - -The final step is compiling SDL itself. - - export CC="/opt/rpi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc --sysroot=$SYSROOT -I$SYSROOT/opt/vc/include -I$SYSROOT/usr/include -I$SYSROOT/opt/vc/include/interface/vcos/pthreads -I$SYSROOT/opt/vc/include/interface/vmcs_host/linux" - cd - mkdir -p build;cd build - LDFLAGS="-L$SYSROOT/opt/vc/lib" ../configure --with-sysroot=$SYSROOT --host=arm-raspberry-linux-gnueabihf --prefix=$PWD/rpi-sdl3-installed --disable-pulseaudio --disable-esd - make - make install - -To be able to deploy this to /usr/local in the Raspbian system you need to fix up a few paths: - - perl -w -pi -e "s#$PWD/rpi-sdl3-installed#/usr/local#g;" ./rpi-sdl3-installed/lib/libSDL3.la ./rpi-sdl3-installed/lib/pkgconfig/sdl3.pc - -Apps don't work or poor video/audio performance ------------------------------------------------ - -If you get sound problems, buffer underruns, etc, run "sudo rpi-update" to -update the RPi's firmware. Note that doing so will fix these problems, but it -will also render the CMA - Dynamic Memory Split functionality useless. - -Also, by default the Raspbian distro configures the GPU RAM at 64MB, this is too -low in general, specially if a 1080p TV is hooked up. - -See here how to configure this setting: http://elinux.org/RPiconfig - -Using a fixed gpu_mem=128 is the best option (specially if you updated the -firmware, using CMA probably won't work, at least it's the current case). - -No input --------- - -Make sure you belong to the "input" group. - - sudo usermod -aG input `whoami` - -No HDMI Audio -------------- - -If you notice that ALSA works but there's no audio over HDMI, try adding: - - hdmi_drive=2 - -to your config.txt file and reboot. - -Reference: http://www.raspberrypi.org/phpBB3/viewtopic.php?t=5062 - -Text Input API support ----------------------- - -The Text Input API is supported, with translation of scan codes done via the -kernel symbol tables. For this to work, SDL needs access to a valid console. -If you notice there's no SDL_EVENT_TEXT_INPUT message being emitted, double check that -your app has read access to one of the following: - -* /proc/self/fd/0 -* /dev/tty -* /dev/tty[0...6] -* /dev/vc/0 -* /dev/console - -This is usually not a problem if you run from the physical terminal (as opposed -to running from a pseudo terminal, such as via SSH). If running from a PTS, a -quick workaround is to run your app as root or add yourself to the tty group, -then re-login to the system. - - sudo usermod -aG tty `whoami` - -The keyboard layout used by SDL is the same as the one the kernel uses. -To configure the layout on Raspbian: - - sudo dpkg-reconfigure keyboard-configuration - -To configure the locale, which controls which keys are interpreted as letters, -this determining the CAPS LOCK behavior: - - sudo dpkg-reconfigure locales - - -OpenGL problems ---------------- - -If you have desktop OpenGL headers installed at build time in your RPi or cross -compilation environment, support for it will be built in. However, the chipset -does not actually have support for it, which causes issues in certain SDL apps -since the presence of OpenGL support supersedes the ES/ES2 variants. -The workaround is to disable OpenGL at configuration time: - - ./configure --disable-video-opengl - -Or if the application uses the Render functions, you can use the SDL_RENDER_DRIVER -environment variable: - - export SDL_RENDER_DRIVER=opengles2 - -Notes ------ - -* When launching apps remotely (via SSH), SDL can prevent local keystrokes from - leaking into the console only if it has root privileges. Launching apps locally - does not suffer from this issue. - - diff --git a/libs/SDL3/docs/README-steamos.md b/libs/SDL3/docs/README-steamos.md new file mode 100644 index 00000000..0feab9a4 --- /dev/null +++ b/libs/SDL3/docs/README-steamos.md @@ -0,0 +1,10 @@ +# SteamOS + +SteamOS is literally a Linux system, and uses the same binaries you distribute to generic Linux Steam users, so generally speaking, all the other [Linux advice](README-linux.md) applies. + +If you are shipping a Linux game on Steam, or explicitly targeting SteamOS, the system is guaranteed to provide SDL. The Steam Client will set up the dynamic loader path so that a known-good copy of SDL is available to any program that needs it before launching a game. Steam provides all major versions of SDL to date, in this manner, for both x86 and amd64, in addition to several add-on libraries like `SDL_image` and `SDL_mixer`. When shipping a Linux game on Steam, do not ship a build of SDL with your game. Link against SDL as normal, and expect it to be available on the player's system. This allows Valve to make fixes and improvements to their SDL and those fixes to flow on to your game. + +We are obsessive about SDL3 having a backwards-compatible ABI. Whether you build your game using the Steam Runtime SDK or just about any other copy of SDL, it _should_ work with the one that ships with Steam. + +In fact, it's not a bad idea to just copy the SDL build out of the Steam Runtime if you plan to ship a Linux game for non-Steam platforms, too, since you know it's definitely well-built. + diff --git a/libs/SDL3/docs/README-switch.md b/libs/SDL3/docs/README-switch.md new file mode 100644 index 00000000..16b7acd1 --- /dev/null +++ b/libs/SDL3/docs/README-switch.md @@ -0,0 +1,3 @@ +# Nintendo Switch + +SDL3 runs on the Nintendo Switch! There are commercial games shipping with this port. This port is kept in a separate repository, but is available for free, under the zlib license, to anyone that is under NDA for Switch development with Nintendo. Please contact Ryan (icculus at icculus dot org) for details. diff --git a/libs/SDL3/docs/README-visualc.md b/libs/SDL3/docs/README-visualc.md deleted file mode 100644 index 068614a2..00000000 --- a/libs/SDL3/docs/README-visualc.md +++ /dev/null @@ -1,113 +0,0 @@ -Using SDL with Microsoft Visual C++ -=================================== - -### by Lion Kimbro with additions by James Turk - -You can either use the precompiled libraries from the [SDL](https://www.libsdl.org/download.php) web site, or you can build SDL -yourself. - -### Building SDL - -0. To build SDL, your machine must, at a minimum, have the DirectX9.0c SDK installed. It may or may not be retrievable from -the [Microsoft](https://www.microsoft.com) website, so you might need to locate it [online](https://duckduckgo.com/?q=directx9.0c+sdk+download&t=h_&ia=web). -_Editor's note: I've been able to successfully build SDL using Visual Studio 2019 **without** the DX9.0c SDK_ - -1. Open the Visual Studio solution file at `./VisualC/SDL.sln`. - -2. Your IDE will likely prompt you to upgrade this solution file to whatever later version of the IDE you're using. In the `Retarget Projects` dialog, -all of the affected project files should be checked allowing you to use the latest `Windows SDK Version` you have installed, along with -the `Platform Toolset`. - -If you choose *NOT* to upgrade to use the latest `Windows SDK Version` or `Platform Toolset`, then you'll need the `Visual Studio 2010 Platform Toolset`. - -3. Build the `.dll` and `.lib` files by right clicking on each project in turn (Projects are listed in the _Workspace_ -panel in the _FileView_ tab), and selecting `Build`. - -You may get a few warnings, but you should not get any errors. - -Later, we will refer to the following `.lib` and `.dll` files that have just been generated: - -- `./VisualC/Win32/Debug/SDL3.dll` or `./VisualC/Win32/Release/SDL3.dll` -- `./VisualC/Win32/Debug/SDL3.lib` or `./VisualC/Win32/Release/SDL3.lib` - -_Note for the `x64` versions, just replace `Win32` in the path with `x64`_ - -### Creating a Project with SDL - -- Create a project as a `Win32 Application`. - -- Create a C++ file for your project. - -- Set the C runtime to `Multi-threaded DLL` in the menu: -`Project|Settings|C/C++ tab|Code Generation|Runtime Library `. - -- Add the SDL `include` directory to your list of includes in the menu: -`Project|Settings|C/C++ tab|Preprocessor|Additional include directories ` - -*VC7 Specific: Instead of doing this, I find it easier to add the -include and library directories to the list that VC7 keeps. Do this by -selecting Tools|Options|Projects|VC++ Directories and under the "Show -Directories For:" dropbox select "Include Files", and click the "New -Directory Icon" and add the [SDLROOT]\\include directory (e.g. If you -installed to c:\\SDL\\ add c:\\SDL\\include). Proceed to change the -dropbox selection to "Library Files" and add [SDLROOT]\\lib.* - -The "include directory" I am referring to is the `./include` folder. - -Now we're going to use the files that we had created earlier in the *Build SDL* step. - -Copy the following file into your Project directory: - -- `SDL3.dll` - -Add the following file to your project (It is not necessary to copy it to your project directory): - -- `SDL3.lib` - -To add them to your project, right click on your project, and select -`Add files to project`. - -**Instead of adding the files to your project, it is more desirable to add them to the linker options: Project|Properties|Linker|Command Line -and type the names of the libraries to link with in the "Additional Options:" box. Note: This must be done for each build configuration -(e.g. Release,Debug).** - -### Hello SDL - -Here's a sample SDL snippet to verify everything is setup in your IDE: - -``` - #include - #include // only include this one in the source file with main()! - - int main( int argc, char* argv[] ) - { - const int WIDTH = 640; - const int HEIGHT = 480; - SDL_Window* window = NULL; - SDL_Renderer* renderer = NULL; - - SDL_Init(SDL_INIT_VIDEO); - window = SDL_CreateWindow("Hello SDL", WIDTH, HEIGHT, 0); - renderer = SDL_CreateRenderer(window, NULL); - - SDL_DestroyRenderer(renderer); - SDL_DestroyWindow(window); - SDL_Quit(); - return 0; - } - ``` - -### That's it! - -I hope that this document has helped you get through the most difficult part of using the SDL: installing it. -Suggestions for improvements should be posted to the [Github Issues](https://github.com/libsdl-org/SDL/issues). - -### Credits - -Thanks to [Paulus Esterhazy](mailto:pesterhazy@gmx.net), for the work on VC++ port. - -This document was originally called "VisualC.txt", and was written by [Sam Lantinga](mailto:slouken@libsdl.org). - -Later, it was converted to HTML and expanded into the document that you see today by [Lion Kimbro](mailto:snowlion@sprynet.com). - -Minor Fixes and Visual C++ 7 Information (In Green) was added by [James Turk](mailto:james@conceptofzero.net) diff --git a/libs/SDL3/docs/README-vita.md b/libs/SDL3/docs/README-vita.md index c222a14c..8d7e70bc 100644 --- a/libs/SDL3/docs/README-vita.md +++ b/libs/SDL3/docs/README-vita.md @@ -10,10 +10,10 @@ Credit to Building -------- To build for the PSVita, make sure you have vitasdk and cmake installed and run: -``` - cmake -S. -Bbuild -DCMAKE_TOOLCHAIN_FILE=${VITASDK}/share/vita.toolchain.cmake -DCMAKE_BUILD_TYPE=Release - cmake --build build - cmake --install build +```sh +cmake -S. -Bbuild -DCMAKE_TOOLCHAIN_FILE=${VITASDK}/share/vita.toolchain.cmake -DCMAKE_BUILD_TYPE=Release +cmake --build build +cmake --install build ``` diff --git a/libs/SDL3/docs/README-windows.md b/libs/SDL3/docs/README-windows.md index ced972ee..1e6d464c 100644 --- a/libs/SDL3/docs/README-windows.md +++ b/libs/SDL3/docs/README-windows.md @@ -16,6 +16,62 @@ Studio solution. Details are here: https://github.com/libsdl-org/SDL/issues/5186 +## MinGW-w64 compiler support + +SDL can be built with MinGW-w64 and CMake. Minimum tested MinGW-w64 version is 8.0.3. + +On a Windows host, you first need to install and set up the MSYS2 environment, which provides the MinGW-w64 toolchain. Install MSYS2, typically to `C:\msys64`, and follow the instructions on the MSYS2 wiki to use the MinGW-w64 shell to update all components in the MSYS2 environment. This generally amounts to running `pacman -Syuu` from the mingw64 shell, but refer to MSYS2's documentation for more details. Once the MSYS2 environment has been updated, install the x86_64 MinGW toolchain from the mingw64 shell with the command `pacman -S mingw-w64-x86_64-toolchain`. (You can additionally install `mingw-w64-i686-toolchain` if you intend to build 32-bit binaries as well. The remainder of this section assumes you only want to build 64-bit binaries.) + +To build and install SDL, you can use PowerShell or any CMake-compatible IDE. First, install CMake, Ninja, and Git. These tools can be installed using any number of tools, such as the MSYS2's `pacman`, `winget`, `Chocolatey`, or by manually downloading and running the installers. Clone SDL to an appropriate location with `git` and run the following commands from the root of the cloned repository: + +```sh +mkdir build +cmake -S . -B build -G Ninja -DCMAKE_TOOLCHAIN_FILE=build-scripts/cmake-toolchain-mingw64-x86_64.cmake +cmake --build build --parallel +cmake --install build --prefix C:/Libraries +``` + +This installs SDL to `C:\Libraries`. You can specify another directory of your choice as desired. Ensure that your `CMAKE_PREFIX_PATH` includes `C:\Libraries` when you want to build against this copy of SDL. The simplest way to do this is to pass it to CMake as an option at configuration time: + +```sh +cmake .. -G Ninja -DCMAKE_PREFIX_PATH=C:/Libraries +``` + +You will also need to configure CMake to use the MinGW-w64 toolchain to build your own project. Here is a minimal toolchain file that you could use for this purpose: + +``` +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR x86_64) + +find_program(CMAKE_C_COMPILER NAMES x86_64-w64-mingw32-gcc REQUIRED) +find_program(CMAKE_CXX_COMPILER NAMES x86_64-w64-mingw32-g++ REQUIRED) +find_program(CMAKE_RC_COMPILER NAMES x86_64-w64-mingw32-windres windres REQUIRED) +``` + +Save this in your project and refer to it at configuration time with the option `-DCMAKE_TOOLCHAIN_FILE`. + +On Windows, you also need to copy `SDL3.dll` to an appropriate directory so that the game can find it at runtime. For guidance, see [README-cmake.md](README-cmake.md#how-do-i-copy-a-sdl3-dynamic-library-to-another-location). + +Below is a minimal `CMakeLists.txt` file to build your game linked against a system SDL that was built with the MinGW-w64 toolchain. See [README-cmake.md](README-cmake.md) for more details on including SDL in your CMake project. + +```cmake +cmake_minimum_required(VERSION 3.15) +project(mygame) + +find_package(SDL3 REQUIRED CONFIG COMPONENTS SDL3-shared) + +add_executable(mygame WIN32 mygame.c) +target_link_libraries(mygame PRIVATE SDL3::SDL3) + +# On Windows, copy SDL3.dll to the build directory +if(WIN32) + add_custom_command( + TARGET mygame POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E copy $ $ + VERBATIM + ) +endif() +``` ## OpenGL ES 2.x support diff --git a/libs/SDL3/docs/README.md b/libs/SDL3/docs/README.md index 812d3ce6..d0f5a540 100644 --- a/libs/SDL3/docs/README.md +++ b/libs/SDL3/docs/README.md @@ -7,8 +7,7 @@ to provide low level access to audio, keyboard, mouse, joystick, and graphics hardware. It is used by video playback software, emulators, and popular games including Valve's award winning catalog and many Humble Bundle games. -SDL officially supports Windows, macOS, Linux, iOS, and Android. -Support for other platforms may be found in the source code. +SDL officially supports Windows, macOS, Linux, iOS, Android, Xbox, PlayStation 4/5, Nintendo Switch, and many other platforms. SDL is written in C, works natively with C++, and there are bindings available for several other languages, including C# and Python. @@ -19,36 +18,19 @@ in the file "LICENSE.txt". Information on building SDL with CMake is available in [README-cmake.md](README-cmake.md) The best way to learn how to use SDL is to check out the header files in -the "include" subdirectory and the programs in the "test" subdirectory. +the "include" subdirectory and the programs in the "examples" subdirectory. The header files and test programs are well commented and always up to date. Information on reporting bugs and contributing is available in [README-contributing.md](README-contributing.md) -More documentation and FAQs are available online at [the wiki](http://wiki.libsdl.org/) +More documentation and FAQs are available online at the [wiki](http://wiki.libsdl.org/) -- [High DPI Support](README-highdpi.md) -- [main()](README-main-functions.md) -- [Porting information](README-porting.md) - [Migrating from SDL 2.0](README-migration.md) -- [Supported Platforms](README-platforms.md) +- [main()](README-main-functions.md) +- [High DPI Support](README-highdpi.md) - [Touch](README-touch.md) -- [Versions](README-versions.md) -- [Visual Studio](README-visualc.md) - -- [Android](README-android.md) -- [Emscripten](README-emscripten.md) -- [iOS](README-ios.md) -- [KMSDRM support on BSD](README-kmsbsd.md) -- [Linux](README-linux.md) -- [macOS](README-macos.md) -- [Nintendo 3DS](README-n3ds.md) -- [PS2](README-ps2.md) -- [PSP](README-psp.md) -- [PSVita](README-vita.md) -- [Raspberry Pi](README-raspberrypi.md) -- [RISC OS](README-riscos.md) -- [Windows GDK](README-gdk.md) -- [Windows](README-windows.md) +- [Supported platforms](README-platforms.md) +- [Porting information](README-porting.md) If you need help with the library, or just want to discuss SDL related issues, you can join the [SDL Discourse](https://discourse.libsdl.org/), diff --git a/libs/SDL3/docs/hello.c b/libs/SDL3/docs/hello.c new file mode 100644 index 00000000..74a04bc2 --- /dev/null +++ b/libs/SDL3/docs/hello.c @@ -0,0 +1,68 @@ +/* + Copyright (C) 1997-2025 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely. +*/ +#define SDL_MAIN_USE_CALLBACKS 1 /* use the callbacks instead of main() */ +#include +#include + +static SDL_Window *window = NULL; +static SDL_Renderer *renderer = NULL; + +/* This function runs once at startup. */ +SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) +{ + /* Create the window */ + if (!SDL_CreateWindowAndRenderer("Hello World", 800, 600, SDL_WINDOW_FULLSCREEN, &window, &renderer)) { + SDL_Log("Couldn't create window and renderer: %s\n", SDL_GetError()); + return SDL_APP_FAILURE; + } + return SDL_APP_CONTINUE; +} + +/* This function runs when a new event (mouse input, keypresses, etc) occurs. */ +SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) +{ + if (event->type == SDL_EVENT_KEY_DOWN || + event->type == SDL_EVENT_QUIT) { + return SDL_APP_SUCCESS; /* end the program, reporting success to the OS. */ + } + return SDL_APP_CONTINUE; +} + +/* This function runs once per frame, and is the heart of the program. */ +SDL_AppResult SDL_AppIterate(void *appstate) +{ + const char *message = "Hello World!"; + int w = 0, h = 0; + float x, y; + const float scale = 4.0f; + + /* Center the message and scale it up */ + SDL_GetRenderOutputSize(renderer, &w, &h); + SDL_SetRenderScale(renderer, scale, scale); + x = ((w / scale) - SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE * SDL_strlen(message)) / 2; + y = ((h / scale) - SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE) / 2; + + /* Draw the message */ + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_RenderClear(renderer); + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + SDL_RenderDebugText(renderer, x, y, message); + SDL_RenderPresent(renderer); + + return SDL_APP_CONTINUE; +} + +/* This function runs once at shutdown. */ +void SDL_AppQuit(void *appstate, SDL_AppResult result) +{ +} + diff --git a/libs/SDL3/examples/audio/01-simple-playback/simple-playback.c b/libs/SDL3/examples/audio/01-simple-playback/simple-playback.c index ae6eabd0..35ddf8a8 100644 --- a/libs/SDL3/examples/audio/01-simple-playback/simple-playback.c +++ b/libs/SDL3/examples/audio/01-simple-playback/simple-playback.c @@ -14,7 +14,7 @@ static SDL_Window *window = NULL; static SDL_Renderer *renderer = NULL; static SDL_AudioStream *stream = NULL; -static int total_samples_generated = 0; +static int current_sine_sample = 0; /* This function runs once at startup. */ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) @@ -73,15 +73,17 @@ SDL_AppResult SDL_AppIterate(void *appstate) static float samples[512]; /* this will feed 512 samples each frame until we get to our maximum. */ int i; + /* generate a 440Hz pure tone */ for (i = 0; i < SDL_arraysize(samples); i++) { - /* You don't have to care about this math; we're just generating a simple sine wave as we go. - https://en.wikipedia.org/wiki/Sine_wave */ - const float time = total_samples_generated / 8000.0f; - const int sine_freq = 500; /* run the wave at 500Hz */ - samples[i] = SDL_sinf(6.283185f * sine_freq * time); - total_samples_generated++; + const int freq = 440; + const float phase = current_sine_sample * freq / 8000.0f; + samples[i] = SDL_sinf(phase * 2 * SDL_PI_F); + current_sine_sample++; } + /* wrapping around to avoid floating-point errors */ + current_sine_sample %= 8000; + /* feed the new data to the stream. It will queue at the end, and trickle out as the hardware needs more data. */ SDL_PutAudioStreamData(stream, samples, sizeof (samples)); } diff --git a/libs/SDL3/examples/audio/02-simple-playback-callback/simple-playback-callback.c b/libs/SDL3/examples/audio/02-simple-playback-callback/simple-playback-callback.c index 47d5098d..5a783619 100644 --- a/libs/SDL3/examples/audio/02-simple-playback-callback/simple-playback-callback.c +++ b/libs/SDL3/examples/audio/02-simple-playback-callback/simple-playback-callback.c @@ -17,7 +17,7 @@ static SDL_Window *window = NULL; static SDL_Renderer *renderer = NULL; static SDL_AudioStream *stream = NULL; -static int total_samples_generated = 0; +static int current_sine_sample = 0; /* this function will be called (usually in a background thread) when the audio stream is consuming data. */ static void SDLCALL FeedTheAudioStreamMore(void *userdata, SDL_AudioStream *astream, int additional_amount, int total_amount) @@ -33,15 +33,17 @@ static void SDLCALL FeedTheAudioStreamMore(void *userdata, SDL_AudioStream *astr const int total = SDL_min(additional_amount, SDL_arraysize(samples)); int i; + /* generate a 440Hz pure tone */ for (i = 0; i < total; i++) { - /* You don't have to care about this math; we're just generating a simple sine wave as we go. - https://en.wikipedia.org/wiki/Sine_wave */ - const float time = total_samples_generated / 8000.0f; - const int sine_freq = 500; /* run the wave at 500Hz */ - samples[i] = SDL_sinf(6.283185f * sine_freq * time); - total_samples_generated++; + const int freq = 440; + const float phase = current_sine_sample * freq / 8000.0f; + samples[i] = SDL_sinf(phase * 2 * SDL_PI_F); + current_sine_sample++; } + /* wrapping around to avoid floating-point errors */ + current_sine_sample %= 8000; + /* feed the new data to the stream. It will queue at the end, and trickle out as the hardware needs more data. */ SDL_PutAudioStreamData(astream, samples, total * sizeof (float)); additional_amount -= total; /* subtract what we've just fed the stream. */ diff --git a/libs/SDL3/examples/demo/01-snake/snake.c b/libs/SDL3/examples/demo/01-snake/snake.c index 08e62c03..a7f667d5 100644 --- a/libs/SDL3/examples/demo/01-snake/snake.c +++ b/libs/SDL3/examples/demo/01-snake/snake.c @@ -285,7 +285,7 @@ static const struct const char *value; } extended_metadata[] = { - { SDL_PROP_APP_METADATA_URL_STRING, "https://examples.libsdl.org/SDL3/game/01-snake/" }, + { SDL_PROP_APP_METADATA_URL_STRING, "https://examples.libsdl.org/SDL3/demo/01-snake/" }, { SDL_PROP_APP_METADATA_CREATOR_STRING, "SDL team" }, { SDL_PROP_APP_METADATA_COPYRIGHT_STRING, "Placed in the public domain" }, { SDL_PROP_APP_METADATA_TYPE_STRING, "game" } diff --git a/libs/SDL3/examples/demo/02-woodeneye-008/woodeneye-008.c b/libs/SDL3/examples/demo/02-woodeneye-008/woodeneye-008.c index 3ad0b45b..b97b06ad 100644 --- a/libs/SDL3/examples/demo/02-woodeneye-008/woodeneye-008.c +++ b/libs/SDL3/examples/demo/02-woodeneye-008/woodeneye-008.c @@ -36,7 +36,7 @@ static const struct { const char *key; const char *value; } extended_metadata[] = { - { SDL_PROP_APP_METADATA_URL_STRING, "https://examples.libsdl.org/SDL3/game/02-woodeneye-008/" }, + { SDL_PROP_APP_METADATA_URL_STRING, "https://examples.libsdl.org/SDL3/demo/02-woodeneye-008/" }, { SDL_PROP_APP_METADATA_CREATOR_STRING, "SDL team" }, { SDL_PROP_APP_METADATA_COPYRIGHT_STRING, "Placed in the public domain" }, { SDL_PROP_APP_METADATA_TYPE_STRING, "game" } diff --git a/libs/SDL3/examples/demo/04-bytepusher/bytepusher.c b/libs/SDL3/examples/demo/04-bytepusher/bytepusher.c index ae862908..01b0e1a4 100644 --- a/libs/SDL3/examples/demo/04-bytepusher/bytepusher.c +++ b/libs/SDL3/examples/demo/04-bytepusher/bytepusher.c @@ -47,7 +47,7 @@ static const struct { const char *key; const char *value; } extended_metadata[] = { - { SDL_PROP_APP_METADATA_URL_STRING, "https://examples.libsdl.org/SDL3/game/04-bytepusher/" }, + { SDL_PROP_APP_METADATA_URL_STRING, "https://examples.libsdl.org/SDL3/demo/04-bytepusher/" }, { SDL_PROP_APP_METADATA_CREATOR_STRING, "SDL team" }, { SDL_PROP_APP_METADATA_COPYRIGHT_STRING, "Placed in the public domain" }, { SDL_PROP_APP_METADATA_TYPE_STRING, "game" } diff --git a/libs/SDL3/examples/pen/01-drawing-lines/drawing-lines.c b/libs/SDL3/examples/pen/01-drawing-lines/drawing-lines.c index 6d2430ac..a530ab60 100644 --- a/libs/SDL3/examples/pen/01-drawing-lines/drawing-lines.c +++ b/libs/SDL3/examples/pen/01-drawing-lines/drawing-lines.c @@ -23,6 +23,8 @@ static float previous_touch_y = -1.0f; /* This function runs once at startup. */ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) { + int w, h; + SDL_SetAppMetadata("Example Pen Drawing Lines", "1.0", "com.example.pen-drawing-lines"); if (!SDL_Init(SDL_INIT_VIDEO)) { @@ -37,7 +39,10 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) /* we make a render target so we can draw lines to it and not have to record and redraw every pen stroke each frame. Instead rendering a frame for us is a single texture draw. */ - render_target = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 640, 480); + + /* make sure the render target matches output size (for hidpi displays, etc) so drawing matches the pen's position on a tablet display. */ + SDL_GetRenderOutputSize(renderer, &w, &h); + render_target = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, w, h); if (!render_target) { SDL_Log("Couldn't create render target: %s", SDL_GetError()); return SDL_APP_FAILURE; diff --git a/libs/SDL3/examples/template.html b/libs/SDL3/examples/template.html index d6a73050..3e439464 100644 --- a/libs/SDL3/examples/template.html +++ b/libs/SDL3/examples/template.html @@ -76,8 +76,8 @@ } #output-container::before { - position: fixed; - bottom: 0; + position: absolute; + bottom: 100%; right: 1rem; content: 'Console'; @@ -134,8 +134,8 @@ } #source-code::before { - position: fixed; - bottom: 0; + position: absolute; + bottom: 100%; left: 1rem; content: 'Source code'; @@ -143,6 +143,10 @@ background: linear-gradient(to bottom, #789, #e0eaee); padding: 0.75rem 1.5rem; border-radius: 0.5rem 0.5rem 0 0; + + /* Used for a hack to avoid tab labels showing on top of tabs; see + comment below for details. */ + transition: bottom 0.25s; } #source-code:hover, @@ -164,6 +168,14 @@ overflow: scroll; } + /* Hack: Sinze z-index only goes one way, and both tab labels should be + behind each other's tab, put the former on top (higher z-index) and + make the latter one disappear when the former is hovered. */ + #output-container:hover ~ #source-code::before, + #output-container:focus-within ~ #source-code::before { + bottom: -100%; + } + @media (prefers-color-scheme: dark) { main > #sidebar { border-color: rgba(48, 54, 61, 0.7); @@ -195,7 +207,7 @@
  • @example_name@
  • -

    @project_name@ example: @category_name@/@example_name@

    +
    @description@
    + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -20,7 +20,7 @@ */ /** - * Main include header for the SDL library, version 3.1.7 + * Main include header for the SDL library, version 3.2.0 * * It is almost always best to include just this one header instead of * picking out individual headers included here. There are exceptions to diff --git a/libs/SDL3/include/SDL3/SDL_assert.h b/libs/SDL3/include/SDL3/SDL_assert.h index aeaa6223..09b3b478 100644 --- a/libs/SDL3/include/SDL3/SDL_assert.h +++ b/libs/SDL3/include/SDL3/SDL_assert.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -89,7 +89,7 @@ extern "C" { * - 3: Paranoid settings: All SDL assertion macros enabled, including * SDL_assert_paranoid. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ASSERT_LEVEL SomeNumberBasedOnVariousFactors @@ -118,24 +118,27 @@ extern "C" { * * If the program is not running under a debugger, SDL_TriggerBreakpoint will * likely terminate the app, possibly without warning. If the current platform - * isn't supported (SDL doesn't know how to trigger a breakpoint), this macro - * does nothing. + * isn't supported, this macro is left undefined. * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_TriggerBreakpoint() TriggerABreakpointInAPlatformSpecificManner -#elif defined(_MSC_VER) +#elif defined(_MSC_VER) && _MSC_VER >= 1310 /* Don't include intrin.h here because it contains C++ code */ extern void __cdecl __debugbreak(void); #define SDL_TriggerBreakpoint() __debugbreak() +#elif defined(_MSC_VER) && defined(_M_IX86) + #define SDL_TriggerBreakpoint() { _asm { int 0x03 } } #elif defined(ANDROID) #include #define SDL_TriggerBreakpoint() assert(0) #elif SDL_HAS_BUILTIN(__builtin_debugtrap) #define SDL_TriggerBreakpoint() __builtin_debugtrap() +#elif SDL_HAS_BUILTIN(__builtin_trap) + #define SDL_TriggerBreakpoint() __builtin_trap() #elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" ) #elif (defined(__GNUC__) || defined(__clang__)) && defined(__riscv) @@ -152,8 +155,7 @@ extern "C" { #include #define SDL_TriggerBreakpoint() raise(SIGTRAP) #else - /* How do we trigger breakpoints on this platform? */ - #define SDL_TriggerBreakpoint() + /* SDL_TriggerBreakpoint is intentionally left undefined on unknown platforms. */ #endif #ifdef SDL_WIKI_DOCUMENTATION_SECTION @@ -163,7 +165,7 @@ extern "C" { * * If SDL can't figure how the compiler reports this, it will use "???". * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_FUNCTION __FUNCTION__ @@ -178,14 +180,14 @@ extern "C" { /** * A macro that reports the current file being compiled. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_FILE __FILE__ /** * A macro that reports the current line number of the file being compiled. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_LINE __LINE__ @@ -222,7 +224,7 @@ disable assertions. * do { SomethingOnce(); } while (SDL_NULL_WHILE_LOOP_CONDITION (0)); * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_NULL_WHILE_LOOP_CONDITION (0) @@ -246,7 +248,7 @@ disable assertions. * * \param condition the condition to assert (but not actually run here). * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_disabled_assert(condition) \ do { (void) sizeof ((condition)); } while (SDL_NULL_WHILE_LOOP_CONDITION) @@ -262,7 +264,7 @@ disable assertions. * condition, try to break in a debugger, kill the program, or ignore the * problem). * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_AssertState { @@ -280,7 +282,7 @@ typedef enum SDL_AssertState * used by the assertion handler, then added to the assertion report. This is * returned as a linked list from SDL_GetAssertionReport(). * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_AssertData { @@ -306,7 +308,7 @@ typedef struct SDL_AssertData * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *data, const char *func, @@ -321,7 +323,7 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * This isn't for direct use by apps; use SDL_assert or SDL_TriggerBreakpoint * instead. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AssertBreakpoint() SDL_TriggerBreakpoint() @@ -353,7 +355,7 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * * \param condition the condition to assert. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_enabled_assert(condition) \ do { \ @@ -399,7 +401,7 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_assert(condition) if (assertion_enabled && (condition)) { trigger_assertion; } @@ -432,7 +434,7 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_assert_release(condition) SDL_disabled_assert(condition) @@ -461,7 +463,7 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_assert_paranoid(condition) SDL_disabled_assert(condition) @@ -505,7 +507,7 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_assert_always(condition) SDL_enabled_assert(condition) @@ -521,7 +523,7 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * * \threadsafety This callback may be called from any thread that triggers an * assert at any time. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)( const SDL_AssertData *data, void *userdata); @@ -545,7 +547,7 @@ typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)( * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAssertionHandler */ @@ -566,7 +568,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetAssertionHandler( * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAssertionHandler */ @@ -591,7 +593,7 @@ extern SDL_DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetDefaultAssertionHandler( * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAssertionHandler */ @@ -625,7 +627,7 @@ extern SDL_DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void ** * SDL_ResetAssertionReport() simultaneously, may render the * returned pointer invalid. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResetAssertionReport */ @@ -643,7 +645,7 @@ extern SDL_DECLSPEC const SDL_AssertData * SDLCALL SDL_GetAssertionReport(void); * assertion, or simultaneously calling this function may cause * memory leaks or crashes. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAssertionReport */ diff --git a/libs/SDL3/include/SDL3/SDL_asyncio.h b/libs/SDL3/include/SDL3/SDL_asyncio.h index 3c983913..b36cb071 100644 --- a/libs/SDL3/include/SDL3/SDL_asyncio.h +++ b/libs/SDL3/include/SDL3/SDL_asyncio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -67,14 +67,14 @@ * * ## Best Practices * - * Simple non-blocking i/o--for an app that just wants to pick up data + * Simple non-blocking I/O--for an app that just wants to pick up data * whenever it's ready without losing framerate waiting on disks to spin--can * use whatever pattern works well for the program. In this case, simply call * SDL_ReadAsyncIO, or maybe SDL_LoadFileAsync, as needed. Once a frame, call * SDL_GetAsyncIOResult to check for any completed tasks and deal with the * data as it arrives. * - * If two separate pieces of the same program need their own i/o, it is legal + * If two separate pieces of the same program need their own I/O, it is legal * for each to create their own queue. This will prevent either piece from * accidentally consuming the other's completed tasks. Each queue does require * some amount of resources, but it is not an overwhelming cost. Do not make a @@ -83,7 +83,7 @@ * were submitted, so it doesn't generally matter what order tasks are * started. * - * One async i/o queue can be shared by multiple threads, or one thread can + * One async I/O queue can be shared by multiple threads, or one thread can * have more than one queue, but the most efficient way--if ruthless * efficiency is the goal--is to have one queue per thread, with multiple * threads working in parallel, and attempt to keep each queue loaded with @@ -117,7 +117,7 @@ extern "C" { * This operates as an opaque handle. One can then request read or write * operations on it. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_AsyncIOFromFile */ @@ -126,7 +126,7 @@ typedef struct SDL_AsyncIO SDL_AsyncIO; /** * Types of asynchronous I/O tasks. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_AsyncIOTaskType { @@ -138,19 +138,19 @@ typedef enum SDL_AsyncIOTaskType /** * Possible outcomes of an asynchronous I/O task. * - * \since This enum is available since SDL 3.0.0. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_AsyncIOResult { SDL_ASYNCIO_COMPLETE, /**< request was completed without error */ SDL_ASYNCIO_FAILURE, /**< request failed for some reason; check SDL_GetError()! */ - SDL_ASYNCIO_CANCELLED /**< request was cancelled before completing. */ + SDL_ASYNCIO_CANCELED /**< request was canceled before completing. */ } SDL_AsyncIOResult; /** * Information about a completed asynchronous I/O request. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_AsyncIOOutcome { @@ -172,7 +172,7 @@ typedef struct SDL_AsyncIOOutcome * allowing an app to manage multiple pending tasks in one place, in whatever * order they complete. * - * \since This struct is available since SDL 3.0.0. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateAsyncIOQueue * \sa SDL_ReadAsyncIO diff --git a/libs/SDL3/include/SDL3/SDL_atomic.h b/libs/SDL3/include/SDL3/SDL_atomic.h index be4c3988..03e3fb13 100644 --- a/libs/SDL3/include/SDL3/SDL_atomic.h +++ b/libs/SDL3/include/SDL3/SDL_atomic.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -92,7 +92,7 @@ typedef int SDL_SpinLock; * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockSpinlock * \sa SDL_UnlockSpinlock @@ -109,7 +109,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_TryLockSpinlock(SDL_SpinLock *lock); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_TryLockSpinlock * \sa SDL_UnlockSpinlock @@ -128,7 +128,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockSpinlock(SDL_SpinLock *lock); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockSpinlock * \sa SDL_TryLockSpinlock @@ -152,7 +152,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockSpinlock(SDL_SpinLock *lock); * time, but if you find yourself needing this, you are probably * dealing with some very sensitive code; be careful! * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_CompilerBarrier() DoCompilerSpecificReadWriteBarrier() @@ -185,7 +185,7 @@ extern __inline void SDL_CompilerBarrier(void); * time, but if you find yourself needing this, you are probably * dealing with some very sensitive code; be careful! * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_MemoryBarrierRelease */ @@ -205,7 +205,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierReleaseFunction(void); * time, but if you find yourself needing this, you are probably * dealing with some very sensitive code; be careful! * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_MemoryBarrierAcquire */ @@ -245,7 +245,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierAcquireFunction(void); * time, but if you find yourself needing this, you are probably * dealing with some very sensitive code; be careful! * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_MemoryBarrierAcquire * \sa SDL_MemoryBarrierReleaseFunction @@ -268,7 +268,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierAcquireFunction(void); * time, but if you find yourself needing this, you are probably * dealing with some very sensitive code; be careful! * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_MemoryBarrierRelease * \sa SDL_MemoryBarrierAcquireFunction @@ -341,7 +341,7 @@ typedef void (*SDL_KernelMemoryBarrierFunc)(); * * \threadsafety This macro is safe to use from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_CPUPauseInstruction() DoACPUPauseInACompilerAndArchitectureSpecificWay @@ -385,7 +385,7 @@ typedef void (*SDL_KernelMemoryBarrierFunc)(); * This is a struct so people don't accidentally use numeric operations on it * directly. You have to use SDL atomic functions. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CompareAndSwapAtomicInt * \sa SDL_GetAtomicInt @@ -407,7 +407,7 @@ typedef struct SDL_AtomicInt { int value; } SDL_AtomicInt; * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAtomicInt * \sa SDL_SetAtomicInt @@ -428,7 +428,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CompareAndSwapAtomicInt(SDL_AtomicInt *a, i * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAtomicInt */ @@ -445,7 +445,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_SetAtomicInt(SDL_AtomicInt *a, int v); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAtomicInt */ @@ -465,7 +465,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAtomicInt(SDL_AtomicInt *a); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AtomicDecRef * \sa SDL_AtomicIncRef @@ -484,7 +484,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddAtomicInt(SDL_AtomicInt *a, int v); * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_AtomicDecRef */ @@ -504,7 +504,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddAtomicInt(SDL_AtomicInt *a, int v); * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_AtomicIncRef */ @@ -531,7 +531,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddAtomicInt(SDL_AtomicInt *a, int v); * This is a struct so people don't accidentally use numeric operations on it * directly. You have to use SDL atomic functions. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CompareAndSwapAtomicU32 * \sa SDL_GetAtomicU32 @@ -552,7 +552,7 @@ typedef struct SDL_AtomicU32 { Uint32 value; } SDL_AtomicU32; * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAtomicU32 * \sa SDL_SetAtomicU32 @@ -573,7 +573,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CompareAndSwapAtomicU32(SDL_AtomicU32 *a, U * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAtomicU32 */ @@ -590,7 +590,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_SetAtomicU32(SDL_AtomicU32 *a, Uint32 v); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAtomicU32 */ @@ -609,7 +609,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetAtomicU32(SDL_AtomicU32 *a); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CompareAndSwapAtomicInt * \sa SDL_GetAtomicPointer @@ -629,7 +629,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CompareAndSwapAtomicPointer(void **a, void * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CompareAndSwapAtomicPointer * \sa SDL_GetAtomicPointer @@ -647,7 +647,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_SetAtomicPointer(void **a, void *v); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CompareAndSwapAtomicPointer * \sa SDL_SetAtomicPointer diff --git a/libs/SDL3/include/SDL3/SDL_audio.h b/libs/SDL3/include/SDL3/SDL_audio.h index d9fa496d..95693821 100644 --- a/libs/SDL3/include/SDL3/SDL_audio.h +++ b/libs/SDL3/include/SDL3/SDL_audio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -146,7 +146,7 @@ extern "C" { * * Generally one should use SDL_AUDIO_BITSIZE instead of this macro directly. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_MASK_BITSIZE (0xFFu) @@ -155,7 +155,7 @@ extern "C" { * * Generally one should use SDL_AUDIO_ISFLOAT instead of this macro directly. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_MASK_FLOAT (1u<<8) @@ -165,7 +165,7 @@ extern "C" { * Generally one should use SDL_AUDIO_ISBIGENDIAN or SDL_AUDIO_ISLITTLEENDIAN * instead of this macro directly. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_MASK_BIG_ENDIAN (1u<<12) @@ -174,7 +174,7 @@ extern "C" { * * Generally one should use SDL_AUDIO_ISSIGNED instead of this macro directly. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_MASK_SIGNED (1u<<15) @@ -199,7 +199,7 @@ extern "C" { * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_DEFINE_AUDIO_FORMAT(signed, bigendian, flt, size) \ (((Uint16)(signed) << 15) | ((Uint16)(bigendian) << 12) | ((Uint16)(flt) << 8) | ((size) & SDL_AUDIO_MASK_BITSIZE)) @@ -207,7 +207,7 @@ extern "C" { /** * Audio format. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_AUDIO_BITSIZE * \sa SDL_AUDIO_BYTESIZE @@ -261,7 +261,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_BITSIZE(x) ((x) & SDL_AUDIO_MASK_BITSIZE) @@ -275,7 +275,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_BYTESIZE(x) (SDL_AUDIO_BITSIZE(x) / 8) @@ -289,7 +289,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISFLOAT(x) ((x) & SDL_AUDIO_MASK_FLOAT) @@ -303,7 +303,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISBIGENDIAN(x) ((x) & SDL_AUDIO_MASK_BIG_ENDIAN) @@ -317,7 +317,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISLITTLEENDIAN(x) (!SDL_AUDIO_ISBIGENDIAN(x)) @@ -331,7 +331,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISSIGNED(x) ((x) & SDL_AUDIO_MASK_SIGNED) @@ -345,7 +345,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISINT(x) (!SDL_AUDIO_ISFLOAT(x)) @@ -359,7 +359,7 @@ typedef enum SDL_AudioFormat * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_ISUNSIGNED(x) (!SDL_AUDIO_ISSIGNED(x)) @@ -369,7 +369,7 @@ typedef enum SDL_AudioFormat * * Zero is used to signify an invalid/null device. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_AudioDeviceID; @@ -380,7 +380,7 @@ typedef Uint32 SDL_AudioDeviceID; * to signify the app just wants the system to choose a default device instead * of the app providing a specific one. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK ((SDL_AudioDeviceID) 0xFFFFFFFFu) @@ -391,14 +391,14 @@ typedef Uint32 SDL_AudioDeviceID; * to signify the app just wants the system to choose a default device instead * of the app providing a specific one. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_DEVICE_DEFAULT_RECORDING ((SDL_AudioDeviceID) 0xFFFFFFFEu) /** * Format specifier for audio data. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_AudioFormat */ @@ -420,7 +420,7 @@ typedef struct SDL_AudioSpec * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_AUDIO_FRAMESIZE(x) (SDL_AUDIO_BYTESIZE((x).format) * (x).channels) @@ -444,7 +444,7 @@ typedef struct SDL_AudioSpec * more of them, bind them to an opened audio device, and feed data to them * (or for recording, consume data from them). * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateAudioStream */ @@ -470,7 +470,7 @@ typedef struct SDL_AudioStream SDL_AudioStream; * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioDriver */ @@ -494,7 +494,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumAudioDrivers(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumAudioDrivers */ @@ -512,7 +512,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDriver(int index); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentAudioDriver(void); @@ -538,7 +538,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentAudioDriver(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenAudioDevice * \sa SDL_GetAudioRecordingDevices @@ -567,7 +567,7 @@ extern SDL_DECLSPEC SDL_AudioDeviceID * SDLCALL SDL_GetAudioPlaybackDevices(int * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenAudioDevice * \sa SDL_GetAudioPlaybackDevices @@ -583,7 +583,7 @@ extern SDL_DECLSPEC SDL_AudioDeviceID * SDLCALL SDL_GetAudioRecordingDevices(int * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioPlaybackDevices * \sa SDL_GetAudioRecordingDevices @@ -621,7 +621,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDeviceName(SDL_AudioDeviceI * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetAudioDeviceFormat(SDL_AudioDeviceID devid, SDL_AudioSpec *spec, int *sample_frames); @@ -642,7 +642,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetAudioDeviceFormat(SDL_AudioDeviceID devi * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamInputChannelMap */ @@ -717,7 +717,7 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioDeviceChannelMap(SDL_AudioDeviceID * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseAudioDevice * \sa SDL_GetAudioDeviceFormat @@ -787,7 +787,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_IsAudioDevicePlayback(SDL_AudioDeviceID dev * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResumeAudioDevice * \sa SDL_AudioDevicePaused @@ -815,7 +815,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AudioDevicePaused * \sa SDL_PauseAudioDevice @@ -837,7 +837,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ResumeAudioDevice(SDL_AudioDeviceID dev); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PauseAudioDevice * \sa SDL_ResumeAudioDevice @@ -861,7 +861,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_AudioDevicePaused(SDL_AudioDeviceID dev); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioDeviceGain */ @@ -896,7 +896,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioDeviceGain(SDL_AudioDeviceID devid * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioDeviceGain */ @@ -917,7 +917,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioDeviceGain(SDL_AudioDeviceID devid, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenAudioDevice */ @@ -942,7 +942,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID devid); * Binding a stream to a device will set its output format for playback * devices, and its input format for recording devices, so they match the * device's settings. The caller is welcome to change the other end of the - * stream's format at any time. + * stream's format at any time with SDL_SetAudioStreamFormat(). * * \param devid an audio device to bind a stream to. * \param streams an array of audio streams to bind. @@ -952,13 +952,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID devid); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindAudioStreams * \sa SDL_UnbindAudioStream * \sa SDL_GetAudioStreamDevice */ -extern SDL_DECLSPEC bool SDLCALL SDL_BindAudioStreams(SDL_AudioDeviceID devid, SDL_AudioStream **streams, int num_streams); +extern SDL_DECLSPEC bool SDLCALL SDL_BindAudioStreams(SDL_AudioDeviceID devid, SDL_AudioStream * const *streams, int num_streams); /** * Bind a single audio stream to an audio device. @@ -973,7 +973,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_BindAudioStreams(SDL_AudioDeviceID devid, S * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindAudioStreams * \sa SDL_UnbindAudioStream @@ -990,16 +990,17 @@ extern SDL_DECLSPEC bool SDLCALL SDL_BindAudioStream(SDL_AudioDeviceID devid, SD * * Unbinding a stream that isn't bound to a device is a legal no-op. * - * \param streams an array of audio streams to unbind. + * \param streams an array of audio streams to unbind. Can be NULL or contain + * NULL. * \param num_streams number streams listed in the `streams` array. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindAudioStreams */ -extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStreams(SDL_AudioStream **streams, int num_streams); +extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStreams(SDL_AudioStream * const *streams, int num_streams); /** * Unbind a single audio stream from its audio device. @@ -1007,11 +1008,11 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStreams(SDL_AudioStream **stream * This is a convenience function, equivalent to calling * `SDL_UnbindAudioStreams(&stream, 1)`. * - * \param stream an audio stream to unbind from a device. + * \param stream an audio stream to unbind from a device. Can be NULL. * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindAudioStream */ @@ -1030,7 +1031,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStream(SDL_AudioStream *stream); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindAudioStream * \sa SDL_BindAudioStreams @@ -1047,7 +1048,7 @@ extern SDL_DECLSPEC SDL_AudioDeviceID SDLCALL SDL_GetAudioStreamDevice(SDL_Audio * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PutAudioStreamData * \sa SDL_GetAudioStreamData @@ -1068,7 +1069,7 @@ extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_CreateAudioStream(const SDL_Au * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetAudioStreamProperties(SDL_AudioStream *stream); @@ -1084,7 +1085,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetAudioStreamProperties(SDL_Au * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamFormat */ @@ -1103,6 +1104,12 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetAudioStreamFormat(SDL_AudioStream *strea * next sound file, and start putting that new data while the previous sound * file is still queued, and everything will still play back correctly. * + * If a stream is bound to a device, then the format of the side of the stream + * bound to a device cannot be changed (src_spec for recording devices, + * dst_spec for playback devices). Attempts to make a change to this side will + * be ignored, but this will not report an error. The other side's format can + * be changed. + * * \param stream the stream the format is being changed. * \param src_spec the new format of the audio input; if NULL, it is not * changed. @@ -1114,7 +1121,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetAudioStreamFormat(SDL_AudioStream *strea * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamFormat * \sa SDL_SetAudioStreamFrequencyRatio @@ -1131,7 +1138,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamFormat(SDL_AudioStream *strea * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamFrequencyRatio */ @@ -1158,7 +1165,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioStreamFrequencyRatio(SDL_AudioStre * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamFrequencyRatio * \sa SDL_SetAudioStreamFormat @@ -1180,7 +1187,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamFrequencyRatio(SDL_AudioStrea * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamGain */ @@ -1205,7 +1212,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioStreamGain(SDL_AudioStream *stream * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamGain */ @@ -1229,7 +1236,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamGain(SDL_AudioStream *stream, * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamInputChannelMap */ @@ -1253,7 +1260,7 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioStreamInputChannelMap(SDL_AudioStr * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamInputChannelMap */ @@ -1297,6 +1304,11 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioStreamOutputChannelMap(SDL_AudioSt * race condition hasn't changed the format while this call is setting the * channel map. * + * Unlike attempting to change the stream's format, the input channel map on a + * stream bound to a recording device is permitted to change at any time; any + * data added to the stream from the device after this call will have the new + * mapping, but previously-added data will still have the prior mapping. + * * \param stream the SDL_AudioStream to change. * \param chmap the new channel map, NULL to reset to default. * \param count The number of channels in the map. @@ -1308,7 +1320,7 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioStreamOutputChannelMap(SDL_AudioSt * stream's format to have a different number of channels from a * a different thread at the same time, though! * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamInputChannelMap */ @@ -1348,6 +1360,13 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamInputChannelMap(SDL_AudioStre * race condition hasn't changed the format while this call is setting the * channel map. * + * Unlike attempting to change the stream's format, the output channel map on + * a stream bound to a recording device is permitted to change at any time; + * any data added to the stream after this call will have the new mapping, but + * previously-added data will still have the prior mapping. When the channel + * map doesn't match the hardware's channel layout, SDL will convert the data + * before feeding it to the device for playback. + * * \param stream the SDL_AudioStream to change. * \param chmap the new channel map, NULL to reset to default. * \param count The number of channels in the map. @@ -1359,7 +1378,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamInputChannelMap(SDL_AudioStre * stream's format to have a different number of channels from a * a different thread at the same time, though! * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamInputChannelMap */ @@ -1386,7 +1405,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamOutputChannelMap(SDL_AudioStr * stream has a callback set, the caller might need to manage * extra locking. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearAudioStream * \sa SDL_FlushAudioStream @@ -1417,7 +1436,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PutAudioStreamData(SDL_AudioStream *stream, * stream has a callback set, the caller might need to manage * extra locking. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearAudioStream * \sa SDL_GetAudioStreamAvailable @@ -1444,7 +1463,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamData(SDL_AudioStream *stream, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamData * \sa SDL_PutAudioStreamData @@ -1483,7 +1502,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamAvailable(SDL_AudioStream *str * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PutAudioStreamData * \sa SDL_ClearAudioStream @@ -1505,7 +1524,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamQueued(SDL_AudioStream *stream * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PutAudioStreamData */ @@ -1523,7 +1542,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_FlushAudioStream(SDL_AudioStream *stream); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamAvailable * \sa SDL_GetAudioStreamData @@ -1550,7 +1569,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ClearAudioStream(SDL_AudioStream *stream); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResumeAudioStreamDevice */ @@ -1570,12 +1589,32 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PauseAudioStreamDevice(SDL_AudioStream *str * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PauseAudioStreamDevice */ extern SDL_DECLSPEC bool SDLCALL SDL_ResumeAudioStreamDevice(SDL_AudioStream *stream); +/** + * Use this function to query if an audio device associated with a stream is + * paused. + * + * Unlike in SDL2, audio devices start in an _unpaused_ state, since an app + * has to bind a stream before any audio will flow. + * + * \param stream the audio stream associated with the audio device to query. + * \returns true if device is valid and paused, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_PauseAudioStreamDevice + * \sa SDL_ResumeAudioStreamDevice + */ +extern SDL_DECLSPEC bool SDLCALL SDL_AudioStreamDevicePaused(SDL_AudioStream *stream); + + /** * Lock an audio stream for serialized access. * @@ -1598,7 +1637,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ResumeAudioStreamDevice(SDL_AudioStream *st * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_UnlockAudioStream */ @@ -1617,7 +1656,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_LockAudioStream(SDL_AudioStream *stream); * \threadsafety You should only call this from the same thread that * previously called SDL_LockAudioStream. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockAudioStream */ @@ -1658,7 +1697,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_UnlockAudioStream(SDL_AudioStream *stream); * is called, so your callback does not need to manage the lock * explicitly. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamGetCallback * \sa SDL_SetAudioStreamPutCallback @@ -1705,7 +1744,7 @@ typedef void (SDLCALL *SDL_AudioStreamCallback)(void *userdata, SDL_AudioStream * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamPutCallback */ @@ -1754,7 +1793,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamGetCallback(SDL_AudioStream * * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAudioStreamGetCallback */ @@ -1776,7 +1815,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamPutCallback(SDL_AudioStream * * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateAudioStream */ @@ -1838,7 +1877,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyAudioStream(SDL_AudioStream *stream) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAudioStreamDevice * \sa SDL_ResumeAudioStreamDevice @@ -1876,7 +1915,7 @@ extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_OpenAudioDeviceStream(SDL_Audi * application is responsible for locking resources the callback * touches that need to be protected. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetAudioPostmixCallback */ @@ -1932,7 +1971,7 @@ typedef void (SDLCALL *SDL_AudioPostmixCallback)(void *userdata, const SDL_Audio * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDeviceID devid, SDL_AudioPostmixCallback callback, void *userdata); @@ -2010,7 +2049,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDeviceID d * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_free * \sa SDL_LoadWAV @@ -2046,7 +2085,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_LoadWAV_IO(SDL_IOStream *src, bool closeio, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_free * \sa SDL_LoadWAV_IO @@ -2085,7 +2124,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_LoadWAV(const char *path, SDL_AudioSpec *sp * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, SDL_AudioFormat format, Uint32 len, float volume); @@ -2115,7 +2154,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, SDL_ * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ConvertAudioSamples(const SDL_AudioSpec *src_spec, const Uint8 *src_data, int src_len, const SDL_AudioSpec *dst_spec, Uint8 **dst_data, int *dst_len); @@ -2128,7 +2167,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ConvertAudioSamples(const SDL_AudioSpec *sr * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioFormatName(SDL_AudioFormat format); @@ -2144,7 +2183,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioFormatName(SDL_AudioFormat * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetSilenceValueForFormat(SDL_AudioFormat format); diff --git a/libs/SDL3/include/SDL3/SDL_begin_code.h b/libs/SDL3/include/SDL3/SDL_begin_code.h index bfb1c2cc..a6b47cf4 100644 --- a/libs/SDL3/include/SDL3/SDL_begin_code.h +++ b/libs/SDL3/include/SDL3/SDL_begin_code.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -62,7 +62,7 @@ * On compilers without a deprecation mechanism, this is defined to nothing, * and using a deprecated function will not generate a warning. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_DEPRECATED __attribute__((deprecated)) @@ -76,7 +76,7 @@ * This symbol is used in SDL's headers, but apps and other libraries are * welcome to use it for their own interfaces as well. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_DECLSPEC __attribute__ ((visibility("default"))) @@ -97,7 +97,7 @@ * This symbol is used in SDL's headers, but apps and other libraries are * welcome to use it for their own interfaces as well. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDLCALL __cdecl @@ -108,7 +108,7 @@ * to ignore this request. On compilers without inline support, this is * defined to nothing. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_INLINE __inline @@ -123,7 +123,7 @@ * This symbol is used in SDL's headers, but apps and other libraries are * welcome to use it for their own interfaces as well. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_FORCE_INLINE __forceinline @@ -140,7 +140,7 @@ * This symbol is used in SDL's headers, but apps and other libraries are * welcome to use it for their own interfaces as well. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_NORETURN __attribute__((noreturn)) @@ -160,7 +160,7 @@ * This symbol is used in SDL's headers, but apps and other libraries are * welcome to use it for their own interfaces as well. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ANALYZER_NORETURN __attribute__((analyzer_noreturn)) @@ -188,7 +188,7 @@ * } * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_FALLTHROUGH [[fallthrough]] @@ -215,7 +215,7 @@ * * On compilers without nodiscard support, this is defined to nothing. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_NODISCARD [[nodiscard]] @@ -232,7 +232,7 @@ * * Most apps don't need to, and should not, use this directly. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_MALLOC __declspec(allocator) __desclspec(restrict) @@ -248,7 +248,7 @@ * * Most apps don't need to, and should not, use this directly. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ALLOC_SIZE(p) __attribute__((alloc_size(p))) @@ -261,7 +261,7 @@ * * On compilers without restrict support, this is defined to nothing. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_RESTRICT __restrict__ @@ -277,7 +277,7 @@ * On compilers without has_builtin support, this is defined to 0 (always * false). * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_HAS_BUILTIN(x) __has_builtin(x) diff --git a/libs/SDL3/include/SDL3/SDL_bits.h b/libs/SDL3/include/SDL3/SDL_bits.h index 71f356ce..7435ce6d 100644 --- a/libs/SDL3/include/SDL3/SDL_bits.h +++ b/libs/SDL3/include/SDL3/SDL_bits.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -61,7 +61,7 @@ extern __inline int _SDL_bsr_watcom(Uint32); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32(Uint32 x) { @@ -78,7 +78,7 @@ SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32(Uint32 x) return -1; } return _SDL_bsr_watcom(x); -#elif defined(_MSC_VER) +#elif defined(_MSC_VER) && _MSC_VER >= 1400 unsigned long index; if (_BitScanReverse(&index, x)) { return (int)index; @@ -128,7 +128,7 @@ SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32(Uint32 x) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE bool SDL_HasExactlyOneBitSet32(Uint32 x) { diff --git a/libs/SDL3/include/SDL3/SDL_blendmode.h b/libs/SDL3/include/SDL3/SDL_blendmode.h index b9dbbe4b..8f00cbca 100644 --- a/libs/SDL3/include/SDL3/SDL_blendmode.h +++ b/libs/SDL3/include/SDL3/SDL_blendmode.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -45,7 +45,7 @@ extern "C" { * * Additional values may be obtained from SDL_ComposeCustomBlendMode. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_ComposeCustomBlendMode */ @@ -64,7 +64,7 @@ typedef Uint32 SDL_BlendMode; * The blend operation used when combining source and destination pixel * components. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_BlendOperation { @@ -83,7 +83,7 @@ typedef enum SDL_BlendOperation * operation. The comma-separated factors listed above are always applied in * the component order red, green, blue, and alpha. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_BlendFactor { @@ -179,7 +179,7 @@ typedef enum SDL_BlendFactor * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderDrawBlendMode * \sa SDL_GetRenderDrawBlendMode diff --git a/libs/SDL3/include/SDL3/SDL_camera.h b/libs/SDL3/include/SDL3/SDL_camera.h index c3611f07..c4d05962 100644 --- a/libs/SDL3/include/SDL3/SDL_camera.h +++ b/libs/SDL3/include/SDL3/SDL_camera.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -88,7 +88,7 @@ extern "C" { * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetCameras */ @@ -97,7 +97,7 @@ typedef Uint32 SDL_CameraID; /** * The opaque structure used to identify an opened SDL camera. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Camera SDL_Camera; @@ -107,7 +107,7 @@ typedef struct SDL_Camera SDL_Camera; * Cameras often support multiple formats; each one will be encapsulated in * this struct. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetCameraSupportedFormats * \sa SDL_GetCameraFormat @@ -125,7 +125,7 @@ typedef struct SDL_CameraSpec /** * The position of camera in relation to system device. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetCameraPosition */ @@ -154,7 +154,7 @@ typedef enum SDL_CameraPosition * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCameraDriver */ @@ -178,7 +178,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumCameraDrivers(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumCameraDrivers */ @@ -196,7 +196,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraDriver(int index); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentCameraDriver(void); @@ -211,7 +211,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentCameraDriver(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenCamera */ @@ -249,7 +249,7 @@ extern SDL_DECLSPEC SDL_CameraID * SDLCALL SDL_GetCameras(int *count); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCameras * \sa SDL_OpenCamera @@ -265,7 +265,7 @@ extern SDL_DECLSPEC SDL_CameraSpec ** SDLCALL SDL_GetCameraSupportedFormats(SDL_ * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCameras */ @@ -284,7 +284,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraName(SDL_CameraID instance * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCameras */ @@ -330,7 +330,7 @@ extern SDL_DECLSPEC SDL_CameraPosition SDLCALL SDL_GetCameraPosition(SDL_CameraI * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCameras * \sa SDL_GetCameraFormat @@ -363,7 +363,7 @@ extern SDL_DECLSPEC SDL_Camera * SDLCALL SDL_OpenCamera(SDL_CameraID instance_id * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenCamera * \sa SDL_CloseCamera @@ -379,7 +379,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetCameraPermissionState(SDL_Camera *camera) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenCamera */ @@ -394,7 +394,7 @@ extern SDL_DECLSPEC SDL_CameraID SDLCALL SDL_GetCameraID(SDL_Camera *camera); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetCameraProperties(SDL_Camera *camera); @@ -418,7 +418,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetCameraProperties(SDL_Camera * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenCamera */ @@ -461,7 +461,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetCameraFormat(SDL_Camera *camera, SDL_Cam * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ReleaseCameraFrame */ @@ -489,7 +489,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_AcquireCameraFrame(SDL_Camera *cam * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AcquireCameraFrame */ @@ -504,7 +504,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseCameraFrame(SDL_Camera *camera, SDL_ * \threadsafety It is safe to call this function from any thread, but no * thread may reference `device` once this function is called. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenCamera */ diff --git a/libs/SDL3/include/SDL3/SDL_clipboard.h b/libs/SDL3/include/SDL3/SDL_clipboard.h index 448cb4a5..0d3cbb49 100644 --- a/libs/SDL3/include/SDL3/SDL_clipboard.h +++ b/libs/SDL3/include/SDL3/SDL_clipboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -96,7 +96,7 @@ extern "C" { * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetClipboardText * \sa SDL_HasClipboardText @@ -115,7 +115,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetClipboardText(const char *text); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasClipboardText * \sa SDL_SetClipboardText @@ -129,7 +129,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetClipboardText(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetClipboardText * \sa SDL_SetClipboardText @@ -145,7 +145,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasClipboardText(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPrimarySelectionText * \sa SDL_HasPrimarySelectionText @@ -164,7 +164,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetPrimarySelectionText(const char *text); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasPrimarySelectionText * \sa SDL_SetPrimarySelectionText @@ -179,7 +179,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetPrimarySelectionText(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPrimarySelectionText * \sa SDL_SetPrimarySelectionText @@ -204,7 +204,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasPrimarySelectionText(void); * breakage in receiving applications. The returned data will not be * freed so it needs to be retained and dealt with internally. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetClipboardData */ @@ -216,7 +216,7 @@ typedef const void *(SDLCALL *SDL_ClipboardDataCallback)(void *userdata, const c * * \param userdata a pointer to provided user data. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetClipboardData */ @@ -246,7 +246,7 @@ typedef void (SDLCALL *SDL_ClipboardCleanupCallback)(void *userdata); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearClipboardData * \sa SDL_GetClipboardData @@ -262,7 +262,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetClipboardData(SDL_ClipboardDataCallback * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetClipboardData */ @@ -282,7 +282,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ClearClipboardData(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasClipboardData * \sa SDL_SetClipboardData @@ -298,7 +298,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetClipboardData(const char *mime_type, s * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetClipboardData * \sa SDL_GetClipboardData @@ -316,7 +316,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasClipboardData(const char *mime_type); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetClipboardData */ diff --git a/libs/SDL3/include/SDL3/SDL_close_code.h b/libs/SDL3/include/SDL3/SDL_close_code.h index aba9066c..da1dea7f 100644 --- a/libs/SDL3/include/SDL3/SDL_close_code.h +++ b/libs/SDL3/include/SDL3/SDL_close_code.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/SDL3/SDL_copying.h b/libs/SDL3/include/SDL3/SDL_copying.h index dcbdcea8..747bd357 100644 --- a/libs/SDL3/include/SDL3/SDL_copying.h +++ b/libs/SDL3/include/SDL3/SDL_copying.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/SDL3/SDL_cpuinfo.h b/libs/SDL3/include/SDL3/SDL_cpuinfo.h index eca703aa..1745bd93 100644 --- a/libs/SDL3/include/SDL3/SDL_cpuinfo.h +++ b/libs/SDL3/include/SDL3/SDL_cpuinfo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -55,7 +55,7 @@ extern "C" { * processors have a 128 byte cache line. We use the larger value to be * generally safe. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_CACHELINE_SIZE 128 @@ -68,7 +68,7 @@ extern "C" { * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetNumLogicalCPUCores(void); @@ -82,7 +82,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumLogicalCPUCores(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void); @@ -96,7 +96,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_HasAltiVec(void); @@ -109,7 +109,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasAltiVec(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_HasMMX(void); @@ -122,7 +122,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasMMX(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasSSE2 * \sa SDL_HasSSE3 @@ -140,7 +140,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasSSE(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasSSE * \sa SDL_HasSSE3 @@ -158,7 +158,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasSSE2(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasSSE * \sa SDL_HasSSE2 @@ -176,7 +176,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasSSE3(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasSSE * \sa SDL_HasSSE2 @@ -194,7 +194,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasSSE41(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasSSE * \sa SDL_HasSSE2 @@ -212,7 +212,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasSSE42(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasAVX2 * \sa SDL_HasAVX512F @@ -228,7 +228,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasAVX(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasAVX * \sa SDL_HasAVX512F @@ -244,7 +244,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasAVX2(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasAVX * \sa SDL_HasAVX2 @@ -262,7 +262,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasAVX512F(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasNEON */ @@ -277,7 +277,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasARMSIMD(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_HasNEON(void); @@ -291,7 +291,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasNEON(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_HasLSX(void); @@ -305,7 +305,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasLSX(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_HasLASX(void); @@ -316,7 +316,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasLASX(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetSystemRAM(void); @@ -337,7 +337,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetSystemRAM(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_aligned_alloc * \sa SDL_aligned_free diff --git a/libs/SDL3/include/SDL3/SDL_dialog.h b/libs/SDL3/include/SDL3/SDL_dialog.h index 9d66573f..460038ff 100644 --- a/libs/SDL3/include/SDL3/SDL_dialog.h +++ b/libs/SDL3/include/SDL3/SDL_dialog.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -59,7 +59,7 @@ extern "C" { * hyphens, underscores and periods. Alternatively, the whole string can be a * single asterisk ("*"), which serves as an "All files" filter. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_DialogFileCallback * \sa SDL_ShowOpenFileDialog @@ -94,11 +94,15 @@ typedef struct SDL_DialogFileFilter * no filter was selected or if the platform or method doesn't support * fetching the selected filter. * + * In Android, the `filelist` are `content://` URIs. They should be opened + * using SDL_IOFromFile() with appropriate modes. This applies both to open + * and save file dialog. + * * \param userdata an app-provided pointer, for the callback's use. * \param filelist the file(s) chosen by the user. * \param filter index of the selected filter. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_DialogFileFilter * \sa SDL_ShowOpenFileDialog @@ -149,7 +153,7 @@ typedef void (SDLCALL *SDL_DialogFileCallback)(void *userdata, const char * cons * callback may be invoked from the same thread or from a * different one, depending on the OS's constraints. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DialogFileCallback * \sa SDL_DialogFileFilter @@ -198,7 +202,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFileDialog(SDL_DialogFileCallback c * callback may be invoked from the same thread or from a * different one, depending on the OS's constraints. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DialogFileCallback * \sa SDL_DialogFileFilter @@ -244,7 +248,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ShowSaveFileDialog(SDL_DialogFileCallback c * callback may be invoked from the same thread or from a * different one, depending on the OS's constraints. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DialogFileCallback * \sa SDL_ShowOpenFileDialog @@ -259,7 +263,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFolderDialog(SDL_DialogFileCallback * This is used by SDL_ShowFileDialogWithProperties() to decide what kind of * dialog to present to the user. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_ShowFileDialogWithProperties */ diff --git a/libs/SDL3/include/SDL3/SDL_egl.h b/libs/SDL3/include/SDL3/SDL_egl.h index cc557d60..65d4e967 100644 --- a/libs/SDL3/include/SDL3/SDL_egl.h +++ b/libs/SDL3/include/SDL3/SDL_egl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/SDL3/SDL_endian.h b/libs/SDL3/include/SDL3/SDL_endian.h index bf1dd206..a34e9d4b 100644 --- a/libs/SDL3/include/SDL3/SDL_endian.h +++ b/libs/SDL3/include/SDL3/SDL_endian.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -78,7 +78,7 @@ _m_prefetch(void *__P) * #endif * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_BYTEORDER * \sa SDL_BIG_ENDIAN @@ -97,7 +97,7 @@ _m_prefetch(void *__P) * #endif * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_BYTEORDER * \sa SDL_LIL_ENDIAN @@ -122,7 +122,7 @@ _m_prefetch(void *__P) * #endif * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_LIL_ENDIAN * \sa SDL_BIG_ENDIAN @@ -184,7 +184,7 @@ _m_prefetch(void *__P) * #endif * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_LIL_ENDIAN * \sa SDL_BIG_ENDIAN @@ -403,7 +403,7 @@ SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE float SDL_SwapFloat(float x) { @@ -442,7 +442,7 @@ SDL_FORCE_INLINE float SDL_SwapFloat(float x) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) { return x_but_byteswapped; } @@ -463,7 +463,7 @@ SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) { return x_but_byteswapped; } * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) { return x_but_byteswapped; } @@ -484,7 +484,7 @@ SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) { return x_but_byteswapped; } * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } @@ -500,7 +500,7 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap16LE(x) SwapOnlyIfNecessary(x) @@ -516,7 +516,7 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap32LE(x) SwapOnlyIfNecessary(x) @@ -532,7 +532,7 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap64LE(x) SwapOnlyIfNecessary(x) @@ -548,7 +548,7 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_SwapFloatLE(x) SwapOnlyIfNecessary(x) @@ -564,7 +564,7 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap16BE(x) SwapOnlyIfNecessary(x) @@ -580,7 +580,7 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap32BE(x) SwapOnlyIfNecessary(x) @@ -596,7 +596,7 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_Swap64BE(x) SwapOnlyIfNecessary(x) @@ -612,7 +612,7 @@ SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_SwapFloatBE(x) SwapOnlyIfNecessary(x) diff --git a/libs/SDL3/include/SDL3/SDL_error.h b/libs/SDL3/include/SDL3/SDL_error.h index c96d1511..934967c1 100644 --- a/libs/SDL3/include/SDL3/SDL_error.h +++ b/libs/SDL3/include/SDL3/SDL_error.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -80,7 +80,7 @@ extern "C" { * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearError * \sa SDL_GetError @@ -99,7 +99,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetError(SDL_PRINTF_FORMAT_STRING const cha * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.6. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearError * \sa SDL_GetError @@ -116,7 +116,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetErrorV(SDL_PRINTF_FORMAT_STRING const ch * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_OutOfMemory(void); @@ -150,7 +150,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_OutOfMemory(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClearError * \sa SDL_SetError @@ -164,7 +164,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetError(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetError * \sa SDL_SetError @@ -187,7 +187,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ClearError(void); * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_Unsupported() SDL_SetError("That operation is not supported") @@ -211,7 +211,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ClearError(void); * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_InvalidParamError(param) SDL_SetError("Parameter '%s' is invalid", (param)) diff --git a/libs/SDL3/include/SDL3/SDL_events.h b/libs/SDL3/include/SDL3/SDL_events.h index 2850b763..1323e9f0 100644 --- a/libs/SDL3/include/SDL3/SDL_events.h +++ b/libs/SDL3/include/SDL3/SDL_events.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -38,10 +38,10 @@ * at all). * * There is other forms of control, too: SDL_PeepEvents() has more - * functionality at the cost of more complexity, and SDL_WaitEvents() can - * block the process until something interesting happens, which might be - * beneficial for certain types of programs on low-power hardware. One may - * also call SDL_AddEventWatch() to set a callback when new events arrive. + * functionality at the cost of more complexity, and SDL_WaitEvent() can block + * the process until something interesting happens, which might be beneficial + * for certain types of programs on low-power hardware. One may also call + * SDL_AddEventWatch() to set a callback when new events arrive. * * The app is free to generate their own events, too: SDL_PushEvent allows the * app to put events onto the queue for later retrieval; SDL_RegisterEvents @@ -79,7 +79,7 @@ extern "C" { /** * The types of events that can be delivered. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_EventType { @@ -212,6 +212,7 @@ typedef enum SDL_EventType SDL_EVENT_FINGER_DOWN = 0x700, SDL_EVENT_FINGER_UP, SDL_EVENT_FINGER_MOTION, + SDL_EVENT_FINGER_CANCELED, /* 0x800, 0x801, and 0x802 were the Gesture events from SDL2. Do not reuse these values! sdl2-compat needs them! */ @@ -281,7 +282,7 @@ typedef enum SDL_EventType /** * Fields shared by every event * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_CommonEvent { @@ -293,7 +294,7 @@ typedef struct SDL_CommonEvent /** * Display state change event data (event.display.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_DisplayEvent { @@ -308,7 +309,7 @@ typedef struct SDL_DisplayEvent /** * Window state change event data (event.window.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_WindowEvent { @@ -323,7 +324,7 @@ typedef struct SDL_WindowEvent /** * Keyboard device event structure (event.kdevice.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_KeyboardDeviceEvent { @@ -342,7 +343,7 @@ typedef struct SDL_KeyboardDeviceEvent * event scancode and modifiers directly from the keyboard layout, bypassing * SDL_HINT_KEYCODE_OPTIONS, by calling SDL_GetKeyFromScancode(). * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetKeyFromScancode * \sa SDL_HINT_KEYCODE_OPTIONS @@ -369,7 +370,7 @@ typedef struct SDL_KeyboardEvent * will be inserted into the editing text. The length is the number of UTF-8 * characters that will be replaced by new typing. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_TextEditingEvent { @@ -385,7 +386,7 @@ typedef struct SDL_TextEditingEvent /** * Keyboard IME candidates event structure (event.edit_candidates.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_TextEditingCandidatesEvent { @@ -408,7 +409,7 @@ typedef struct SDL_TextEditingCandidatesEvent * This event will never be delivered unless text input is enabled by calling * SDL_StartTextInput(). Text input is disabled by default! * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_StartTextInput * \sa SDL_StopTextInput @@ -425,7 +426,7 @@ typedef struct SDL_TextInputEvent /** * Mouse device event structure (event.mdevice.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MouseDeviceEvent { @@ -438,7 +439,7 @@ typedef struct SDL_MouseDeviceEvent /** * Mouse motion event structure (event.motion.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MouseMotionEvent { @@ -457,7 +458,7 @@ typedef struct SDL_MouseMotionEvent /** * Mouse button event structure (event.button.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MouseButtonEvent { @@ -477,7 +478,7 @@ typedef struct SDL_MouseButtonEvent /** * Mouse wheel event structure (event.wheel.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MouseWheelEvent { @@ -496,7 +497,7 @@ typedef struct SDL_MouseWheelEvent /** * Joystick axis motion event structure (event.jaxis.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_JoyAxisEvent { @@ -515,7 +516,7 @@ typedef struct SDL_JoyAxisEvent /** * Joystick trackball motion event structure (event.jball.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_JoyBallEvent { @@ -534,7 +535,7 @@ typedef struct SDL_JoyBallEvent /** * Joystick hat position change event structure (event.jhat.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_JoyHatEvent { @@ -557,7 +558,7 @@ typedef struct SDL_JoyHatEvent /** * Joystick button event structure (event.jbutton.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_JoyButtonEvent { @@ -577,7 +578,7 @@ typedef struct SDL_JoyButtonEvent * SDL will send JOYSTICK_ADDED events for devices that are already plugged in * during SDL_Init. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GamepadDeviceEvent */ @@ -592,7 +593,7 @@ typedef struct SDL_JoyDeviceEvent /** * Joystick battery level change event structure (event.jbattery.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_JoyBatteryEvent { @@ -607,7 +608,7 @@ typedef struct SDL_JoyBatteryEvent /** * Gamepad axis motion event structure (event.gaxis.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GamepadAxisEvent { @@ -627,7 +628,7 @@ typedef struct SDL_GamepadAxisEvent /** * Gamepad button event structure (event.gbutton.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GamepadButtonEvent { @@ -652,7 +653,7 @@ typedef struct SDL_GamepadButtonEvent * in during SDL_Init() and are recognized as gamepads. It will also send * events for joysticks that get gamepad mappings at runtime. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_JoyDeviceEvent */ @@ -667,7 +668,7 @@ typedef struct SDL_GamepadDeviceEvent /** * Gamepad touchpad event structure (event.gtouchpad.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GamepadTouchpadEvent { @@ -685,7 +686,7 @@ typedef struct SDL_GamepadTouchpadEvent /** * Gamepad sensor event structure (event.gsensor.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GamepadSensorEvent { @@ -701,7 +702,7 @@ typedef struct SDL_GamepadSensorEvent /** * Audio device event structure (event.adevice.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_AudioDeviceEvent { @@ -718,7 +719,7 @@ typedef struct SDL_AudioDeviceEvent /** * Camera device event structure (event.cdevice.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_CameraDeviceEvent { @@ -732,7 +733,7 @@ typedef struct SDL_CameraDeviceEvent /** * Renderer event structure (event.render.*) * - * \since This struct is available since SDL 3.1.7. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_RenderEvent { @@ -760,11 +761,11 @@ typedef struct SDL_RenderEvent * report a touch outside of the window, which will also be outside of the * range. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_TouchFingerEvent { - SDL_EventType type; /**< SDL_EVENT_FINGER_MOTION or SDL_EVENT_FINGER_DOWN or SDL_EVENT_FINGER_UP */ + SDL_EventType type; /**< SDL_EVENT_FINGER_DOWN, SDL_EVENT_FINGER_UP, SDL_EVENT_FINGER_MOTION, or SDL_EVENT_FINGER_CANCELED */ Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_TouchID touchID; /**< The touch device id */ @@ -790,7 +791,7 @@ typedef struct SDL_TouchFingerEvent * is there." The pen touching and lifting off from the tablet while not * leaving the area are handled by SDL_EVENT_PEN_DOWN and SDL_EVENT_PEN_UP. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenProximityEvent { @@ -810,7 +811,7 @@ typedef struct SDL_PenProximityEvent * `pen_state & SDL_PEN_INPUT_DOWN` to decide if a pen is "drawing" when * dealing with pen motion. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenMotionEvent { @@ -830,7 +831,7 @@ typedef struct SDL_PenMotionEvent * These events come when a pen touches a surface (a tablet, etc), or lifts * off from one. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenTouchEvent { @@ -852,7 +853,7 @@ typedef struct SDL_PenTouchEvent * This is for buttons on the pen itself that the user might click. The pen * itself pressing down to draw triggers a SDL_EVENT_PEN_DOWN event instead. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenButtonEvent { @@ -874,7 +875,7 @@ typedef struct SDL_PenButtonEvent * You might get some of these events even if the pen isn't touching the * tablet. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenAxisEvent { @@ -894,7 +895,7 @@ typedef struct SDL_PenAxisEvent * An event used to drop text or request a file open by the system * (event.drop.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_DropEvent { @@ -912,22 +913,22 @@ typedef struct SDL_DropEvent * An event triggered when the clipboard contents have changed * (event.clipboard.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_ClipboardEvent { SDL_EventType type; /**< SDL_EVENT_CLIPBOARD_UPDATE */ Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ - bool owner; /**< are we owning the clipboard (internal update) */ - Sint32 n_mime_types; /**< number of mime types */ + bool owner; /**< are we owning the clipboard (internal update) */ + Sint32 num_mime_types; /**< number of mime types */ const char **mime_types; /**< current mime types */ } SDL_ClipboardEvent; /** * Sensor event structure (event.sensor.*) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_SensorEvent { @@ -942,7 +943,7 @@ typedef struct SDL_SensorEvent /** * The "quit requested" event * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_QuitEvent { @@ -960,7 +961,7 @@ typedef struct SDL_QuitEvent * the programmer; the only requirement is that '''type''' is a value obtained * from SDL_RegisterEvents(). * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_UserEvent { @@ -980,7 +981,7 @@ typedef struct SDL_UserEvent * The SDL_Event structure is the core of all event handling in SDL. SDL_Event * is a union of all event structures used in SDL. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef union SDL_Event { @@ -1060,7 +1061,7 @@ SDL_COMPILE_TIME_ASSERT(SDL_Event, sizeof(SDL_Event) == sizeof(((SDL_Event *)NUL * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PollEvent * \sa SDL_WaitEvent @@ -1072,7 +1073,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_PumpEvents(void); /** * The type of action to request from SDL_PeepEvents(). * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_EventAction { @@ -1117,7 +1118,7 @@ typedef enum SDL_EventAction * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PollEvent * \sa SDL_PumpEvents @@ -1138,7 +1139,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event *events, int numevents, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasEvents */ @@ -1159,7 +1160,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasEvent(Uint32 type); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasEvents */ @@ -1187,7 +1188,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_FlushEvents */ @@ -1214,7 +1215,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_FlushEvent(Uint32 type); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_FlushEvent */ @@ -1258,7 +1259,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType) * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PushEvent * \sa SDL_WaitEvent @@ -1282,7 +1283,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PollEvent(SDL_Event *event); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PollEvent * \sa SDL_PushEvent @@ -1312,7 +1313,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WaitEvent(SDL_Event *event); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PollEvent * \sa SDL_PushEvent @@ -1346,7 +1347,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WaitEventTimeout(SDL_Event *event, Sint32 t * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PeepEvents * \sa SDL_PollEvent @@ -1368,7 +1369,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PushEvent(SDL_Event *event); * application is responsible for locking resources the callback * touches that need to be protected. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetEventFilter * \sa SDL_AddEventWatch @@ -1376,8 +1377,11 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PushEvent(SDL_Event *event); typedef bool (SDLCALL *SDL_EventFilter)(void *userdata, SDL_Event *event); /** - * Set up a filter to process all events before they change internal state and - * are posted to the internal event queue. + * Set up a filter to process all events before they are added to the internal + * event queue. + * + * If you just want to see events without modifying them or preventing them + * from being queued, you should use SDL_AddEventWatch() instead. * * If the filter function returns true when called, then the event will be * added to the internal queue. If it returns false, then the event will be @@ -1391,17 +1395,9 @@ typedef bool (SDLCALL *SDL_EventFilter)(void *userdata, SDL_Event *event); * interrupt signal (e.g. pressing Ctrl-C), it will be delivered to the * application at the next event poll. * - * There is one caveat when dealing with the SDL_QuitEvent event type. The - * event filter is only called when the window manager desires to close the - * application window. If the event filter returns 1, then the window will be - * closed, otherwise the window will remain open if possible. - * * Note: Disabled events never make it to the event filter function; see * SDL_SetEventEnabled(). * - * Note: If you just want to inspect events without filtering, you should use - * SDL_AddEventWatch() instead. - * * Note: Events pushed onto the queue with SDL_PushEvent() get passed through * the event filter, but events pushed onto the queue with SDL_PeepEvents() do * not. @@ -1411,7 +1407,7 @@ typedef bool (SDLCALL *SDL_EventFilter)(void *userdata, SDL_Event *event); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddEventWatch * \sa SDL_SetEventEnabled @@ -1434,7 +1430,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter, void * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetEventFilter */ @@ -1465,7 +1461,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetEventFilter(SDL_EventFilter *filter, voi * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RemoveEventWatch * \sa SDL_SetEventFilter @@ -1483,7 +1479,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_AddEventWatch(SDL_EventFilter filter, void * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddEventWatch */ @@ -1502,7 +1498,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_RemoveEventWatch(SDL_EventFilter filter, vo * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetEventFilter * \sa SDL_SetEventFilter @@ -1517,7 +1513,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter, void * * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_EventEnabled */ @@ -1531,7 +1527,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetEventEnabled(Uint32 type, bool enabled); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetEventEnabled */ @@ -1547,7 +1543,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_EventEnabled(Uint32 type); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PushEvent */ @@ -1561,7 +1557,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PollEvent * \sa SDL_WaitEvent diff --git a/libs/SDL3/include/SDL3/SDL_filesystem.h b/libs/SDL3/include/SDL3/SDL_filesystem.h index 13234afd..af3ca27e 100644 --- a/libs/SDL3/include/SDL3/SDL_filesystem.h +++ b/libs/SDL3/include/SDL3/SDL_filesystem.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -22,7 +22,23 @@ /** * # CategoryFilesystem * - * SDL Filesystem API. + * SDL offers an API for examining and manipulating the system's filesystem. + * This covers most things one would need to do with directories, except for + * actual file I/O (which is covered by [CategoryIOStream](CategoryIOStream) + * and [CategoryAsyncIO](CategoryAsyncIO) instead). + * + * There are functions to answer necessary path questions: + * + * - Where is my app's data? SDL_GetBasePath(). + * - Where can I safely write files? SDL_GetPrefPath(). + * - Where are paths like Downloads, Desktop, Music? SDL_GetUserFolder(). + * - What is this thing at this location? SDL_GetPathInfo(). + * - What items live in this folder? SDL_EnumerateDirectory(). + * - What items live in this folder by wildcard? SDL_GlobDirectory(). + * - What is my current working directory? SDL_GetCurrentDirectory(). + * + * SDL also offers functions to manipulate the directory tree: renaming, + * removing, copying files. */ #ifndef SDL_filesystem_h_ @@ -73,7 +89,7 @@ extern "C" { * doesn't implement this functionality, call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPrefPath */ @@ -128,7 +144,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetBasePath(void); * etc.). This should be freed with SDL_free() when it is no longer * needed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetBasePath */ @@ -159,7 +175,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetPrefPath(const char *org, const char * * * Note that on macOS/iOS, the Videos folder is called "Movies". * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetUserFolder */ @@ -200,7 +216,7 @@ typedef enum SDL_Folder * \returns either a null-terminated C string containing the full path to the * folder, or NULL if an error happened. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetUserFolder(SDL_Folder folder); @@ -214,7 +230,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetUserFolder(SDL_Folder folder); * symlinks, named pipes, etc. They are currently reported as * SDL_PATHTYPE_OTHER. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_PathInfo */ @@ -229,7 +245,7 @@ typedef enum SDL_PathType /** * Information about a path on the filesystem. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetPathInfo * \sa SDL_GetStoragePathInfo @@ -246,7 +262,7 @@ typedef struct SDL_PathInfo /** * Flags for path matching. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GlobDirectory * \sa SDL_GlobStorageDirectory @@ -267,14 +283,14 @@ typedef Uint32 SDL_GlobFlags; * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_CreateDirectory(const char *path); /** * Possible results from an enumeration callback. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_EnumerateDirectoryCallback */ @@ -297,12 +313,15 @@ typedef enum SDL_EnumerationResult * terminate the enumeration early, and dictate the return value of the * enumeration function itself. * + * `dirname` is guaranteed to end with a path separator ('\\' on Windows, '/' + * on most other platforms). + * * \param userdata an app-controlled pointer that is passed to the callback. * \param dirname the directory that is being enumerated. * \param fname the next entry in the enumeration. * \returns how the enumeration should proceed. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_EnumerateDirectory */ @@ -327,7 +346,7 @@ typedef SDL_EnumerationResult (SDLCALL *SDL_EnumerateDirectoryCallback)(void *us * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback callback, void *userdata); @@ -341,7 +360,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_EnumerateDirectory(const char *path, SDL_En * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_RemovePath(const char *path); @@ -364,7 +383,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RemovePath(const char *path); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_RenamePath(const char *oldpath, const char *newpath); @@ -404,7 +423,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenamePath(const char *oldpath, const char * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_CopyFile(const char *oldpath, const char *newpath); @@ -417,7 +436,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CopyFile(const char *oldpath, const char *n * \returns true on success or false if the file doesn't exist, or another * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetPathInfo(const char *path, SDL_PathInfo *info); @@ -425,10 +444,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetPathInfo(const char *path, SDL_PathInfo * Enumerate a directory tree, filtered by pattern, and return a list. * * Files are filtered out if they don't match the string in `pattern`, which - * may contain wildcard characters '*' (match everything) and '?' (match one + * may contain wildcard characters '\*' (match everything) and '?' (match one * character). If pattern is NULL, no filtering is done and all results are * returned. Subdirectories are permitted, and are specified with a path - * separator of '/'. Wildcard characters '*' and '?' never match a path + * separator of '/'. Wildcard characters '\*' and '?' never match a path * separator. * * `flags` may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching @@ -450,7 +469,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetPathInfo(const char *path, SDL_PathInfo * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char ** SDLCALL SDL_GlobDirectory(const char *path, const char *pattern, SDL_GlobFlags flags, int *count); @@ -464,6 +483,9 @@ extern SDL_DECLSPEC char ** SDLCALL SDL_GlobDirectory(const char *path, const ch * platforms without this concept, this would cause surprises with file access * outside of SDL. * + * The returned path is guaranteed to end with a path separator ('\\' on + * Windows, '/' on most other platforms). + * * \returns a UTF-8 string of the current working directory in * platform-dependent notation. NULL if there's a problem. This * should be freed with SDL_free() when it is no longer needed. diff --git a/libs/SDL3/include/SDL3/SDL_gamepad.h b/libs/SDL3/include/SDL3/SDL_gamepad.h index 900a8092..264f763b 100644 --- a/libs/SDL3/include/SDL3/SDL_gamepad.h +++ b/libs/SDL3/include/SDL3/SDL_gamepad.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -51,6 +51,24 @@ * If you would like to receive gamepad updates while the application is in * the background, you should set the following hint before calling * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS + * + * Gamepads support various optional features such as rumble, color LEDs, + * touchpad, gyro, etc. The support for these features varies depending on the + * controller and OS support available. You can check for LED and rumble + * capabilities at runtime by calling SDL_GetGamepadProperties() and checking + * the various capability properties. You can check for touchpad by calling + * SDL_GetNumGamepadTouchpads() and check for gyro and accelerometer by + * calling SDL_GamepadHasSensor(). + * + * By default SDL will try to use the most capable driver available, but you + * can tune which OS drivers to use with the various joystick hints in + * SDL_hints.h. + * + * Your application should always support gamepad hotplugging. On some + * platforms like Xbox, Steam Deck, etc., this is a requirement for + * certification. On other platforms, like macOS and Windows when using + * Windows.Gaming.Input, controllers may not be available at startup and will + * come in at some point after you've started processing events. */ #ifndef SDL_gamepad_h_ @@ -74,7 +92,7 @@ extern "C" { /** * The structure used to identify an SDL gamepad * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Gamepad SDL_Gamepad; @@ -124,7 +142,7 @@ typedef enum SDL_GamepadType * You can query the labels for the face buttons using * SDL_GetGamepadButtonLabel() * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_GamepadButton { @@ -167,7 +185,7 @@ typedef enum SDL_GamepadButton * For a complete set, you should look at the button and gamepad type and have * a set of symbols that work well with your art style. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_GamepadButtonLabel { @@ -194,7 +212,7 @@ typedef enum SDL_GamepadButtonLabel * pressed) when reported by SDL_GetGamepadAxis(). Note that this is not the * same range that will be reported by the lower-level SDL_GetJoystickAxis(). * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_GamepadAxis { @@ -216,7 +234,7 @@ typedef enum SDL_GamepadAxis * gamepad. This enum is used as part of SDL_GamepadBinding to specify those * mappings. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_GamepadBindingType { @@ -237,7 +255,7 @@ typedef enum SDL_GamepadBindingType * more with a simple text string. Those strings are parsed into a collection * of these structs to make it easier to operate on the data. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetGamepadBindings */ @@ -310,7 +328,7 @@ typedef struct SDL_GamepadBinding * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddGamepadMappingsFromFile * \sa SDL_AddGamepadMappingsFromIO @@ -350,7 +368,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMapping(const char *mapping); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddGamepadMapping * \sa SDL_AddGamepadMappingsFromFile @@ -384,7 +402,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromIO(SDL_IOStream *src, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddGamepadMapping * \sa SDL_AddGamepadMappingsFromIO @@ -404,7 +422,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromFile(const char *file) * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReloadGamepadMappings(void); @@ -418,7 +436,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReloadGamepadMappings(void); * single allocation that should be freed with SDL_free() when it is * no longer needed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char ** SDLCALL SDL_GetGamepadMappings(int *count); @@ -430,7 +448,7 @@ extern SDL_DECLSPEC char ** SDLCALL SDL_GetGamepadMappings(int *count); * information. This should be freed with SDL_free() when it is no * longer needed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUIDForID * \sa SDL_GetJoystickGUID @@ -447,7 +465,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMappingForGUID(SDL_GUID guid); * available; call SDL_GetError() for more information. This should * be freed with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddGamepadMapping * \sa SDL_GetGamepadMappingForID @@ -467,7 +485,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMapping(SDL_Gamepad *gamepad); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddGamepadMapping * \sa SDL_GetGamepadMapping @@ -479,7 +497,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadMapping(SDL_JoystickID instance_i * * \returns true if a gamepad is connected, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepads */ @@ -494,7 +512,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasGamepad(void); * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasGamepad * \sa SDL_OpenGamepad @@ -508,7 +526,7 @@ extern SDL_DECLSPEC SDL_JoystickID * SDLCALL SDL_GetGamepads(int *count); * \returns true if the given joystick is supported by the gamepad interface, * false if it isn't or it's an invalid index. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoysticks * \sa SDL_OpenGamepad @@ -524,7 +542,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_IsGamepad(SDL_JoystickID instance_id); * \returns the name of the selected gamepad. If no name can be found, this * function returns NULL; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadName * \sa SDL_GetGamepads @@ -540,7 +558,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadNameForID(SDL_JoystickID * \returns the path of the selected gamepad. If no path can be found, this * function returns NULL; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPath * \sa SDL_GetGamepads @@ -555,7 +573,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadPathForID(SDL_JoystickID * \param instance_id the joystick instance ID. * \returns the player index of a gamepad, or -1 if it's not available. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPlayerIndex * \sa SDL_GetGamepads @@ -571,7 +589,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetGamepadPlayerIndexForID(SDL_JoystickID in * \returns the GUID of the selected gamepad. If called on an invalid index, * this function returns a zero GUID. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GUIDToString * \sa SDL_GetGamepads @@ -588,7 +606,7 @@ extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetGamepadGUIDForID(SDL_JoystickID inst * \returns the USB vendor ID of the selected gamepad. If called on an invalid * index, this function returns zero. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadVendor * \sa SDL_GetGamepads @@ -605,7 +623,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadVendorForID(SDL_JoystickID inst * \returns the USB product ID of the selected gamepad. If called on an * invalid index, this function returns zero. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProduct * \sa SDL_GetGamepads @@ -622,7 +640,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductForID(SDL_JoystickID ins * \returns the product version of the selected gamepad. If called on an * invalid index, this function returns zero. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProductVersion * \sa SDL_GetGamepads @@ -637,7 +655,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductVersionForID(SDL_Joystic * \param instance_id the joystick instance ID. * \returns the gamepad type. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadType * \sa SDL_GetGamepads @@ -653,7 +671,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadTypeForID(SDL_Joystick * \param instance_id the joystick instance ID. * \returns the gamepad type. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTypeForID * \sa SDL_GetGamepads @@ -670,7 +688,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetRealGamepadTypeForID(SDL_Joys * \returns the mapping string. Returns NULL if no mapping is available. This * should be freed with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepads * \sa SDL_GetGamepadMapping @@ -684,7 +702,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMappingForID(SDL_JoystickID ins * \returns a gamepad identifier or NULL if an error occurred; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseGamepad * \sa SDL_IsGamepad @@ -699,7 +717,7 @@ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_OpenGamepad(SDL_JoystickID instanc * \returns an SDL_Gamepad on success or NULL on failure or if it hasn't been * opened yet; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromID(SDL_JoystickID instance_id); @@ -709,7 +727,7 @@ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromID(SDL_JoystickID in * \param player_index the player index, which different from the instance ID. * \returns the SDL_Gamepad associated with a player index. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPlayerIndex * \sa SDL_SetGamepadPlayerIndex @@ -739,7 +757,7 @@ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromPlayerIndex(int play * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGamepadProperties(SDL_Gamepad *gamepad); @@ -757,7 +775,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGamepadProperties(SDL_Gamepa * \returns the instance ID of the specified gamepad on success or 0 on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetGamepadID(SDL_Gamepad *gamepad); @@ -769,7 +787,7 @@ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetGamepadID(SDL_Gamepad *gamepad * \returns the implementation dependent name for the gamepad, or NULL if * there is no name or the identifier passed is invalid. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadNameForID */ @@ -783,7 +801,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadName(SDL_Gamepad *gamepad * \returns the implementation dependent path for the gamepad, or NULL if * there is no path or the identifier passed is invalid. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPathForID */ @@ -796,7 +814,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadPath(SDL_Gamepad *gamepad * \returns the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it's not * available. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTypeForID */ @@ -809,7 +827,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadType(SDL_Gamepad *game * \returns the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it's not * available. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRealGamepadTypeForID */ @@ -823,7 +841,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetRealGamepadType(SDL_Gamepad * * \param gamepad the gamepad object to query. * \returns the player index for gamepad, or -1 if it's not available. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetGamepadPlayerIndex */ @@ -838,7 +856,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetGamepadPlayerIndex(SDL_Gamepad *gamepad); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPlayerIndex */ @@ -852,7 +870,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadPlayerIndex(SDL_Gamepad *gamepad, * \param gamepad the gamepad object to query. * \returns the USB vendor ID, or zero if unavailable. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadVendorForID */ @@ -866,7 +884,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadVendor(SDL_Gamepad *gamepad); * \param gamepad the gamepad object to query. * \returns the USB product ID, or zero if unavailable. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProductForID */ @@ -880,7 +898,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProduct(SDL_Gamepad *gamepad); * \param gamepad the gamepad object to query. * \returns the USB product version, or zero if unavailable. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProductVersionForID */ @@ -894,7 +912,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductVersion(SDL_Gamepad *gam * \param gamepad the gamepad object to query. * \returns the gamepad firmware version, or zero if unavailable. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadFirmwareVersion(SDL_Gamepad *gamepad); @@ -906,7 +924,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadFirmwareVersion(SDL_Gamepad *ga * \param gamepad the gamepad object to query. * \returns the serial number, or NULL if unavailable. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadSerial(SDL_Gamepad *gamepad); @@ -919,7 +937,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadSerial(SDL_Gamepad *gamep * \param gamepad the gamepad object to query. * \returns the gamepad handle, or 0 if unavailable. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetGamepadSteamHandle(SDL_Gamepad *gamepad); @@ -931,7 +949,7 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetGamepadSteamHandle(SDL_Gamepad *gamepa * `SDL_JOYSTICK_CONNECTION_INVALID` on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetGamepadConnectionState(SDL_Gamepad *gamepad); @@ -951,7 +969,7 @@ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetGamepadConnection * battery. * \returns the current battery state. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetGamepadPowerInfo(SDL_Gamepad *gamepad, int *percent); @@ -963,7 +981,7 @@ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetGamepadPowerInfo(SDL_Gamepad * * \returns true if the gamepad has been opened and is currently connected, or * false if not. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GamepadConnected(SDL_Gamepad *gamepad); @@ -983,7 +1001,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GamepadConnected(SDL_Gamepad *gamepad); * \returns an SDL_Joystick object, or NULL on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetGamepadJoystick(SDL_Gamepad *gamepad); @@ -995,7 +1013,7 @@ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetGamepadJoystick(SDL_Gamepad *g * * \param enabled whether to process gamepad events or not. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadEventsEnabled * \sa SDL_UpdateGamepads @@ -1010,7 +1028,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetGamepadEventsEnabled(bool enabled); * * \returns true if gamepad events are being processed, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetGamepadEventsEnabled */ @@ -1026,7 +1044,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GamepadEventsEnabled(void); * single allocation that should be freed with SDL_free() when it is * no longer needed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_GamepadBinding ** SDLCALL SDL_GetGamepadBindings(SDL_Gamepad *gamepad, int *count); @@ -1037,7 +1055,7 @@ extern SDL_DECLSPEC SDL_GamepadBinding ** SDLCALL SDL_GetGamepadBindings(SDL_Gam * enabled. Under such circumstances, it will not be necessary to call this * function. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UpdateGamepads(void); @@ -1053,7 +1071,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UpdateGamepads(void); * \returns the SDL_GamepadType enum corresponding to the input string, or * `SDL_GAMEPAD_TYPE_UNKNOWN` if no match was found. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadStringForType */ @@ -1067,7 +1085,7 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadTypeFromString(const c * specified. The string returned is of the format used by * SDL_Gamepad mapping strings. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTypeFromString */ @@ -1089,7 +1107,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForType(SDL_Gamepad * \returns the SDL_GamepadAxis enum corresponding to the input string, or * `SDL_GAMEPAD_AXIS_INVALID` if no match was found. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadStringForAxis */ @@ -1103,7 +1121,7 @@ extern SDL_DECLSPEC SDL_GamepadAxis SDLCALL SDL_GetGamepadAxisFromString(const c * specified. The string returned is of the format used by * SDL_Gamepad mapping strings. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadAxisFromString */ @@ -1119,7 +1137,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForAxis(SDL_Gamepad * \param axis an axis enum value (an SDL_GamepadAxis value). * \returns true if the gamepad has this axis, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasButton * \sa SDL_GetGamepadAxis @@ -1143,7 +1161,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GamepadHasAxis(SDL_Gamepad *gamepad, SDL_Ga * \returns axis state (including 0) on success or 0 (also) on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasAxis * \sa SDL_GetGamepadButton @@ -1162,7 +1180,7 @@ extern SDL_DECLSPEC Sint16 SDLCALL SDL_GetGamepadAxis(SDL_Gamepad *gamepad, SDL_ * \returns the SDL_GamepadButton enum corresponding to the input string, or * `SDL_GAMEPAD_BUTTON_INVALID` if no match was found. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadStringForButton */ @@ -1176,7 +1194,7 @@ extern SDL_DECLSPEC SDL_GamepadButton SDLCALL SDL_GetGamepadButtonFromString(con * specified. The string returned is of the format used by * SDL_Gamepad mapping strings. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadButtonFromString */ @@ -1192,7 +1210,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForButton(SDL_Gamep * \param button a button enum value (an SDL_GamepadButton value). * \returns true if the gamepad has this button, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasAxis */ @@ -1205,7 +1223,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GamepadHasButton(SDL_Gamepad *gamepad, SDL_ * \param button a button index (one of the SDL_GamepadButton values). * \returns true if the button is pressed, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasButton * \sa SDL_GetGamepadAxis @@ -1219,7 +1237,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadButton(SDL_Gamepad *gamepad, SDL_ * \param button a button index (one of the SDL_GamepadButton values). * \returns the SDL_GamepadButtonLabel enum corresponding to the button label. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadButtonLabel */ @@ -1232,7 +1250,7 @@ extern SDL_DECLSPEC SDL_GamepadButtonLabel SDLCALL SDL_GetGamepadButtonLabelForT * \param button a button index (one of the SDL_GamepadButton values). * \returns the SDL_GamepadButtonLabel enum corresponding to the button label. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadButtonLabelForType */ @@ -1244,7 +1262,7 @@ extern SDL_DECLSPEC SDL_GamepadButtonLabel SDLCALL SDL_GetGamepadButtonLabel(SDL * \param gamepad a gamepad. * \returns number of touchpads. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumGamepadTouchpadFingers */ @@ -1258,7 +1276,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumGamepadTouchpads(SDL_Gamepad *gamepad) * \param touchpad a touchpad. * \returns number of supported simultaneous fingers. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTouchpadFinger * \sa SDL_GetNumGamepadTouchpads @@ -1281,7 +1299,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumGamepadTouchpadFingers(SDL_Gamepad *ga * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumGamepadTouchpadFingers */ @@ -1294,7 +1312,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadTouchpadFinger(SDL_Gamepad *gamep * \param type the type of sensor to query. * \returns true if the sensor exists, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadSensorData * \sa SDL_GetGamepadSensorDataRate @@ -1311,7 +1329,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GamepadHasSensor(SDL_Gamepad *gamepad, SDL_ * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasSensor * \sa SDL_GamepadSensorEnabled @@ -1325,7 +1343,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadSensorEnabled(SDL_Gamepad *gamepa * \param type the type of sensor to query. * \returns true if the sensor is enabled, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetGamepadSensorEnabled */ @@ -1338,7 +1356,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GamepadSensorEnabled(SDL_Gamepad *gamepad, * \param type the type of sensor to query. * \returns the data rate, or 0.0f if the data rate is not available. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC float SDLCALL SDL_GetGamepadSensorDataRate(SDL_Gamepad *gamepad, SDL_SensorType type); @@ -1355,7 +1373,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetGamepadSensorDataRate(SDL_Gamepad *game * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadSensorData(SDL_Gamepad *gamepad, SDL_SensorType type, float *data, int num_values); @@ -1377,7 +1395,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadSensorData(SDL_Gamepad *gamepad, * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_RumbleGamepad(SDL_Gamepad *gamepad, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); @@ -1403,7 +1421,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RumbleGamepad(SDL_Gamepad *gamepad, Uint16 * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RumbleGamepad */ @@ -1425,7 +1443,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RumbleGamepadTriggers(SDL_Gamepad *gamepad, * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadLED(SDL_Gamepad *gamepad, Uint8 red, Uint8 green, Uint8 blue); @@ -1438,7 +1456,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadLED(SDL_Gamepad *gamepad, Uint8 r * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SendGamepadEffect(SDL_Gamepad *gamepad, const void *data, int size); @@ -1448,7 +1466,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SendGamepadEffect(SDL_Gamepad *gamepad, con * \param gamepad a gamepad identifier previously returned by * SDL_OpenGamepad(). * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenGamepad */ @@ -1462,7 +1480,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseGamepad(SDL_Gamepad *gamepad); * \param button a button on the gamepad. * \returns the sfSymbolsName or NULL if the name can't be found. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadAppleSFSymbolsNameForAxis */ @@ -1475,7 +1493,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadAppleSFSymbolsNameForButt * \param axis an axis on the gamepad. * \returns the sfSymbolsName or NULL if the name can't be found. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadAppleSFSymbolsNameForButton */ diff --git a/libs/SDL3/include/SDL3/SDL_gpu.h b/libs/SDL3/include/SDL3/SDL_gpu.h index 6d8b90e7..fa870a57 100644 --- a/libs/SDL3/include/SDL3/SDL_gpu.h +++ b/libs/SDL3/include/SDL3/SDL_gpu.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -149,6 +149,29 @@ * [here](https://github.com/TheSpydog/SDL_gpu_examples) * . * + * ## Performance considerations + * + * Here are some basic tips for maximizing your rendering performance. + * + * - Beginning a new render pass is relatively expensive. Use as few render + * passes as you can. + * - Minimize the amount of state changes. For example, binding a pipeline is + * relatively cheap, but doing it hundreds of times when you don't need to + * will slow the performance significantly. + * - Perform your data uploads as early as possible in the frame. + * - Don't churn resources. Creating and releasing resources is expensive. + * It's better to create what you need up front and cache it. + * - Don't use uniform buffers for large amounts of data (more than a matrix + * or so). Use a storage buffer instead. + * - Use cycling correctly. There is a detailed explanation of cycling further + * below. + * - Use culling techniques to minimize pixel writes. The less writing the GPU + * has to do the better. Culling can be a very advanced topic but even + * simple culling techniques can boost performance significantly. + * + * In general try to remember the golden rule of performance: doing things is + * more expensive than not doing things. Don't Touch The Driver! + * * ## FAQ * * **Question: When are you adding more advanced features, like ray tracing or @@ -160,12 +183,42 @@ * So while these things are not in the "never" category, they are definitely * not "near future" items either. * + * **Question: Why is my shader not working?** + * + * Answer: A common oversight when using shaders is not properly laying out + * the shader resources/registers correctly. The GPU API is very strict with + * how it wants resources to be laid out and it's difficult for the API to + * automatically validate shaders to see if they have a compatible layout. See + * the documentation for SDL_CreateGPUShader() and + * SDL_CreateGPUComputePipeline() for information on the expected layout. + * + * Another common issue is not setting the correct number of samplers, + * textures, and buffers in SDL_GPUShaderCreateInfo. If possible use shader + * reflection to extract the required information from the shader + * automatically instead of manually filling in the struct's values. + * + * **Question: My application isn't performing very well. Is this the GPU + * API's fault?** + * + * Answer: No. Long answer: The GPU API is a relatively thin layer over the + * underlying graphics API. While it's possible that we have done something + * inefficiently, it's very unlikely especially if you are relatively + * inexperienced with GPU rendering. Please see the performance tips above and + * make sure you are following them. Additionally, tools like RenderDoc can be + * very helpful for diagnosing incorrect behavior and performance issues. + * * ## System Requirements * * **Vulkan:** Supported on Windows, Linux, Nintendo Switch, and certain * Android devices. Requires Vulkan 1.0 with the following extensions and - * device features: - `VK_KHR_swapchain` - `VK_KHR_maintenance1` - - * `independentBlend` - `imageCubeArray` - `depthClamp` - `shaderClipDistance` + * device features: + * + * - `VK_KHR_swapchain` + * - `VK_KHR_maintenance1` + * - `independentBlend` + * - `imageCubeArray` + * - `depthClamp` + * - `shaderClipDistance` * - `drawIndirectFirstInstance` * * **D3D12:** Supported on Windows 10 or newer, Xbox One (GDK), and Xbox @@ -173,10 +226,79 @@ * 11_1. * * **Metal:** Supported on macOS 10.14+ and iOS/tvOS 13.0+. Hardware - * requirements vary by operating system: - macOS requires an Apple Silicon or - * [Intel Mac2 family](https://developer.apple.com/documentation/metal/mtlfeatureset/mtlfeatureset_macos_gpufamily2_v1?language=objc) - * GPU - iOS/tvOS requires an A9 GPU or newer - iOS Simulator and tvOS - * Simulator are unsupported + * requirements vary by operating system: + * + * - macOS requires an Apple Silicon or + * [Intel Mac2 family](https://developer.apple.com/documentation/metal/mtlfeatureset/mtlfeatureset_macos_gpufamily2_v1?language=objc) + * GPU + * - iOS/tvOS requires an A9 GPU or newer + * - iOS Simulator and tvOS Simulator are unsupported + * + * ## Uniform Data + * + * Uniforms are for passing data to shaders. The uniform data will be constant + * across all executions of the shader. + * + * There are 4 available uniform slots per shader stage (where the stages are + * vertex, fragment, and compute). Uniform data pushed to a slot on a stage + * keeps its value throughout the command buffer until you call the relevant + * Push function on that slot again. + * + * For example, you could write your vertex shaders to read a camera matrix + * from uniform binding slot 0, push the camera matrix at the start of the + * command buffer, and that data will be used for every subsequent draw call. + * + * It is valid to push uniform data during a render or compute pass. + * + * Uniforms are best for pushing small amounts of data. If you are pushing + * more than a matrix or two per call you should consider using a storage + * buffer instead. + * + * ## A Note On Cycling + * + * When using a command buffer, operations do not occur immediately - they + * occur some time after the command buffer is submitted. + * + * When a resource is used in a pending or active command buffer, it is + * considered to be "bound". When a resource is no longer used in any pending + * or active command buffers, it is considered to be "unbound". + * + * If data resources are bound, it is unspecified when that data will be + * unbound unless you acquire a fence when submitting the command buffer and + * wait on it. However, this doesn't mean you need to track resource usage + * manually. + * + * All of the functions and structs that involve writing to a resource have a + * "cycle" bool. SDL_GPUTransferBuffer, SDL_GPUBuffer, and SDL_GPUTexture all + * effectively function as ring buffers on internal resources. When cycle is + * true, if the resource is bound, the cycle rotates to the next unbound + * internal resource, or if none are available, a new one is created. This + * means you don't have to worry about complex state tracking and + * synchronization as long as cycling is correctly employed. + * + * For example: you can call SDL_MapGPUTransferBuffer(), write texture data, + * SDL_UnmapGPUTransferBuffer(), and then SDL_UploadToGPUTexture(). The next + * time you write texture data to the transfer buffer, if you set the cycle + * param to true, you don't have to worry about overwriting any data that is + * not yet uploaded. + * + * Another example: If you are using a texture in a render pass every frame, + * this can cause a data dependency between frames. If you set cycle to true + * in the SDL_GPUColorTargetInfo struct, you can prevent this data dependency. + * + * Cycling will never undefine already bound data. When cycling, all data in + * the resource is considered to be undefined for subsequent commands until + * that data is written again. You must take care not to read undefined data. + * + * Note that when cycling a texture, the entire texture will be cycled, even + * if only part of the texture is used in the call, so you must consider the + * entire texture to contain undefined data after cycling. + * + * You must also take care not to overwrite a section of data that has been + * referenced in a command without cycling first. It is OK to overwrite + * unreferenced data in a bound resource without cycling, but overwriting a + * section of data that has already been referenced will produce unexpected + * results. */ #ifndef SDL_gpu_h_ @@ -199,7 +321,7 @@ extern "C" { /** * An opaque handle representing the SDL_GPU context. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GPUDevice SDL_GPUDevice; @@ -209,10 +331,9 @@ typedef struct SDL_GPUDevice SDL_GPUDevice; * Used for vertices, indices, indirect draw commands, and general compute * data. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateGPUBuffer - * \sa SDL_SetGPUBufferName * \sa SDL_UploadToGPUBuffer * \sa SDL_DownloadFromGPUBuffer * \sa SDL_CopyGPUBufferToBuffer @@ -233,7 +354,7 @@ typedef struct SDL_GPUBuffer SDL_GPUBuffer; * * Used for transferring data to and from the device. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateGPUTransferBuffer * \sa SDL_MapGPUTransferBuffer @@ -249,10 +370,9 @@ typedef struct SDL_GPUTransferBuffer SDL_GPUTransferBuffer; /** * An opaque handle representing a texture. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateGPUTexture - * \sa SDL_SetGPUTextureName * \sa SDL_UploadToGPUTexture * \sa SDL_DownloadFromGPUTexture * \sa SDL_CopyGPUTextureToTexture @@ -270,7 +390,7 @@ typedef struct SDL_GPUTexture SDL_GPUTexture; /** * An opaque handle representing a sampler. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateGPUSampler * \sa SDL_BindGPUVertexSamplers @@ -282,7 +402,7 @@ typedef struct SDL_GPUSampler SDL_GPUSampler; /** * An opaque handle representing a compiled shader object. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateGPUShader * \sa SDL_CreateGPUGraphicsPipeline @@ -295,7 +415,7 @@ typedef struct SDL_GPUShader SDL_GPUShader; * * Used during compute passes. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateGPUComputePipeline * \sa SDL_BindGPUComputePipeline @@ -308,7 +428,7 @@ typedef struct SDL_GPUComputePipeline SDL_GPUComputePipeline; * * Used during render passes. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline * \sa SDL_BindGPUGraphicsPipeline @@ -333,7 +453,7 @@ typedef struct SDL_GPUGraphicsPipeline SDL_GPUGraphicsPipeline; * In multi-threading scenarios, you should only access a command buffer on * the thread you acquired it from. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_AcquireGPUCommandBuffer * \sa SDL_SubmitGPUCommandBuffer @@ -347,7 +467,7 @@ typedef struct SDL_GPUCommandBuffer SDL_GPUCommandBuffer; * This handle is transient and should not be held or referenced after * SDL_EndGPURenderPass is called. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_BeginGPURenderPass * \sa SDL_EndGPURenderPass @@ -360,7 +480,7 @@ typedef struct SDL_GPURenderPass SDL_GPURenderPass; * This handle is transient and should not be held or referenced after * SDL_EndGPUComputePass is called. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_BeginGPUComputePass * \sa SDL_EndGPUComputePass @@ -373,7 +493,7 @@ typedef struct SDL_GPUComputePass SDL_GPUComputePass; * This handle is transient and should not be held or referenced after * SDL_EndGPUCopyPass is called. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_BeginGPUCopyPass * \sa SDL_EndGPUCopyPass @@ -383,7 +503,7 @@ typedef struct SDL_GPUCopyPass SDL_GPUCopyPass; /** * An opaque handle representing a fence. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_SubmitGPUCommandBufferAndAcquireFence * \sa SDL_QueryGPUFence @@ -395,7 +515,21 @@ typedef struct SDL_GPUFence SDL_GPUFence; /** * Specifies the primitive topology of a graphics pipeline. * - * \since This enum is available since SDL 3.1.3 + * If you are using POINTLIST you must include a point size output in the + * vertex shader. + * + * - For HLSL compiling to SPIRV you must decorate a float output with + * [[vk::builtin("PointSize")]]. + * - For GLSL you must set the gl_PointSize builtin. + * - For MSL you must include a float output with the [[point_size]] + * decorator. + * + * Note that sized point topology is totally unsupported on D3D12. Any size + * other than 1 will be ignored. In general, you should avoid using point + * topology for both compatibility and performance reasons. You WILL regret + * using it. + * + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline */ @@ -412,7 +546,7 @@ typedef enum SDL_GPUPrimitiveType * Specifies how the contents of a texture attached to a render pass are * treated at the beginning of the render pass. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_BeginGPURenderPass */ @@ -427,7 +561,7 @@ typedef enum SDL_GPULoadOp * Specifies how the contents of a texture attached to a render pass are * treated at the end of the render pass. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_BeginGPURenderPass */ @@ -442,7 +576,7 @@ typedef enum SDL_GPUStoreOp /** * Specifies the size of elements in an index buffer. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline */ @@ -526,14 +660,13 @@ typedef enum SDL_GPUIndexElementSize * supported: * * - D16_UNORM - * - Either (but not necessarily both!) D24_UNORM or D32_SFLOAT - * - Either (but not necessarily both!) D24_UNORM_S8_UINT or - * D32_SFLOAT_S8_UINT + * - Either (but not necessarily both!) D24_UNORM or D32_FLOAT + * - Either (but not necessarily both!) D24_UNORM_S8_UINT or D32_FLOAT_S8_UINT * * Unless D16_UNORM is sufficient for your purposes, always check which of * D24/D32 is supported before creating a depth-stencil texture! * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUTexture * \sa SDL_GPUTextureSupportsFormat @@ -679,7 +812,7 @@ typedef enum SDL_GPUTextureFormat * within a compute pass. Note that SIMULTANEOUS usage is only supported by a * limited number of texture formats. * - * \since This datatype is available since SDL 3.1.3 + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_CreateGPUTexture */ @@ -696,7 +829,7 @@ typedef Uint32 SDL_GPUTextureUsageFlags; /** * Specifies the type of a texture. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUTexture */ @@ -715,7 +848,7 @@ typedef enum SDL_GPUTextureType * Used in multisampling. Note that this value only applies when the texture * is used as a render target. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUTexture * \sa SDL_GPUTextureSupportsSampleCount @@ -734,7 +867,7 @@ typedef enum SDL_GPUSampleCount * * Can be passed in as the layer field in texture-related structs. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_GPUCubeMapFace { @@ -755,7 +888,7 @@ typedef enum SDL_GPUCubeMapFace * Unlike textures, READ | WRITE can be used for simultaneous read-write * usage. The same data synchronization concerns as textures apply. * - * \since This datatype is available since SDL 3.1.3 + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_CreateGPUBuffer */ @@ -774,7 +907,7 @@ typedef Uint32 SDL_GPUBufferUsageFlags; * Note that mapping and copying FROM an upload transfer buffer or TO a * download transfer buffer is undefined behavior. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUTransferBuffer */ @@ -787,7 +920,7 @@ typedef enum SDL_GPUTransferBufferUsage /** * Specifies which stage a shader program corresponds to. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUShader */ @@ -802,7 +935,7 @@ typedef enum SDL_GPUShaderStage * * Each format corresponds to a specific backend that accepts it. * - * \since This datatype is available since SDL 3.1.3 + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_CreateGPUShader */ @@ -819,7 +952,7 @@ typedef Uint32 SDL_GPUShaderFormat; /** * Specifies the format of a vertex attribute. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline */ @@ -885,7 +1018,7 @@ typedef enum SDL_GPUVertexElementFormat /** * Specifies the rate at which vertex attributes are pulled from buffers. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline */ @@ -898,7 +1031,7 @@ typedef enum SDL_GPUVertexInputRate /** * Specifies the fill mode of the graphics pipeline. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline */ @@ -911,7 +1044,7 @@ typedef enum SDL_GPUFillMode /** * Specifies the facing direction in which triangle faces will be culled. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline */ @@ -926,7 +1059,7 @@ typedef enum SDL_GPUCullMode * Specifies the vertex winding that will cause a triangle to be determined to * be front-facing. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline */ @@ -939,7 +1072,7 @@ typedef enum SDL_GPUFrontFace /** * Specifies a comparison operator for depth, stencil and sampler operations. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline */ @@ -960,7 +1093,7 @@ typedef enum SDL_GPUCompareOp * Specifies what happens to a stored stencil value if stencil tests fail or * pass. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline */ @@ -984,7 +1117,7 @@ typedef enum SDL_GPUStencilOp * The source color is the value written by the fragment shader. The * destination color is the value currently existing in the texture. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline */ @@ -1005,7 +1138,7 @@ typedef enum SDL_GPUBlendOp * The source color is the value written by the fragment shader. The * destination color is the value currently existing in the texture. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline */ @@ -1030,7 +1163,7 @@ typedef enum SDL_GPUBlendFactor /** * Specifies which color components are written in a graphics pipeline. * - * \since This datatype is available since SDL 3.1.3 + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline */ @@ -1044,7 +1177,7 @@ typedef Uint8 SDL_GPUColorComponentFlags; /** * Specifies a filter operation used by a sampler. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUSampler */ @@ -1057,7 +1190,7 @@ typedef enum SDL_GPUFilter /** * Specifies a mipmap mode used by a sampler. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUSampler */ @@ -1071,7 +1204,7 @@ typedef enum SDL_GPUSamplerMipmapMode * Specifies behavior of texture sampling when the coordinates exceed the 0-1 * range. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateGPUSampler */ @@ -1101,7 +1234,7 @@ typedef enum SDL_GPUSamplerAddressMode * there is a pending image to present, the pending image is replaced by the * new image. Similar to VSYNC, but with reduced visual latency. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_SetGPUSwapchainParameters * \sa SDL_WindowSupportsGPUPresentMode @@ -1124,16 +1257,17 @@ typedef enum SDL_GPUPresentMode * claiming the window if you wish to change the swapchain composition from * SDR. * - * - SDR: B8G8R8A8 or R8G8B8A8 swapchain. Pixel values are in nonlinear sRGB - * encoding. - * - SDR_LINEAR: B8G8R8A8_SRGB or R8G8B8A8_SRGB swapchain. Pixel values are in - * nonlinear sRGB encoding. - * - HDR_EXTENDED_LINEAR: R16G16B16A16_SFLOAT swapchain. Pixel values are in - * extended linear encoding. - * - HDR10_ST2048: A2R10G10B10 or A2B10G10R10 swapchain. Pixel values are in - * PQ ST2048 encoding. + * - SDR: B8G8R8A8 or R8G8B8A8 swapchain. Pixel values are in sRGB encoding. + * - SDR_LINEAR: B8G8R8A8_SRGB or R8G8B8A8_SRGB swapchain. Pixel values are + * stored in memory in sRGB encoding but accessed in shaders in "linear + * sRGB" encoding which is sRGB but with a linear transfer function. + * - HDR_EXTENDED_LINEAR: R16G16B16A16_FLOAT swapchain. Pixel values are in + * extended linear sRGB encoding and permits values outside of the [0, 1] + * range. + * - HDR10_ST2084: A2R10G10B10 or A2B10G10R10 swapchain. Pixel values are in + * BT.2020 ST2084 (PQ) encoding. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. * * \sa SDL_SetGPUSwapchainParameters * \sa SDL_WindowSupportsGPUSwapchainComposition @@ -1144,7 +1278,7 @@ typedef enum SDL_GPUSwapchainComposition SDL_GPU_SWAPCHAINCOMPOSITION_SDR, SDL_GPU_SWAPCHAINCOMPOSITION_SDR_LINEAR, SDL_GPU_SWAPCHAINCOMPOSITION_HDR_EXTENDED_LINEAR, - SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2048 + SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084 } SDL_GPUSwapchainComposition; /* Structures */ @@ -1152,7 +1286,7 @@ typedef enum SDL_GPUSwapchainComposition /** * A structure specifying a viewport. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_SetGPUViewport */ @@ -1170,7 +1304,7 @@ typedef struct SDL_GPUViewport * A structure specifying parameters related to transferring data to or from a * texture. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_UploadToGPUTexture * \sa SDL_DownloadFromGPUTexture @@ -1188,7 +1322,7 @@ typedef struct SDL_GPUTextureTransferInfo * * Used when transferring buffer data to or from a transfer buffer. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_UploadToGPUBuffer * \sa SDL_DownloadFromGPUBuffer @@ -1204,7 +1338,7 @@ typedef struct SDL_GPUTransferBufferLocation * * Used when copying data from one texture to another. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CopyGPUTextureToTexture */ @@ -1223,7 +1357,7 @@ typedef struct SDL_GPUTextureLocation * * Used when transferring data to or from a texture. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_UploadToGPUTexture * \sa SDL_DownloadFromGPUTexture @@ -1244,7 +1378,7 @@ typedef struct SDL_GPUTextureRegion /** * A structure specifying a region of a texture used in the blit operation. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_BlitGPUTexture */ @@ -1264,7 +1398,7 @@ typedef struct SDL_GPUBlitRegion * * Used when copying data between buffers. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CopyGPUBufferToBuffer */ @@ -1279,7 +1413,7 @@ typedef struct SDL_GPUBufferLocation * * Used when transferring data to or from buffers. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_UploadToGPUBuffer * \sa SDL_DownloadFromGPUBuffer @@ -1296,10 +1430,12 @@ typedef struct SDL_GPUBufferRegion * * Note that the `first_vertex` and `first_instance` parameters are NOT * compatible with built-in vertex/instance ID variables in shaders (for - * example, SV_VertexID). If your shader depends on these variables, the - * correlating draw call parameter MUST be 0. + * example, SV_VertexID); GPU APIs and shader languages do not define these + * built-in variables consistently, so if your shader depends on them, the + * only way to keep behavior consistent and portable is to always pass 0 for + * the correlating parameter in the draw calls. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_DrawGPUPrimitivesIndirect */ @@ -1316,10 +1452,12 @@ typedef struct SDL_GPUIndirectDrawCommand * * Note that the `first_vertex` and `first_instance` parameters are NOT * compatible with built-in vertex/instance ID variables in shaders (for - * example, SV_VertexID). If your shader depends on these variables, the - * correlating draw call parameter MUST be 0. + * example, SV_VertexID); GPU APIs and shader languages do not define these + * built-in variables consistently, so if your shader depends on them, the + * only way to keep behavior consistent and portable is to always pass 0 for + * the correlating parameter in the draw calls. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_DrawGPUIndexedPrimitivesIndirect */ @@ -1335,7 +1473,7 @@ typedef struct SDL_GPUIndexedIndirectDrawCommand /** * A structure specifying the parameters of an indexed dispatch command. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_DispatchGPUComputeIndirect */ @@ -1351,7 +1489,7 @@ typedef struct SDL_GPUIndirectDispatchCommand /** * A structure specifying the parameters of a sampler. * - * \since This function is available since SDL 3.1.3 + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateGPUSampler */ @@ -1389,7 +1527,7 @@ typedef struct SDL_GPUSamplerCreateInfo * SDL_GPUVertexAttribute. For example, if an attribute has a buffer_slot of * 0, then that attribute belongs to the vertex buffer bound at slot 0. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GPUVertexAttribute * \sa SDL_GPUVertexInputState @@ -1408,7 +1546,7 @@ typedef struct SDL_GPUVertexBufferDescription * All vertex attribute locations provided to an SDL_GPUVertexInputState must * be unique. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GPUVertexBufferDescription * \sa SDL_GPUVertexInputState @@ -1425,9 +1563,11 @@ typedef struct SDL_GPUVertexAttribute * A structure specifying the parameters of a graphics pipeline vertex input * state. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GPUGraphicsPipelineCreateInfo + * \sa SDL_GPUVertexBufferDescription + * \sa SDL_GPUVertexAttribute */ typedef struct SDL_GPUVertexInputState { @@ -1440,7 +1580,7 @@ typedef struct SDL_GPUVertexInputState /** * A structure specifying the stencil operation state of a graphics pipeline. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GPUDepthStencilState */ @@ -1455,7 +1595,7 @@ typedef struct SDL_GPUStencilOpState /** * A structure specifying the blend state of a color target. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GPUColorTargetDescription */ @@ -1478,7 +1618,7 @@ typedef struct SDL_GPUColorTargetBlendState /** * A structure specifying code and metadata for creating a shader object. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateGPUShader */ @@ -1504,9 +1644,13 @@ typedef struct SDL_GPUShaderCreateInfo * that certain usage combinations are invalid, for example SAMPLER and * GRAPHICS_STORAGE. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateGPUTexture + * \sa SDL_GPUTextureType + * \sa SDL_GPUTextureFormat + * \sa SDL_GPUTextureUsageFlags + * \sa SDL_GPUSampleCount */ typedef struct SDL_GPUTextureCreateInfo { @@ -1528,7 +1672,7 @@ typedef struct SDL_GPUTextureCreateInfo * Usage flags can be bitwise OR'd together for combinations of usages. Note * that certain combinations are invalid, for example VERTEX and INDEX. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateGPUBuffer * \sa SDL_GPUBufferUsageFlags @@ -1544,7 +1688,7 @@ typedef struct SDL_GPUBufferCreateInfo /** * A structure specifying the parameters of a transfer buffer. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateGPUTransferBuffer */ @@ -1567,7 +1711,7 @@ typedef struct SDL_GPUTransferBufferCreateInfo * consider enabling depth clip and then manually clamping depth in your * fragment shaders on Metal and Vulkan. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GPUGraphicsPipelineCreateInfo */ @@ -1589,7 +1733,7 @@ typedef struct SDL_GPURasterizerState * A structure specifying the parameters of the graphics pipeline multisample * state. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GPUGraphicsPipelineCreateInfo */ @@ -1607,7 +1751,7 @@ typedef struct SDL_GPUMultisampleState * A structure specifying the parameters of the graphics pipeline depth * stencil state. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GPUGraphicsPipelineCreateInfo */ @@ -1630,7 +1774,7 @@ typedef struct SDL_GPUDepthStencilState * A structure specifying the parameters of color targets used in a graphics * pipeline. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GPUGraphicsPipelineTargetInfo */ @@ -1644,7 +1788,7 @@ typedef struct SDL_GPUColorTargetDescription * A structure specifying the descriptions of render targets used in a * graphics pipeline. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GPUGraphicsPipelineCreateInfo */ @@ -1662,7 +1806,7 @@ typedef struct SDL_GPUGraphicsPipelineTargetInfo /** * A structure specifying the parameters of a graphics pipeline state. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline * \sa SDL_GPUVertexInputState @@ -1689,7 +1833,7 @@ typedef struct SDL_GPUGraphicsPipelineCreateInfo /** * A structure specifying the parameters of a compute pipeline state. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateGPUComputePipeline */ @@ -1743,7 +1887,7 @@ typedef struct SDL_GPUComputePipelineCreateInfo * stores the multisample texture's contents. Not recommended as it requires * significant memory bandwidth. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_BeginGPURenderPass */ @@ -1804,7 +1948,7 @@ typedef struct SDL_GPUColorTargetInfo * * Note that depth/stencil targets do not support multisample resolves. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_BeginGPURenderPass */ @@ -1825,7 +1969,7 @@ typedef struct SDL_GPUDepthStencilTargetInfo /** * A structure containing parameters for a blit command. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_BlitGPUTexture */ @@ -1847,7 +1991,7 @@ typedef struct SDL_GPUBlitInfo { /** * A structure specifying parameters in a buffer binding call. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_BindGPUVertexBuffers * \sa SDL_BindGPUIndexBuffer @@ -1861,7 +2005,7 @@ typedef struct SDL_GPUBufferBinding /** * A structure specifying parameters in a sampler binding call. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_BindGPUVertexSamplers * \sa SDL_BindGPUFragmentSamplers @@ -1876,7 +2020,7 @@ typedef struct SDL_GPUTextureSamplerBinding * A structure specifying parameters related to binding buffers in a compute * pass. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_BeginGPUComputePass */ @@ -1893,7 +2037,7 @@ typedef struct SDL_GPUStorageBufferReadWriteBinding * A structure specifying parameters related to binding textures in a compute * pass. * - * \since This struct is available since SDL 3.1.3 + * \since This struct is available since SDL 3.2.0. * * \sa SDL_BeginGPUComputePass */ @@ -1921,7 +2065,7 @@ typedef struct SDL_GPUStorageTextureReadWriteBinding * driver. * \returns true if supported, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateGPUDevice */ @@ -1935,7 +2079,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GPUSupportsShaderFormats( * \param props the properties to use. * \returns true if supported, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateGPUDeviceWithProperties */ @@ -1953,7 +2097,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GPUSupportsProperties( * \returns a GPU context on success or NULL on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGPUShaderFormats * \sa SDL_GetGPUDeviceDriver @@ -1985,7 +2129,7 @@ extern SDL_DECLSPEC SDL_GPUDevice *SDLCALL SDL_CreateGPUDevice( * provide SPIR-V shaders if applicable. * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN`: The app is able to * provide DXBC shaders if applicable - * `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN`: The app is able to + * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN`: The app is able to * provide DXIL shaders if applicable. * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN`: The app is able to * provide MSL shaders if applicable. @@ -2001,7 +2145,7 @@ extern SDL_DECLSPEC SDL_GPUDevice *SDLCALL SDL_CreateGPUDevice( * \returns a GPU context on success or NULL on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGPUShaderFormats * \sa SDL_GetGPUDeviceDriver @@ -2027,7 +2171,7 @@ extern SDL_DECLSPEC SDL_GPUDevice *SDLCALL SDL_CreateGPUDeviceWithProperties( * * \param device a GPU Context to destroy. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateGPUDevice */ @@ -2038,7 +2182,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyGPUDevice(SDL_GPUDevice *device); * * \returns the number of built in GPU drivers. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGPUDriver */ @@ -2057,7 +2201,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumGPUDrivers(void); * \param index the index of a GPU driver. * \returns the name of the GPU driver with the given **index**. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumGPUDrivers */ @@ -2069,7 +2213,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGPUDriver(int index); * \param device a GPU context to query. * \returns the name of the device's driver, or NULL on error. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGPUDeviceDriver(SDL_GPUDevice *device); @@ -2080,7 +2224,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGPUDeviceDriver(SDL_GPUDevice *d * \returns a bitflag indicating which shader formats the driver is able to * consume. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_GPUShaderFormat SDLCALL SDL_GetGPUShaderFormats(SDL_GPUDevice *device); @@ -2114,13 +2258,19 @@ extern SDL_DECLSPEC SDL_GPUShaderFormat SDLCALL SDL_GetGPUShaderFormats(SDL_GPUD * - [[texture]]: Sampled textures, followed by read-only storage textures, * followed by read-write storage textures * + * There are optional properties that can be provided through `props`. These + * are the supported properties: + * + * - `SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING`: a name that can be + * displayed in debugging tools. + * * \param device a GPU Context. * \param createinfo a struct describing the state of the compute pipeline to * create. * \returns a compute pipeline object on success, or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindGPUComputePipeline * \sa SDL_ReleaseGPUComputePipeline @@ -2129,16 +2279,24 @@ extern SDL_DECLSPEC SDL_GPUComputePipeline *SDLCALL SDL_CreateGPUComputePipeline SDL_GPUDevice *device, const SDL_GPUComputePipelineCreateInfo *createinfo); +#define SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING "SDL.gpu.computepipeline.create.name" + /** * Creates a pipeline object to be used in a graphics workflow. * + * There are optional properties that can be provided through `props`. These + * are the supported properties: + * + * - `SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING`: a name that can be + * displayed in debugging tools. + * * \param device a GPU Context. * \param createinfo a struct describing the state of the graphics pipeline to * create. * \returns a graphics pipeline object on success, or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateGPUShader * \sa SDL_BindGPUGraphicsPipeline @@ -2148,16 +2306,24 @@ extern SDL_DECLSPEC SDL_GPUGraphicsPipeline *SDLCALL SDL_CreateGPUGraphicsPipeli SDL_GPUDevice *device, const SDL_GPUGraphicsPipelineCreateInfo *createinfo); +#define SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING "SDL.gpu.graphicspipeline.create.name" + /** * Creates a sampler object to be used when binding textures in a graphics * workflow. * + * There are optional properties that can be provided through `props`. These + * are the supported properties: + * + * - `SDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING`: a name that can be displayed + * in debugging tools. + * * \param device a GPU Context. * \param createinfo a struct describing the state of the sampler to create. * \returns a sampler object on success, or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BindGPUVertexSamplers * \sa SDL_BindGPUFragmentSamplers @@ -2167,6 +2333,8 @@ extern SDL_DECLSPEC SDL_GPUSampler *SDLCALL SDL_CreateGPUSampler( SDL_GPUDevice *device, const SDL_GPUSamplerCreateInfo *createinfo); +#define SDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING "SDL.gpu.sampler.create.name" + /** * Creates a shader to be used when creating a graphics pipeline. * @@ -2224,12 +2392,18 @@ extern SDL_DECLSPEC SDL_GPUSampler *SDLCALL SDL_CreateGPUSampler( * SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING with * SDL_CreateGPUDeviceWithProperties(). * + * There are optional properties that can be provided through `props`. These + * are the supported properties: + * + * - `SDL_PROP_GPU_SHADER_CREATE_NAME_STRING`: a name that can be displayed in + * debugging tools. + * * \param device a GPU Context. * \param createinfo a struct describing the state of the shader to create. * \returns a shader object on success, or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateGPUGraphicsPipeline * \sa SDL_ReleaseGPUShader @@ -2238,6 +2412,8 @@ extern SDL_DECLSPEC SDL_GPUShader *SDLCALL SDL_CreateGPUShader( SDL_GPUDevice *device, const SDL_GPUShaderCreateInfo *createinfo); +#define SDL_PROP_GPU_SHADER_CREATE_NAME_STRING "SDL.gpu.shader.create.name" + /** * Creates a texture object to be used in graphics or compute workflows. * @@ -2254,34 +2430,33 @@ extern SDL_DECLSPEC SDL_GPUShader *SDLCALL SDL_CreateGPUShader( * There are optional properties that can be provided through * SDL_GPUTextureCreateInfo's `props`. These are the supported properties: * - * - `SDL_PROP_PROCESS_CREATE_ARGS_POINTER`: an array of strings containing - * the program to run, any arguments, and a NULL pointer, e.g. const char - * *args[] = { "myprogram", "argument", NULL }. This is a required property. - * - `SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_R_FLOAT`: (Direct3D 12 only) if + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT`: (Direct3D 12 only) if * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture * to a color with this red intensity. Defaults to zero. - * - `SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_G_FLOAT`: (Direct3D 12 only) if + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT`: (Direct3D 12 only) if * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture * to a color with this green intensity. Defaults to zero. - * - `SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_B_FLOAT`: (Direct3D 12 only) if + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT`: (Direct3D 12 only) if * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture * to a color with this blue intensity. Defaults to zero. - * - `SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_A_FLOAT`: (Direct3D 12 only) if + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT`: (Direct3D 12 only) if * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture * to a color with this alpha intensity. Defaults to zero. - * - `SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_DEPTH_FLOAT`: (Direct3D 12 only) + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT`: (Direct3D 12 only) * if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, clear * the texture to a depth of this value. Defaults to zero. - * - `SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_STENCIL_UINT8`: (Direct3D 12 + * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_UINT8`: (Direct3D 12 * only) if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, * clear the texture to a stencil of this value. Defaults to zero. + * - `SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING`: a name that can be displayed + * in debugging tools. * * \param device a GPU Context. * \param createinfo a struct describing the state of the texture to create. * \returns a texture object on success, or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_UploadToGPUTexture * \sa SDL_DownloadFromGPUTexture @@ -2298,13 +2473,13 @@ extern SDL_DECLSPEC SDL_GPUTexture *SDLCALL SDL_CreateGPUTexture( SDL_GPUDevice *device, const SDL_GPUTextureCreateInfo *createinfo); -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_R_FLOAT "SDL.gpu.createtexture.d3d12.clear.r" -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_G_FLOAT "SDL.gpu.createtexture.d3d12.clear.g" -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_B_FLOAT "SDL.gpu.createtexture.d3d12.clear.b" -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_A_FLOAT "SDL.gpu.createtexture.d3d12.clear.a" -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_DEPTH_FLOAT "SDL.gpu.createtexture.d3d12.clear.depth" -#define SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_STENCIL_UINT8 "SDL.gpu.createtexture.d3d12.clear.stencil" - +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT "SDL.gpu.texture.create.d3d12.clear.r" +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT "SDL.gpu.texture.create.d3d12.clear.g" +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT "SDL.gpu.texture.create.d3d12.clear.b" +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT "SDL.gpu.texture.create.d3d12.clear.a" +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT "SDL.gpu.texture.create.d3d12.clear.depth" +#define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_UINT8 "SDL.gpu.texture.create.d3d12.clear.stencil" +#define SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING "SDL.gpu.texture.create.name" /** * Creates a buffer object to be used in graphics or compute workflows. @@ -2320,14 +2495,19 @@ extern SDL_DECLSPEC SDL_GPUTexture *SDLCALL SDL_CreateGPUTexture( * [this blog post](https://moonside.games/posts/sdl-gpu-concepts-cycling/) * . * + * There are optional properties that can be provided through `props`. These + * are the supported properties: + * + * - `SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING`: a name that can be displayed in + * debugging tools. + * * \param device a GPU Context. * \param createinfo a struct describing the state of the buffer to create. * \returns a buffer object on success, or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * - * \sa SDL_SetGPUBufferName * \sa SDL_UploadToGPUBuffer * \sa SDL_DownloadFromGPUBuffer * \sa SDL_CopyGPUBufferToBuffer @@ -2345,6 +2525,8 @@ extern SDL_DECLSPEC SDL_GPUBuffer *SDLCALL SDL_CreateGPUBuffer( SDL_GPUDevice *device, const SDL_GPUBufferCreateInfo *createinfo); +#define SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING "SDL.gpu.buffer.create.name" + /** * Creates a transfer buffer to be used when uploading to or downloading from * graphics resources. @@ -2352,13 +2534,19 @@ extern SDL_DECLSPEC SDL_GPUBuffer *SDLCALL SDL_CreateGPUBuffer( * Download buffers can be particularly expensive to create, so it is good * practice to reuse them if data will be downloaded regularly. * + * There are optional properties that can be provided through `props`. These + * are the supported properties: + * + * - `SDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING`: a name that can be + * displayed in debugging tools. + * * \param device a GPU Context. * \param createinfo a struct describing the state of the transfer buffer to * create. * \returns a transfer buffer on success, or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_UploadToGPUBuffer * \sa SDL_DownloadFromGPUBuffer @@ -2370,18 +2558,26 @@ extern SDL_DECLSPEC SDL_GPUTransferBuffer *SDLCALL SDL_CreateGPUTransferBuffer( SDL_GPUDevice *device, const SDL_GPUTransferBufferCreateInfo *createinfo); +#define SDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING "SDL.gpu.transferbuffer.create.name" + /* Debug Naming */ /** * Sets an arbitrary string constant to label a buffer. * - * Useful for debugging. + * You should use SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING with + * SDL_CreateGPUBuffer instead of this function to avoid thread safety issues. * * \param device a GPU Context. * \param buffer a buffer to attach the name to. * \param text a UTF-8 string constant to mark as the name of the buffer. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe, you must make sure the + * buffer is not simultaneously used by any other thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUBuffer */ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUBufferName( SDL_GPUDevice *device, @@ -2391,13 +2587,20 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUBufferName( /** * Sets an arbitrary string constant to label a texture. * - * Useful for debugging. + * You should use SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING with + * SDL_CreateGPUTexture instead of this function to avoid thread safety + * issues. * * \param device a GPU Context. * \param texture a texture to attach the name to. * \param text a UTF-8 string constant to mark as the name of the texture. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe, you must make sure the + * texture is not simultaneously used by any other thread. + * + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_CreateGPUTexture */ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUTextureName( SDL_GPUDevice *device, @@ -2412,7 +2615,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUTextureName( * \param command_buffer a command buffer. * \param text a UTF-8 string constant to insert as the label. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_InsertGPUDebugLabel( SDL_GPUCommandBuffer *command_buffer, @@ -2435,7 +2638,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_InsertGPUDebugLabel( * \param command_buffer a command buffer. * \param name a UTF-8 string constant that names the group. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PopGPUDebugGroup */ @@ -2448,7 +2651,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUDebugGroup( * * \param command_buffer a command buffer. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PushGPUDebugGroup */ @@ -2465,7 +2668,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_PopGPUDebugGroup( * \param device a GPU context. * \param texture a texture to be destroyed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTexture( SDL_GPUDevice *device, @@ -2479,7 +2682,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTexture( * \param device a GPU context. * \param sampler a sampler to be destroyed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUSampler( SDL_GPUDevice *device, @@ -2493,7 +2696,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUSampler( * \param device a GPU context. * \param buffer a buffer to be destroyed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUBuffer( SDL_GPUDevice *device, @@ -2507,7 +2710,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUBuffer( * \param device a GPU context. * \param transfer_buffer a transfer buffer to be destroyed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTransferBuffer( SDL_GPUDevice *device, @@ -2521,7 +2724,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTransferBuffer( * \param device a GPU context. * \param compute_pipeline a compute pipeline to be destroyed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUComputePipeline( SDL_GPUDevice *device, @@ -2535,7 +2738,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUComputePipeline( * \param device a GPU context. * \param shader a shader to be destroyed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUShader( SDL_GPUDevice *device, @@ -2549,7 +2752,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUShader( * \param device a GPU context. * \param graphics_pipeline a graphics pipeline to be destroyed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUGraphicsPipeline( SDL_GPUDevice *device, @@ -2563,11 +2766,18 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUGraphicsPipeline( * acquired on. The command buffer should be submitted on the thread it was * acquired on. * + * It is valid to acquire multiple command buffers on the same thread at once. + * In fact a common design pattern is to acquire two command buffers per frame + * where one is dedicated to render and compute passes and the other is + * dedicated to copy passes and other preparatory work such as generating + * mipmaps. Interleaving commands between the two command buffers reduces the + * total amount of passes overall which improves rendering performance. + * * \param device a GPU context. * \returns a command buffer, or NULL on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SubmitGPUCommandBuffer * \sa SDL_SubmitGPUCommandBufferAndAcquireFence @@ -2575,25 +2785,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUGraphicsPipeline( extern SDL_DECLSPEC SDL_GPUCommandBuffer *SDLCALL SDL_AcquireGPUCommandBuffer( SDL_GPUDevice *device); -/* - * UNIFORM DATA - * - * Uniforms are for passing data to shaders. - * The uniform data will be constant across all executions of the shader. - * - * There are 4 available uniform slots per shader stage (vertex, fragment, compute). - * Uniform data pushed to a slot on a stage keeps its value throughout the command buffer - * until you call the relevant Push function on that slot again. - * - * For example, you could write your vertex shaders to read a camera matrix from uniform binding slot 0, - * push the camera matrix at the start of the command buffer, and that data will be used for every - * subsequent draw call. - * - * It is valid to push uniform data during a render or compute pass. - * - * Uniforms are best for pushing small amounts of data. - * If you are pushing more than a matrix or two per call you should consider using a storage buffer instead. - */ +/* Uniform Data */ /** * Pushes data to a vertex uniform slot on the command buffer. @@ -2605,7 +2797,7 @@ extern SDL_DECLSPEC SDL_GPUCommandBuffer *SDLCALL SDL_AcquireGPUCommandBuffer( * \param data client data to write. * \param length the length of the data to write. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUVertexUniformData( SDL_GPUCommandBuffer *command_buffer, @@ -2623,7 +2815,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUVertexUniformData( * \param data client data to write. * \param length the length of the data to write. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUFragmentUniformData( SDL_GPUCommandBuffer *command_buffer, @@ -2641,7 +2833,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUFragmentUniformData( * \param data client data to write. * \param length the length of the data to write. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUComputeUniformData( SDL_GPUCommandBuffer *command_buffer, @@ -2649,45 +2841,6 @@ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUComputeUniformData( const void *data, Uint32 length); -/* - * A NOTE ON CYCLING - * - * When using a command buffer, operations do not occur immediately - - * they occur some time after the command buffer is submitted. - * - * When a resource is used in a pending or active command buffer, it is considered to be "bound". - * When a resource is no longer used in any pending or active command buffers, it is considered to be "unbound". - * - * If data resources are bound, it is unspecified when that data will be unbound - * unless you acquire a fence when submitting the command buffer and wait on it. - * However, this doesn't mean you need to track resource usage manually. - * - * All of the functions and structs that involve writing to a resource have a "cycle" bool. - * GPUTransferBuffer, GPUBuffer, and GPUTexture all effectively function as ring buffers on internal resources. - * When cycle is true, if the resource is bound, the cycle rotates to the next unbound internal resource, - * or if none are available, a new one is created. - * This means you don't have to worry about complex state tracking and synchronization as long as cycling is correctly employed. - * - * For example: you can call MapTransferBuffer, write texture data, UnmapTransferBuffer, and then UploadToTexture. - * The next time you write texture data to the transfer buffer, if you set the cycle param to true, you don't have - * to worry about overwriting any data that is not yet uploaded. - * - * Another example: If you are using a texture in a render pass every frame, this can cause a data dependency between frames. - * If you set cycle to true in the SDL_GPUColorTargetInfo struct, you can prevent this data dependency. - * - * Cycling will never undefine already bound data. - * When cycling, all data in the resource is considered to be undefined for subsequent commands until that data is written again. - * You must take care not to read undefined data. - * - * Note that when cycling a texture, the entire texture will be cycled, - * even if only part of the texture is used in the call, - * so you must consider the entire texture to contain undefined data after cycling. - * - * You must also take care not to overwrite a section of data that has been referenced in a command without cycling first. - * It is OK to overwrite unreferenced data in a bound resource without cycling, - * but overwriting a section of data that has already been referenced will produce unexpected results. - */ - /* Graphics State */ /** @@ -2711,7 +2864,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUComputeUniformData( * NULL. * \returns a render pass handle. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_EndGPURenderPass */ @@ -2729,7 +2882,7 @@ extern SDL_DECLSPEC SDL_GPURenderPass *SDLCALL SDL_BeginGPURenderPass( * \param render_pass a render pass handle. * \param graphics_pipeline the graphics pipeline to bind. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUGraphicsPipeline( SDL_GPURenderPass *render_pass, @@ -2741,7 +2894,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUGraphicsPipeline( * \param render_pass a render pass handle. * \param viewport the viewport to set. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUViewport( SDL_GPURenderPass *render_pass, @@ -2753,7 +2906,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUViewport( * \param render_pass a render pass handle. * \param scissor the scissor area to set. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUScissor( SDL_GPURenderPass *render_pass, @@ -2765,7 +2918,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUScissor( * \param render_pass a render pass handle. * \param blend_constants the blend constant color. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GPU_BLENDFACTOR_CONSTANT_COLOR * \sa SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR @@ -2780,7 +2933,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUBlendConstants( * \param render_pass a render pass handle. * \param reference the stencil reference value to set. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUStencilReference( SDL_GPURenderPass *render_pass, @@ -2796,7 +2949,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUStencilReference( * buffers and offset values. * \param num_bindings the number of bindings in the bindings array. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexBuffers( SDL_GPURenderPass *render_pass, @@ -2813,7 +2966,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexBuffers( * \param index_element_size whether the index values in the buffer are 16- or * 32-bit. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUIndexBuffer( SDL_GPURenderPass *render_pass, @@ -2832,7 +2985,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUIndexBuffer( * \param num_bindings the number of texture-sampler pairs to bind from the * array. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexSamplers( SDL_GPURenderPass *render_pass, @@ -2851,7 +3004,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexSamplers( * \param storage_textures an array of storage textures. * \param num_bindings the number of storage texture to bind from the array. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexStorageTextures( SDL_GPURenderPass *render_pass, @@ -2870,7 +3023,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexStorageTextures( * \param storage_buffers an array of buffers. * \param num_bindings the number of buffers to bind from the array. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexStorageBuffers( SDL_GPURenderPass *render_pass, @@ -2890,7 +3043,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexStorageBuffers( * \param num_bindings the number of texture-sampler pairs to bind from the * array. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentSamplers( SDL_GPURenderPass *render_pass, @@ -2909,7 +3062,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentSamplers( * \param storage_textures an array of storage textures. * \param num_bindings the number of storage textures to bind from the array. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentStorageTextures( SDL_GPURenderPass *render_pass, @@ -2928,7 +3081,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentStorageTextures( * \param storage_buffers an array of storage buffers. * \param num_bindings the number of storage buffers to bind from the array. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentStorageBuffers( SDL_GPURenderPass *render_pass, @@ -2946,8 +3099,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentStorageBuffers( * * Note that the `first_vertex` and `first_instance` parameters are NOT * compatible with built-in vertex/instance ID variables in shaders (for - * example, SV_VertexID). If your shader depends on these variables, the - * correlating draw call parameter MUST be 0. + * example, SV_VertexID); GPU APIs and shader languages do not define these + * built-in variables consistently, so if your shader depends on them, the + * only way to keep behavior consistent and portable is to always pass 0 for + * the correlating parameter in the draw calls. * * \param render_pass a render pass handle. * \param num_indices the number of indices to draw per instance. @@ -2957,7 +3112,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentStorageBuffers( * vertex buffer. * \param first_instance the ID of the first instance to draw. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUIndexedPrimitives( SDL_GPURenderPass *render_pass, @@ -2974,8 +3129,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUIndexedPrimitives( * * Note that the `first_vertex` and `first_instance` parameters are NOT * compatible with built-in vertex/instance ID variables in shaders (for - * example, SV_VertexID). If your shader depends on these variables, the - * correlating draw call parameter MUST be 0. + * example, SV_VertexID); GPU APIs and shader languages do not define these + * built-in variables consistently, so if your shader depends on them, the + * only way to keep behavior consistent and portable is to always pass 0 for + * the correlating parameter in the draw calls. * * \param render_pass a render pass handle. * \param num_vertices the number of vertices to draw. @@ -2983,7 +3140,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUIndexedPrimitives( * \param first_vertex the index of the first vertex to draw. * \param first_instance the ID of the first instance to draw. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUPrimitives( SDL_GPURenderPass *render_pass, @@ -3006,7 +3163,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUPrimitives( * \param draw_count the number of draw parameter sets that should be read * from the draw buffer. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUPrimitivesIndirect( SDL_GPURenderPass *render_pass, @@ -3028,7 +3185,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUPrimitivesIndirect( * \param draw_count the number of draw parameter sets that should be read * from the draw buffer. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUIndexedPrimitivesIndirect( SDL_GPURenderPass *render_pass, @@ -3044,7 +3201,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUIndexedPrimitivesIndirect( * * \param render_pass a render pass handle. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_EndGPURenderPass( SDL_GPURenderPass *render_pass); @@ -3084,7 +3241,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_EndGPURenderPass( * from the array. * \returns a compute pass handle. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_EndGPUComputePass */ @@ -3101,7 +3258,7 @@ extern SDL_DECLSPEC SDL_GPUComputePass *SDLCALL SDL_BeginGPUComputePass( * \param compute_pass a compute pass handle. * \param compute_pipeline a compute pipeline to bind. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputePipeline( SDL_GPUComputePass *compute_pass, @@ -3119,7 +3276,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputePipeline( * \param num_bindings the number of texture-sampler bindings to bind from the * array. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeSamplers( SDL_GPUComputePass *compute_pass, @@ -3138,7 +3295,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeSamplers( * \param storage_textures an array of storage textures. * \param num_bindings the number of storage textures to bind from the array. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageTextures( SDL_GPUComputePass *compute_pass, @@ -3157,7 +3314,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageTextures( * \param storage_buffers an array of storage buffer binding structs. * \param num_bindings the number of storage buffers to bind from the array. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageBuffers( SDL_GPUComputePass *compute_pass, @@ -3183,7 +3340,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageBuffers( * \param groupcount_z number of local workgroups to dispatch in the Z * dimension. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUCompute( SDL_GPUComputePass *compute_pass, @@ -3207,7 +3364,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUCompute( * \param buffer a buffer containing dispatch parameters. * \param offset the offset to start reading from the dispatch buffer. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUComputeIndirect( SDL_GPUComputePass *compute_pass, @@ -3222,7 +3379,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUComputeIndirect( * * \param compute_pass a compute pass handle. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_EndGPUComputePass( SDL_GPUComputePass *compute_pass); @@ -3240,7 +3397,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_EndGPUComputePass( * \returns the address of the mapped transfer buffer memory, or NULL on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void *SDLCALL SDL_MapGPUTransferBuffer( SDL_GPUDevice *device, @@ -3253,7 +3410,7 @@ extern SDL_DECLSPEC void *SDLCALL SDL_MapGPUTransferBuffer( * \param device a GPU context. * \param transfer_buffer a previously mapped transfer buffer. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UnmapGPUTransferBuffer( SDL_GPUDevice *device, @@ -3271,7 +3428,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnmapGPUTransferBuffer( * \param command_buffer a command buffer. * \returns a copy pass handle. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_GPUCopyPass *SDLCALL SDL_BeginGPUCopyPass( SDL_GPUCommandBuffer *command_buffer); @@ -3291,7 +3448,7 @@ extern SDL_DECLSPEC SDL_GPUCopyPass *SDLCALL SDL_BeginGPUCopyPass( * \param cycle if true, cycles the texture if the texture is bound, otherwise * overwrites the data. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUTexture( SDL_GPUCopyPass *copy_pass, @@ -3299,8 +3456,6 @@ extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUTexture( const SDL_GPUTextureRegion *destination, bool cycle); -/* Uploads data from a TransferBuffer to a Buffer. */ - /** * Uploads data from a transfer buffer to a buffer. * @@ -3313,7 +3468,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUTexture( * \param cycle if true, cycles the buffer if it is already bound, otherwise * overwrites the data. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUBuffer( SDL_GPUCopyPass *copy_pass, @@ -3336,7 +3491,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUBuffer( * \param cycle if true, cycles the destination texture if the destination * texture is bound, otherwise overwrites the data. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUTextureToTexture( SDL_GPUCopyPass *copy_pass, @@ -3347,8 +3502,6 @@ extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUTextureToTexture( Uint32 d, bool cycle); -/* Copies data from a buffer to a buffer. */ - /** * Performs a buffer-to-buffer copy. * @@ -3362,7 +3515,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUTextureToTexture( * \param cycle if true, cycles the destination buffer if it is already bound, * otherwise overwrites the data. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUBufferToBuffer( SDL_GPUCopyPass *copy_pass, @@ -3382,7 +3535,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUBufferToBuffer( * \param destination the destination transfer buffer with image layout * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DownloadFromGPUTexture( SDL_GPUCopyPass *copy_pass, @@ -3399,7 +3552,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DownloadFromGPUTexture( * \param source the source buffer with offset and size. * \param destination the destination transfer buffer with offset. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_DownloadFromGPUBuffer( SDL_GPUCopyPass *copy_pass, @@ -3411,7 +3564,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DownloadFromGPUBuffer( * * \param copy_pass a copy pass handle. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_EndGPUCopyPass( SDL_GPUCopyPass *copy_pass); @@ -3424,7 +3577,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_EndGPUCopyPass( * \param command_buffer a command_buffer. * \param texture a texture with more than 1 mip level. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_GenerateMipmapsForGPUTexture( SDL_GPUCommandBuffer *command_buffer, @@ -3438,7 +3591,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GenerateMipmapsForGPUTexture( * \param command_buffer a command buffer. * \param info the blit info struct containing the blit parameters. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_BlitGPUTexture( SDL_GPUCommandBuffer *command_buffer, @@ -3456,7 +3609,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BlitGPUTexture( * \param swapchain_composition the swapchain composition to check. * \returns true if supported, false if unsupported. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClaimWindowForGPUDevice */ @@ -3475,7 +3628,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WindowSupportsGPUSwapchainComposition( * \param present_mode the presentation mode to check. * \returns true if supported, false if unsupported. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClaimWindowForGPUDevice */ @@ -3504,7 +3657,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WindowSupportsGPUPresentMode( * \threadsafety This function should only be called from the thread that * created the window. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_WaitAndAcquireGPUSwapchainTexture * \sa SDL_ReleaseWindowFromGPUDevice @@ -3521,7 +3674,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ClaimWindowForGPUDevice( * \param device a GPU context. * \param window an SDL_Window that has been claimed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClaimWindowForGPUDevice */ @@ -3547,7 +3700,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseWindowFromGPUDevice( * \returns true if successful, false on error; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_WindowSupportsGPUPresentMode * \sa SDL_WindowSupportsGPUSwapchainComposition @@ -3596,7 +3749,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetGPUAllowedFramesInFlight( * \param window an SDL_Window that has been claimed. * \returns the texture format of the swapchain. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_GPUTextureFormat SDLCALL SDL_GetGPUSwapchainTextureFormat( SDL_GPUDevice *device, @@ -3637,7 +3790,7 @@ extern SDL_DECLSPEC SDL_GPUTextureFormat SDLCALL SDL_GetGPUSwapchainTextureForma * \threadsafety This function should only be called from the thread that * created the window. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ClaimWindowForGPUDevice * \sa SDL_SubmitGPUCommandBuffer @@ -3735,7 +3888,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WaitAndAcquireGPUSwapchainTexture( * \returns true on success, false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AcquireGPUCommandBuffer * \sa SDL_WaitAndAcquireGPUSwapchainTexture @@ -3761,7 +3914,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SubmitGPUCommandBuffer( * \returns a fence associated with the command buffer, or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AcquireGPUCommandBuffer * \sa SDL_WaitAndAcquireGPUSwapchainTexture @@ -3788,7 +3941,7 @@ extern SDL_DECLSPEC SDL_GPUFence *SDLCALL SDL_SubmitGPUCommandBufferAndAcquireFe * \returns true on success, false on error; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.6. + * \since This function is available since SDL 3.2.0. * * \sa SDL_WaitAndAcquireGPUSwapchainTexture * \sa SDL_AcquireGPUCommandBuffer @@ -3804,7 +3957,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CancelGPUCommandBuffer( * \returns true on success, false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_WaitForGPUFences */ @@ -3822,7 +3975,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WaitForGPUIdle( * \returns true on success, false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SubmitGPUCommandBufferAndAcquireFence * \sa SDL_WaitForGPUIdle @@ -3840,7 +3993,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WaitForGPUFences( * \param fence a fence. * \returns true if the fence is signaled, false if it is not. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SubmitGPUCommandBufferAndAcquireFence */ @@ -3854,7 +4007,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_QueryGPUFence( * \param device a GPU context. * \param fence a fence. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SubmitGPUCommandBufferAndAcquireFence */ @@ -3870,7 +4023,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUFence( * \param format the texture format you want to know the texel size of. * \returns the texel block size of the texture format. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_UploadToGPUTexture */ @@ -3887,7 +4040,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GPUTextureFormatTexelBlockSize( * \param usage a bitmask of all usage scenarios to check. * \returns whether the texture format is supported for this type and usage. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GPUTextureSupportsFormat( SDL_GPUDevice *device, @@ -3903,7 +4056,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GPUTextureSupportsFormat( * \param sample_count the sample count to check. * \returns a hardware-specific version of min(preferred, possible). * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GPUTextureSupportsSampleCount( SDL_GPUDevice *device, @@ -3919,7 +4072,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GPUTextureSupportsSampleCount( * \param depth_or_layer_count depth for 3D textures or layer count otherwise. * \returns the size of a texture with this format and dimensions. * - * \since This function is available since SDL 3.1.6. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_CalculateGPUTextureFormatSize( SDL_GPUTextureFormat format, @@ -3938,7 +4091,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_CalculateGPUTextureFormatSize( * * \param device a GPU context. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddEventWatch */ @@ -3953,7 +4106,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GDKSuspendGPU(SDL_GPUDevice *device); * * \param device a GPU context. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddEventWatch */ diff --git a/libs/SDL3/include/SDL3/SDL_guid.h b/libs/SDL3/include/SDL3/SDL_guid.h index 2f464c67..e2f32ffc 100644 --- a/libs/SDL3/include/SDL3/SDL_guid.h +++ b/libs/SDL3/include/SDL3/SDL_guid.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -56,7 +56,7 @@ extern "C" { * GUIDs may be platform-dependent (i.e., the same device may report different * GUIDs on different operating systems). * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_GUID { Uint8 data[16]; @@ -71,7 +71,7 @@ typedef struct SDL_GUID { * \param pszGUID buffer in which to write the ASCII string. * \param cbGUID the size of pszGUID, should be at least 33 bytes. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StringToGUID */ @@ -87,7 +87,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GUIDToString(SDL_GUID guid, char *pszGUID, * \param pchGUID string containing an ASCII representation of a GUID. * \returns a SDL_GUID structure. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GUIDToString */ diff --git a/libs/SDL3/include/SDL3/SDL_haptic.h b/libs/SDL3/include/SDL3/SDL_haptic.h index 533f3bce..a45335b2 100644 --- a/libs/SDL3/include/SDL3/SDL_haptic.h +++ b/libs/SDL3/include/SDL3/SDL_haptic.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -141,7 +141,7 @@ extern "C" { /** * The haptic structure used to identify an SDL haptic. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_OpenHaptic * \sa SDL_OpenHapticFromJoystick @@ -167,7 +167,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Constant haptic effect. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticCondition */ @@ -178,7 +178,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Periodic haptic effect that simulates sine waves. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticPeriodic */ @@ -189,7 +189,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Periodic haptic effect that simulates square waves. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticPeriodic */ @@ -200,7 +200,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Periodic haptic effect that simulates triangular waves. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticPeriodic */ @@ -211,7 +211,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Periodic haptic effect that simulates saw tooth up waves. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticPeriodic */ @@ -222,7 +222,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Periodic haptic effect that simulates saw tooth down waves. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticPeriodic */ @@ -233,7 +233,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Ramp haptic effect. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticRamp */ @@ -245,7 +245,7 @@ typedef struct SDL_Haptic SDL_Haptic; * Condition haptic effect that simulates a spring. Effect is based on the * axes position. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticCondition */ @@ -257,7 +257,7 @@ typedef struct SDL_Haptic SDL_Haptic; * Condition haptic effect that simulates dampening. Effect is based on the * axes velocity. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticCondition */ @@ -269,7 +269,7 @@ typedef struct SDL_Haptic SDL_Haptic; * Condition haptic effect that simulates inertia. Effect is based on the axes * acceleration. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticCondition */ @@ -281,7 +281,7 @@ typedef struct SDL_Haptic SDL_Haptic; * Condition haptic effect that simulates friction. Effect is based on the * axes movement. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticCondition */ @@ -292,7 +292,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Haptic effect for direct control over high/low frequency motors. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticLeftRight */ @@ -301,21 +301,21 @@ typedef struct SDL_Haptic SDL_Haptic; /** * Reserved for future use. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_HAPTIC_RESERVED1 (1u<<12) /** * Reserved for future use. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_HAPTIC_RESERVED2 (1u<<13) /** * Reserved for future use. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_HAPTIC_RESERVED3 (1u<<14) @@ -324,7 +324,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * User defined custom haptic effect. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_HAPTIC_CUSTOM (1u<<15) @@ -337,7 +337,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Device supports setting the global gain. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SetHapticGain */ @@ -348,7 +348,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Device supports setting autocenter. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SetHapticAutocenter */ @@ -359,7 +359,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Device supports querying effect status. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_GetHapticEffectStatus */ @@ -370,7 +370,7 @@ typedef struct SDL_Haptic SDL_Haptic; * * Devices supports being paused. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_PauseHaptic * \sa SDL_ResumeHaptic @@ -386,7 +386,7 @@ typedef struct SDL_Haptic SDL_Haptic; /** * Uses polar coordinates for the direction. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticDirection */ @@ -395,7 +395,7 @@ typedef struct SDL_Haptic SDL_Haptic; /** * Uses cartesian coordinates for the direction. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticDirection */ @@ -404,7 +404,7 @@ typedef struct SDL_Haptic SDL_Haptic; /** * Uses spherical coordinates for the direction. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticDirection */ @@ -416,7 +416,7 @@ typedef struct SDL_Haptic SDL_Haptic; * This provides better compatibility across platforms and devices as SDL will * guess the correct axis. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_HapticDirection */ @@ -433,7 +433,7 @@ typedef struct SDL_Haptic SDL_Haptic; /** * Used to play a device an infinite number of times. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_RunHapticEffect */ @@ -534,7 +534,7 @@ typedef struct SDL_Haptic SDL_Haptic; * direction.dir[0] = 9000; // Since we only have two axes we don't need more parameters. * ``` * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_POLAR * \sa SDL_HAPTIC_CARTESIAN @@ -558,7 +558,7 @@ typedef struct SDL_HapticDirection * A constant effect applies a constant force in the specified direction to * the joystick. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_CONSTANT * \sa SDL_HapticEffect @@ -640,7 +640,7 @@ typedef struct SDL_HapticConstant * \| \| \| \| \| \| \| * ``` * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_SINE * \sa SDL_HAPTIC_SQUARE @@ -696,7 +696,7 @@ typedef struct SDL_HapticPeriodic * SDL_HapticDirection diagram for which side is positive and which is * negative. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HapticDirection * \sa SDL_HAPTIC_SPRING @@ -710,7 +710,7 @@ typedef struct SDL_HapticCondition /* Header */ Uint16 type; /**< SDL_HAPTIC_SPRING, SDL_HAPTIC_DAMPER, SDL_HAPTIC_INERTIA or SDL_HAPTIC_FRICTION */ - SDL_HapticDirection direction; /**< Direction of the effect - Not used ATM. */ + SDL_HapticDirection direction; /**< Direction of the effect. */ /* Replay */ Uint32 length; /**< Duration of the effect. */ @@ -739,7 +739,7 @@ typedef struct SDL_HapticCondition * effects get added to the ramp effect making the effect become quadratic * instead of linear. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_RAMP * \sa SDL_HapticEffect @@ -778,7 +778,7 @@ typedef struct SDL_HapticRamp * motors, commonly found in modern game controllers. The small (right) motor * is high frequency, and the large (left) motor is low frequency. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_LEFTRIGHT * \sa SDL_HapticEffect @@ -808,7 +808,7 @@ typedef struct SDL_HapticLeftRight * If channels is one, the effect is rotated using the defined direction. * Otherwise it uses the samples in data for the different axes. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HAPTIC_CUSTOM * \sa SDL_HapticEffect @@ -903,7 +903,7 @@ typedef struct SDL_HapticCustom * Note either the attack_level or the fade_level may be above the actual * effect level. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_HapticConstant * \sa SDL_HapticPeriodic @@ -932,7 +932,7 @@ typedef union SDL_HapticEffect * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_HapticID; @@ -948,7 +948,7 @@ typedef Uint32 SDL_HapticID; * failure; call SDL_GetError() for more information. This should be * freed with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenHaptic */ @@ -964,7 +964,7 @@ extern SDL_DECLSPEC SDL_HapticID * SDLCALL SDL_GetHaptics(int *count); * this function returns NULL; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticName * \sa SDL_OpenHaptic @@ -985,7 +985,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetHapticNameForID(SDL_HapticID ins * \returns the device identifier or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseHaptic * \sa SDL_GetHaptics @@ -1004,7 +1004,7 @@ extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_OpenHaptic(SDL_HapticID instance_id * \returns an SDL_Haptic on success or NULL on failure or if it hasn't been * opened yet; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_GetHapticFromID(SDL_HapticID instance_id); @@ -1015,7 +1015,7 @@ extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_GetHapticFromID(SDL_HapticID instan * \returns the instance ID of the specified haptic device on success or 0 on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_HapticID SDLCALL SDL_GetHapticID(SDL_Haptic *haptic); @@ -1027,7 +1027,7 @@ extern SDL_DECLSPEC SDL_HapticID SDLCALL SDL_GetHapticID(SDL_Haptic *haptic); * this function returns NULL; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticNameForID */ @@ -1038,7 +1038,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetHapticName(SDL_Haptic *haptic); * * \returns true if the mouse is haptic or false if it isn't. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenHapticFromMouse */ @@ -1050,7 +1050,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_IsMouseHaptic(void); * \returns the haptic device identifier or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseHaptic * \sa SDL_IsMouseHaptic @@ -1063,7 +1063,7 @@ extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_OpenHapticFromMouse(void); * \param joystick the SDL_Joystick to test for haptic capabilities. * \returns true if the joystick is haptic or false if it isn't. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenHapticFromJoystick */ @@ -1084,7 +1084,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_IsJoystickHaptic(SDL_Joystick *joystick); * \returns a valid haptic device identifier on success or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseHaptic * \sa SDL_IsJoystickHaptic @@ -1096,7 +1096,7 @@ extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_OpenHapticFromJoystick(SDL_Joystick * * \param haptic the SDL_Haptic device to close. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenHaptic */ @@ -1113,7 +1113,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseHaptic(SDL_Haptic *haptic); * \returns the number of effects the haptic device can store or a negative * error code on failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMaxHapticEffectsPlaying * \sa SDL_GetHapticFeatures @@ -1129,7 +1129,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetMaxHapticEffects(SDL_Haptic *haptic); * \returns the number of effects the haptic device can play at the same time * or -1 on failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMaxHapticEffects * \sa SDL_GetHapticFeatures @@ -1143,7 +1143,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetMaxHapticEffectsPlaying(SDL_Haptic *hapti * \returns a list of supported haptic features in bitwise manner (OR'd), or 0 * on failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HapticEffectSupported * \sa SDL_GetMaxHapticEffects @@ -1160,7 +1160,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetHapticFeatures(SDL_Haptic *haptic); * \returns the number of axes on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetNumHapticAxes(SDL_Haptic *haptic); @@ -1171,7 +1171,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumHapticAxes(SDL_Haptic *haptic); * \param effect the desired effect to query. * \returns true if the effect is supported or false if it isn't. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateHapticEffect * \sa SDL_GetHapticFeatures @@ -1187,7 +1187,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HapticEffectSupported(SDL_Haptic *haptic, c * \returns the ID of the effect on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyHapticEffect * \sa SDL_RunHapticEffect @@ -1210,7 +1210,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_CreateHapticEffect(SDL_Haptic *haptic, const * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateHapticEffect * \sa SDL_RunHapticEffect @@ -1233,7 +1233,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_UpdateHapticEffect(SDL_Haptic *haptic, int * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticEffectStatus * \sa SDL_StopHapticEffect @@ -1249,7 +1249,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RunHapticEffect(SDL_Haptic *haptic, int eff * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RunHapticEffect * \sa SDL_StopHapticEffects @@ -1265,7 +1265,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_StopHapticEffect(SDL_Haptic *haptic, int ef * \param haptic the SDL_Haptic device to destroy the effect on. * \param effect the ID of the haptic effect to destroy. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateHapticEffect */ @@ -1281,7 +1281,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyHapticEffect(SDL_Haptic *haptic, int * \returns true if it is playing, false if it isn't playing or haptic status * isn't supported. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticFeatures */ @@ -1303,7 +1303,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetHapticEffectStatus(SDL_Haptic *haptic, i * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticFeatures */ @@ -1322,7 +1322,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetHapticGain(SDL_Haptic *haptic, int gain) * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHapticFeatures */ @@ -1341,7 +1341,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetHapticAutocenter(SDL_Haptic *haptic, int * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResumeHaptic */ @@ -1356,7 +1356,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PauseHaptic(SDL_Haptic *haptic); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PauseHaptic */ @@ -1369,7 +1369,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ResumeHaptic(SDL_Haptic *haptic); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RunHapticEffect * \sa SDL_StopHapticEffects @@ -1382,7 +1382,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_StopHapticEffects(SDL_Haptic *haptic); * \param haptic haptic device to check for rumble support. * \returns true if the effect is supported or false if it isn't. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_InitHapticRumble */ @@ -1395,7 +1395,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HapticRumbleSupported(SDL_Haptic *haptic); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PlayHapticRumble * \sa SDL_StopHapticRumble @@ -1412,7 +1412,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_InitHapticRumble(SDL_Haptic *haptic); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_InitHapticRumble * \sa SDL_StopHapticRumble @@ -1426,7 +1426,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PlayHapticRumble(SDL_Haptic *haptic, float * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PlayHapticRumble */ diff --git a/libs/SDL3/include/SDL3/SDL_hidapi.h b/libs/SDL3/include/SDL3/SDL_hidapi.h index 86d78f7c..131b0372 100644 --- a/libs/SDL3/include/SDL3/SDL_hidapi.h +++ b/libs/SDL3/include/SDL3/SDL_hidapi.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -65,14 +65,14 @@ extern "C" { /** * An opaque handle representing an open HID device. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_hid_device SDL_hid_device; /** * HID underlying bus types. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_hid_bus_type { /** Unknown bus type */ @@ -107,7 +107,7 @@ typedef enum SDL_hid_bus_type { /** * Information about a connected HID device * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_hid_device_info { @@ -169,7 +169,7 @@ typedef struct SDL_hid_device_info * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_hid_exit */ @@ -184,7 +184,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_init(void); * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_hid_init */ @@ -205,7 +205,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_exit(void); * \returns a change counter that is incremented with each potential device * change, or 0 if device change detection isn't available. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_hid_enumerate */ @@ -233,7 +233,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_hid_device_change_count(void); * in the case of failure. Free this linked list by calling * SDL_hid_free_enumeration(). * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_hid_device_change_count */ @@ -247,7 +247,7 @@ extern SDL_DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_enumerate(unsigned sho * \param devs pointer to a list of struct_device returned from * SDL_hid_enumerate(). * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_hid_free_enumeration(SDL_hid_device_info *devs); @@ -265,7 +265,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_hid_free_enumeration(SDL_hid_device_info *d * \returns a pointer to a SDL_hid_device object on success or NULL on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number); @@ -279,7 +279,7 @@ extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open(unsigned short vendor_ * \returns a pointer to a SDL_hid_device object on success or NULL on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open_path(const char *path); @@ -306,7 +306,7 @@ extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open_path(const char *path) * \returns the actual number of bytes written and -1 on on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_write(SDL_hid_device *dev, const unsigned char *data, size_t length); @@ -327,7 +327,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_write(SDL_hid_device *dev, const unsigne * SDL_GetError() for more information. If no packet was available to * be read within the timeout period, this function returns 0. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_read_timeout(SDL_hid_device *dev, unsigned char *data, size_t length, int milliseconds); @@ -348,7 +348,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_read_timeout(SDL_hid_device *dev, unsign * be read and the handle is in non-blocking mode, this function * returns 0. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_read(SDL_hid_device *dev, unsigned char *data, size_t length); @@ -367,7 +367,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_read(SDL_hid_device *dev, unsigned char * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_set_nonblocking(SDL_hid_device *dev, int nonblock); @@ -392,7 +392,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_set_nonblocking(SDL_hid_device *dev, int * \returns the actual number of bytes written and -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_send_feature_report(SDL_hid_device *dev, const unsigned char *data, size_t length); @@ -415,7 +415,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_send_feature_report(SDL_hid_device *dev, * still in the first byte), or -1 on on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_feature_report(SDL_hid_device *dev, unsigned char *data, size_t length); @@ -438,7 +438,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_feature_report(SDL_hid_device *dev, * still in the first byte), or -1 on on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_input_report(SDL_hid_device *dev, unsigned char *data, size_t length); @@ -449,7 +449,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_input_report(SDL_hid_device *dev, un * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_close(SDL_hid_device *dev); @@ -462,7 +462,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_close(SDL_hid_device *dev); * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_manufacturer_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); @@ -475,7 +475,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_manufacturer_string(SDL_hid_device * * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_product_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); @@ -488,7 +488,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_product_string(SDL_hid_device *dev, * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_serial_number_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); @@ -502,7 +502,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_serial_number_string(SDL_hid_device * \returns 0 on success or a negative error code on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_indexed_string(SDL_hid_device *dev, int string_index, wchar_t *string, size_t maxlen); @@ -514,7 +514,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_indexed_string(SDL_hid_device *dev, * on failure; call SDL_GetError() for more information. This struct * is valid until the device is closed with SDL_hid_close(). * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_get_device_info(SDL_hid_device *dev); @@ -530,7 +530,7 @@ extern SDL_DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_get_device_info(SDL_hi * \returns the number of bytes actually copied or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_report_descriptor(SDL_hid_device *dev, unsigned char *buf, size_t buf_size); @@ -539,7 +539,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_hid_get_report_descriptor(SDL_hid_device *de * * \param active true to start the scan, false to stop the scan. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_hid_ble_scan(bool active); diff --git a/libs/SDL3/include/SDL3/SDL_hints.h b/libs/SDL3/include/SDL3/SDL_hints.h index 1e03207d..8f2d074d 100644 --- a/libs/SDL3/include/SDL3/SDL_hints.h +++ b/libs/SDL3/include/SDL3/SDL_hints.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -61,7 +61,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED "SDL_ALLOW_ALT_TAB_WHILE_GRABBED" @@ -81,7 +81,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ANDROID_ALLOW_RECREATE_ACTIVITY "SDL_ANDROID_ALLOW_RECREATE_ACTIVITY" @@ -96,7 +96,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ANDROID_BLOCK_ON_PAUSE "SDL_ANDROID_BLOCK_ON_PAUSE" @@ -113,7 +113,7 @@ extern "C" { * * This hint should be set before SDL audio is initialized. * - * \since This hint is available since SDL 3.1.8. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ANDROID_LOW_LATENCY_AUDIO "SDL_ANDROID_LOW_LATENCY_AUDIO" @@ -136,7 +136,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ANDROID_TRAP_BACK_BUTTON "SDL_ANDROID_TRAP_BACK_BUTTON" @@ -152,7 +152,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_APP_ID "SDL_APP_ID" @@ -170,7 +170,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_APP_NAME "SDL_APP_NAME" @@ -193,7 +193,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS "SDL_APPLE_TV_CONTROLLER_UI_EVENTS" @@ -208,7 +208,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION "SDL_APPLE_TV_REMOTE_ALLOW_ROTATION" @@ -225,7 +225,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. * * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE @@ -243,7 +243,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.1.7. + * \since This hint is available since SDL 3.2.0. * * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE @@ -261,7 +261,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.1.7. + * \since This hint is available since SDL 3.2.0. * * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE * \sa SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE @@ -282,7 +282,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_CATEGORY "SDL_AUDIO_CATEGORY" @@ -295,7 +295,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_CHANNELS "SDL_AUDIO_CHANNELS" @@ -318,7 +318,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DEVICE_APP_ICON_NAME "SDL_AUDIO_DEVICE_APP_ICON_NAME" @@ -340,7 +340,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DEVICE_SAMPLE_FRAMES "SDL_AUDIO_DEVICE_SAMPLE_FRAMES" @@ -367,7 +367,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DEVICE_STREAM_NAME "SDL_AUDIO_DEVICE_STREAM_NAME" @@ -393,7 +393,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DEVICE_STREAM_ROLE "SDL_AUDIO_DEVICE_STREAM_ROLE" @@ -404,7 +404,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DISK_INPUT_FILE "SDL_AUDIO_DISK_INPUT_FILE" @@ -415,7 +415,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DISK_OUTPUT_FILE "SDL_AUDIO_DISK_OUTPUT_FILE" @@ -428,7 +428,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DISK_TIMESCALE "SDL_AUDIO_DISK_TIMESCALE" @@ -442,7 +442,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DRIVER "SDL_AUDIO_DRIVER" @@ -455,7 +455,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DUMMY_TIMESCALE "SDL_AUDIO_DUMMY_TIMESCALE" @@ -482,7 +482,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_FORMAT "SDL_AUDIO_FORMAT" @@ -495,7 +495,7 @@ extern "C" { * * This hint should be set before an audio device is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_FREQUENCY "SDL_AUDIO_FREQUENCY" @@ -518,7 +518,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_INCLUDE_MONITORS "SDL_AUDIO_INCLUDE_MONITORS" @@ -533,7 +533,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUTO_UPDATE_JOYSTICKS "SDL_AUTO_UPDATE_JOYSTICKS" @@ -548,7 +548,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUTO_UPDATE_SENSORS "SDL_AUTO_UPDATE_SENSORS" @@ -571,7 +571,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_BMP_SAVE_LEGACY_FORMAT "SDL_BMP_SAVE_LEGACY_FORMAT" @@ -587,7 +587,7 @@ extern "C" { * best camera backend on your behalf. This hint needs to be set before * SDL_Init() is called to be useful. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_CAMERA_DRIVER "SDL_CAMERA_DRIVER" @@ -620,7 +620,7 @@ extern "C" { * * The items can be prefixed by '+'/'-' to add/remove features. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_CPU_FEATURE_MASK "SDL_CPU_FEATURE_MASK" @@ -634,7 +634,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_DIRECTINPUT "SDL_JOYSTICK_DIRECTINPUT" @@ -663,7 +663,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_FILE_DIALOG_DRIVER "SDL_FILE_DIALOG_DRIVER" @@ -681,7 +681,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_DISPLAY_USABLE_BOUNDS "SDL_DISPLAY_USABLE_BOUNDS" @@ -702,7 +702,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_EMSCRIPTEN_ASYNCIFY "SDL_EMSCRIPTEN_ASYNCIFY" @@ -715,7 +715,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_EMSCRIPTEN_CANVAS_SELECTOR "SDL_EMSCRIPTEN_CANVAS_SELECTOR" @@ -730,12 +730,13 @@ extern "C" { * - "#document": the javascript document object * - "#screen": the javascript window.screen object * - "#canvas": the WebGL canvas element + * - "#none": Don't bind anything at all * - any other string without a leading # sign applies to the element on the * page with that ID. * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT "SDL_EMSCRIPTEN_KEYBOARD_ELEMENT" @@ -752,7 +753,7 @@ extern "C" { * * This hint must be set before SDL_StartTextInput() is called * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ENABLE_SCREEN_KEYBOARD "SDL_ENABLE_SCREEN_KEYBOARD" @@ -769,7 +770,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_EVDEV_DEVICES "SDL_EVDEV_DEVICES" @@ -793,7 +794,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_EVENT_LOGGING "SDL_EVENT_LOGGING" @@ -813,7 +814,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_FORCE_RAISEWINDOW "SDL_FORCE_RAISEWINDOW" @@ -834,7 +835,7 @@ extern "C" { * * This hint should be set before calling SDL_GetWindowSurface() * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_FRAMEBUFFER_ACCELERATION "SDL_FRAMEBUFFER_ACCELERATION" @@ -849,7 +850,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLERCONFIG "SDL_GAMECONTROLLERCONFIG" @@ -865,7 +866,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLERCONFIG_FILE "SDL_GAMECONTROLLERCONFIG_FILE" @@ -889,7 +890,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLERTYPE "SDL_GAMECONTROLLERTYPE" @@ -907,7 +908,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES "SDL_GAMECONTROLLER_IGNORE_DEVICES" @@ -925,7 +926,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT "SDL_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT" @@ -948,7 +949,7 @@ extern "C" { * * This hint should be set before a gamepad is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GAMECONTROLLER_SENSOR_FUSION "SDL_GAMECONTROLLER_SENSOR_FUSION" @@ -960,7 +961,7 @@ extern "C" { * * This hint should be set before calling SDL_StartTextInput() * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GDK_TEXTINPUT_DEFAULT_TEXT "SDL_GDK_TEXTINPUT_DEFAULT_TEXT" @@ -972,7 +973,7 @@ extern "C" { * * This hint should be set before calling SDL_StartTextInput() * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GDK_TEXTINPUT_DESCRIPTION "SDL_GDK_TEXTINPUT_DESCRIPTION" @@ -987,7 +988,7 @@ extern "C" { * * This hint should be set before calling SDL_StartTextInput() * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GDK_TEXTINPUT_MAX_LENGTH "SDL_GDK_TEXTINPUT_MAX_LENGTH" @@ -1003,7 +1004,7 @@ extern "C" { * * This hint should be set before calling SDL_StartTextInput() * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GDK_TEXTINPUT_SCOPE "SDL_GDK_TEXTINPUT_SCOPE" @@ -1014,7 +1015,7 @@ extern "C" { * * This hint should be set before calling SDL_StartTextInput() * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GDK_TEXTINPUT_TITLE "SDL_GDK_TEXTINPUT_TITLE" @@ -1032,7 +1033,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_HIDAPI_LIBUSB "SDL_HIDAPI_LIBUSB" @@ -1050,7 +1051,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_HIDAPI_LIBUSB_WHITELIST "SDL_HIDAPI_LIBUSB_WHITELIST" @@ -1064,7 +1065,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_HIDAPI_UDEV "SDL_HIDAPI_UDEV" @@ -1078,7 +1079,7 @@ extern "C" { * * This hint should be set before any GPU functions are called. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_GPU_DRIVER "SDL_GPU_DRIVER" @@ -1097,7 +1098,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_HIDAPI_ENUMERATE_ONLY_CONTROLLERS "SDL_HIDAPI_ENUMERATE_ONLY_CONTROLLERS" @@ -1114,7 +1115,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_HIDAPI_IGNORE_DEVICES "SDL_HIDAPI_IGNORE_DEVICES" @@ -1137,7 +1138,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_IME_IMPLEMENTED_UI "SDL_IME_IMPLEMENTED_UI" @@ -1156,7 +1157,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_IOS_HIDE_HOME_INDICATOR "SDL_IOS_HIDE_HOME_INDICATOR" @@ -1173,7 +1174,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS "SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS" @@ -1190,7 +1191,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES "SDL_JOYSTICK_ARCADESTICK_DEVICES" @@ -1211,7 +1212,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED "SDL_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED" @@ -1229,7 +1230,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_BLACKLIST_DEVICES "SDL_JOYSTICK_BLACKLIST_DEVICES" @@ -1250,7 +1251,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED "SDL_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED" @@ -1260,10 +1261,35 @@ extern "C" { * * This variable is currently only used by the Linux joystick driver. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_DEVICE "SDL_JOYSTICK_DEVICE" +/** + * A variable controlling whether enhanced reports should be used for + * controllers when using the HIDAPI driver. + * + * Enhanced reports allow rumble and effects on Bluetooth PlayStation + * controllers and gyro on Nintendo Switch controllers, but break Windows + * DirectInput for other applications that don't use SDL. + * + * Once enhanced reports are enabled, they can't be disabled on PlayStation + * controllers without power cycling the controller. + * + * The variable can be set to the following values: + * + * - "0": enhanced reports are not enabled. + * - "1": enhanced reports are enabled. (default) + * - "auto": enhanced features are advertised to the application, but SDL + * doesn't change the controller report mode unless the application uses + * them. + * + * This hint can be enabled anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_JOYSTICK_ENHANCED_REPORTS "SDL_JOYSTICK_ENHANCED_REPORTS" + /** * A variable containing a list of flightstick style controllers. * @@ -1277,7 +1303,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES "SDL_JOYSTICK_FLIGHTSTICK_DEVICES" @@ -1298,7 +1324,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED "SDL_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED" @@ -1315,7 +1341,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_GAMEINPUT "SDL_JOYSTICK_GAMEINPUT" @@ -1333,7 +1359,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_GAMECUBE_DEVICES "SDL_JOYSTICK_GAMECUBE_DEVICES" @@ -1354,7 +1380,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED "SDL_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED" @@ -1371,7 +1397,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI "SDL_JOYSTICK_HIDAPI" @@ -1388,7 +1414,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_COMBINE_JOY_CONS "SDL_JOYSTICK_HIDAPI_COMBINE_JOY_CONS" @@ -1405,7 +1431,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE "SDL_JOYSTICK_HIDAPI_GAMECUBE" @@ -1426,7 +1452,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE "SDL_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE" @@ -1443,7 +1469,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS "SDL_JOYSTICK_HIDAPI_JOY_CONS" @@ -1462,7 +1488,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_JOYCON_HOME_LED "SDL_JOYSTICK_HIDAPI_JOYCON_HOME_LED" @@ -1479,7 +1505,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_LUNA "SDL_JOYSTICK_HIDAPI_LUNA" @@ -1496,7 +1522,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_NINTENDO_CLASSIC "SDL_JOYSTICK_HIDAPI_NINTENDO_CLASSIC" @@ -1518,7 +1544,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS3 "SDL_JOYSTICK_HIDAPI_PS3" @@ -1535,7 +1561,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER "SDL_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER" @@ -1552,7 +1578,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS4 "SDL_JOYSTICK_HIDAPI_PS4" @@ -1567,36 +1593,10 @@ extern "C" { * This hint can be set anytime, but only takes effect when extended input * reports are enabled. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS4_REPORT_INTERVAL "SDL_JOYSTICK_HIDAPI_PS4_REPORT_INTERVAL" -/** - * A variable controlling whether extended input reports should be used for - * PS4 controllers when using the HIDAPI driver. - * - * The variable can be set to the following values: - * - * - "0": extended reports are not enabled. (default) - * - "1": extended reports are enabled. - * - * Extended input reports allow rumble on Bluetooth PS4 controllers, but break - * DirectInput handling for applications that don't use SDL. - * - * Once extended reports are enabled, they can not be disabled without power - * cycling the controller. - * - * For compatibility with applications written for versions of SDL prior to - * the introduction of PS5 controller support, this value will also control - * the state of extended reports on PS5 controllers when the - * SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE hint is not explicitly set. - * - * This hint can be enabled anytime. - * - * \since This hint is available since SDL 3.1.3. - */ -#define SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE "SDL_JOYSTICK_HIDAPI_PS4_RUMBLE" - /** * A variable controlling whether the HIDAPI driver for PS5 controllers should * be used. @@ -1610,7 +1610,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS5 "SDL_JOYSTICK_HIDAPI_PS5" @@ -1623,35 +1623,10 @@ extern "C" { * - "0": player LEDs are not enabled. * - "1": player LEDs are enabled. (default) * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED "SDL_JOYSTICK_HIDAPI_PS5_PLAYER_LED" -/** - * A variable controlling whether extended input reports should be used for - * PS5 controllers when using the HIDAPI driver. - * - * The variable can be set to the following values: - * - * - "0": extended reports are not enabled. (default) - * - "1": extended reports. - * - * Extended input reports allow rumble on Bluetooth PS5 controllers, but break - * DirectInput handling for applications that don't use SDL. - * - * Once extended reports are enabled, they can not be disabled without power - * cycling the controller. - * - * For compatibility with applications written for versions of SDL prior to - * the introduction of PS5 controller support, this value defaults to the - * value of SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE. - * - * This hint can be enabled anytime. - * - * \since This hint is available since SDL 3.1.3. - */ -#define SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE "SDL_JOYSTICK_HIDAPI_PS5_RUMBLE" - /** * A variable controlling whether the HIDAPI driver for NVIDIA SHIELD * controllers should be used. @@ -1665,7 +1640,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_SHIELD "SDL_JOYSTICK_HIDAPI_SHIELD" @@ -1680,7 +1655,7 @@ extern "C" { * * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_STADIA "SDL_JOYSTICK_HIDAPI_STADIA" @@ -1697,7 +1672,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_STEAM "SDL_JOYSTICK_HIDAPI_STEAM" @@ -1716,7 +1691,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.8. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_STEAM_HOME_LED "SDL_JOYSTICK_HIDAPI_STEAM_HOME_LED" @@ -1733,7 +1708,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_STEAMDECK "SDL_JOYSTICK_HIDAPI_STEAMDECK" @@ -1761,7 +1736,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_SWITCH "SDL_JOYSTICK_HIDAPI_SWITCH" @@ -1780,7 +1755,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED "SDL_JOYSTICK_HIDAPI_SWITCH_HOME_LED" @@ -1795,7 +1770,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED "SDL_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED" @@ -1811,7 +1786,7 @@ extern "C" { * * This hint should be set before opening a Joy-Con controller. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS "SDL_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS" @@ -1829,7 +1804,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_WII "SDL_JOYSTICK_HIDAPI_WII" @@ -1844,7 +1819,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_WII_PLAYER_LED "SDL_JOYSTICK_HIDAPI_WII_PLAYER_LED" @@ -1862,7 +1837,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX "SDL_JOYSTICK_HIDAPI_XBOX" @@ -1879,7 +1854,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360 "SDL_JOYSTICK_HIDAPI_XBOX_360" @@ -1894,7 +1869,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED "SDL_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED" @@ -1911,7 +1886,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_WIRELESS "SDL_JOYSTICK_HIDAPI_XBOX_360_WIRELESS" @@ -1928,7 +1903,7 @@ extern "C" { * * This hint should be set before initializing joysticks and gamepads. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE "SDL_JOYSTICK_HIDAPI_XBOX_ONE" @@ -1947,7 +1922,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED "SDL_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED" @@ -1962,7 +1937,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_IOKIT "SDL_JOYSTICK_IOKIT" @@ -1977,7 +1952,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_LINUX_CLASSIC "SDL_JOYSTICK_LINUX_CLASSIC" @@ -1992,7 +1967,7 @@ extern "C" { * * This hint should be set before a controller is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_LINUX_DEADZONES "SDL_JOYSTICK_LINUX_DEADZONES" @@ -2010,7 +1985,7 @@ extern "C" { * * This hint should be set before a controller is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_LINUX_DIGITAL_HATS "SDL_JOYSTICK_LINUX_DIGITAL_HATS" @@ -2026,7 +2001,7 @@ extern "C" { * * This hint should be set before a controller is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_LINUX_HAT_DEADZONES "SDL_JOYSTICK_LINUX_HAT_DEADZONES" @@ -2041,7 +2016,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_MFI "SDL_JOYSTICK_MFI" @@ -2056,7 +2031,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_RAWINPUT "SDL_JOYSTICK_RAWINPUT" @@ -2073,7 +2048,7 @@ extern "C" { * * This hint should be set before a gamepad is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_RAWINPUT_CORRELATE_XINPUT "SDL_JOYSTICK_RAWINPUT_CORRELATE_XINPUT" @@ -2088,7 +2063,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_ROG_CHAKRAM "SDL_JOYSTICK_ROG_CHAKRAM" @@ -2098,12 +2073,12 @@ extern "C" { * * The variable can be set to the following values: * - * - "0": A separate thread is not used. (default) - * - "1": A separate thread is used for handling raw input messages. + * - "0": A separate thread is not used. + * - "1": A separate thread is used for handling raw input messages. (default) * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_THREAD "SDL_JOYSTICK_THREAD" @@ -2120,7 +2095,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_THROTTLE_DEVICES "SDL_JOYSTICK_THROTTLE_DEVICES" @@ -2141,7 +2116,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_THROTTLE_DEVICES_EXCLUDED "SDL_JOYSTICK_THROTTLE_DEVICES_EXCLUDED" @@ -2156,7 +2131,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_WGI "SDL_JOYSTICK_WGI" @@ -2173,7 +2148,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_WHEEL_DEVICES "SDL_JOYSTICK_WHEEL_DEVICES" @@ -2194,7 +2169,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_WHEEL_DEVICES_EXCLUDED "SDL_JOYSTICK_WHEEL_DEVICES_EXCLUDED" @@ -2212,7 +2187,7 @@ extern "C" { * * This hint should be set before a controller is opened. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_ZERO_CENTERED_DEVICES "SDL_JOYSTICK_ZERO_CENTERED_DEVICES" @@ -2246,7 +2221,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_KEYCODE_OPTIONS "SDL_KEYCODE_OPTIONS" @@ -2260,7 +2235,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_KMSDRM_DEVICE_INDEX "SDL_KMSDRM_DEVICE_INDEX" @@ -2288,7 +2263,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_KMSDRM_REQUIRE_DRM_MASTER "SDL_KMSDRM_REQUIRE_DRM_MASTER" @@ -2314,7 +2289,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_LOGGING "SDL_LOGGING" @@ -2330,7 +2305,7 @@ extern "C" { * * This hint needs to be set before SDL_Init(). * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MAC_BACKGROUND_APP "SDL_MAC_BACKGROUND_APP" @@ -2346,7 +2321,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK "SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK" @@ -2369,10 +2344,35 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MAC_OPENGL_ASYNC_DISPATCH "SDL_MAC_OPENGL_ASYNC_DISPATCH" +/** + * A variable controlling whether the Option (⌥) key on macOS should be + * remapped to act as the Alt key. + * + * The variable can be set to the following values: + * + * - "none": The Option key is not remapped to Alt. (default) + * - "only_left": Only the left Option key is remapped to Alt. + * - "only_right": Only the right Option key is remapped to Alt. + * - "both": Both Option keys are remapped to Alt. + * + * This will prevent the triggering of key compositions that rely on the + * Option key, but will still send the Alt modifier for keyboard events. In + * the case that both Alt and Option are pressed, the Option key will be + * ignored. This is particularly useful for applications like terminal + * emulators and graphical user interfaces (GUIs) that rely on Alt key + * functionality for shortcuts or navigation. This does not apply to + * SDL_GetKeyFromScancode and only has an effect if IME is enabled. + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_MAC_OPTION_AS_ALT "SDL_MAC_OPTION_AS_ALT" + /** * A variable controlling whether SDL_EVENT_MOUSE_WHEEL event values will have * momentum on macOS. @@ -2391,18 +2391,26 @@ extern "C" { /** * Request SDL_AppIterate() be called at a specific rate. * - * This number is in Hz, so "60" means try to iterate 60 times per second. + * If this is set to a number, it represents Hz, so "60" means try to iterate + * 60 times per second. "0" means to iterate as fast as possible. Negative + * values are illegal, but reserved, in case they are useful in a future + * revision of SDL. + * + * There are other strings that have special meaning. If set to "waitevent", + * SDL_AppIterate will not be called until new event(s) have arrived (and been + * processed by SDL_AppEvent). This can be useful for apps that are completely + * idle except in response to input. * * On some platforms, or if you are using SDL_main instead of SDL_AppIterate, * this hint is ignored. When the hint can be used, it is allowed to be * changed at any time. * - * This defaults to 60, and specifying NULL for the hint's value will restore + * This defaults to 0, and specifying NULL for the hint's value will restore * the default. * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MAIN_CALLBACK_RATE "SDL_MAIN_CALLBACK_RATE" @@ -2421,7 +2429,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_AUTO_CAPTURE "SDL_MOUSE_AUTO_CAPTURE" @@ -2430,7 +2438,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS "SDL_MOUSE_DOUBLE_CLICK_RADIUS" @@ -2439,7 +2447,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_DOUBLE_CLICK_TIME "SDL_MOUSE_DOUBLE_CLICK_TIME" @@ -2451,7 +2459,7 @@ extern "C" { * * This hint needs to be set before SDL_Init(). * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_DEFAULT_SYSTEM_CURSOR "SDL_MOUSE_DEFAULT_SYSTEM_CURSOR" @@ -2483,7 +2491,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_EMULATE_WARP_WITH_RELATIVE "SDL_MOUSE_EMULATE_WARP_WITH_RELATIVE" @@ -2497,7 +2505,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH "SDL_MOUSE_FOCUS_CLICKTHROUGH" @@ -2507,7 +2515,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_NORMAL_SPEED_SCALE "SDL_MOUSE_NORMAL_SPEED_SCALE" @@ -2528,7 +2536,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_RELATIVE_MODE_CENTER "SDL_MOUSE_RELATIVE_MODE_CENTER" @@ -2538,7 +2546,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE "SDL_MOUSE_RELATIVE_SPEED_SCALE" @@ -2552,12 +2560,12 @@ extern "C" { * - "1": Relative mouse motion will be scaled using the system mouse * acceleration curve. * - * If SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE is set, that will override the + * If SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE is set, that will be applied after * system speed scale. * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_RELATIVE_SYSTEM_SCALE "SDL_MOUSE_RELATIVE_SYSTEM_SCALE" @@ -2576,7 +2584,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_RELATIVE_WARP_MOTION "SDL_MOUSE_RELATIVE_WARP_MOTION" @@ -2595,7 +2603,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_RELATIVE_CURSOR_VISIBLE "SDL_MOUSE_RELATIVE_CURSOR_VISIBLE" @@ -2612,7 +2620,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MOUSE_TOUCH_EVENTS "SDL_MOUSE_TOUCH_EVENTS" @@ -2630,7 +2638,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_MUTE_CONSOLE_KEYBOARD "SDL_MUTE_CONSOLE_KEYBOARD" @@ -2645,7 +2653,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_NO_SIGNAL_HANDLERS "SDL_NO_SIGNAL_HANDLERS" @@ -2653,12 +2661,25 @@ extern "C" { * Specify the OpenGL library to load. * * This hint should be set before creating an OpenGL window or creating an - * OpenGL context. + * OpenGL context. If this hint isn't set, SDL will choose a reasonable + * default. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_OPENGL_LIBRARY "SDL_OPENGL_LIBRARY" +/** + * Specify the EGL library to load. + * + * This hint should be set before creating an OpenGL window or creating an + * OpenGL context. This hint is only considered if SDL is using EGL to manage + * OpenGL contexts. If this hint isn't set, SDL will choose a reasonable + * default. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_EGL_LIBRARY "SDL_EGL_LIBRARY" + /** * A variable controlling what driver to use for OpenGL ES contexts. * @@ -2689,7 +2710,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_OPENGL_ES_DRIVER "SDL_OPENGL_ES_DRIVER" @@ -2720,7 +2741,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ORIENTATIONS "SDL_ORIENTATIONS" @@ -2740,7 +2761,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_POLL_SENTINEL "SDL_POLL_SENTINEL" @@ -2758,7 +2779,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_PREFERRED_LOCALES "SDL_PREFERRED_LOCALES" @@ -2775,9 +2796,13 @@ extern "C" { * - "1": SDL will send a quit event when the last window is requesting to * close. (default) * + * If there is at least one active system tray icon, SDL_EVENT_QUIT will + * instead be sent when both the last window will be closed and the last tray + * icon will be destroyed. + * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE "SDL_QUIT_ON_LAST_WINDOW_CLOSE" @@ -2792,7 +2817,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_DIRECT3D_THREADSAFE "SDL_RENDER_DIRECT3D_THREADSAFE" @@ -2808,7 +2833,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_DIRECT3D11_DEBUG "SDL_RENDER_DIRECT3D11_DEBUG" @@ -2822,7 +2847,7 @@ extern "C" { * * By default, SDL does not use Vulkan Validation Layers. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_VULKAN_DEBUG "SDL_RENDER_VULKAN_DEBUG" @@ -2836,7 +2861,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_GPU_DEBUG "SDL_RENDER_GPU_DEBUG" @@ -2851,7 +2876,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_GPU_LOW_POWER "SDL_RENDER_GPU_LOW_POWER" @@ -2875,12 +2900,16 @@ extern "C" { * - "gpu" * - "software" * + * This hint accepts a comma-separated list of driver names, and each will be + * tried in the order listed when creating a renderer until one succeeds or + * all of them fail. + * * The default varies by platform, but it's the first one in the list that is * available on the current platform. * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_DRIVER "SDL_RENDER_DRIVER" @@ -2898,7 +2927,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_LINE_METHOD "SDL_RENDER_LINE_METHOD" @@ -2913,7 +2942,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_METAL_PREFER_LOW_POWER_DEVICE "SDL_RENDER_METAL_PREFER_LOW_POWER_DEVICE" @@ -2930,7 +2959,7 @@ extern "C" { * * This hint should be set before creating a renderer. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RENDER_VSYNC "SDL_RENDER_VSYNC" @@ -2947,7 +2976,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RETURN_KEY_HIDES_IME "SDL_RETURN_KEY_HIDES_IME" @@ -2964,7 +2993,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. * * \sa SDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED */ @@ -2986,7 +3015,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED "SDL_ROG_GAMEPAD_MICE_EXCLUDED" @@ -2998,7 +3027,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_RPI_VIDEO_LAYER "SDL_RPI_VIDEO_LAYER" @@ -3020,7 +3049,7 @@ extern "C" { * * This hint should be set before calling SDL_DisableScreenSaver() * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME "SDL_SCREENSAVER_INHIBIT_ACTIVITY_NAME" @@ -3039,7 +3068,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_SHUTDOWN_DBUS_ON_QUIT "SDL_SHUTDOWN_DBUS_ON_QUIT" @@ -3053,7 +3082,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_STORAGE_TITLE_DRIVER "SDL_STORAGE_TITLE_DRIVER" @@ -3067,7 +3096,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_STORAGE_USER_DRIVER "SDL_STORAGE_USER_DRIVER" @@ -3096,7 +3125,7 @@ extern "C" { * * This hint should be set before calling SDL_SetCurrentThreadPriority() * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL "SDL_THREAD_FORCE_REALTIME_TIME_CRITICAL" @@ -3119,7 +3148,7 @@ extern "C" { * * This hint should be set before calling SDL_SetCurrentThreadPriority() * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_THREAD_PRIORITY_POLICY "SDL_THREAD_PRIORITY_POLICY" @@ -3139,7 +3168,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_TIMER_RESOLUTION "SDL_TIMER_RESOLUTION" @@ -3154,7 +3183,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_TOUCH_MOUSE_EVENTS "SDL_TOUCH_MOUSE_EVENTS" @@ -3175,7 +3204,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_TRACKPAD_IS_TOUCH_ONLY "SDL_TRACKPAD_IS_TOUCH_ONLY" @@ -3190,7 +3219,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_TV_REMOTE_AS_JOYSTICK "SDL_TV_REMOTE_AS_JOYSTICK" @@ -3204,7 +3233,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_ALLOW_SCREENSAVER "SDL_VIDEO_ALLOW_SCREENSAVER" @@ -3252,7 +3281,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_DOUBLE_BUFFER "SDL_VIDEO_DOUBLE_BUFFER" @@ -3264,9 +3293,13 @@ extern "C" { * force a specific target, such as "x11" if, say, you are on Wayland but want * to try talking to the X server instead. * + * This hint accepts a comma-separated list of driver names, and each will be + * tried in the order listed during init, until one succeeds or all of them + * fail. + * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_DRIVER "SDL_VIDEO_DRIVER" @@ -3279,7 +3312,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_DUMMY_SAVE_FRAMES "SDL_VIDEO_DUMMY_SAVE_FRAMES" @@ -3293,7 +3326,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_EGL_ALLOW_GETDISPLAY_FALLBACK "SDL_VIDEO_EGL_ALLOW_GETDISPLAY_FALLBACK" @@ -3309,7 +3342,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_FORCE_EGL "SDL_VIDEO_FORCE_EGL" @@ -3327,10 +3360,31 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES "SDL_VIDEO_MAC_FULLSCREEN_SPACES" +/** + * A variable that specifies the menu visibility when a window is fullscreen + * in Spaces on macOS. + * + * The variable can be set to the following values: + * + * - "0": The menu will be hidden when the window is in a fullscreen space, + * and not accessible by moving the mouse to the top of the screen. + * - "1": The menu will be accessible when the window is in a fullscreen + * space. + * - "auto": The menu will be hidden if fullscreen mode was toggled on + * programmatically via `SDL_SetWindowFullscreen()`, and accessible if + * fullscreen was entered via the "fullscreen" button on the window title + * bar. (default) + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY "SDL_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY" + /** * A variable controlling whether fullscreen windows are minimized when they * lose focus. @@ -3343,7 +3397,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS "SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS" @@ -3360,7 +3414,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_OFFSCREEN_SAVE_FRAMES "SDL_VIDEO_OFFSCREEN_SAVE_FRAMES" @@ -3386,7 +3440,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_SYNC_WINDOW_OPERATIONS "SDL_VIDEO_SYNC_WINDOW_OPERATIONS" @@ -3404,7 +3458,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR "SDL_VIDEO_WAYLAND_ALLOW_LIBDECOR" @@ -3424,7 +3478,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WAYLAND_MODE_EMULATION "SDL_VIDEO_WAYLAND_MODE_EMULATION" @@ -3446,7 +3500,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WAYLAND_MODE_SCALING "SDL_VIDEO_WAYLAND_MODE_SCALING" @@ -3466,7 +3520,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WAYLAND_PREFER_LIBDECOR "SDL_VIDEO_WAYLAND_PREFER_LIBDECOR" @@ -3485,6 +3539,8 @@ extern "C" { * * - Rounding errors can result with odd window sizes and/or desktop scales, * which can cause the window contents to appear slightly blurry. + * - Positioning the window may be imprecise due to unit conversions and + * rounding. * - The window may be unusably small on scaled desktops. * - The window may jump in size when moving between displays of different * scale factors. @@ -3503,7 +3559,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WAYLAND_SCALE_TO_DISPLAY "SDL_VIDEO_WAYLAND_SCALE_TO_DISPLAY" @@ -3525,7 +3581,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_WIN_D3DCOMPILER "SDL_VIDEO_WIN_D3DCOMPILER" @@ -3540,7 +3596,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR "SDL_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR" @@ -3559,7 +3615,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_NET_WM_PING "SDL_VIDEO_X11_NET_WM_PING" @@ -3573,7 +3629,7 @@ extern "C" { * * This hint should be set before initializing the video subsystem. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_NODIRECTCOLOR "SDL_VIDEO_X11_NODIRECTCOLOR" @@ -3584,7 +3640,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_SCALING_FACTOR "SDL_VIDEO_X11_SCALING_FACTOR" @@ -3593,7 +3649,7 @@ extern "C" { * * This hint should be set before initializing the video subsystem. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_VISUALID "SDL_VIDEO_X11_VISUALID" @@ -3602,7 +3658,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_WINDOW_VISUALID "SDL_VIDEO_X11_WINDOW_VISUALID" @@ -3616,7 +3672,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VIDEO_X11_XRANDR "SDL_VIDEO_X11_XRANDR" @@ -3631,7 +3687,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_ENABLE_BACK_TOUCH "SDL_VITA_ENABLE_BACK_TOUCH" @@ -3646,7 +3702,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_ENABLE_FRONT_TOUCH "SDL_VITA_ENABLE_FRONT_TOUCH" @@ -3657,7 +3713,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_MODULE_PATH "SDL_VITA_MODULE_PATH" @@ -3670,7 +3726,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_PVR_INIT "SDL_VITA_PVR_INIT" @@ -3685,7 +3741,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_RESOLUTION "SDL_VITA_RESOLUTION" @@ -3700,7 +3756,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_PVR_OPENGL "SDL_VITA_PVR_OPENGL" @@ -3716,7 +3772,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VITA_TOUCH_MOUSE_DEVICE "SDL_VITA_TOUCH_MOUSE_DEVICE" @@ -3727,7 +3783,7 @@ extern "C" { * * This hint should be set before calling SDL_Vulkan_CreateSurface() * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VULKAN_DISPLAY "SDL_VULKAN_DISPLAY" @@ -3737,7 +3793,7 @@ extern "C" { * This hint should be set before creating a Vulkan window or calling * SDL_Vulkan_LoadLibrary(). * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_VULKAN_LIBRARY "SDL_VULKAN_LIBRARY" @@ -3769,7 +3825,7 @@ extern "C" { * * This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO() * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WAVE_FACT_CHUNK "SDL_WAVE_FACT_CHUNK" @@ -3781,7 +3837,7 @@ extern "C" { * * This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO() * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WAVE_CHUNK_LIMIT "SDL_WAVE_CHUNK_LIMIT" @@ -3809,7 +3865,7 @@ extern "C" { * * This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO() * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WAVE_RIFF_CHUNK_SIZE "SDL_WAVE_RIFF_CHUNK_SIZE" @@ -3829,7 +3885,7 @@ extern "C" { * * This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO() * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WAVE_TRUNCATION "SDL_WAVE_TRUNCATION" @@ -3846,7 +3902,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOW_ACTIVATE_WHEN_RAISED "SDL_WINDOW_ACTIVATE_WHEN_RAISED" @@ -3863,7 +3919,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN "SDL_WINDOW_ACTIVATE_WHEN_SHOWN" @@ -3881,7 +3937,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOW_ALLOW_TOPMOST "SDL_WINDOW_ALLOW_TOPMOST" @@ -3897,7 +3953,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN "SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN" @@ -3913,7 +3969,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_CLOSE_ON_ALT_F4 "SDL_WINDOWS_CLOSE_ON_ALT_F4" @@ -3942,7 +3998,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_ENABLE_MENU_MNEMONICS "SDL_WINDOWS_ENABLE_MENU_MNEMONICS" @@ -3957,7 +4013,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP "SDL_WINDOWS_ENABLE_MESSAGELOOP" @@ -3973,7 +4029,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_GAMEINPUT "SDL_WINDOWS_GAMEINPUT" @@ -3987,7 +4043,7 @@ extern "C" { * * This hint can be set anytime. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_RAW_KEYBOARD "SDL_WINDOWS_RAW_KEYBOARD" @@ -4008,7 +4064,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_FORCE_SEMAPHORE_KERNEL "SDL_WINDOWS_FORCE_SEMAPHORE_KERNEL" @@ -4018,7 +4074,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_INTRESOURCE_ICON "SDL_WINDOWS_INTRESOURCE_ICON" @@ -4028,7 +4084,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL "SDL_WINDOWS_INTRESOURCE_ICON_SMALL" @@ -4054,7 +4110,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_USE_D3D9EX "SDL_WINDOWS_USE_D3D9EX" @@ -4071,7 +4127,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_WINDOWS_ERASE_BACKGROUND_MODE "SDL_WINDOWS_ERASE_BACKGROUND_MODE" @@ -4092,7 +4148,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_X11_FORCE_OVERRIDE_REDIRECT "SDL_X11_FORCE_OVERRIDE_REDIRECT" @@ -4109,7 +4165,7 @@ extern "C" { * * This hint should be set before creating a window. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_X11_WINDOW_TYPE "SDL_X11_WINDOW_TYPE" @@ -4120,7 +4176,7 @@ extern "C" { * * This hint should be set before initializing the video subsystem. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_X11_XCB_LIBRARY "SDL_X11_XCB_LIBRARY" @@ -4135,7 +4191,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_XINPUT_ENABLED "SDL_XINPUT_ENABLED" @@ -4159,15 +4215,45 @@ extern "C" { * This hint should be set before an assertion failure is triggered and can be * changed at any time. * - * \since This hint is available since SDL 3.1.3. + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_ASSERT "SDL_ASSERT" +/** + * A variable controlling whether pen events should generate synthetic mouse + * events. + * + * The variable can be set to the following values: + * + * - "0": Pen events will not generate mouse events. + * - "1": Pen events will generate mouse events. (default) + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_PEN_MOUSE_EVENTS "SDL_PEN_MOUSE_EVENTS" + +/** + * A variable controlling whether pen events should generate synthetic touch + * events. + * + * The variable can be set to the following values: + * + * - "0": Pen events will not generate touch events. + * - "1": Pen events will generate touch events. (default) + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_PEN_TOUCH_EVENTS "SDL_PEN_TOUCH_EVENTS" + /** * An enumeration of hint priorities. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_HintPriority { @@ -4191,7 +4277,7 @@ typedef enum SDL_HintPriority * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHint * \sa SDL_ResetHint @@ -4213,7 +4299,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetHintWithPriority(const char *name, const * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHint * \sa SDL_ResetHint @@ -4234,7 +4320,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetHint(const char *name, const char *value * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetHint * \sa SDL_ResetHints @@ -4250,7 +4336,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ResetHint(const char *name); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResetHint */ @@ -4269,7 +4355,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ResetHints(void); * callback instead is always thread-safe, as SDL holds a lock * on the thread subsystem during the callback. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetHint * \sa SDL_SetHintWithPriority @@ -4286,7 +4372,7 @@ extern SDL_DECLSPEC const char *SDLCALL SDL_GetHint(const char *name); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetHint * \sa SDL_SetHint @@ -4308,7 +4394,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetHintBoolean(const char *name, bool defau * hint value. SDL holds a lock on the hint subsystem when * calling this callback. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_AddHintCallback */ @@ -4329,7 +4415,7 @@ typedef void(SDLCALL *SDL_HintCallback)(void *userdata, const char *name, const * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RemoveHintCallback */ @@ -4345,7 +4431,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_AddHintCallback(const char *name, SDL_HintC * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddHintCallback */ diff --git a/libs/SDL3/include/SDL3/SDL_init.h b/libs/SDL3/include/SDL3/SDL_init.h index 10b04b4e..adf0de8a 100644 --- a/libs/SDL3/include/SDL3/SDL_init.h +++ b/libs/SDL3/include/SDL3/SDL_init.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -67,7 +67,7 @@ extern "C" { * These are the flags which may be passed to SDL_Init(). You should specify * the subsystems which you will be using in your application. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_Init * \sa SDL_Quit @@ -104,7 +104,7 @@ typedef Uint32 SDL_InitFlags; * [Main callbacks in SDL3](https://wiki.libsdl.org/SDL3/README/main-functions#main-callbacks-in-sdl3) * for complete details. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_AppResult { @@ -128,7 +128,7 @@ typedef enum SDL_AppResult * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to * terminate with success, SDL_APP_CONTINUE to continue. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef SDL_AppResult (SDLCALL *SDL_AppInit_func)(void **appstate, int argc, char *argv[]); @@ -143,7 +143,7 @@ typedef SDL_AppResult (SDLCALL *SDL_AppInit_func)(void **appstate, int argc, cha * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to * terminate with success, SDL_APP_CONTINUE to continue. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef SDL_AppResult (SDLCALL *SDL_AppIterate_func)(void *appstate); @@ -159,7 +159,7 @@ typedef SDL_AppResult (SDLCALL *SDL_AppIterate_func)(void *appstate); * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to * terminate with success, SDL_APP_CONTINUE to continue. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef SDL_AppResult (SDLCALL *SDL_AppEvent_func)(void *appstate, SDL_Event *event); @@ -173,7 +173,7 @@ typedef SDL_AppResult (SDLCALL *SDL_AppEvent_func)(void *appstate, SDL_Event *ev * \param appstate an optional pointer, provided by the app in SDL_AppInit. * \param result the result code that terminated the app (success or failure). * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef void (SDLCALL *SDL_AppQuit_func)(void *appstate, SDL_AppResult result); @@ -224,7 +224,7 @@ typedef void (SDLCALL *SDL_AppQuit_func)(void *appstate, SDL_AppResult result); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAppMetadata * \sa SDL_SetAppMetadataProperty @@ -244,7 +244,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_Init(SDL_InitFlags flags); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Init * \sa SDL_Quit @@ -260,7 +260,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_InitSubSystem(SDL_InitFlags flags); * * \param flags any of the flags used by SDL_Init(); see SDL_Init for details. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_InitSubSystem * \sa SDL_Quit @@ -274,7 +274,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_QuitSubSystem(SDL_InitFlags flags); * \returns a mask of all initialized subsystems if `flags` is 0, otherwise it * returns the initialization status of the specified subsystems. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Init * \sa SDL_InitSubSystem @@ -292,7 +292,7 @@ extern SDL_DECLSPEC SDL_InitFlags SDLCALL SDL_WasInit(SDL_InitFlags flags); * application is shutdown, but it is not wise to do this from a library or * other dynamically loaded code. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Init * \sa SDL_QuitSubSystem @@ -324,7 +324,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_IsMainThread(void); * * \param userdata an app-controlled pointer that is passed to the callback. * - * \since This datatype is available since SDL 3.1.8. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_RunOnMainThread */ @@ -388,7 +388,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RunOnMainThread(SDL_MainThreadCallback call * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAppMetadataProperty */ @@ -450,7 +450,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAppMetadata(const char *appname, const c * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAppMetadataProperty * \sa SDL_SetAppMetadata @@ -481,7 +481,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAppMetadataProperty(const char *name, co * freed if you call SDL_SetAppMetadataProperty() to set that * property from another thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAppMetadata * \sa SDL_SetAppMetadataProperty diff --git a/libs/SDL3/include/SDL3/SDL_intrin.h b/libs/SDL3/include/SDL3/SDL_intrin.h index 457328fa..bac6d7ad 100644 --- a/libs/SDL3/include/SDL3/SDL_intrin.h +++ b/libs/SDL3/include/SDL3/SDL_intrin.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -58,7 +58,7 @@ * * If this macro is defined, SDL will have already included `` * - * \since This macro is available since 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_LASX_INTRINSICS */ @@ -69,7 +69,7 @@ * * If this macro is defined, SDL will have already included `` * - * \since This macro is available since 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_LASX_INTRINSICS */ @@ -81,7 +81,7 @@ * If this macro is defined, SDL will have already included `` * ``, ``, and ``, as appropriate. * - * \since This macro is available since 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_NEON_INTRINSICS 1 @@ -90,7 +90,7 @@ * * If this macro is defined, SDL will have already included `` * - * \since This macro is available since 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ALTIVEC_INTRINSICS 1 @@ -99,7 +99,7 @@ * * If this macro is defined, SDL will have already included `` * - * \since This macro is available since 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SSE_INTRINSICS */ @@ -110,7 +110,7 @@ * * If this macro is defined, SDL will have already included `` * - * \since This macro is available since 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SSE2_INTRINSICS * \sa SDL_SSE3_INTRINSICS @@ -124,7 +124,7 @@ * * If this macro is defined, SDL will have already included `` * - * \since This macro is available since 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SSE_INTRINSICS * \sa SDL_SSE3_INTRINSICS @@ -138,7 +138,7 @@ * * If this macro is defined, SDL will have already included `` * - * \since This macro is available since 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SSE_INTRINSICS * \sa SDL_SSE2_INTRINSICS @@ -152,7 +152,7 @@ * * If this macro is defined, SDL will have already included `` * - * \since This macro is available since 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SSE_INTRINSICS * \sa SDL_SSE2_INTRINSICS @@ -166,7 +166,7 @@ * * If this macro is defined, SDL will have already included `` * - * \since This macro is available since 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SSE_INTRINSICS * \sa SDL_SSE2_INTRINSICS @@ -180,7 +180,7 @@ * * If this macro is defined, SDL will have already included `` * - * \since This macro is available since 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_AVX2_INTRINSICS * \sa SDL_AVX512F_INTRINSICS @@ -192,7 +192,7 @@ * * If this macro is defined, SDL will have already included `` * - * \since This macro is available since 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_AVX_INTRINSICS * \sa SDL_AVX512F_INTRINSICS @@ -206,7 +206,7 @@ * * If this macro is defined, SDL will have already included `` * - * \since This macro is available since 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_AVX_INTRINSICS * \sa SDL_AVX2_INTRINSICS @@ -275,7 +275,7 @@ _m_prefetch(void *__P) * used directly by apps. Apps should probably just use SDL_TARGETING * directly, instead. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_TARGETING */ @@ -335,7 +335,7 @@ _m_prefetch(void *__P) * This symbol is used by SDL internally, but apps and other libraries are * welcome to use it for their own interfaces as well. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_TARGETING(x) __attribute__((target(x))) diff --git a/libs/SDL3/include/SDL3/SDL_iostream.h b/libs/SDL3/include/SDL3/SDL_iostream.h index c6ff1c28..4ca16093 100644 --- a/libs/SDL3/include/SDL3/SDL_iostream.h +++ b/libs/SDL3/include/SDL3/SDL_iostream.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -25,7 +25,7 @@ * # CategoryIOStream * * SDL provides an abstract interface for reading and writing data streams. It - * offers implementations for files, memory, etc, and the app can provideo + * offers implementations for files, memory, etc, and the app can provide * their own implementations, too. * * SDL_IOStream is not related to the standard C++ iostream class, other than @@ -48,7 +48,7 @@ extern "C" { /** * SDL_IOStream status, set by a read or write operation. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_IOStatus { @@ -66,7 +66,7 @@ typedef enum SDL_IOStatus * These map to the same "whence" concept that `fseek` or `lseek` use in the * standard C runtime. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_IOWhence { @@ -85,7 +85,7 @@ typedef enum SDL_IOWhence * * This structure should be initialized using SDL_INIT_INTERFACE() * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_INIT_INTERFACE */ @@ -177,7 +177,7 @@ SDL_COMPILE_TIME_ASSERT(SDL_IOStreamInterface_SIZE, * SDL_OpenIO() to provide their own stream implementation behind this * struct's abstract interface. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_IOStream SDL_IOStream; @@ -260,7 +260,9 @@ typedef struct SDL_IOStream SDL_IOStream; * \returns a pointer to the SDL_IOStream structure that is created or NULL on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseIO * \sa SDL_FlushIO @@ -303,7 +305,9 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromFile(const char *file, cons * \returns a pointer to a new SDL_IOStream structure or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_IOFromConstMem * \sa SDL_CloseIO @@ -347,7 +351,9 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromMem(void *mem, size_t size) * \returns a pointer to a new SDL_IOStream structure or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_IOFromMem * \sa SDL_CloseIO @@ -375,7 +381,9 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromConstMem(const void *mem, s * \returns a pointer to a new SDL_IOStream structure or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseIO * \sa SDL_ReadIO @@ -408,7 +416,9 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromDynamicMem(void); * \returns a pointer to the allocated memory on success or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseIO * \sa SDL_INIT_INTERFACE @@ -442,7 +452,9 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_OpenIO(const SDL_IOStreamInterfac * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenIO */ @@ -455,7 +467,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CloseIO(SDL_IOStream *context); * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetIOProperties(SDL_IOStream *context); @@ -473,10 +487,9 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetIOProperties(SDL_IOStream *c * \param context the SDL_IOStream to query. * \returns an SDL_IOStatus enum with the current state. * - * \threadsafety This function should not be called at the same time that - * another thread is operating on the same SDL_IOStream. + * \threadsafety This function is not thread safe. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_IOStatus SDLCALL SDL_GetIOStatus(SDL_IOStream *context); @@ -488,7 +501,9 @@ extern SDL_DECLSPEC SDL_IOStatus SDLCALL SDL_GetIOStatus(SDL_IOStream *context); * negative error code on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetIOSize(SDL_IOStream *context); @@ -513,7 +528,9 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetIOSize(SDL_IOStream *context); * \returns the final offset in the data stream after the seek or -1 on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_TellIO */ @@ -531,7 +548,9 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_SeekIO(SDL_IOStream *context, Sint64 offs * \returns the current offset in the stream, or -1 if the information can not * be determined. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_SeekIO */ @@ -554,7 +573,9 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_TellIO(SDL_IOStream *context); * \returns the number of bytes read, or 0 on end of file or other failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_WriteIO * \sa SDL_GetIOStatus @@ -581,7 +602,9 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_ReadIO(SDL_IOStream *context, void *ptr, * \returns the number of bytes written, which will be less than `size` on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_IOprintf * \sa SDL_ReadIO @@ -603,7 +626,9 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_WriteIO(SDL_IOStream *context, const void * \returns the number of bytes written or 0 on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_IOvprintf * \sa SDL_WriteIO @@ -621,7 +646,9 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_IOprintf(SDL_IOStream *context, SDL_PRINT * \returns the number of bytes written or 0 on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_IOprintf * \sa SDL_WriteIO @@ -639,7 +666,9 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_IOvprintf(SDL_IOStream *context, SDL_PRIN * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenIO * \sa SDL_WriteIO @@ -663,7 +692,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_FlushIO(SDL_IOStream *context); * \returns the data or NULL on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadFile * \sa SDL_SaveFile_IO @@ -684,7 +715,9 @@ extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile_IO(SDL_IOStream *src, size_t *da * \returns the data or NULL on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadFile_IO * \sa SDL_SaveFile @@ -703,6 +736,8 @@ extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile(const char *file, size_t *datasi * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety This function is not thread safe. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_SaveFile @@ -713,13 +748,15 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SaveFile_IO(SDL_IOStream *src, const void * /** * Save all the data into a file path. * - * \param file the path to read all available data from. + * \param file the path to write all available data into. * \param data the data to be written. If datasize is 0, may be NULL or a * invalid pointer. * \param datasize the number of bytes to be written. * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety This function is not thread safe. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_SaveFile_IO @@ -747,7 +784,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SaveFile(const char *file, const void *data * \returns true on success or false on failure or EOF; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU8(SDL_IOStream *src, Uint8 *value); @@ -764,7 +803,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU8(SDL_IOStream *src, Uint8 *value); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS8(SDL_IOStream *src, Sint8 *value); @@ -785,7 +826,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS8(SDL_IOStream *src, Sint8 *value); * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU16LE(SDL_IOStream *src, Uint16 *value); @@ -806,7 +849,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU16LE(SDL_IOStream *src, Uint16 *value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS16LE(SDL_IOStream *src, Sint16 *value); @@ -827,7 +872,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS16LE(SDL_IOStream *src, Sint16 *value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU16BE(SDL_IOStream *src, Uint16 *value); @@ -848,7 +895,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU16BE(SDL_IOStream *src, Uint16 *value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS16BE(SDL_IOStream *src, Sint16 *value); @@ -869,7 +918,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS16BE(SDL_IOStream *src, Sint16 *value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU32LE(SDL_IOStream *src, Uint32 *value); @@ -890,7 +941,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU32LE(SDL_IOStream *src, Uint32 *value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS32LE(SDL_IOStream *src, Sint32 *value); @@ -911,7 +964,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS32LE(SDL_IOStream *src, Sint32 *value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU32BE(SDL_IOStream *src, Uint32 *value); @@ -932,7 +987,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU32BE(SDL_IOStream *src, Uint32 *value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS32BE(SDL_IOStream *src, Sint32 *value); @@ -953,7 +1010,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS32BE(SDL_IOStream *src, Sint32 *value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU64LE(SDL_IOStream *src, Uint64 *value); @@ -974,7 +1033,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU64LE(SDL_IOStream *src, Uint64 *value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS64LE(SDL_IOStream *src, Sint64 *value); @@ -995,7 +1056,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS64LE(SDL_IOStream *src, Sint64 *value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU64BE(SDL_IOStream *src, Uint64 *value); @@ -1016,7 +1079,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU64BE(SDL_IOStream *src, Uint64 *value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS64BE(SDL_IOStream *src, Sint64 *value); /* @} *//* Read endian functions */ @@ -1036,7 +1101,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS64BE(SDL_IOStream *src, Sint64 *value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU8(SDL_IOStream *dst, Uint8 value); @@ -1048,7 +1115,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU8(SDL_IOStream *dst, Uint8 value); * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS8(SDL_IOStream *dst, Sint8 value); @@ -1065,7 +1134,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS8(SDL_IOStream *dst, Sint8 value); * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU16LE(SDL_IOStream *dst, Uint16 value); @@ -1082,7 +1153,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU16LE(SDL_IOStream *dst, Uint16 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS16LE(SDL_IOStream *dst, Sint16 value); @@ -1098,7 +1171,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS16LE(SDL_IOStream *dst, Sint16 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU16BE(SDL_IOStream *dst, Uint16 value); @@ -1114,7 +1189,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU16BE(SDL_IOStream *dst, Uint16 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS16BE(SDL_IOStream *dst, Sint16 value); @@ -1131,7 +1208,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS16BE(SDL_IOStream *dst, Sint16 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU32LE(SDL_IOStream *dst, Uint32 value); @@ -1148,7 +1227,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU32LE(SDL_IOStream *dst, Uint32 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS32LE(SDL_IOStream *dst, Sint32 value); @@ -1164,7 +1245,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS32LE(SDL_IOStream *dst, Sint32 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU32BE(SDL_IOStream *dst, Uint32 value); @@ -1180,7 +1263,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU32BE(SDL_IOStream *dst, Uint32 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS32BE(SDL_IOStream *dst, Sint32 value); @@ -1197,7 +1282,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS32BE(SDL_IOStream *dst, Sint32 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU64LE(SDL_IOStream *dst, Uint64 value); @@ -1214,7 +1301,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU64LE(SDL_IOStream *dst, Uint64 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS64LE(SDL_IOStream *dst, Sint64 value); @@ -1230,7 +1319,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS64LE(SDL_IOStream *dst, Sint64 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU64BE(SDL_IOStream *dst, Uint64 value); @@ -1246,7 +1337,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU64BE(SDL_IOStream *dst, Uint64 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS64BE(SDL_IOStream *dst, Sint64 value); diff --git a/libs/SDL3/include/SDL3/SDL_joystick.h b/libs/SDL3/include/SDL3/SDL_joystick.h index 58000020..d15668b6 100644 --- a/libs/SDL3/include/SDL3/SDL_joystick.h +++ b/libs/SDL3/include/SDL3/SDL_joystick.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -81,7 +81,7 @@ extern SDL_Mutex *SDL_joystick_lock; * * This is opaque data. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Joystick SDL_Joystick; @@ -93,7 +93,7 @@ typedef struct SDL_Joystick SDL_Joystick; * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_JoystickID; @@ -107,7 +107,7 @@ typedef Uint32 SDL_JoystickID; * This is by no means a complete list of everything that can be plugged into * a computer. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_JoystickType { @@ -130,7 +130,7 @@ typedef enum SDL_JoystickType * This is used by SDL_GetJoystickConnectionState to report how a device is * connected to the system. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_JoystickConnectionState { @@ -143,7 +143,7 @@ typedef enum SDL_JoystickConnectionState /** * The largest value an SDL_Joystick's axis can report. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_JOYSTICK_AXIS_MIN */ @@ -154,7 +154,7 @@ typedef enum SDL_JoystickConnectionState * * This is a negative number! * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_JOYSTICK_AXIS_MAX */ @@ -170,14 +170,14 @@ typedef enum SDL_JoystickConnectionState * joysticks while processing to guarantee that the joystick list won't change * and joystick and gamepad events will not be delivered. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_LockJoysticks(void) SDL_ACQUIRE(SDL_joystick_lock); /** * Unlocking for atomic access to the joystick API. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UnlockJoysticks(void) SDL_RELEASE(SDL_joystick_lock); @@ -186,7 +186,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockJoysticks(void) SDL_RELEASE(SDL_joyst * * \returns true if a joystick is connected, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoysticks */ @@ -201,7 +201,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasJoystick(void); * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasJoystick * \sa SDL_OpenJoystick @@ -217,7 +217,7 @@ extern SDL_DECLSPEC SDL_JoystickID * SDLCALL SDL_GetJoysticks(int *count); * \returns the name of the selected joystick. If no name can be found, this * function returns NULL; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickName * \sa SDL_GetJoysticks @@ -233,7 +233,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickNameForID(SDL_JoystickID * \returns the path of the selected joystick. If no path can be found, this * function returns NULL; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPath * \sa SDL_GetJoysticks @@ -248,7 +248,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickPathForID(SDL_JoystickID * \param instance_id the joystick instance ID. * \returns the player index of a joystick, or -1 if it's not available. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPlayerIndex * \sa SDL_GetJoysticks @@ -264,7 +264,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetJoystickPlayerIndexForID(SDL_JoystickID i * \returns the GUID of the selected joystick. If called with an invalid * instance_id, this function returns a zero GUID. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUID * \sa SDL_GUIDToString @@ -281,7 +281,7 @@ extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetJoystickGUIDForID(SDL_JoystickID ins * \returns the USB vendor ID of the selected joystick. If called with an * invalid instance_id, this function returns 0. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickVendor * \sa SDL_GetJoysticks @@ -298,7 +298,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickVendorForID(SDL_JoystickID ins * \returns the USB product ID of the selected joystick. If called with an * invalid instance_id, this function returns 0. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProduct * \sa SDL_GetJoysticks @@ -315,7 +315,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProductForID(SDL_JoystickID in * \returns the product version of the selected joystick. If called with an * invalid instance_id, this function returns 0. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProductVersion * \sa SDL_GetJoysticks @@ -332,7 +332,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProductVersionForID(SDL_Joysti * invalid instance_id, this function returns * `SDL_JOYSTICK_TYPE_UNKNOWN`. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickType * \sa SDL_GetJoysticks @@ -349,7 +349,7 @@ extern SDL_DECLSPEC SDL_JoystickType SDLCALL SDL_GetJoystickTypeForID(SDL_Joysti * \returns a joystick identifier or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseJoystick */ @@ -362,7 +362,7 @@ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_OpenJoystick(SDL_JoystickID insta * \returns an SDL_Joystick on success or NULL on failure or if it hasn't been * opened yet; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetJoystickFromID(SDL_JoystickID instance_id); @@ -373,7 +373,7 @@ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetJoystickFromID(SDL_JoystickID * \returns an SDL_Joystick on success or NULL on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPlayerIndex * \sa SDL_SetJoystickPlayerIndex @@ -383,7 +383,7 @@ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetJoystickFromPlayerIndex(int pl /** * The structure that describes a virtual joystick touchpad. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_VirtualJoystickDesc */ @@ -396,7 +396,7 @@ typedef struct SDL_VirtualJoystickTouchpadDesc /** * The structure that describes a virtual joystick sensor. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_VirtualJoystickDesc */ @@ -412,7 +412,7 @@ typedef struct SDL_VirtualJoystickSensorDesc * This structure should be initialized using SDL_INIT_INTERFACE(). All * elements of this structure are optional. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_AttachVirtualJoystick * \sa SDL_INIT_INTERFACE @@ -469,7 +469,7 @@ SDL_COMPILE_TIME_ASSERT(SDL_VirtualJoystickDesc_SIZE, * \returns the joystick instance ID, or 0 on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DetachVirtualJoystick */ @@ -483,7 +483,7 @@ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_AttachVirtualJoystick(const SDL_V * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AttachVirtualJoystick */ @@ -495,7 +495,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_DetachVirtualJoystick(SDL_JoystickID instan * \param instance_id the joystick instance ID. * \returns true if the joystick is virtual, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_IsJoystickVirtual(SDL_JoystickID instance_id); @@ -518,7 +518,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_IsJoystickVirtual(SDL_JoystickID instance_i * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualAxis(SDL_Joystick *joystick, int axis, Sint16 value); @@ -538,7 +538,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualAxis(SDL_Joystick *joysti * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualBall(SDL_Joystick *joystick, int ball, Sint16 xrel, Sint16 yrel); @@ -557,7 +557,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualBall(SDL_Joystick *joysti * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualButton(SDL_Joystick *joystick, int button, bool down); @@ -576,7 +576,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualButton(SDL_Joystick *joys * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualHat(SDL_Joystick *joystick, int hat, Uint8 value); @@ -602,7 +602,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualHat(SDL_Joystick *joystic * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualTouchpad(SDL_Joystick *joystick, int touchpad, int finger, bool down, float x, float y, float pressure); @@ -624,7 +624,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualTouchpad(SDL_Joystick *jo * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SendJoystickVirtualSensorData(SDL_Joystick *joystick, SDL_SensorType type, Uint64 sensor_timestamp, const float *data, int num_values); @@ -648,7 +648,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SendJoystickVirtualSensorData(SDL_Joystick * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetJoystickProperties(SDL_Joystick *joystick); @@ -665,7 +665,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetJoystickProperties(SDL_Joyst * \returns the name of the selected joystick. If no name can be found, this * function returns NULL; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickNameForID */ @@ -678,7 +678,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickName(SDL_Joystick *joyst * \returns the path of the selected joystick. If no path can be found, this * function returns NULL; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPathForID */ @@ -693,7 +693,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickPath(SDL_Joystick *joyst * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the player index, or -1 if it's not available. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetJoystickPlayerIndex */ @@ -708,7 +708,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetJoystickPlayerIndex(SDL_Joystick *joystic * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPlayerIndex */ @@ -724,7 +724,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickPlayerIndex(SDL_Joystick *joysti * this function returns a zero GUID; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUIDForID * \sa SDL_GUIDToString @@ -739,7 +739,7 @@ extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetJoystickGUID(SDL_Joystick *joystick) * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the USB vendor ID of the selected joystick, or 0 if unavailable. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickVendorForID */ @@ -753,7 +753,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickVendor(SDL_Joystick *joystick) * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the USB product ID of the selected joystick, or 0 if unavailable. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProductForID */ @@ -767,7 +767,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProduct(SDL_Joystick *joystick * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the product version of the selected joystick, or 0 if unavailable. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProductVersionForID */ @@ -782,7 +782,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProductVersion(SDL_Joystick *j * \returns the firmware version of the selected joystick, or 0 if * unavailable. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickFirmwareVersion(SDL_Joystick *joystick); @@ -795,7 +795,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickFirmwareVersion(SDL_Joystick * * \returns the serial number of the selected joystick, or NULL if * unavailable. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickSerial(SDL_Joystick *joystick); @@ -805,7 +805,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickSerial(SDL_Joystick *joy * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the SDL_JoystickType of the selected joystick. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickTypeForID */ @@ -824,7 +824,7 @@ extern SDL_DECLSPEC SDL_JoystickType SDLCALL SDL_GetJoystickType(SDL_Joystick *j * \param crc16 a pointer filled in with a CRC used to distinguish different * products with the same VID/PID, or 0 if not available. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUIDForID */ @@ -837,7 +837,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetJoystickGUIDInfo(SDL_GUID guid, Uint16 * * \returns true if the joystick has been opened, false if it has not; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_JoystickConnected(SDL_Joystick *joystick); @@ -848,7 +848,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_JoystickConnected(SDL_Joystick *joystick); * \returns the instance ID of the specified joystick on success or 0 on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetJoystickID(SDL_Joystick *joystick); @@ -863,7 +863,7 @@ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetJoystickID(SDL_Joystick *joyst * \returns the number of axis controls/number of axes on success or -1 on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickAxis * \sa SDL_GetNumJoystickBalls @@ -884,7 +884,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickAxes(SDL_Joystick *joystick); * \returns the number of trackballs on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickBall * \sa SDL_GetNumJoystickAxes @@ -900,7 +900,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickBalls(SDL_Joystick *joystick); * \returns the number of POV hats on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickHat * \sa SDL_GetNumJoystickAxes @@ -916,7 +916,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickHats(SDL_Joystick *joystick); * \returns the number of buttons on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickButton * \sa SDL_GetNumJoystickAxes @@ -934,7 +934,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickButtons(SDL_Joystick *joystick * * \param enabled whether to process joystick events or not. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_JoystickEventsEnabled * \sa SDL_UpdateJoysticks @@ -950,7 +950,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetJoystickEventsEnabled(bool enabled); * * \returns true if joystick events are being processed, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetJoystickEventsEnabled */ @@ -962,7 +962,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_JoystickEventsEnabled(void); * This is called automatically by the event loop if any joystick events are * enabled. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UpdateJoysticks(void); @@ -984,7 +984,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UpdateJoysticks(void); * \returns a 16-bit signed integer representing the current position of the * axis or 0 on failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickAxes */ @@ -1002,7 +1002,7 @@ extern SDL_DECLSPEC Sint16 SDLCALL SDL_GetJoystickAxis(SDL_Joystick *joystick, i * \param state upon return, the initial value is supplied here. * \returns true if this axis has any initial value, or false if not. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetJoystickAxisInitialState(SDL_Joystick *joystick, int axis, Sint16 *state); @@ -1021,7 +1021,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetJoystickAxisInitialState(SDL_Joystick *j * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickBalls */ @@ -1036,7 +1036,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetJoystickBall(SDL_Joystick *joystick, int * \param hat the hat index to get the state from; indices start at index 0. * \returns the current hat position. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickHats */ @@ -1060,7 +1060,7 @@ extern SDL_DECLSPEC Uint8 SDLCALL SDL_GetJoystickHat(SDL_Joystick *joystick, int * index 0. * \returns true if the button is pressed, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickButtons */ @@ -1083,7 +1083,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetJoystickButton(SDL_Joystick *joystick, i * \param duration_ms the duration of the rumble effect, in milliseconds. * \returns true, or false if rumble isn't supported on this joystick. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_RumbleJoystick(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); @@ -1110,7 +1110,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RumbleJoystick(SDL_Joystick *joystick, Uint * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RumbleJoystick */ @@ -1132,7 +1132,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RumbleJoystickTriggers(SDL_Joystick *joysti * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue); @@ -1145,7 +1145,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickLED(SDL_Joystick *joystick, Uint * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SendJoystickEffect(SDL_Joystick *joystick, const void *data, int size); @@ -1154,7 +1154,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SendJoystickEffect(SDL_Joystick *joystick, * * \param joystick the joystick device to close. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenJoystick */ @@ -1168,7 +1168,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseJoystick(SDL_Joystick *joystick); * `SDL_JOYSTICK_CONNECTION_INVALID` on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetJoystickConnectionState(SDL_Joystick *joystick); @@ -1189,7 +1189,7 @@ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetJoystickConnectio * \returns the current battery state or `SDL_POWERSTATE_ERROR` on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetJoystickPowerInfo(SDL_Joystick *joystick, int *percent); diff --git a/libs/SDL3/include/SDL3/SDL_keyboard.h b/libs/SDL3/include/SDL3/SDL_keyboard.h index f6505d19..afa77b6c 100644 --- a/libs/SDL3/include/SDL3/SDL_keyboard.h +++ b/libs/SDL3/include/SDL3/SDL_keyboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -55,7 +55,7 @@ extern "C" { * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_KeyboardID; @@ -68,7 +68,7 @@ typedef Uint32 SDL_KeyboardID; * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyboards */ @@ -90,7 +90,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasKeyboard(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyboardNameForID * \sa SDL_HasKeyboard @@ -108,7 +108,7 @@ extern SDL_DECLSPEC SDL_KeyboardID * SDLCALL SDL_GetKeyboards(int *count); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyboards */ @@ -121,7 +121,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetKeyboardNameForID(SDL_KeyboardID * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void); @@ -151,7 +151,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_PumpEvents * \sa SDL_ResetKeyboard @@ -165,7 +165,7 @@ extern SDL_DECLSPEC const bool * SDLCALL SDL_GetKeyboardState(int *numkeys); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyboardState */ @@ -179,7 +179,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ResetKeyboard(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyboardState * \sa SDL_SetModState @@ -201,7 +201,7 @@ extern SDL_DECLSPEC SDL_Keymod SDLCALL SDL_GetModState(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetModState */ @@ -224,7 +224,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetModState(SDL_Keymod modstate); * * \threadsafety This function is not thread safe. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyName * \sa SDL_GetScancodeFromKey @@ -245,7 +245,7 @@ extern SDL_DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scan * * \threadsafety This function is not thread safe. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyFromScancode * \sa SDL_GetScancodeName @@ -264,7 +264,7 @@ extern SDL_DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromKey(SDL_Keycode key, * * \threadsafety This function is not thread safe. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetScancodeName */ @@ -288,7 +288,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetScancodeName(SDL_Scancode scancode, cons * * \threadsafety This function is not thread safe. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetScancodeFromKey * \sa SDL_GetScancodeFromName @@ -305,7 +305,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetScancodeName(SDL_Scancode scanco * * \threadsafety This function is not thread safe. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyFromName * \sa SDL_GetScancodeFromKey @@ -318,12 +318,14 @@ extern SDL_DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromName(const char *nam * * If the key doesn't have a name, this function returns an empty string (""). * + * Letters will be presented in their uppercase form, if applicable. + * * \param key the desired SDL_Keycode to query. * \returns a UTF-8 encoded string of the key name. * * \threadsafety This function is not thread safe. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyFromName * \sa SDL_GetKeyFromScancode @@ -340,7 +342,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetKeyName(SDL_Keycode key); * * \threadsafety This function is not thread safe. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetKeyFromScancode * \sa SDL_GetKeyName @@ -367,7 +369,7 @@ extern SDL_DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromName(const char *name); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTextInputArea * \sa SDL_StartTextInputWithProperties @@ -383,7 +385,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_StartTextInput(SDL_Window *window); * value is valid on every platform, but where a value isn't supported, a * reasonable fallback will be used. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_StartTextInputWithProperties */ @@ -407,7 +409,7 @@ typedef enum SDL_TextInputType * Not every value is valid on every platform, but where a value isn't * supported, a reasonable fallback will be used. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_StartTextInputWithProperties */ @@ -462,7 +464,7 @@ typedef enum SDL_Capitalization * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTextInputArea * \sa SDL_StartTextInput @@ -485,7 +487,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_StartTextInputWithProperties(SDL_Window *wi * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StartTextInput */ @@ -503,7 +505,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_TextInputActive(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StartTextInput */ @@ -518,7 +520,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_StopTextInput(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StartTextInput * \sa SDL_StopTextInput @@ -541,7 +543,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ClearComposition(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextInputArea * \sa SDL_StartTextInput @@ -563,7 +565,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetTextInputArea(SDL_Window *window, const * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTextInputArea */ @@ -577,7 +579,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetTextInputArea(SDL_Window *window, SDL_Re * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StartTextInput * \sa SDL_ScreenKeyboardShown @@ -592,7 +594,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasScreenKeyboardSupport(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasScreenKeyboardSupport */ diff --git a/libs/SDL3/include/SDL3/SDL_keycode.h b/libs/SDL3/include/SDL3/SDL_keycode.h index 3d7723d1..61b68e79 100644 --- a/libs/SDL3/include/SDL3/SDL_keycode.h +++ b/libs/SDL3/include/SDL3/SDL_keycode.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -47,11 +47,15 @@ * A special exception is the number keys at the top of the keyboard which map * to SDLK_0...SDLK_9 on AZERTY layouts. * - * \since This datatype is available since SDL 3.1.3. + * Keys with the `SDLK_EXTENDED_MASK` bit set do not map to a scancode or + * unicode code point. + * + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_Keycode; -#define SDLK_SCANCODE_MASK (1u<<30) +#define SDLK_EXTENDED_MASK (1u << 29) +#define SDLK_SCANCODE_MASK (1u << 30) #define SDL_SCANCODE_TO_KEYCODE(X) (X | SDLK_SCANCODE_MASK) #define SDLK_UNKNOWN 0x00000000u /**< 0 */ #define SDLK_RETURN 0x0000000du /**< '\r' */ @@ -302,17 +306,25 @@ typedef Uint32 SDL_Keycode; #define SDLK_SOFTRIGHT 0x40000120u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTRIGHT) */ #define SDLK_CALL 0x40000121u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALL) */ #define SDLK_ENDCALL 0x40000122u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ENDCALL) */ +#define SDLK_LEFT_TAB 0x20000001u /**< Extended key Left Tab */ +#define SDLK_LEVEL5_SHIFT 0x20000002u /**< Extended key Level 5 Shift */ +#define SDLK_MULTI_KEY_COMPOSE 0x20000003u /**< Extended key Multi-key Compose */ +#define SDLK_LMETA 0x20000004u /**< Extended key Left Meta */ +#define SDLK_RMETA 0x20000005u /**< Extended key Right Meta */ +#define SDLK_LHYPER 0x20000006u /**< Extended key Left Hyper */ +#define SDLK_RHYPER 0x20000007u /**< Extended key Right Hyper */ /** * Valid key modifiers (possibly OR'd together). * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint16 SDL_Keymod; #define SDL_KMOD_NONE 0x0000u /**< no modifier is applicable. */ #define SDL_KMOD_LSHIFT 0x0001u /**< the left Shift key is down. */ #define SDL_KMOD_RSHIFT 0x0002u /**< the right Shift key is down. */ +#define SDL_KMOD_LEVEL5 0x0004u /**< the Level 5 Shift key is down. */ #define SDL_KMOD_LCTRL 0x0040u /**< the left Ctrl (Control) key is down. */ #define SDL_KMOD_RCTRL 0x0080u /**< the right Ctrl (Control) key is down. */ #define SDL_KMOD_LALT 0x0100u /**< the left Alt key is down. */ diff --git a/libs/SDL3/include/SDL3/SDL_loadso.h b/libs/SDL3/include/SDL3/SDL_loadso.h index 027462fe..f8649d75 100644 --- a/libs/SDL3/include/SDL3/SDL_loadso.h +++ b/libs/SDL3/include/SDL3/SDL_loadso.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -68,7 +68,7 @@ extern "C" { /** * An opaque datatype that represents a loaded shared object. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_LoadObject * \sa SDL_LoadFunction @@ -85,7 +85,7 @@ typedef struct SDL_SharedObject SDL_SharedObject; * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadFunction * \sa SDL_UnloadObject @@ -114,7 +114,7 @@ extern SDL_DECLSPEC SDL_SharedObject * SDLCALL SDL_LoadObject(const char *sofile * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadObject */ @@ -130,7 +130,7 @@ extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_LoadFunction(SDL_SharedObjec * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadObject */ diff --git a/libs/SDL3/include/SDL3/SDL_locale.h b/libs/SDL3/include/SDL3/SDL_locale.h index a5035830..902843e8 100644 --- a/libs/SDL3/include/SDL3/SDL_locale.h +++ b/libs/SDL3/include/SDL3/SDL_locale.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -53,7 +53,7 @@ extern "C" { * would be "en"), and the country, if not NULL, will be an ISO-3166 country * code (so Canada would be "CA"). * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPreferredLocales */ @@ -102,7 +102,7 @@ typedef struct SDL_Locale * allocation that should be freed with SDL_free() when it is no * longer needed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Locale ** SDLCALL SDL_GetPreferredLocales(int *count); diff --git a/libs/SDL3/include/SDL3/SDL_log.h b/libs/SDL3/include/SDL3/SDL_log.h index b1955cbf..a56476c6 100644 --- a/libs/SDL3/include/SDL3/SDL_log.h +++ b/libs/SDL3/include/SDL3/SDL_log.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -76,7 +76,7 @@ extern "C" { * level, the assert category is enabled at the WARN level, test is enabled at * the VERBOSE level and all other categories are enabled at the ERROR level. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_LogCategory { @@ -116,7 +116,7 @@ typedef enum SDL_LogCategory /** * The predefined log priorities * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_LogPriority { @@ -139,7 +139,7 @@ typedef enum SDL_LogPriority * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ResetLogPriorities * \sa SDL_SetLogPriority @@ -154,7 +154,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetLogPriorities(SDL_LogPriority priority); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetLogPriority * \sa SDL_ResetLogPriorities @@ -170,7 +170,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetLogPriority(int category, SDL_LogPriorit * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetLogPriority */ @@ -183,7 +183,7 @@ extern SDL_DECLSPEC SDL_LogPriority SDLCALL SDL_GetLogPriority(int category); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetLogPriorities * \sa SDL_SetLogPriority @@ -205,7 +205,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ResetLogPriorities(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetLogPriorities * \sa SDL_SetLogPriority @@ -221,7 +221,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetLogPriorityPrefix(SDL_LogPriority priori * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LogCritical * \sa SDL_LogDebug @@ -245,7 +245,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_Log(SDL_PRINTF_FORMAT_STRING const char *fm * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -270,7 +270,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogTrace(int category, SDL_PRINTF_FORMAT_ST * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -293,7 +293,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogVerbose(int category, SDL_PRINTF_FORMAT_ * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -317,7 +317,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogDebug(int category, SDL_PRINTF_FORMAT_ST * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -341,7 +341,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogInfo(int category, SDL_PRINTF_FORMAT_STR * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -365,7 +365,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogWarn(int category, SDL_PRINTF_FORMAT_STR * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -389,7 +389,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogError(int category, SDL_PRINTF_FORMAT_ST * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogDebug @@ -414,7 +414,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogCritical(int category, SDL_PRINTF_FORMAT * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -440,7 +440,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogMessage(int category, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Log * \sa SDL_LogCritical @@ -469,7 +469,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LogMessageV(int category, * \param priority the priority of the message. * \param message the message being output. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef void (SDLCALL *SDL_LogOutputFunction)(void *userdata, int category, SDL_LogPriority priority, const char *message); @@ -480,7 +480,7 @@ typedef void (SDLCALL *SDL_LogOutputFunction)(void *userdata, int category, SDL_ * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.6. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetLogOutputFunction * \sa SDL_GetLogOutputFunction @@ -497,7 +497,7 @@ extern SDL_DECLSPEC SDL_LogOutputFunction SDLCALL SDL_GetDefaultLogOutputFunctio * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDefaultLogOutputFunction * \sa SDL_SetLogOutputFunction @@ -512,7 +512,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetLogOutputFunction(SDL_LogOutputFunction * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDefaultLogOutputFunction * \sa SDL_GetLogOutputFunction diff --git a/libs/SDL3/include/SDL3/SDL_main.h b/libs/SDL3/include/SDL3/SDL_main.h index b244af1c..2e7a2ebb 100644 --- a/libs/SDL3/include/SDL3/SDL_main.h +++ b/libs/SDL3/include/SDL3/SDL_main.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -69,7 +69,7 @@ * docs/README-main-functions.md in the source tree) for a more detailed * explanation. * - * \since This macro is used by the headers since SDL 3.1.3. + * \since This macro is used by the headers since SDL 3.2.0. */ #define SDL_MAIN_HANDLED 1 @@ -86,7 +86,7 @@ * docs/README-main-functions.md in the source tree) for a more detailed * explanation. * - * \since This macro is used by the headers since SDL 3.1.3. + * \since This macro is used by the headers since SDL 3.2.0. * * \sa SDL_AppInit * \sa SDL_AppEvent @@ -109,7 +109,7 @@ * * This macro is used internally by SDL, and apps probably shouldn't rely on it. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_MAIN_AVAILABLE @@ -127,12 +127,18 @@ * * This macro is used internally by SDL, and apps probably shouldn't rely on it. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_MAIN_NEEDED #endif +#if defined(__has_include) + #if __has_include("SDL_main_private.h") && __has_include("SDL_main_impl_private.h") + #define SDL_PLATFORM_PRIVATE_MAIN + #endif +#endif + #ifndef SDL_MAIN_HANDLED #if defined(SDL_PLATFORM_PRIVATE_MAIN) /* Private platforms may have their own ideas about entry points. */ @@ -235,7 +241,7 @@ * External code rarely needs this, and if it needs something, it's almost * always SDL_DECLSPEC instead. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_DECLSPEC */ @@ -324,7 +330,7 @@ extern "C" { * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to * terminate with success, SDL_APP_CONTINUE to continue. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AppIterate * \sa SDL_AppEvent @@ -376,7 +382,7 @@ extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppInit(void **appstate, int a * \threadsafety This function may get called concurrently with SDL_AppEvent() * for events not pushed on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AppInit * \sa SDL_AppEvent @@ -425,7 +431,7 @@ extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppIterate(void *appstate); * SDL_AppIterate() or SDL_AppQuit() for events not pushed from * the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AppInit * \sa SDL_AppIterate @@ -464,7 +470,7 @@ extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppEvent(void *appstate, SDL_E * \threadsafety SDL_AppEvent() may get called concurrently with this function * if other threads that push events are still active. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AppInit */ @@ -482,7 +488,7 @@ extern SDLMAIN_DECLSPEC void SDLCALL SDL_AppQuit(void *appstate, SDL_AppResult r * program completion, and small non-zero values are considered * errors. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef int (SDLCALL *SDL_main_func)(int argc, char *argv[]); @@ -515,7 +521,7 @@ typedef int (SDLCALL *SDL_main_func)(int argc, char *argv[]); * * \threadsafety This is the program entry point. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDLMAIN_DECLSPEC int SDLCALL SDL_main(int argc, char *argv[]); @@ -528,7 +534,7 @@ extern SDLMAIN_DECLSPEC int SDLCALL SDL_main(int argc, char *argv[]); * will not be changed it is necessary to define SDL_MAIN_HANDLED before * including SDL.h. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Init */ @@ -560,7 +566,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetMainReady(void); * \threadsafety Generally this is called once, near startup, from the * process's initial thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_RunApp(int argc, char *argv[], SDL_main_func mainFunction, void *reserved); @@ -587,7 +593,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_RunApp(int argc, char *argv[], SDL_main_func * \threadsafety It is not safe to call this anywhere except as the only * function call in SDL_main. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_EnterAppMainCallbacks(int argc, char *argv[], SDL_AppInit_func appinit, SDL_AppIterate_func appiter, SDL_AppEvent_func appevent, SDL_AppQuit_func appquit); @@ -616,7 +622,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_EnterAppMainCallbacks(int argc, char *argv[] * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_RegisterApp(const char *name, Uint32 style, void *hInst); @@ -633,7 +639,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RegisterApp(const char *name, Uint32 style, * deregistered when the registration counter in SDL_RegisterApp decrements to * zero through calls to this function. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UnregisterApp(void); @@ -645,7 +651,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnregisterApp(void); * This function is only needed for Xbox GDK support; all other platforms will * do nothing and set an "unsupported" error message. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_GDKSuspendComplete(void); diff --git a/libs/SDL3/include/SDL3/SDL_main_impl.h b/libs/SDL3/include/SDL3/SDL_main_impl.h index 761e6b88..14ebb429 100644 --- a/libs/SDL3/include/SDL3/SDL_main_impl.h +++ b/libs/SDL3/include/SDL3/SDL_main_impl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/SDL3/SDL_messagebox.h b/libs/SDL3/include/SDL3/SDL_messagebox.h index 776da2ac..365ae36a 100644 --- a/libs/SDL3/include/SDL3/SDL_messagebox.h +++ b/libs/SDL3/include/SDL3/SDL_messagebox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -22,7 +22,18 @@ /** * # CategoryMessagebox * - * Message box support routines. + * SDL offers a simple message box API, which is useful for simple alerts, + * such as informing the user when something fatal happens at startup without + * the need to build a UI for it (or informing the user _before_ your UI is + * ready). + * + * These message boxes are native system dialogs where possible. + * + * There is both a customizable function (SDL_ShowMessageBox()) that offers + * lots of options for what to display and reports on what choice the user + * made, and also a much-simplified version (SDL_ShowSimpleMessageBox()), + * merely takes a text message and title, and waits until the user presses a + * single "OK" UI button. Often, this is all that is necessary. */ #ifndef SDL_messagebox_h_ @@ -43,7 +54,7 @@ extern "C" { * * If supported will display warning icon, etc. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_MessageBoxFlags; @@ -56,7 +67,7 @@ typedef Uint32 SDL_MessageBoxFlags; /** * SDL_MessageBoxButtonData flags. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_MessageBoxButtonFlags; @@ -66,7 +77,7 @@ typedef Uint32 SDL_MessageBoxButtonFlags; /** * Individual button data. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MessageBoxButtonData { @@ -78,7 +89,7 @@ typedef struct SDL_MessageBoxButtonData /** * RGB value used in a message box color scheme * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MessageBoxColor { @@ -102,7 +113,7 @@ typedef enum SDL_MessageBoxColorType /** * A set of colors to use for message box dialogs * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MessageBoxColorScheme { @@ -112,7 +123,7 @@ typedef struct SDL_MessageBoxColorScheme /** * MessageBox structure containing title, text, window, etc. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_MessageBoxData { @@ -157,7 +168,7 @@ typedef struct SDL_MessageBoxData * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ShowSimpleMessageBox */ @@ -199,7 +210,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ShowMessageBox(const SDL_MessageBoxData *me * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ShowMessageBox */ diff --git a/libs/SDL3/include/SDL3/SDL_metal.h b/libs/SDL3/include/SDL3/SDL_metal.h index ff7f2a0e..14b1bc87 100644 --- a/libs/SDL3/include/SDL3/SDL_metal.h +++ b/libs/SDL3/include/SDL3/SDL_metal.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -23,6 +23,10 @@ * # CategoryMetal * * Functions to creating Metal layers and views on SDL windows. + * + * This provides some platform-specific glue for Apple platforms. Most macOS + * and iOS apps can use SDL without these functions, but this API they can be + * useful for specific OS-level integration tasks. */ #ifndef SDL_metal_h_ @@ -39,7 +43,7 @@ extern "C" { /** * A handle to a CAMetalLayer-backed NSView (macOS) or UIView (iOS/tvOS). * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef void *SDL_MetalView; @@ -61,7 +65,7 @@ typedef void *SDL_MetalView; * \param window the window. * \returns handle NSView or UIView. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Metal_DestroyView * \sa SDL_Metal_GetLayer @@ -76,7 +80,7 @@ extern SDL_DECLSPEC SDL_MetalView SDLCALL SDL_Metal_CreateView(SDL_Window *windo * * \param view the SDL_MetalView object. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Metal_CreateView */ @@ -88,7 +92,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_Metal_DestroyView(SDL_MetalView view); * \param view the SDL_MetalView object. * \returns a pointer. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void * SDLCALL SDL_Metal_GetLayer(SDL_MetalView view); diff --git a/libs/SDL3/include/SDL3/SDL_misc.h b/libs/SDL3/include/SDL3/SDL_misc.h index 45d26f4d..3dd6fcdd 100644 --- a/libs/SDL3/include/SDL3/SDL_misc.h +++ b/libs/SDL3/include/SDL3/SDL_misc.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -65,7 +65,7 @@ extern "C" { * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_OpenURL(const char *url); diff --git a/libs/SDL3/include/SDL3/SDL_mouse.h b/libs/SDL3/include/SDL3/SDL_mouse.h index e6c1ab60..18856e20 100644 --- a/libs/SDL3/include/SDL3/SDL_mouse.h +++ b/libs/SDL3/include/SDL3/SDL_mouse.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -22,7 +22,36 @@ /** * # CategoryMouse * - * SDL mouse handling. + * Any GUI application has to deal with the mouse, and SDL provides functions + * to manage mouse input and the displayed cursor. + * + * Most interactions with the mouse will come through the event subsystem. + * Moving a mouse generates an SDL_EVENT_MOUSE_MOTION event, pushing a button + * generates SDL_EVENT_MOUSE_BUTTON_DOWN, etc, but one can also query the + * current state of the mouse at any time with SDL_GetMouseState(). + * + * For certain games, it's useful to disassociate the mouse cursor from mouse + * input. An FPS, for example, would not want the player's motion to stop as + * the mouse hits the edge of the window. For these scenarios, use + * SDL_SetWindowRelativeMouseMode(), which hides the cursor, grabs mouse input + * to the window, and reads mouse input no matter how far it moves. + * + * Games that want the system to track the mouse but want to draw their own + * cursor can use SDL_HideCursor() and SDL_ShowCursor(). It might be more + * efficient to let the system manage the cursor, if possible, using + * SDL_SetCursor() with a custom image made through SDL_CreateColorCursor(), + * or perhaps just a specific system cursor from SDL_CreateSystemCursor(). + * + * SDL can, on many platforms, differentiate between multiple connected mice, + * allowing for interesting input scenarios and multiplayer games. They can be + * enumerated with SDL_GetMice(), and SDL will send SDL_EVENT_MOUSE_ADDED and + * SDL_EVENT_MOUSE_REMOVED events as they are connected and unplugged. + * + * Since many apps only care about basic mouse input, SDL offers a virtual + * mouse device for touch and pen input, which often can make a desktop + * application work on a touchscreen phone without any code changes. Apps that + * care about touch/pen separately from mouse input should filter out events + * with a `which` field of SDL_TOUCH_MOUSEID/SDL_PEN_MOUSEID. */ #ifndef SDL_mouse_h_ @@ -47,7 +76,7 @@ extern "C" { * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_MouseID; @@ -56,14 +85,14 @@ typedef Uint32 SDL_MouseID; * * This is opaque data. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Cursor SDL_Cursor; /** * Cursor types for SDL_CreateSystemCursor(). * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_SystemCursor { @@ -93,7 +122,7 @@ typedef enum SDL_SystemCursor /** * Scroll direction types for the Scroll event * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_MouseWheelDirection { @@ -110,7 +139,7 @@ typedef enum SDL_MouseWheelDirection * - Button 4: Side mouse button 1 * - Button 5: Side mouse button 2 * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetMouseState * \sa SDL_GetGlobalMouseState @@ -141,7 +170,7 @@ typedef Uint32 SDL_MouseButtonFlags; * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMice */ @@ -163,7 +192,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasMouse(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMouseNameForID * \sa SDL_HasMouse @@ -181,7 +210,7 @@ extern SDL_DECLSPEC SDL_MouseID * SDLCALL SDL_GetMice(int *count); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMice */ @@ -194,7 +223,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetMouseNameForID(SDL_MouseID insta * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocus(void); @@ -224,7 +253,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocus(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGlobalMouseState * \sa SDL_GetRelativeMouseState @@ -260,7 +289,7 @@ extern SDL_DECLSPEC SDL_MouseButtonFlags SDLCALL SDL_GetMouseState(float *x, flo * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CaptureMouse * \sa SDL_GetMouseState @@ -296,7 +325,7 @@ extern SDL_DECLSPEC SDL_MouseButtonFlags SDLCALL SDL_GetGlobalMouseState(float * * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMouseState * \sa SDL_GetGlobalMouseState @@ -320,7 +349,7 @@ extern SDL_DECLSPEC SDL_MouseButtonFlags SDLCALL SDL_GetRelativeMouseState(float * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_WarpMouseGlobal */ @@ -345,7 +374,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_WarpMouseInWindow */ @@ -359,6 +388,11 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WarpMouseGlobal(float x, float y); * report continuous relative mouse motion even if the mouse is at the edge of * the window. * + * If you'd like to keep the mouse position fixed while in relative mode you + * can use SDL_SetWindowMouseRect(). If you'd like the cursor to be at a + * specific location when relative mode ends, you should use + * SDL_WarpMouseInWindow() before disabling relative mode. + * * This function will flush any pending mouse motion for this window. * * \param window the window to change. @@ -368,7 +402,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WarpMouseGlobal(float x, float y); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowRelativeMouseMode */ @@ -382,7 +416,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowRelativeMouseMode(SDL_Window *wind * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowRelativeMouseMode */ @@ -430,7 +464,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowRelativeMouseMode(SDL_Window *wind * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGlobalMouseState */ @@ -473,7 +507,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CaptureMouse(bool enabled); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateColorCursor * \sa SDL_CreateSystemCursor @@ -506,7 +540,7 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_CreateCursor(const Uint8 * data, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateCursor * \sa SDL_CreateSystemCursor @@ -526,7 +560,7 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_CreateColorCursor(SDL_Surface *surf * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyCursor */ @@ -546,7 +580,7 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_CreateSystemCursor(SDL_SystemCursor * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCursor */ @@ -562,7 +596,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetCursor(SDL_Cursor *cursor); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetCursor */ @@ -579,7 +613,7 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_GetCursor(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_GetDefaultCursor(void); @@ -593,7 +627,7 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_GetDefaultCursor(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateColorCursor * \sa SDL_CreateCursor @@ -609,7 +643,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyCursor(SDL_Cursor *cursor); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CursorVisible * \sa SDL_HideCursor @@ -624,7 +658,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ShowCursor(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CursorVisible * \sa SDL_ShowCursor @@ -639,7 +673,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HideCursor(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HideCursor * \sa SDL_ShowCursor diff --git a/libs/SDL3/include/SDL3/SDL_mutex.h b/libs/SDL3/include/SDL3/SDL_mutex.h index e21d3df1..c88ec153 100644 --- a/libs/SDL3/include/SDL3/SDL_mutex.h +++ b/libs/SDL3/include/SDL3/SDL_mutex.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -25,7 +25,19 @@ /** * # CategoryMutex * - * Functions to provide thread synchronization primitives. + * SDL offers several thread synchronization primitives. This document can't + * cover the complicated topic of thread safety, but reading up on what each + * of these primitives are, why they are useful, and how to correctly use them + * is vital to writing correct and safe multithreaded programs. + * + * - Mutexes: SDL_CreateMutex() + * - Read/Write locks: SDL_CreateRWLock() + * - Semaphores: SDL_CreateSemaphore() + * - Condition variables: SDL_CreateCondition() + * + * SDL also offers a datatype, SDL_InitState, which can be used to make sure + * only one thread initializes/deinitializes some resource that several + * threads might try to use for the first time simultaneously. */ #include @@ -60,7 +72,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_CAPABILITY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(capability(x)) @@ -70,7 +82,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_SCOPED_CAPABILITY \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) @@ -80,7 +92,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_GUARDED_BY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x)) @@ -90,7 +102,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PT_GUARDED_BY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x)) @@ -100,7 +112,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ACQUIRED_BEFORE(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(x)) @@ -110,7 +122,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ACQUIRED_AFTER(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(x)) @@ -120,7 +132,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_REQUIRES(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(requires_capability(x)) @@ -130,7 +142,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_REQUIRES_SHARED(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(requires_shared_capability(x)) @@ -140,7 +152,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ACQUIRE(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquire_capability(x)) @@ -150,7 +162,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ACQUIRE_SHARED(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquire_shared_capability(x)) @@ -160,7 +172,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_RELEASE(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(release_capability(x)) @@ -170,7 +182,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_RELEASE_SHARED(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(release_shared_capability(x)) @@ -180,7 +192,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_RELEASE_GENERIC(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(release_generic_capability(x)) @@ -190,7 +202,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_TRY_ACQUIRE(x, y) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(x, y)) @@ -200,7 +212,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_TRY_ACQUIRE_SHARED(x, y) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_shared_capability(x, y)) @@ -210,7 +222,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_EXCLUDES(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(x)) @@ -220,7 +232,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ASSERT_CAPABILITY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(assert_capability(x)) @@ -230,7 +242,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ASSERT_SHARED_CAPABILITY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_capability(x)) @@ -240,7 +252,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_RETURN_CAPABILITY(x) \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x)) @@ -250,7 +262,7 @@ * * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_NO_THREAD_SAFETY_ANALYSIS \ SDL_THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis) @@ -279,7 +291,7 @@ extern "C" { * * https://en.wikipedia.org/wiki/Mutex * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Mutex SDL_Mutex; @@ -296,7 +308,7 @@ typedef struct SDL_Mutex SDL_Mutex; * \returns the initialized and unlocked mutex or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyMutex * \sa SDL_LockMutex @@ -322,7 +334,7 @@ extern SDL_DECLSPEC SDL_Mutex * SDLCALL SDL_CreateMutex(void); * * \param mutex the mutex to lock. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_TryLockMutex * \sa SDL_UnlockMutex @@ -343,7 +355,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockMutex(SDL_Mutex *mutex) SDL_ACQUIRE(mut * \param mutex the mutex to try to lock. * \returns true on success, false if the mutex would block. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockMutex * \sa SDL_UnlockMutex @@ -362,7 +374,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_TryLockMutex(SDL_Mutex *mutex) SDL_TRY_ACQU * * \param mutex the mutex to unlock. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockMutex * \sa SDL_TryLockMutex @@ -380,7 +392,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockMutex(SDL_Mutex *mutex) SDL_RELEASE(m * * \param mutex the mutex to destroy. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateMutex */ @@ -410,7 +422,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_Mutex *mutex); * about how threads are scheduled and when they can be recursively locked. * These are documented in the other rwlock functions. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_RWLock SDL_RWLock; @@ -445,7 +457,7 @@ typedef struct SDL_RWLock SDL_RWLock; * \returns the initialized and unlocked read/write lock or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyRWLock * \sa SDL_LockRWLockForReading @@ -485,7 +497,7 @@ extern SDL_DECLSPEC SDL_RWLock * SDLCALL SDL_CreateRWLock(void); * * \param rwlock the read/write lock to lock. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForWriting * \sa SDL_TryLockRWLockForReading @@ -516,7 +528,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockRWLockForReading(SDL_RWLock *rwlock) SD * * \param rwlock the read/write lock to lock. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForReading * \sa SDL_TryLockRWLockForWriting @@ -541,7 +553,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockRWLockForWriting(SDL_RWLock *rwlock) SD * \param rwlock the rwlock to try to lock. * \returns true on success, false if the lock would block. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForReading * \sa SDL_TryLockRWLockForWriting @@ -571,7 +583,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_TryLockRWLockForReading(SDL_RWLock *rwlock) * \param rwlock the rwlock to try to lock. * \returns true on success, false if the lock would block. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForWriting * \sa SDL_TryLockRWLockForReading @@ -595,7 +607,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_TryLockRWLockForWriting(SDL_RWLock *rwlock) * * \param rwlock the rwlock to unlock. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForReading * \sa SDL_LockRWLockForWriting @@ -615,7 +627,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockRWLock(SDL_RWLock *rwlock) SDL_RELEAS * * \param rwlock the rwlock to destroy. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRWLock */ @@ -641,7 +653,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyRWLock(SDL_RWLock *rwlock); * * https://en.wikipedia.org/wiki/Semaphore_(programming) * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Semaphore SDL_Semaphore; @@ -658,7 +670,7 @@ typedef struct SDL_Semaphore SDL_Semaphore; * \returns a new semaphore or NULL on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySemaphore * \sa SDL_SignalSemaphore @@ -677,7 +689,7 @@ extern SDL_DECLSPEC SDL_Semaphore * SDLCALL SDL_CreateSemaphore(Uint32 initial_v * * \param sem the semaphore to destroy. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateSemaphore */ @@ -695,7 +707,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_Semaphore *sem); * * \param sem the semaphore wait on. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SignalSemaphore * \sa SDL_TryWaitSemaphore @@ -714,7 +726,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_WaitSemaphore(SDL_Semaphore *sem); * \param sem the semaphore to wait on. * \returns true if the wait succeeds, false if the wait would block. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SignalSemaphore * \sa SDL_WaitSemaphore @@ -734,7 +746,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_TryWaitSemaphore(SDL_Semaphore *sem); * indefinitely. * \returns true if the wait succeeds or false if the wait times out. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SignalSemaphore * \sa SDL_TryWaitSemaphore @@ -747,7 +759,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WaitSemaphoreTimeout(SDL_Semaphore *sem, Si * * \param sem the semaphore to increment. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_TryWaitSemaphore * \sa SDL_WaitSemaphore @@ -761,7 +773,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SignalSemaphore(SDL_Semaphore *sem); * \param sem the semaphore to query. * \returns the current value of the semaphore. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetSemaphoreValue(SDL_Semaphore *sem); @@ -784,7 +796,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetSemaphoreValue(SDL_Semaphore *sem); * * https://en.wikipedia.org/wiki/Condition_variable * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Condition SDL_Condition; @@ -794,7 +806,7 @@ typedef struct SDL_Condition SDL_Condition; * \returns a new condition variable or NULL on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BroadcastCondition * \sa SDL_SignalCondition @@ -809,7 +821,7 @@ extern SDL_DECLSPEC SDL_Condition * SDLCALL SDL_CreateCondition(void); * * \param cond the condition variable to destroy. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateCondition */ @@ -822,7 +834,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyCondition(SDL_Condition *cond); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BroadcastCondition * \sa SDL_WaitCondition @@ -837,7 +849,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SignalCondition(SDL_Condition *cond); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SignalCondition * \sa SDL_WaitCondition @@ -865,7 +877,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BroadcastCondition(SDL_Condition *cond); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BroadcastCondition * \sa SDL_SignalCondition @@ -895,7 +907,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_WaitCondition(SDL_Condition *cond, SDL_Mute * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BroadcastCondition * \sa SDL_SignalCondition @@ -914,7 +926,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WaitConditionTimeout(SDL_Condition *cond, /** * The current status of an SDL_InitState structure. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_InitStatus { @@ -963,7 +975,7 @@ typedef enum SDL_InitStatus * { * if (!SDL_ShouldQuit(&init)) { * // The system is not initialized - * return true; + * return; * } * * // At this point, you should not leave this function without calling SDL_SetInitialized() @@ -978,7 +990,7 @@ typedef enum SDL_InitStatus * should use other mechanisms to protect those, if that's a concern for your * code. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_InitState { @@ -1003,7 +1015,7 @@ typedef struct SDL_InitState * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetInitialized * \sa SDL_ShouldQuit @@ -1024,7 +1036,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ShouldInit(SDL_InitState *state); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetInitialized * \sa SDL_ShouldInit @@ -1043,7 +1055,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ShouldQuit(SDL_InitState *state); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ShouldInit * \sa SDL_ShouldQuit diff --git a/libs/SDL3/include/SDL3/SDL_oldnames.h b/libs/SDL3/include/SDL3/SDL_oldnames.h index d9bb59ec..c93607e3 100644 --- a/libs/SDL3/include/SDL3/SDL_oldnames.h +++ b/libs/SDL3/include/SDL3/SDL_oldnames.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -307,6 +307,8 @@ #define SDL_HINT_DIRECTINPUT_ENABLED SDL_HINT_JOYSTICK_DIRECTINPUT #define SDL_HINT_GDK_TEXTINPUT_DEFAULT SDL_HINT_GDK_TEXTINPUT_DEFAULT_TEXT #define SDL_HINT_JOYSTICK_GAMECUBE_RUMBLE_BRAKE SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE +#define SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE SDL_HINT_JOYSTICK_ENHANCED_REPORTS +#define SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE SDL_HINT_JOYSTICK_ENHANCED_REPORTS #define SDL_HINT_LINUX_DIGITAL_HATS SDL_HINT_JOYSTICK_LINUX_DIGITAL_HATS #define SDL_HINT_LINUX_HAT_DEADZONES SDL_HINT_JOYSTICK_LINUX_HAT_DEADZONES #define SDL_HINT_LINUX_JOYSTICK_CLASSIC SDL_HINT_JOYSTICK_LINUX_CLASSIC @@ -949,6 +951,8 @@ #define SDL_HINT_DIRECTINPUT_ENABLED SDL_HINT_DIRECTINPUT_ENABLED_renamed_SDL_HINT_JOYSTICK_DIRECTINPUT #define SDL_HINT_GDK_TEXTINPUT_DEFAULT SDL_HINT_GDK_TEXTINPUT_DEFAULT_renamed_SDL_HINT_GDK_TEXTINPUT_DEFAULT_TEXT #define SDL_HINT_JOYSTICK_GAMECUBE_RUMBLE_BRAKE SDL_HINT_JOYSTICK_GAMECUBE_RUMBLE_BRAKE_renamed_SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE +#define SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE_renamed_SDL_HINT_JOYSTICK_ENHANCED_REPORTS +#define SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE_renamed_SDL_HINT_JOYSTICK_ENHANCED_REPORTS #define SDL_HINT_LINUX_DIGITAL_HATS SDL_HINT_LINUX_DIGITAL_HATS_renamed_SDL_HINT_JOYSTICK_LINUX_DIGITAL_HATS #define SDL_HINT_LINUX_HAT_DEADZONES SDL_HINT_LINUX_HAT_DEADZONES_renamed_SDL_HINT_JOYSTICK_LINUX_HAT_DEADZONES #define SDL_HINT_LINUX_JOYSTICK_CLASSIC SDL_HINT_LINUX_JOYSTICK_CLASSIC_renamed_SDL_HINT_JOYSTICK_LINUX_CLASSIC diff --git a/libs/SDL3/include/SDL3/SDL_opengl.h b/libs/SDL3/include/SDL3/SDL_opengl.h index 1292f425..d1b8b02a 100644 --- a/libs/SDL3/include/SDL3/SDL_opengl.h +++ b/libs/SDL3/include/SDL3/SDL_opengl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/SDL3/SDL_opengles.h b/libs/SDL3/include/SDL3/SDL_opengles.h index bde4d74f..4fb9a4b7 100644 --- a/libs/SDL3/include/SDL3/SDL_opengles.h +++ b/libs/SDL3/include/SDL3/SDL_opengles.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/SDL3/SDL_opengles2.h b/libs/SDL3/include/SDL3/SDL_opengles2.h index ba196010..365898a6 100644 --- a/libs/SDL3/include/SDL3/SDL_opengles2.h +++ b/libs/SDL3/include/SDL3/SDL_opengles2.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/SDL3/SDL_pen.h b/libs/SDL3/include/SDL3/SDL_pen.h index 6f0eef50..5182eeb0 100644 --- a/libs/SDL3/include/SDL3/SDL_pen.h +++ b/libs/SDL3/include/SDL3/SDL_pen.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -40,6 +40,8 @@ #define SDL_pen_h_ #include +#include +#include /* Set up for C function definitions, even when using C++ */ #ifdef __cplusplus @@ -55,15 +57,29 @@ extern "C" { * consistent as long as SDL can recognize a tool to be the same pen; but if a * pen physically leaves the area and returns, it might get a new ID. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_PenID; +/** + * The SDL_MouseID for mouse events simulated with pen input. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PEN_MOUSEID ((SDL_MouseID)-2) + +/** + * The SDL_TouchID for touch events simulated with pen input. + * + * \since This macro is available since SDL 3.2.0. + */ +#define SDL_PEN_TOUCHID ((SDL_TouchID)-2) + /** * Pen input flags, as reported by various pen events' `pen_state` field. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_PenInputFlags; @@ -88,7 +104,7 @@ typedef Uint32 SDL_PenInputFlags; * * `SDL_sinf(xtilt * SDL_PI_F / 180.0)`. * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_PenAxis { diff --git a/libs/SDL3/include/SDL3/SDL_pixels.h b/libs/SDL3/include/SDL3/SDL_pixels.h index 1f4f9756..b6f38acb 100644 --- a/libs/SDL3/include/SDL3/SDL_pixels.h +++ b/libs/SDL3/include/SDL3/SDL_pixels.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -93,7 +93,7 @@ extern "C" { /** * A fully opaque 8-bit alpha value. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_ALPHA_TRANSPARENT */ @@ -102,7 +102,7 @@ extern "C" { /** * A fully opaque floating point alpha value. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_ALPHA_TRANSPARENT_FLOAT */ @@ -111,7 +111,7 @@ extern "C" { /** * A fully transparent 8-bit alpha value. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_ALPHA_OPAQUE */ @@ -120,7 +120,7 @@ extern "C" { /** * A fully transparent floating point alpha value. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_ALPHA_OPAQUE_FLOAT */ @@ -129,7 +129,7 @@ extern "C" { /** * Pixel type. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_PixelType { @@ -152,7 +152,7 @@ typedef enum SDL_PixelType /** * Bitmap pixel order, high bit -> low bit. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_BitmapOrder { @@ -164,7 +164,7 @@ typedef enum SDL_BitmapOrder /** * Packed component order, high bit -> low bit. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_PackedOrder { @@ -182,7 +182,7 @@ typedef enum SDL_PackedOrder /** * Array component order, low byte -> high byte. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ArrayOrder { @@ -198,7 +198,7 @@ typedef enum SDL_ArrayOrder /** * Packed component layout. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_PackedLayout { @@ -230,7 +230,7 @@ typedef enum SDL_PackedLayout * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_DEFINE_PIXELFOURCC(A, B, C, D) SDL_FOURCC(A, B, C, D) @@ -254,7 +254,7 @@ typedef enum SDL_PackedLayout * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_DEFINE_PIXELFORMAT(type, order, layout, bits, bytes) \ ((1 << 28) | ((type) << 24) | ((order) << 20) | ((layout) << 16) | \ @@ -271,7 +271,7 @@ typedef enum SDL_PackedLayout * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PIXELFLAG(format) (((format) >> 28) & 0x0F) @@ -285,7 +285,7 @@ typedef enum SDL_PackedLayout * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PIXELTYPE(format) (((format) >> 24) & 0x0F) @@ -300,7 +300,7 @@ typedef enum SDL_PackedLayout * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PIXELORDER(format) (((format) >> 20) & 0x0F) @@ -315,7 +315,7 @@ typedef enum SDL_PackedLayout * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PIXELLAYOUT(format) (((format) >> 16) & 0x0F) @@ -333,7 +333,7 @@ typedef enum SDL_PackedLayout * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_BYTESPERPIXEL */ @@ -354,7 +354,7 @@ typedef enum SDL_PackedLayout * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_BITSPERPIXEL */ @@ -377,7 +377,7 @@ typedef enum SDL_PackedLayout * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ISPIXELFORMAT_INDEXED(format) \ (!SDL_ISPIXELFORMAT_FOURCC(format) && \ @@ -397,7 +397,7 @@ typedef enum SDL_PackedLayout * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ISPIXELFORMAT_PACKED(format) \ (!SDL_ISPIXELFORMAT_FOURCC(format) && \ @@ -416,7 +416,7 @@ typedef enum SDL_PackedLayout * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ISPIXELFORMAT_ARRAY(format) \ (!SDL_ISPIXELFORMAT_FOURCC(format) && \ @@ -437,7 +437,7 @@ typedef enum SDL_PackedLayout * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ISPIXELFORMAT_10BIT(format) \ (!SDL_ISPIXELFORMAT_FOURCC(format) && \ @@ -455,7 +455,7 @@ typedef enum SDL_PackedLayout * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ISPIXELFORMAT_FLOAT(format) \ (!SDL_ISPIXELFORMAT_FOURCC(format) && \ @@ -473,7 +473,7 @@ typedef enum SDL_PackedLayout * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ISPIXELFORMAT_ALPHA(format) \ ((SDL_ISPIXELFORMAT_PACKED(format) && \ @@ -501,7 +501,7 @@ typedef enum SDL_PackedLayout * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ISPIXELFORMAT_FOURCC(format) /* The flag is set to 1 because 0x1? is not in the printable ASCII range */ \ ((format) && (SDL_PIXELFLAG(format) != 1)) @@ -543,7 +543,7 @@ typedef enum SDL_PackedLayout * an alias for ABGR8888 on little-endian CPUs like x86, or an alias for * RGBA8888 on big-endian CPUs. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_PixelFormat { @@ -701,7 +701,7 @@ typedef enum SDL_PixelFormat /** * Colorspace color type. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ColorType { @@ -714,7 +714,7 @@ typedef enum SDL_ColorType * Colorspace color range, as described by * https://www.itu.int/rec/R-REC-BT.2100-2-201807-I/en * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ColorRange { @@ -727,7 +727,7 @@ typedef enum SDL_ColorRange * Colorspace color primaries, as described by * https://www.itu.int/rec/T-REC-H.273-201612-S/en * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ColorPrimaries { @@ -752,7 +752,7 @@ typedef enum SDL_ColorPrimaries * * These are as described by https://www.itu.int/rec/T-REC-H.273-201612-S/en * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_TransferCharacteristics { @@ -782,7 +782,7 @@ typedef enum SDL_TransferCharacteristics * * These are as described by https://www.itu.int/rec/T-REC-H.273-201612-S/en * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_MatrixCoefficients { @@ -806,7 +806,7 @@ typedef enum SDL_MatrixCoefficients /** * Colorspace chroma sample location. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ChromaLocation { @@ -847,7 +847,7 @@ typedef enum SDL_ChromaLocation * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_DEFINE_COLORSPACE(type, range, primaries, transfer, matrix, chroma) \ (((Uint32)(type) << 28) | ((Uint32)(range) << 24) | ((Uint32)(chroma) << 20) | \ @@ -861,7 +861,7 @@ typedef enum SDL_ChromaLocation * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_COLORSPACETYPE(cspace) (SDL_ColorType)(((cspace) >> 28) & 0x0F) @@ -873,7 +873,7 @@ typedef enum SDL_ChromaLocation * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_COLORSPACERANGE(cspace) (SDL_ColorRange)(((cspace) >> 24) & 0x0F) @@ -885,7 +885,7 @@ typedef enum SDL_ChromaLocation * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_COLORSPACECHROMA(cspace) (SDL_ChromaLocation)(((cspace) >> 20) & 0x0F) @@ -897,7 +897,7 @@ typedef enum SDL_ChromaLocation * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_COLORSPACEPRIMARIES(cspace) (SDL_ColorPrimaries)(((cspace) >> 10) & 0x1F) @@ -909,7 +909,7 @@ typedef enum SDL_ChromaLocation * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_COLORSPACETRANSFER(cspace) (SDL_TransferCharacteristics)(((cspace) >> 5) & 0x1F) @@ -921,7 +921,7 @@ typedef enum SDL_ChromaLocation * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_COLORSPACEMATRIX(cspace) (SDL_MatrixCoefficients)((cspace) & 0x1F) @@ -937,7 +937,7 @@ typedef enum SDL_ChromaLocation * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ISCOLORSPACE_MATRIX_BT601(cspace) (SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT601 || SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT470BG) @@ -949,7 +949,7 @@ typedef enum SDL_ChromaLocation * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ISCOLORSPACE_MATRIX_BT709(cspace) (SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT709) @@ -962,7 +962,7 @@ typedef enum SDL_ChromaLocation * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ISCOLORSPACE_MATRIX_BT2020_NCL(cspace) (SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT2020_NCL) @@ -974,7 +974,7 @@ typedef enum SDL_ChromaLocation * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ISCOLORSPACE_LIMITED_RANGE(cspace) (SDL_COLORSPACERANGE(cspace) != SDL_COLOR_RANGE_FULL) @@ -986,7 +986,7 @@ typedef enum SDL_ChromaLocation * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ISCOLORSPACE_FULL_RANGE(cspace) (SDL_COLORSPACERANGE(cspace) == SDL_COLOR_RANGE_FULL) @@ -997,7 +997,7 @@ typedef enum SDL_ChromaLocation * function, etc.), this is not an exhaustive list, but rather a * representative sample of the kinds of colorspaces supported in SDL. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_ColorPrimaries * \sa SDL_ColorRange @@ -1104,7 +1104,7 @@ typedef enum SDL_Colorspace * (SDL_PIXELFORMAT_ABGR8888 on little-endian systems and * SDL_PIXELFORMAT_RGBA8888 on big-endian systems). * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Color { @@ -1118,7 +1118,7 @@ typedef struct SDL_Color * The bits of this structure can be directly reinterpreted as a float-packed * color which uses the SDL_PIXELFORMAT_RGBA128_FLOAT format * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_FColor { @@ -1131,7 +1131,7 @@ typedef struct SDL_FColor /** * A set of indexed colors representing a palette. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_SetPaletteColors */ @@ -1146,7 +1146,7 @@ typedef struct SDL_Palette /** * Details about the format of a pixel. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PixelFormatDetails { @@ -1177,7 +1177,7 @@ typedef struct SDL_PixelFormatDetails * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetPixelFormatName(SDL_PixelFormat format); @@ -1195,7 +1195,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetPixelFormatName(SDL_PixelFormat * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPixelFormatForMasks */ @@ -1217,7 +1217,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetMasksForPixelFormat(SDL_PixelFormat form * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMasksForPixelFormat */ @@ -1236,7 +1236,7 @@ extern SDL_DECLSPEC SDL_PixelFormat SDLCALL SDL_GetPixelFormatForMasks(int bpp, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const SDL_PixelFormatDetails * SDLCALL SDL_GetPixelFormatDetails(SDL_PixelFormat format); @@ -1252,7 +1252,7 @@ extern SDL_DECLSPEC const SDL_PixelFormatDetails * SDLCALL SDL_GetPixelFormatDet * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyPalette * \sa SDL_SetPaletteColors @@ -1273,7 +1273,7 @@ extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_CreatePalette(int ncolors); * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified or destroyed in another thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetPaletteColors(SDL_Palette *palette, const SDL_Color *colors, int firstcolor, int ncolors); @@ -1285,7 +1285,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetPaletteColors(SDL_Palette *palette, cons * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified or destroyed in another thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreatePalette */ @@ -1320,7 +1320,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyPalette(SDL_Palette *palette); * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPixelFormatDetails * \sa SDL_GetRGB @@ -1359,7 +1359,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapRGB(const SDL_PixelFormatDetails *form * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPixelFormatDetails * \sa SDL_GetRGBA @@ -1387,7 +1387,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapRGBA(const SDL_PixelFormatDetails *for * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPixelFormatDetails * \sa SDL_GetRGBA @@ -1419,7 +1419,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, const SDL_PixelFormatD * \threadsafety It is safe to call this function from any thread, as long as * the palette is not modified. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPixelFormatDetails * \sa SDL_GetRGB diff --git a/libs/SDL3/include/SDL3/SDL_platform.h b/libs/SDL3/include/SDL3/SDL_platform.h index 9f4689d6..e40f009b 100644 --- a/libs/SDL3/include/SDL3/SDL_platform.h +++ b/libs/SDL3/include/SDL3/SDL_platform.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -51,7 +51,7 @@ extern "C" { * \returns the name of the platform. If the correct platform name is not * available, returns a string beginning with the text "Unknown". * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetPlatform(void); diff --git a/libs/SDL3/include/SDL3/SDL_platform_defines.h b/libs/SDL3/include/SDL3/SDL_platform_defines.h index 82661bb3..7e9a0a92 100644 --- a/libs/SDL3/include/SDL3/SDL_platform_defines.h +++ b/libs/SDL3/include/SDL3/SDL_platform_defines.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -33,7 +33,7 @@ /** * A preprocessor macro that is only defined if compiling for AIX. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_AIX 1 #endif @@ -43,7 +43,7 @@ /** * A preprocessor macro that is only defined if compiling for Haiku OS. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_HAIKU 1 #endif @@ -53,7 +53,7 @@ /** * A preprocessor macro that is only defined if compiling for BSDi * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_BSDI 1 #endif @@ -63,7 +63,7 @@ /** * A preprocessor macro that is only defined if compiling for FreeBSD. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_FREEBSD 1 #endif @@ -73,7 +73,7 @@ /** * A preprocessor macro that is only defined if compiling for HP-UX. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_HPUX 1 #endif @@ -83,7 +83,7 @@ /** * A preprocessor macro that is only defined if compiling for IRIX. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_IRIX 1 #endif @@ -96,7 +96,7 @@ * Note that Android, although ostensibly a Linux-based system, will not * define this. It defines SDL_PLATFORM_ANDROID instead. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_LINUX 1 #endif @@ -106,7 +106,7 @@ /** * A preprocessor macro that is only defined if compiling for Android. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_ANDROID 1 #undef SDL_PLATFORM_LINUX @@ -121,7 +121,7 @@ * Other platforms, like Linux, might define this in addition to their primary * define. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_UNIX 1 #endif @@ -133,7 +133,7 @@ * * iOS, macOS, etc will additionally define a more specific platform macro. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_PLATFORM_MACOS * \sa SDL_PLATFORM_IOS @@ -180,7 +180,7 @@ /** * A preprocessor macro that is only defined if compiling for tvOS. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_PLATFORM_APPLE */ @@ -192,7 +192,7 @@ /** * A preprocessor macro that is only defined if compiling for VisionOS. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_PLATFORM_APPLE */ @@ -204,7 +204,7 @@ /** * A preprocessor macro that is only defined if compiling for iOS. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_PLATFORM_APPLE */ @@ -215,7 +215,7 @@ /** * A preprocessor macro that is only defined if compiling for macOS. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_PLATFORM_APPLE */ @@ -232,7 +232,7 @@ /** * A preprocessor macro that is only defined if compiling for Emscripten. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_EMSCRIPTEN 1 #endif @@ -242,7 +242,7 @@ /** * A preprocessor macro that is only defined if compiling for NetBSD. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_NETBSD 1 #endif @@ -252,7 +252,7 @@ /** * A preprocessor macro that is only defined if compiling for OpenBSD. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_OPENBSD 1 #endif @@ -262,7 +262,7 @@ /** * A preprocessor macro that is only defined if compiling for OS/2. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_OS2 1 #endif @@ -272,7 +272,7 @@ /** * A preprocessor macro that is only defined if compiling for Tru64 (OSF/1). * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_OSF 1 #endif @@ -282,7 +282,7 @@ /** * A preprocessor macro that is only defined if compiling for QNX Neutrino. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_QNXNTO 1 #endif @@ -292,7 +292,7 @@ /** * A preprocessor macro that is only defined if compiling for RISC OS. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_RISCOS 1 #endif @@ -302,7 +302,7 @@ /** * A preprocessor macro that is only defined if compiling for SunOS/Solaris. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_SOLARIS 1 #endif @@ -312,7 +312,7 @@ /** * A preprocessor macro that is only defined if compiling for Cygwin. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_CYGWIN 1 #endif @@ -325,7 +325,7 @@ * This also covers several other platforms, like Microsoft GDK, Xbox, WinRT, * etc. Each will have their own more-specific platform macros, too. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_PLATFORM_WIN32 * \sa SDL_PLATFORM_XBOXONE @@ -362,11 +362,11 @@ /** * A preprocessor macro that defined to 1 if compiling for Windows Phone. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_WINAPI_FAMILY_PHONE (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) -#elif HAVE_WINAPIFAMILY_H && HAVE_WINAPIFAMILY_H +#elif defined(HAVE_WINAPIFAMILY_H) && HAVE_WINAPIFAMILY_H #define SDL_WINAPI_FAMILY_PHONE (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) #else #define SDL_WINAPI_FAMILY_PHONE 0 @@ -381,7 +381,7 @@ * A preprocessor macro that is only defined if compiling for Microsoft GDK * for Windows. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_WINGDK 1 @@ -390,7 +390,7 @@ /** * A preprocessor macro that is only defined if compiling for Xbox One. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_XBOXONE 1 @@ -399,7 +399,7 @@ /** * A preprocessor macro that is only defined if compiling for Xbox Series. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_XBOXSERIES 1 @@ -412,7 +412,7 @@ * convention, its system layer tends to still be referred to as "the Win32 * API." * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_WIN32 1 @@ -427,7 +427,7 @@ * A preprocessor macro that is only defined if compiling for Microsoft GDK on * any platform. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_GDK 1 #endif @@ -437,7 +437,7 @@ /** * A preprocessor macro that is only defined if compiling for Sony PSP. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_PSP 1 #endif @@ -448,7 +448,7 @@ * A preprocessor macro that is only defined if compiling for Sony PlayStation * 2. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_PS2 1 #endif @@ -458,7 +458,7 @@ /** * A preprocessor macro that is only defined if compiling for Sony Vita. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_VITA 1 #endif @@ -468,7 +468,7 @@ /** * A preprocessor macro that is only defined if compiling for Nintendo 3DS. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PLATFORM_3DS 1 diff --git a/libs/SDL3/include/SDL3/SDL_power.h b/libs/SDL3/include/SDL3/SDL_power.h index 5265eaf9..4056ce3c 100644 --- a/libs/SDL3/include/SDL3/SDL_power.h +++ b/libs/SDL3/include/SDL3/SDL_power.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -26,6 +26,15 @@ * # CategoryPower * * SDL power management routines. + * + * There is a single function in this category: SDL_GetPowerInfo(). + * + * This function is useful for games on the go. This allows an app to know if + * it's running on a draining battery, which can be useful if the app wants to + * reduce processing, or perhaps framerate, to extend the duration of the + * battery's charge. Perhaps the app just wants to show a battery meter when + * fullscreen, or alert the user when the power is getting extremely low, so + * they can save their game. */ #include @@ -42,7 +51,7 @@ extern "C" { * * These are results returned by SDL_GetPowerInfo(). * - * \since This enum is available since SDL 3.1.3 + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_PowerState { @@ -80,7 +89,7 @@ typedef enum SDL_PowerState * \returns the current battery state or `SDL_POWERSTATE_ERROR` on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetPowerInfo(int *seconds, int *percent); diff --git a/libs/SDL3/include/SDL3/SDL_process.h b/libs/SDL3/include/SDL3/SDL_process.h index 7cabeee0..2cc77395 100644 --- a/libs/SDL3/include/SDL3/SDL_process.h +++ b/libs/SDL3/include/SDL3/SDL_process.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -57,7 +57,7 @@ extern "C" { /** * An opaque handle representing a system process. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_CreateProcess */ @@ -92,7 +92,7 @@ typedef struct SDL_Process SDL_Process; * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProcessWithProperties * \sa SDL_GetProcessProperties @@ -139,7 +139,7 @@ extern SDL_DECLSPEC SDL_Process *SDLCALL SDL_CreateProcess(const char * const *a * `SDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER` set. This is true for streams * representing files and process I/O. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_CreateProcessWithProperties * \sa SDL_GetProcessProperties @@ -204,7 +204,7 @@ typedef enum SDL_ProcessIO * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProcess * \sa SDL_GetProcessProperties @@ -252,7 +252,7 @@ extern SDL_DECLSPEC SDL_Process *SDLCALL SDL_CreateProcessWithProperties(SDL_Pro * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProcess * \sa SDL_CreateProcessWithProperties @@ -288,7 +288,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetProcessProperties(SDL_Proces * * \threadsafety This function is not thread safe. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProcess * \sa SDL_CreateProcessWithProperties @@ -314,7 +314,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_ReadProcess(SDL_Process *process, size_t * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProcess * \sa SDL_CreateProcessWithProperties @@ -338,7 +338,7 @@ extern SDL_DECLSPEC SDL_IOStream *SDLCALL SDL_GetProcessInput(SDL_Process *proce * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProcess * \sa SDL_CreateProcessWithProperties @@ -360,7 +360,7 @@ extern SDL_DECLSPEC SDL_IOStream *SDLCALL SDL_GetProcessOutput(SDL_Process *proc * * \threadsafety This function is not thread safe. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProcess * \sa SDL_CreateProcessWithProperties @@ -393,7 +393,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_KillProcess(SDL_Process *process, bool forc * * \threadsafety This function is not thread safe. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProcess * \sa SDL_CreateProcessWithProperties @@ -413,7 +413,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WaitProcess(SDL_Process *process, bool bloc * * \threadsafety This function is not thread safe. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProcess * \sa SDL_CreateProcessWithProperties diff --git a/libs/SDL3/include/SDL3/SDL_properties.h b/libs/SDL3/include/SDL3/SDL_properties.h index 45852407..1f47d5f4 100644 --- a/libs/SDL3/include/SDL3/SDL_properties.h +++ b/libs/SDL3/include/SDL3/SDL_properties.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -61,14 +61,14 @@ extern "C" { /** * SDL properties ID * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_PropertiesID; /** * SDL property type * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_PropertyType { @@ -86,7 +86,7 @@ typedef enum SDL_PropertyType * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGlobalProperties(void); @@ -100,7 +100,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGlobalProperties(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyProperties */ @@ -121,7 +121,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_CreateProperties(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_CopyProperties(SDL_PropertiesID src, SDL_PropertiesID dst); @@ -143,7 +143,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CopyProperties(SDL_PropertiesID src, SDL_Pr * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_UnlockProperties */ @@ -156,7 +156,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_LockProperties(SDL_PropertiesID props); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockProperties */ @@ -180,7 +180,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockProperties(SDL_PropertiesID props); * \threadsafety This callback may fire without any locks held; if this is a * concern, the app should provide its own locking. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetPointerPropertyWithCleanup */ @@ -209,7 +209,7 @@ typedef void (SDLCALL *SDL_CleanupPropertyCallback)(void *userdata, void *value) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPointerProperty * \sa SDL_SetPointerProperty @@ -228,7 +228,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetPointerPropertyWithCleanup(SDL_Propertie * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPointerProperty * \sa SDL_HasProperty @@ -254,7 +254,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetPointerProperty(SDL_PropertiesID props, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetStringProperty */ @@ -271,7 +271,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetStringProperty(SDL_PropertiesID props, c * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumberProperty */ @@ -288,7 +288,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetNumberProperty(SDL_PropertiesID props, c * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetFloatProperty */ @@ -305,7 +305,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetFloatProperty(SDL_PropertiesID props, co * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetBooleanProperty */ @@ -320,7 +320,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetBooleanProperty(SDL_PropertiesID props, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPropertyType */ @@ -336,7 +336,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasProperty(SDL_PropertiesID props, const c * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasProperty */ @@ -363,7 +363,7 @@ extern SDL_DECLSPEC SDL_PropertyType SDLCALL SDL_GetPropertyType(SDL_PropertiesI * If you need to avoid this, use SDL_LockProperties() and * SDL_UnlockProperties(). * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetBooleanProperty * \sa SDL_GetFloatProperty @@ -391,7 +391,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetPointerProperty(SDL_PropertiesID props * If you need to avoid this, use SDL_LockProperties() and * SDL_UnlockProperties(). * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPropertyType * \sa SDL_HasProperty @@ -413,7 +413,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetStringProperty(SDL_PropertiesID * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPropertyType * \sa SDL_HasProperty @@ -435,7 +435,7 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetNumberProperty(SDL_PropertiesID props, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPropertyType * \sa SDL_HasProperty @@ -457,7 +457,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetFloatProperty(SDL_PropertiesID props, c * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPropertyType * \sa SDL_HasProperty @@ -475,7 +475,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetBooleanProperty(SDL_PropertiesID props, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ClearProperty(SDL_PropertiesID props, const char *name); @@ -492,7 +492,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ClearProperty(SDL_PropertiesID props, const * \threadsafety SDL_EnumerateProperties holds a lock on `props` during this * callback. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_EnumerateProperties */ @@ -512,7 +512,7 @@ typedef void (SDLCALL *SDL_EnumeratePropertiesCallback)(void *userdata, SDL_Prop * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_EnumerateProperties(SDL_PropertiesID props, SDL_EnumeratePropertiesCallback callback, void *userdata); @@ -528,7 +528,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_EnumerateProperties(SDL_PropertiesID props, * locked or other threads might be setting or getting values * from these properties. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProperties */ diff --git a/libs/SDL3/include/SDL3/SDL_rect.h b/libs/SDL3/include/SDL3/SDL_rect.h index e4d3b84d..8998de6f 100644 --- a/libs/SDL3/include/SDL3/SDL_rect.h +++ b/libs/SDL3/include/SDL3/SDL_rect.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -41,7 +41,7 @@ extern "C" { /** * The structure that defines a point (using integers). * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetRectEnclosingPoints * \sa SDL_PointInRect @@ -55,7 +55,7 @@ typedef struct SDL_Point /** * The structure that defines a point (using floating point values). * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetRectEnclosingPointsFloat * \sa SDL_PointInRectFloat @@ -70,7 +70,7 @@ typedef struct SDL_FPoint /** * A rectangle, with the origin at the upper left (using integers). * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_RectEmpty * \sa SDL_RectsEqual @@ -91,7 +91,7 @@ typedef struct SDL_Rect * A rectangle, with the origin at the upper left (using floating point * values). * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_RectEmptyFloat * \sa SDL_RectsEqualFloat @@ -121,7 +121,7 @@ typedef struct SDL_FRect * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE void SDL_RectToFRect(const SDL_Rect *rect, SDL_FRect *frect) { @@ -150,7 +150,7 @@ SDL_FORCE_INLINE void SDL_RectToFRect(const SDL_Rect *rect, SDL_FRect *frect) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r) { @@ -174,7 +174,7 @@ SDL_FORCE_INLINE bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE bool SDL_RectEmpty(const SDL_Rect *r) { @@ -198,7 +198,7 @@ SDL_FORCE_INLINE bool SDL_RectEmpty(const SDL_Rect *r) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE bool SDL_RectsEqual(const SDL_Rect *a, const SDL_Rect *b) { @@ -217,7 +217,7 @@ SDL_FORCE_INLINE bool SDL_RectsEqual(const SDL_Rect *a, const SDL_Rect *b) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRectIntersection */ @@ -234,7 +234,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasRectIntersection(const SDL_Rect *A, cons * rectangles `A` and `B`. * \returns true if there is an intersection, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasRectIntersection */ @@ -250,7 +250,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectIntersection(const SDL_Rect *A, cons * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectUnion(const SDL_Rect *A, const SDL_Rect *B, SDL_Rect *result); @@ -269,7 +269,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectUnion(const SDL_Rect *A, const SDL_R * \returns true if any points were enclosed or false if all the points were * outside of the clipping rectangle. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectEnclosingPoints(const SDL_Point *points, int count, const SDL_Rect *clip, SDL_Rect *result); @@ -289,7 +289,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectEnclosingPoints(const SDL_Point *poi * \param Y2 a pointer to the ending Y-coordinate of the line. * \returns true if there is an intersection, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectAndLineIntersection(const SDL_Rect *rect, int *X1, int *Y1, int *X2, int *Y2); @@ -315,7 +315,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectAndLineIntersection(const SDL_Rect * * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE bool SDL_PointInRectFloat(const SDL_FPoint *p, const SDL_FRect *r) { @@ -339,7 +339,7 @@ SDL_FORCE_INLINE bool SDL_PointInRectFloat(const SDL_FPoint *p, const SDL_FRect * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE bool SDL_RectEmptyFloat(const SDL_FRect *r) { @@ -367,7 +367,7 @@ SDL_FORCE_INLINE bool SDL_RectEmptyFloat(const SDL_FRect *r) * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RectsEqualFloat */ @@ -402,7 +402,7 @@ SDL_FORCE_INLINE bool SDL_RectsEqualEpsilon(const SDL_FRect *a, const SDL_FRect * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RectsEqualEpsilon */ @@ -420,7 +420,7 @@ SDL_FORCE_INLINE bool SDL_RectsEqualFloat(const SDL_FRect *a, const SDL_FRect *b * \param B an SDL_FRect structure representing the second rectangle. * \returns true if there is an intersection, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRectIntersection */ @@ -437,7 +437,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasRectIntersectionFloat(const SDL_FRect *A * rectangles `A` and `B`. * \returns true if there is an intersection, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HasRectIntersectionFloat */ @@ -453,7 +453,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectIntersectionFloat(const SDL_FRect *A * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectUnionFloat(const SDL_FRect *A, const SDL_FRect *B, SDL_FRect *result); @@ -473,7 +473,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectUnionFloat(const SDL_FRect *A, const * \returns true if any points were enclosed or false if all the points were * outside of the clipping rectangle. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectEnclosingPointsFloat(const SDL_FPoint *points, int count, const SDL_FRect *clip, SDL_FRect *result); @@ -494,7 +494,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectEnclosingPointsFloat(const SDL_FPoin * \param Y2 a pointer to the ending Y-coordinate of the line. * \returns true if there is an intersection, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectAndLineIntersectionFloat(const SDL_FRect *rect, float *X1, float *Y1, float *X2, float *Y2); diff --git a/libs/SDL3/include/SDL3/SDL_render.h b/libs/SDL3/include/SDL3/SDL_render.h index a466a33d..891e9945 100644 --- a/libs/SDL3/include/SDL3/SDL_render.h +++ b/libs/SDL3/include/SDL3/SDL_render.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -69,14 +69,14 @@ extern "C" { /** * The name of the software renderer. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_SOFTWARE_RENDERER "software" /** * Vertex structure. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Vertex { @@ -88,7 +88,7 @@ typedef struct SDL_Vertex /** * The access pattern allowed for a texture. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_TextureAccess { @@ -100,7 +100,7 @@ typedef enum SDL_TextureAccess /** * How the logical size is mapped to the output. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_RendererLogicalPresentation { @@ -114,7 +114,7 @@ typedef enum SDL_RendererLogicalPresentation /** * A structure representing rendering state * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Renderer SDL_Renderer; @@ -123,7 +123,7 @@ typedef struct SDL_Renderer SDL_Renderer; /** * An efficient driver-specific representation of pixel data * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateTexture * \sa SDL_CreateTextureFromSurface @@ -157,7 +157,7 @@ typedef struct SDL_Texture SDL_Texture; * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRenderer * \sa SDL_GetRenderDriver @@ -182,7 +182,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumRenderDrivers(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumRenderDrivers */ @@ -203,7 +203,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetRenderDriver(int index); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRenderer * \sa SDL_CreateWindow @@ -219,6 +219,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CreateWindowAndRenderer(const char *title, * don't need a specific renderer, specify NULL and SDL will attempt to choose * the best option for you, based on what is available on the user's system. * + * If `name` is a comma-separated list, SDL will try each name, in the order + * listed, until one succeeds or all of them fail. + * * By default the rendering size matches the window size in pixels, but you * can call SDL_SetRenderLogicalPresentation() to change the content size and * scaling options. @@ -231,7 +234,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CreateWindowAndRenderer(const char *title, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRendererWithProperties * \sa SDL_CreateSoftwareRenderer @@ -285,7 +288,7 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window *window * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProperties * \sa SDL_CreateRenderer @@ -322,7 +325,7 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRendererWithProperties(SDL_ * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyRenderer */ @@ -337,7 +340,7 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateSoftwareRenderer(SDL_Surfac * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_GetRenderer(SDL_Window *window); @@ -350,7 +353,7 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_GetRenderer(SDL_Window *window); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetRenderWindow(SDL_Renderer *renderer); @@ -363,7 +366,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetRenderWindow(SDL_Renderer *rende * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRenderer * \sa SDL_CreateRendererWithProperties @@ -452,7 +455,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetRendererName(SDL_Renderer *rende * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetRendererProperties(SDL_Renderer *renderer); @@ -495,7 +498,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetRendererProperties(SDL_Rende * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCurrentRenderOutputSize */ @@ -517,7 +520,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderOutputSize(SDL_Renderer *renderer, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderOutputSize */ @@ -533,13 +536,12 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetCurrentRenderOutputSize(SDL_Renderer *re * \param access one of the enumerated values in SDL_TextureAccess. * \param w the width of the texture in pixels. * \param h the height of the texture in pixels. - * \returns a pointer to the created texture or NULL if no rendering context - * was active, the format was unsupported, or the width or height - * were out of range; call SDL_GetError() for more information. + * \returns the created texture or NULL on failure; call SDL_GetError() for + * more information. * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTextureFromSurface * \sa SDL_CreateTextureWithProperties @@ -569,7 +571,7 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTexture(SDL_Renderer *render * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTexture * \sa SDL_CreateTextureWithProperties @@ -673,13 +675,12 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureFromSurface(SDL_Rende * * \param renderer the rendering context. * \param props the properties to use. - * \returns a pointer to the created texture or NULL if no rendering context - * was active, the format was unsupported, or the width or height - * were out of range; call SDL_GetError() for more information. + * \returns the created texture or NULL on failure; call SDL_GetError() for + * more information. * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProperties * \sa SDL_CreateTexture @@ -798,7 +799,7 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureWithProperties(SDL_Re * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetTextureProperties(SDL_Texture *texture); @@ -838,7 +839,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetTextureProperties(SDL_Textur * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_GetRendererFromTexture(SDL_Texture *texture); @@ -855,7 +856,7 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_GetRendererFromTexture(SDL_Textur * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureSize(SDL_Texture *texture, float *w, float *h); @@ -880,7 +881,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureSize(SDL_Texture *texture, float * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureColorMod * \sa SDL_SetTextureAlphaMod @@ -910,7 +911,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetTextureColorMod(SDL_Texture *texture, Ui * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureColorModFloat * \sa SDL_SetTextureAlphaModFloat @@ -931,7 +932,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetTextureColorModFloat(SDL_Texture *textur * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaMod * \sa SDL_GetTextureColorModFloat @@ -951,7 +952,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureColorMod(SDL_Texture *texture, Ui * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaModFloat * \sa SDL_GetTextureColorMod @@ -977,7 +978,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureColorModFloat(SDL_Texture *textur * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaMod * \sa SDL_SetTextureAlphaModFloat @@ -1003,7 +1004,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetTextureAlphaMod(SDL_Texture *texture, Ui * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaModFloat * \sa SDL_SetTextureAlphaMod @@ -1021,7 +1022,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetTextureAlphaModFloat(SDL_Texture *textur * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaModFloat * \sa SDL_GetTextureColorMod @@ -1039,7 +1040,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureAlphaMod(SDL_Texture *texture, Ui * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureAlphaMod * \sa SDL_GetTextureColorModFloat @@ -1060,7 +1061,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureAlphaModFloat(SDL_Texture *textur * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureBlendMode */ @@ -1076,7 +1077,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetTextureBlendMode(SDL_Texture *texture, S * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTextureBlendMode */ @@ -1096,7 +1097,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureBlendMode(SDL_Texture *texture, S * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTextureScaleMode */ @@ -1112,7 +1113,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetTextureScaleMode(SDL_Texture *texture, S * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTextureScaleMode */ @@ -1143,7 +1144,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureScaleMode(SDL_Texture *texture, S * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockTexture * \sa SDL_UnlockTexture @@ -1177,7 +1178,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_UpdateTexture(SDL_Texture *texture, const S * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_UpdateNVTexture * \sa SDL_UpdateTexture @@ -1209,7 +1210,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_UpdateYUVTexture(SDL_Texture *texture, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_UpdateTexture * \sa SDL_UpdateYUVTexture @@ -1244,7 +1245,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_UpdateNVTexture(SDL_Texture *texture, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockTextureToSurface * \sa SDL_UnlockTexture @@ -1275,14 +1276,14 @@ extern SDL_DECLSPEC bool SDLCALL SDL_LockTexture(SDL_Texture *texture, * `SDL_TEXTUREACCESS_STREAMING`. * \param rect a pointer to the rectangle to lock for access. If the rect is * NULL, the entire texture will be locked. - * \param surface this is filled in with an SDL surface representing the - * locked area. + * \param surface a pointer to an SDL surface of size **rect**. Don't assume + * any specific pixel content. * \returns true on success or false on failure; call SDL_GetError() for more * information. * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockTexture * \sa SDL_UnlockTexture @@ -1304,7 +1305,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_LockTextureToSurface(SDL_Texture *texture, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockTexture */ @@ -1326,7 +1327,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockTexture(SDL_Texture *texture); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderTarget */ @@ -1343,7 +1344,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderTarget(SDL_Renderer *renderer, SDL * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderTarget */ @@ -1382,7 +1383,7 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_GetRenderTarget(SDL_Renderer *rend * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ConvertEventToRenderCoordinates * \sa SDL_GetRenderLogicalPresentation @@ -1405,7 +1406,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderLogicalPresentation(SDL_Renderer * * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderLogicalPresentation */ @@ -1427,7 +1428,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderLogicalPresentation(SDL_Renderer * * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderLogicalPresentation */ @@ -1453,7 +1454,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderLogicalPresentationRect(SDL_Render * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderLogicalPresentation * \sa SDL_SetRenderScale @@ -1482,7 +1483,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderCoordinatesFromWindow(SDL_Renderer *r * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderLogicalPresentation * \sa SDL_SetRenderScale @@ -1500,10 +1501,18 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderCoordinatesToWindow(SDL_Renderer *ren * - The scale (SDL_SetRenderScale) * - The viewport (SDL_SetRenderViewport) * + * Various event types are converted with this function: mouse, touch, pen, + * etc. + * * Touch coordinates are converted from normalized coordinates in the window * to non-normalized rendering coordinates. * - * Once converted, the coordinates may be outside the rendering area. + * Relative mouse coordinates (xrel and yrel event fields) are _also_ + * converted. Applications that do not want these fields converted should use + * SDL_RenderCoordinatesFromWindow() on the specific event fields instead of + * converting the entire event structure. + * + * Once converted, coordinates may be outside the rendering area. * * \param renderer the rendering context. * \param event the event to modify. @@ -1512,7 +1521,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderCoordinatesToWindow(SDL_Renderer *ren * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderCoordinatesFromWindow */ @@ -1535,7 +1544,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ConvertEventToRenderCoordinates(SDL_Rendere * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderViewport * \sa SDL_RenderViewportSet @@ -1552,7 +1561,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderViewport(SDL_Renderer *renderer, c * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderViewportSet * \sa SDL_SetRenderViewport @@ -1572,7 +1581,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderViewport(SDL_Renderer *renderer, S * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderViewport * \sa SDL_SetRenderViewport @@ -1597,7 +1606,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderViewportSet(SDL_Renderer *renderer); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderSafeArea(SDL_Renderer *renderer, SDL_Rect *rect); @@ -1612,7 +1621,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderSafeArea(SDL_Renderer *renderer, S * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderClipRect * \sa SDL_RenderClipEnabled @@ -1630,7 +1639,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderClipRect(SDL_Renderer *renderer, c * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderClipEnabled * \sa SDL_SetRenderClipRect @@ -1646,7 +1655,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderClipRect(SDL_Renderer *renderer, S * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderClipRect * \sa SDL_SetRenderClipRect @@ -1672,7 +1681,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderClipEnabled(SDL_Renderer *renderer); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderScale */ @@ -1689,7 +1698,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderScale(SDL_Renderer *renderer, floa * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderScale */ @@ -1713,7 +1722,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderScale(SDL_Renderer *renderer, floa * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderDrawColor * \sa SDL_SetRenderDrawColorFloat @@ -1738,7 +1747,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderDrawColor(SDL_Renderer *renderer, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderDrawColorFloat * \sa SDL_SetRenderDrawColor @@ -1762,7 +1771,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderDrawColorFloat(SDL_Renderer *rende * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderDrawColorFloat * \sa SDL_SetRenderDrawColor @@ -1786,7 +1795,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderDrawColor(SDL_Renderer *renderer, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderDrawColorFloat * \sa SDL_GetRenderDrawColor @@ -1811,7 +1820,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderDrawColorFloat(SDL_Renderer *rende * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderColorScale */ @@ -1827,7 +1836,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderColorScale(SDL_Renderer *renderer, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderColorScale */ @@ -1845,7 +1854,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderColorScale(SDL_Renderer *renderer, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderDrawBlendMode */ @@ -1861,7 +1870,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderDrawBlendMode(SDL_Renderer *render * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderDrawBlendMode */ @@ -1881,7 +1890,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderDrawBlendMode(SDL_Renderer *render * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderDrawColor */ @@ -1898,7 +1907,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderClear(SDL_Renderer *renderer); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderPoints */ @@ -1915,7 +1924,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderPoint(SDL_Renderer *renderer, float x * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderPoint */ @@ -1934,7 +1943,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderPoints(SDL_Renderer *renderer, const * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderLines */ @@ -1952,7 +1961,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderLine(SDL_Renderer *renderer, float x1 * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderLine */ @@ -1969,7 +1978,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderLines(SDL_Renderer *renderer, const S * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderRects */ @@ -1987,7 +1996,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderRect(SDL_Renderer *renderer, const SD * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderRect */ @@ -2005,7 +2014,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderRects(SDL_Renderer *renderer, const S * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderFillRects */ @@ -2023,7 +2032,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderFillRect(SDL_Renderer *renderer, cons * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderFillRect */ @@ -2044,7 +2053,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderFillRects(SDL_Renderer *renderer, con * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderTextureRotated * \sa SDL_RenderTextureTiled @@ -2073,7 +2082,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderTexture(SDL_Renderer *renderer, SDL_T * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderTexture */ @@ -2133,7 +2142,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderTextureAffine(SDL_Renderer *renderer, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderTexture */ @@ -2167,7 +2176,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderTextureTiled(SDL_Renderer *renderer, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderTexture */ @@ -2191,7 +2200,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderTexture9Grid(SDL_Renderer *renderer, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderGeometryRaw */ @@ -2223,7 +2232,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderGeometry(SDL_Renderer *renderer, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderGeometry */ @@ -2252,7 +2261,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderGeometryRaw(SDL_Renderer *renderer, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect); @@ -2289,7 +2298,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_RenderReadPixels(SDL_Renderer *ren * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRenderer * \sa SDL_RenderClear @@ -2316,7 +2325,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderPresent(SDL_Renderer *renderer); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTexture * \sa SDL_CreateTextureFromSurface @@ -2333,7 +2342,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyTexture(SDL_Texture *texture); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRenderer */ @@ -2368,7 +2377,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyRenderer(SDL_Renderer *renderer); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_FlushRenderer(SDL_Renderer *renderer); @@ -2384,7 +2393,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_FlushRenderer(SDL_Renderer *renderer); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderMetalCommandEncoder */ @@ -2407,7 +2416,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetRenderMetalLayer(SDL_Renderer *rendere * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderMetalLayer */ @@ -2440,7 +2449,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetRenderMetalCommandEncoder(SDL_Renderer * \threadsafety It is **NOT** safe to call this function from two threads at * once. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_AddVulkanRenderSemaphores(SDL_Renderer *renderer, Uint32 wait_stage_mask, Sint64 wait_semaphore, Sint64 signal_semaphore); @@ -2463,7 +2472,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_AddVulkanRenderSemaphores(SDL_Renderer *ren * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderVSync */ @@ -2483,7 +2492,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderVSync(SDL_Renderer *renderer, int * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetRenderVSync */ @@ -2534,7 +2543,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderVSync(SDL_Renderer *renderer, int * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.6. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderDebugTextFormat * \sa SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE diff --git a/libs/SDL3/include/SDL3/SDL_revision.h b/libs/SDL3/include/SDL3/SDL_revision.h index d75cfc8e..18f7c4d6 100644 --- a/libs/SDL3/include/SDL3/SDL_revision.h +++ b/libs/SDL3/include/SDL3/SDL_revision.h @@ -1,22 +1,22 @@ /* - Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. */ /* WIKI CATEGORY: Version */ @@ -44,13 +44,13 @@ * clue in debugging forensics and not something the app will parse in any * way. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.0.0. */ #define SDL_REVISION "Some arbitrary string decided at SDL build time" #elif defined(SDL_VENDOR_INFO) -#define SDL_REVISION SDL_VENDOR_INFO +#define SDL_REVISION "release-3.2.0-0-g535d80bad (" SDL_VENDOR_INFO ")" #else -#define SDL_REVISION "" +#define SDL_REVISION "release-3.2.0-0-g535d80bad" #endif #endif /* SDL_revision_h_ */ diff --git a/libs/SDL3/include/SDL3/SDL_scancode.h b/libs/SDL3/include/SDL3/SDL_scancode.h index 1259f800..9650a6cf 100644 --- a/libs/SDL3/include/SDL3/SDL_scancode.h +++ b/libs/SDL3/include/SDL3/SDL_scancode.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -47,7 +47,7 @@ * The values in this enumeration are based on the USB usage page standard: * https://usb.org/sites/default/files/hut1_5.pdf * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_Scancode { diff --git a/libs/SDL3/include/SDL3/SDL_sensor.h b/libs/SDL3/include/SDL3/SDL_sensor.h index 008c8d68..b220f053 100644 --- a/libs/SDL3/include/SDL3/SDL_sensor.h +++ b/libs/SDL3/include/SDL3/SDL_sensor.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -24,6 +24,8 @@ * * SDL sensor management. * + * These APIs grant access to gyros and accelerometers on various platforms. + * * In order to use these functions, SDL_Init() must have been called with the * SDL_INIT_SENSOR flag. This causes SDL to scan the system for sensors, and * load appropriate drivers. @@ -47,7 +49,7 @@ extern "C" { /** * The opaque structure used to identify an opened SDL sensor. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Sensor SDL_Sensor; @@ -57,7 +59,7 @@ typedef struct SDL_Sensor SDL_Sensor; * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_SensorID; @@ -69,7 +71,7 @@ typedef Uint32 SDL_SensorID; * rest will have an value of SDL_STANDARD_GRAVITY away from the center of the * earth, which is a positive Y value. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_STANDARD_GRAVITY 9.80665f @@ -123,7 +125,7 @@ typedef Uint32 SDL_SensorID; * * The gyroscope axis data is not changed when the device is rotated. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetCurrentDisplayOrientation */ @@ -151,7 +153,7 @@ typedef enum SDL_SensorType * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_SensorID * SDLCALL SDL_GetSensors(int *count); @@ -163,7 +165,7 @@ extern SDL_DECLSPEC SDL_SensorID * SDLCALL SDL_GetSensors(int *count); * \param instance_id the sensor instance ID. * \returns the sensor name, or NULL if `instance_id` is not valid. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetSensorNameForID(SDL_SensorID instance_id); @@ -176,7 +178,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetSensorNameForID(SDL_SensorID ins * \returns the SDL_SensorType, or `SDL_SENSOR_INVALID` if `instance_id` is * not valid. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_SensorType SDLCALL SDL_GetSensorTypeForID(SDL_SensorID instance_id); @@ -189,7 +191,7 @@ extern SDL_DECLSPEC SDL_SensorType SDLCALL SDL_GetSensorTypeForID(SDL_SensorID i * \returns the sensor platform dependent type, or -1 if `instance_id` is not * valid. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetSensorNonPortableTypeForID(SDL_SensorID instance_id); @@ -200,7 +202,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetSensorNonPortableTypeForID(SDL_SensorID i * \returns an SDL_Sensor object or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Sensor * SDLCALL SDL_OpenSensor(SDL_SensorID instance_id); @@ -211,7 +213,7 @@ extern SDL_DECLSPEC SDL_Sensor * SDLCALL SDL_OpenSensor(SDL_SensorID instance_id * \returns an SDL_Sensor object or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Sensor * SDLCALL SDL_GetSensorFromID(SDL_SensorID instance_id); @@ -222,7 +224,7 @@ extern SDL_DECLSPEC SDL_Sensor * SDLCALL SDL_GetSensorFromID(SDL_SensorID instan * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSensorProperties(SDL_Sensor *sensor); @@ -233,7 +235,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSensorProperties(SDL_Sensor * \returns the sensor name or NULL on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetSensorName(SDL_Sensor *sensor); @@ -244,7 +246,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetSensorName(SDL_Sensor *sensor); * \returns the SDL_SensorType type, or `SDL_SENSOR_INVALID` if `sensor` is * NULL. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_SensorType SDLCALL SDL_GetSensorType(SDL_Sensor *sensor); @@ -254,7 +256,7 @@ extern SDL_DECLSPEC SDL_SensorType SDLCALL SDL_GetSensorType(SDL_Sensor *sensor) * \param sensor the SDL_Sensor object to inspect. * \returns the sensor platform dependent type, or -1 if `sensor` is NULL. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetSensorNonPortableType(SDL_Sensor *sensor); @@ -265,7 +267,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetSensorNonPortableType(SDL_Sensor *sensor) * \returns the sensor instance ID, or 0 on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_SensorID SDLCALL SDL_GetSensorID(SDL_Sensor *sensor); @@ -280,7 +282,7 @@ extern SDL_DECLSPEC SDL_SensorID SDLCALL SDL_GetSensorID(SDL_Sensor *sensor); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetSensorData(SDL_Sensor *sensor, float *data, int num_values); @@ -289,7 +291,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSensorData(SDL_Sensor *sensor, float *da * * \param sensor the SDL_Sensor object to close. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_CloseSensor(SDL_Sensor *sensor); @@ -302,7 +304,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseSensor(SDL_Sensor *sensor); * This needs to be called from the thread that initialized the sensor * subsystem. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UpdateSensors(void); diff --git a/libs/SDL3/include/SDL3/SDL_stdinc.h b/libs/SDL3/include/SDL3/SDL_stdinc.h index 4a9c525a..4e15a3c6 100644 --- a/libs/SDL3/include/SDL3/SDL_stdinc.h +++ b/libs/SDL3/include/SDL3/SDL_stdinc.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -22,11 +22,25 @@ /** * # CategoryStdinc * - * This is a general header that includes C language support. It implements a - * subset of the C runtime APIs, but with an `SDL_` prefix. For most common - * use cases, these should behave the same way as their C runtime equivalents, - * but they may differ in how or whether they handle certain edge cases. When - * in doubt, consult the documentation for details. + * SDL provides its own implementation of some of the most important C runtime + * functions. + * + * Using these functions allows an app to have access to common C + * functionality without depending on a specific C runtime (or a C runtime at + * all). More importantly, the SDL implementations work identically across + * platforms, so apps can avoid surprises like snprintf() behaving differently + * between Windows and Linux builds, or itoa() only existing on some + * platforms. + * + * For many of the most common functions, like SDL_memcpy, SDL might just call + * through to the usual C runtime behind the scenes, if it makes sense to do + * so (if it's faster and always available/reliable on a given platform), + * reducing library size and offering the most optimized option. + * + * SDL also offers other C-runtime-adjacent functionality in this header that + * either isn't, strictly speaking, part of any C runtime standards, like + * SDL_crc32() and SDL_reinterpret_cast, etc. It also offers a few better + * options, like SDL_strlcpy(), which functions as a safer form of strcpy(). */ #ifndef SDL_stdinc_h_ @@ -45,6 +59,11 @@ #endif #ifndef __cplusplus +#if defined(__has_include) && !defined(SDL_INCLUDE_STDBOOL_H) +#if __has_include() +#define SDL_INCLUDE_STDBOOL_H +#endif +#endif #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ (defined(_MSC_VER) && (_MSC_VER >= 1910 /* Visual Studio 2017 */)) || \ defined(SDL_INCLUDE_STDBOOL_H) @@ -88,6 +107,32 @@ void *alloca(size_t); # endif #endif + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * Don't let SDL use "long long" C types. + * + * SDL will define this if it believes the compiler doesn't understand the + * "long long" syntax for C datatypes. This can happen on older compilers. + * + * If _your_ compiler doesn't support "long long" but SDL doesn't know it, it + * is safe to define this yourself to build against the SDL headers. + * + * If this is defined, it will remove access to some C runtime support + * functions, like SDL_ulltoa and SDL_strtoll that refer to this datatype + * explicitly. The rest of SDL will still be available. + * + * SDL's own source code cannot be built with a compiler that has this + * defined, for various technical reasons. + */ +#define SDL_NOLONGLONG 1 + +#elif defined(_MSC_VER) && (_MSC_VER < 1310) /* long long introduced in Visual Studio.NET 2003 */ +# define SDL_NOLONGLONG 1 +#endif + + #ifdef SDL_WIKI_DOCUMENTATION_SECTION /** @@ -102,7 +147,7 @@ void *alloca(size_t); * In modern times, it's generally expected to cover an entire linear address * space. But be careful! * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_SIZE_MAX SIZE_MAX @@ -142,7 +187,7 @@ void *alloca(size_t); * * \threadsafety This macro doesn't generate any code to run. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_assert */ @@ -175,7 +220,7 @@ void *alloca(size_t); * inside of `sizeof`, so there are no side-effects here, as expressions do * not actually run any code in these cases. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) @@ -190,7 +235,7 @@ void *alloca(size_t); * * \param arg the text to turn into a string literal. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_STRINGIFY_ARG(arg) #arg @@ -219,7 +264,7 @@ void *alloca(size_t); * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_static_cast * \sa SDL_const_cast @@ -241,7 +286,7 @@ void *alloca(size_t); * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_reinterpret_cast * \sa SDL_const_cast @@ -263,7 +308,7 @@ void *alloca(size_t); * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_reinterpret_cast * \sa SDL_static_cast @@ -294,7 +339,7 @@ void *alloca(size_t); * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_FOURCC(A, B, C, D) \ ((SDL_static_cast(Uint32, SDL_static_cast(Uint8, (A))) << 0) | \ @@ -311,7 +356,7 @@ void *alloca(size_t); * 0xFFFFFFFF is overflowing a 32-bit value. Use `SDL_SINT64_C(0xFFFFFFFF1)` * instead of `0xFFFFFFFF1` by itself. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_UINT64_C */ @@ -324,7 +369,7 @@ void *alloca(size_t); * 0xFFFFFFFF is overflowing a 32-bit value. Use `SDL_UINT64_C(0xFFFFFFFF1)` * instead of `0xFFFFFFFF1` by itself. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SINT64_C */ @@ -366,7 +411,7 @@ void *alloca(size_t); /** * A signed 8-bit integer type. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ typedef int8_t Sint8; #define SDL_MAX_SINT8 ((Sint8)0x7F) /* 127 */ @@ -375,7 +420,7 @@ typedef int8_t Sint8; /** * An unsigned 8-bit integer type. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ typedef uint8_t Uint8; #define SDL_MAX_UINT8 ((Uint8)0xFF) /* 255 */ @@ -384,7 +429,7 @@ typedef uint8_t Uint8; /** * A signed 16-bit integer type. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ typedef int16_t Sint16; #define SDL_MAX_SINT16 ((Sint16)0x7FFF) /* 32767 */ @@ -393,7 +438,7 @@ typedef int16_t Sint16; /** * An unsigned 16-bit integer type. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ typedef uint16_t Uint16; #define SDL_MAX_UINT16 ((Uint16)0xFFFF) /* 65535 */ @@ -402,7 +447,7 @@ typedef uint16_t Uint16; /** * A signed 32-bit integer type. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ typedef int32_t Sint32; #define SDL_MAX_SINT32 ((Sint32)0x7FFFFFFF) /* 2147483647 */ @@ -411,7 +456,7 @@ typedef int32_t Sint32; /** * An unsigned 32-bit integer type. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ typedef uint32_t Uint32; #define SDL_MAX_UINT32 ((Uint32)0xFFFFFFFFu) /* 4294967295 */ @@ -420,7 +465,7 @@ typedef uint32_t Uint32; /** * A signed 64-bit integer type. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_SINT64_C */ @@ -431,7 +476,7 @@ typedef int64_t Sint64; /** * An unsigned 64-bit integer type. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_UINT64_C */ @@ -447,7 +492,7 @@ typedef uint64_t Uint64; * and SDL_SECONDS_TO_NS(), and between Windows FILETIME values with * SDL_TimeToWindows() and SDL_TimeFromWindows(). * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_MAX_SINT64 * \sa SDL_MIN_SINT64 @@ -473,7 +518,7 @@ typedef Sint64 SDL_Time; * Equals by default to platform-defined `FLT_EPSILON`, or * `1.1920928955078125e-07F` if that's not available. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_FLT_EPSILON 1.1920928955078125e-07F /* 0x0.000002p0 */ #endif @@ -491,7 +536,7 @@ typedef Sint64 SDL_Time; * SDL_Log("There are %" SDL_PRIs64 " bottles of beer on the wall.", bottles); * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRIs64 "lld" @@ -504,7 +549,7 @@ typedef Sint64 SDL_Time; * SDL_Log("There are %" SDL_PRIu64 " bottles of beer on the wall.", bottles); * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRIu64 "llu" @@ -517,7 +562,7 @@ typedef Sint64 SDL_Time; * SDL_Log("There are %" SDL_PRIx64 " bottles of beer on the wall.", bottles); * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRIx64 "llx" @@ -530,7 +575,7 @@ typedef Sint64 SDL_Time; * SDL_Log("There are %" SDL_PRIX64 " bottles of beer on the wall.", bottles); * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRIX64 "llX" @@ -543,7 +588,7 @@ typedef Sint64 SDL_Time; * SDL_Log("There are %" SDL_PRIs32 " bottles of beer on the wall.", bottles); * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRIs32 "d" @@ -556,7 +601,7 @@ typedef Sint64 SDL_Time; * SDL_Log("There are %" SDL_PRIu32 " bottles of beer on the wall.", bottles); * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRIu32 "u" @@ -569,7 +614,7 @@ typedef Sint64 SDL_Time; * SDL_Log("There are %" SDL_PRIx32 " bottles of beer on the wall.", bottles); * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRIx32 "x" @@ -582,7 +627,7 @@ typedef Sint64 SDL_Time; * SDL_Log("There are %" SDL_PRIX32 " bottles of beer on the wall.", bottles); * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRIX32 "X" @@ -598,7 +643,7 @@ typedef Sint64 SDL_Time; * SDL_Log("There are %" SDL_PRILL_PREFIX "d bottles of beer on the wall.", bottles); * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRILL_PREFIX "ll" @@ -611,7 +656,7 @@ typedef Sint64 SDL_Time; * SDL_Log("There are %" SDL_PRILLd " bottles of beer on the wall.", bottles); * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRILLd SDL_PRILL_PREFIX "d" @@ -624,7 +669,7 @@ typedef Sint64 SDL_Time; * SDL_Log("There are %" SDL_PRILLu " bottles of beer on the wall.", bottles); * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRILLu SDL_PRILL_PREFIX "u" @@ -638,7 +683,7 @@ typedef Sint64 SDL_Time; * SDL_Log("There are %" SDL_PRILLx " bottles of beer on the wall.", bottles); * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRILLx SDL_PRILL_PREFIX "x" @@ -652,7 +697,7 @@ typedef Sint64 SDL_Time; * SDL_Log("There are %" SDL_PRILLX " bottles of beer on the wall.", bottles); * ``` * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRILLX SDL_PRILL_PREFIX "X" #endif /* SDL_WIKI_DOCUMENTATION_SECTION */ @@ -734,7 +779,9 @@ typedef Sint64 SDL_Time; #endif /* Specifically for the `long long` -- SDL-specific. */ #ifdef SDL_PLATFORM_WINDOWS +#ifndef SDL_NOLONGLONG SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 for windows - make sure `long long` is 64 bits. */ +#endif #define SDL_PRILL_PREFIX "I64" #else #define SDL_PRILL_PREFIX "ll" @@ -770,7 +817,7 @@ SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 f * * On compilers without this annotation mechanism, this is defined to nothing. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_IN_BYTECAP(x) _In_bytecount_(x) @@ -790,7 +837,7 @@ SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 f * * On compilers without this annotation mechanism, this is defined to nothing. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_INOUT_Z_CAP(x) _Inout_z_cap_(x) @@ -809,7 +856,7 @@ SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 f * * On compilers without this annotation mechanism, this is defined to nothing. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_OUT_Z_CAP(x) _Out_z_cap_(x) @@ -831,7 +878,7 @@ SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 f * * On compilers without this annotation mechanism, this is defined to nothing. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_OUT_CAP(x) _Out_cap_(x) @@ -850,7 +897,7 @@ SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 f * * On compilers without this annotation mechanism, this is defined to nothing. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_OUT_BYTECAP(x) _Out_bytecap_(x) @@ -869,7 +916,7 @@ SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 f * * On compilers without this annotation mechanism, this is defined to nothing. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_OUT_Z_BYTECAP(x) _Out_z_bytecap_(x) @@ -887,7 +934,7 @@ SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 f * * On compilers without this annotation mechanism, this is defined to nothing. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRINTF_FORMAT_STRING _Printf_format_string_ @@ -905,7 +952,7 @@ SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 f * * On compilers without this annotation mechanism, this is defined to nothing. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_SCANF_FORMAT_STRING _Scanf_format_string_impl_ @@ -927,7 +974,7 @@ SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 f * This can (and should) be used with SDL_PRINTF_FORMAT_STRING as well, which * between them will cover at least Visual Studio, GCC, and Clang. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __printf__, fmtargnumber, fmtargnumber+1 ))) @@ -949,7 +996,7 @@ SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 f * This can (and should) be used with SDL_PRINTF_FORMAT_STRING as well, which * between them will cover at least Visual Studio, GCC, and Clang. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_PRINTF_VARARG_FUNCV( fmtargnumber ) __attribute__(( format( __printf__, fmtargnumber, 0 ))) @@ -971,7 +1018,7 @@ SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 f * This can (and should) be used with SDL_SCANF_FORMAT_STRING as well, which * between them will cover at least Visual Studio, GCC, and Clang. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_SCANF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __scanf__, fmtargnumber, fmtargnumber+1 ))) @@ -993,7 +1040,7 @@ SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 f * This can (and should) be used with SDL_SCANF_FORMAT_STRING as well, which * between them will cover at least Visual Studio, GCC, and Clang. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_SCANF_VARARG_FUNCV( fmtargnumber ) __attribute__(( format( __scanf__, fmtargnumber, 0 ))) @@ -1015,7 +1062,7 @@ SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 f * This can (and should) be used with SDL_PRINTF_FORMAT_STRING as well, which * between them will cover at least Visual Studio, GCC, and Clang. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_WPRINTF_VARARG_FUNC( fmtargnumber ) /* __attribute__ (( format( __wprintf__, fmtargnumber, fmtargnumber+1 ))) */ @@ -1037,7 +1084,7 @@ SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 f * This can (and should) be used with SDL_PRINTF_FORMAT_STRING as well, which * between them will cover at least Visual Studio, GCC, and Clang. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_WPRINTF_VARARG_FUNCV( fmtargnumber ) /* __attribute__ (( format( __wprintf__, fmtargnumber, 0 ))) */ @@ -1107,8 +1154,10 @@ SDL_COMPILE_TIME_ASSERT(uint32_size, sizeof(Uint32) == 4); SDL_COMPILE_TIME_ASSERT(sint32_size, sizeof(Sint32) == 4); SDL_COMPILE_TIME_ASSERT(uint64_size, sizeof(Uint64) == 8); SDL_COMPILE_TIME_ASSERT(sint64_size, sizeof(Sint64) == 8); +#ifndef SDL_NOLONGLONG SDL_COMPILE_TIME_ASSERT(uint64_longlong, sizeof(Uint64) <= sizeof(unsigned long long)); SDL_COMPILE_TIME_ASSERT(size_t_longlong, sizeof(size_t) <= sizeof(unsigned long long)); +#endif typedef struct SDL_alignment_test { Uint8 a; @@ -1177,7 +1226,7 @@ extern "C" { * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_IOStreamInterface * \sa SDL_StorageInterface @@ -1211,7 +1260,7 @@ extern "C" { * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_stack_free */ @@ -1229,7 +1278,7 @@ extern "C" { * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_stack_alloc */ @@ -1258,7 +1307,7 @@ extern "C" { * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_free * \sa SDL_calloc @@ -1280,7 +1329,7 @@ extern SDL_DECLSPEC SDL_MALLOC void * SDLCALL SDL_malloc(size_t size); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_free * \sa SDL_malloc @@ -1315,7 +1364,7 @@ extern SDL_DECLSPEC SDL_MALLOC SDL_ALLOC_SIZE2(1, 2) void * SDLCALL SDL_calloc(s * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_free * \sa SDL_malloc @@ -1335,7 +1384,7 @@ extern SDL_DECLSPEC SDL_ALLOC_SIZE(2) void * SDLCALL SDL_realloc(void *mem, size * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_malloc * \sa SDL_calloc @@ -1353,7 +1402,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_free(void *mem); * * \threadsafety It should be safe to call this callback from any thread. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_malloc * \sa SDL_GetOriginalMemoryFunctions @@ -1374,7 +1423,7 @@ typedef void *(SDLCALL *SDL_malloc_func)(size_t size); * * \threadsafety It should be safe to call this callback from any thread. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_calloc * \sa SDL_GetOriginalMemoryFunctions @@ -1395,7 +1444,7 @@ typedef void *(SDLCALL *SDL_calloc_func)(size_t nmemb, size_t size); * * \threadsafety It should be safe to call this callback from any thread. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_realloc * \sa SDL_GetOriginalMemoryFunctions @@ -1413,7 +1462,7 @@ typedef void *(SDLCALL *SDL_realloc_func)(void *mem, size_t size); * * \threadsafety It should be safe to call this callback from any thread. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_free * \sa SDL_GetOriginalMemoryFunctions @@ -1437,7 +1486,7 @@ typedef void (SDLCALL *SDL_free_func)(void *mem); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_GetOriginalMemoryFunctions(SDL_malloc_func *malloc_func, SDL_calloc_func *calloc_func, @@ -1456,7 +1505,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetOriginalMemoryFunctions(SDL_malloc_func * unlikely event of a background thread calling * SDL_SetMemoryFunctions simultaneously. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetMemoryFunctions * \sa SDL_GetOriginalMemoryFunctions @@ -1487,7 +1536,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetMemoryFunctions(SDL_malloc_func *malloc_ * should not replace the memory functions once any allocations * are made! * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetMemoryFunctions * \sa SDL_GetOriginalMemoryFunctions @@ -1515,7 +1564,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetMemoryFunctions(SDL_malloc_func malloc_f * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_aligned_free */ @@ -1533,7 +1582,7 @@ extern SDL_DECLSPEC SDL_MALLOC void * SDLCALL SDL_aligned_alloc(size_t alignment * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_aligned_alloc */ @@ -1547,14 +1596,14 @@ extern SDL_DECLSPEC void SDLCALL SDL_aligned_free(void *mem); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetNumAllocations(void); /** * A thread-safe set of environment variables * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetEnvironment * \sa SDL_CreateEnvironment @@ -1580,7 +1629,7 @@ typedef struct SDL_Environment SDL_Environment; * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetEnvironmentVariable * \sa SDL_GetEnvironmentVariables @@ -1601,7 +1650,7 @@ extern SDL_DECLSPEC SDL_Environment * SDLCALL SDL_GetEnvironment(void); * from any thread, otherwise it is safe if no other threads are * calling setenv() or unsetenv() * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetEnvironmentVariable * \sa SDL_GetEnvironmentVariables @@ -1621,7 +1670,7 @@ extern SDL_DECLSPEC SDL_Environment * SDLCALL SDL_CreateEnvironment(bool populat * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetEnvironment * \sa SDL_CreateEnvironment @@ -1642,7 +1691,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetEnvironmentVariable(SDL_Environm * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetEnvironment * \sa SDL_CreateEnvironment @@ -1666,7 +1715,7 @@ extern SDL_DECLSPEC char ** SDLCALL SDL_GetEnvironmentVariables(SDL_Environment * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetEnvironment * \sa SDL_CreateEnvironment @@ -1686,7 +1735,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetEnvironmentVariable(SDL_Environment *env * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetEnvironment * \sa SDL_CreateEnvironment @@ -1705,7 +1754,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_UnsetEnvironmentVariable(SDL_Environment *e * \threadsafety It is safe to call this function from any thread, as long as * the environment is no longer in use. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateEnvironment */ @@ -1722,7 +1771,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyEnvironment(SDL_Environment *env); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_getenv(const char *name); @@ -1739,7 +1788,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_getenv(const char *name); * \threadsafety This function is not thread safe, consider using SDL_getenv() * instead. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_getenv */ @@ -1757,7 +1806,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_getenv_unsafe(const char *name); * \threadsafety This function is not thread safe, consider using * SDL_SetEnvironmentVariable() instead. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetEnvironmentVariable */ @@ -1772,7 +1821,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_setenv_unsafe(const char *name, const char * * \threadsafety This function is not thread safe, consider using * SDL_UnsetEnvironmentVariable() instead. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_UnsetEnvironmentVariable */ @@ -1787,7 +1836,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_unsetenv_unsafe(const char *name); * before `a`, 0 if they are equal. If two elements are equal, their * order in the sorted array is undefined. * - * \since This callback is available since SDL 3.1.3. + * \since This callback is available since SDL 3.2.0. * * \sa SDL_bsearch * \sa SDL_qsort @@ -1833,7 +1882,7 @@ typedef int (SDLCALL *SDL_CompareCallback)(const void *a, const void *b); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_bsearch * \sa SDL_qsort_r @@ -1883,7 +1932,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_bsearch_r * \sa SDL_qsort @@ -1900,7 +1949,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_bsearch(const void *key, const void *base * before `a`, 0 if they are equal. If two elements are equal, their * order in the sorted array is undefined. * - * \since This callback is available since SDL 3.1.3. + * \since This callback is available since SDL 3.2.0. * * \sa SDL_qsort_r * \sa SDL_bsearch_r @@ -1953,7 +2002,7 @@ typedef int (SDLCALL *SDL_CompareCallback_r)(void *userdata, const void *a, cons * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_bsearch_r * \sa SDL_qsort @@ -2011,7 +2060,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_qsort_r(void *base, size_t nmemb, size_t si * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_bsearch * \sa SDL_qsort_r @@ -2026,7 +2075,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_bsearch_r(const void *key, const void *ba * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_abs(int x); @@ -2044,7 +2093,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_abs(int x); * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) @@ -2062,7 +2111,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_abs(int x); * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) @@ -2086,7 +2135,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_abs(int x); * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_clamp(x, a, b) (((x) < (a)) ? (a) : (((x) > (b)) ? (b) : (x))) @@ -2101,7 +2150,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_abs(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isalpha(int x); @@ -2116,7 +2165,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isalpha(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isalnum(int x); @@ -2131,7 +2180,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isalnum(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isblank(int x); @@ -2146,7 +2195,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isblank(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_iscntrl(int x); @@ -2161,7 +2210,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_iscntrl(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isdigit(int x); @@ -2176,7 +2225,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isdigit(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isxdigit(int x); @@ -2191,7 +2240,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isxdigit(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isgraph * \sa SDL_isalnum @@ -2216,7 +2265,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_ispunct(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isspace(int x); @@ -2231,7 +2280,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isspace(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isupper(int x); @@ -2246,7 +2295,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isupper(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_islower(int x); @@ -2265,7 +2314,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_islower(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_isprint(int x); @@ -2284,7 +2333,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isprint(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isprint */ @@ -2304,7 +2353,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isgraph(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_toupper(int x); @@ -2322,7 +2371,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_toupper(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_tolower(int x); @@ -2343,7 +2392,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_tolower(int x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint16 SDLCALL SDL_crc16(Uint16 crc, const void *data, size_t len); @@ -2364,7 +2413,7 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_crc16(Uint16 crc, const void *data, size_ * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_crc32(Uint32 crc, const void *data, size_t len); @@ -2390,7 +2439,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_crc32(Uint32 crc, const void *data, size_ * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_murmur3_32(const void *data, size_t len, Uint32 seed); @@ -2408,7 +2457,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_murmur3_32(const void *data, size_t len, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_memmove */ @@ -2445,7 +2494,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_memcpy(SDL_OUT_BYTECAP(len) void *dst, SD * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ #define SDL_copyp(dst, src) \ { SDL_COMPILE_TIME_ASSERT(SDL_copyp, sizeof (*(dst)) == sizeof (*(src))); } \ @@ -2464,7 +2513,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_memcpy(SDL_OUT_BYTECAP(len) void *dst, SD * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_memcpy */ @@ -2494,7 +2543,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_memmove(SDL_OUT_BYTECAP(len) void *dst, S * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void * SDLCALL SDL_memset(SDL_OUT_BYTECAP(len) void *dst, int c, size_t len); @@ -2514,7 +2563,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_memset(SDL_OUT_BYTECAP(len) void *dst, in * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void * SDLCALL SDL_memset4(void *dst, Uint32 val, size_t dwords); @@ -2538,7 +2587,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_memset4(void *dst, Uint32 val, size_t dwo * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_zerop * \sa SDL_zeroa @@ -2557,7 +2606,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_memset4(void *dst, Uint32 val, size_t dwo * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_zero * \sa SDL_zeroa @@ -2576,7 +2625,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_memset4(void *dst, Uint32 val, size_t dwo * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_zero * \sa SDL_zeroa @@ -2596,7 +2645,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_memset4(void *dst, Uint32 val, size_t dwo * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); @@ -2619,7 +2668,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_ * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_wcsnlen * \sa SDL_utf8strlen @@ -2650,7 +2699,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t *wstr); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_wcslen * \sa SDL_utf8strlen @@ -2679,7 +2728,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_wcsnlen(const wchar_t *wstr, size_t maxle * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_wcslcat */ @@ -2708,7 +2757,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_wcslcpy(SDL_OUT_Z_CAP(maxlen) wchar_t *ds * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_wcslcpy */ @@ -2728,7 +2777,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_wcslcat(SDL_INOUT_Z_CAP(maxlen) wchar_t * * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC wchar_t * SDLCALL SDL_wcsdup(const wchar_t *wstr); @@ -2748,7 +2797,7 @@ extern SDL_DECLSPEC wchar_t * SDLCALL SDL_wcsdup(const wchar_t *wstr); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC wchar_t * SDLCALL SDL_wcsstr(const wchar_t *haystack, const wchar_t *needle); @@ -2773,7 +2822,7 @@ extern SDL_DECLSPEC wchar_t * SDLCALL SDL_wcsstr(const wchar_t *haystack, const * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC wchar_t * SDLCALL SDL_wcsnstr(const wchar_t *haystack, const wchar_t *needle, size_t maxlen); @@ -2792,7 +2841,7 @@ extern SDL_DECLSPEC wchar_t * SDLCALL SDL_wcsnstr(const wchar_t *haystack, const * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_wcscmp(const wchar_t *str1, const wchar_t *str2); @@ -2823,7 +2872,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_wcscmp(const wchar_t *str1, const wchar_t *s * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_wcsncmp(const wchar_t *str1, const wchar_t *str2, size_t maxlen); @@ -2853,7 +2902,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_wcsncmp(const wchar_t *str1, const wchar_t * * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_wcscasecmp(const wchar_t *str1, const wchar_t *str2); @@ -2895,7 +2944,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_wcscasecmp(const wchar_t *str1, const wchar_ * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_wcsncasecmp(const wchar_t *str1, const wchar_t *str2, size_t maxlen); @@ -2920,7 +2969,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_wcsncasecmp(const wchar_t *str1, const wchar * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_strtol */ @@ -2938,7 +2987,7 @@ extern SDL_DECLSPEC long SDLCALL SDL_wcstol(const wchar_t *str, wchar_t **endp, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_strnlen * \sa SDL_utf8strlen @@ -2962,7 +3011,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_strlen(const char *str); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_strlen * \sa SDL_utf8strlen @@ -2992,7 +3041,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_strnlen(const char *str, size_t maxlen); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_strlcat * \sa SDL_utf8strlcpy @@ -3021,7 +3070,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_strlcpy(SDL_OUT_Z_CAP(maxlen) char *dst, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_strlcpy */ @@ -3049,7 +3098,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_utf8strlcpy(SDL_OUT_Z_CAP(dst_bytes) char * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_strlcpy */ @@ -3069,7 +3118,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_strlcat(SDL_INOUT_Z_CAP(maxlen) char *dst * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_MALLOC char * SDLCALL SDL_strdup(const char *str); @@ -3094,7 +3143,7 @@ extern SDL_DECLSPEC SDL_MALLOC char * SDLCALL SDL_strdup(const char *str); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_MALLOC char * SDLCALL SDL_strndup(const char *str, size_t maxlen); @@ -3115,7 +3164,7 @@ extern SDL_DECLSPEC SDL_MALLOC char * SDLCALL SDL_strndup(const char *str, size_ * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char * SDLCALL SDL_strrev(char *str); @@ -3134,7 +3183,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_strrev(char *str); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_strlwr */ @@ -3155,7 +3204,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_strupr(char *str); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_strupr */ @@ -3177,7 +3226,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_strlwr(char *str); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char * SDLCALL SDL_strchr(const char *str, int c); @@ -3196,7 +3245,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_strchr(const char *str, int c); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char * SDLCALL SDL_strrchr(const char *str, int c); @@ -3216,7 +3265,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_strrchr(const char *str, int c); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char * SDLCALL SDL_strstr(const char *haystack, const char *needle); @@ -3239,7 +3288,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_strstr(const char *haystack, const char * * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char * SDLCALL SDL_strnstr(const char *haystack, const char *needle, size_t maxlen); @@ -3267,7 +3316,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_strnstr(const char *haystack, const char * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char * SDLCALL SDL_strcasestr(const char *haystack, const char *needle); @@ -3296,7 +3345,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_strcasestr(const char *haystack, const ch * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char * SDLCALL SDL_strtok_r(char *str, const char *delim, char **saveptr); @@ -3321,7 +3370,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_strtok_r(char *str, const char *delim, ch * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_utf8strnlen * \sa SDL_strlen @@ -3354,7 +3403,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_utf8strlen(const char *str); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_utf8strlen * \sa SDL_strnlen @@ -3381,7 +3430,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_utf8strnlen(const char *str, size_t bytes * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_uitoa * \sa SDL_ltoa @@ -3409,7 +3458,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_itoa(int value, char *str, int radix); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_itoa * \sa SDL_ultoa @@ -3437,7 +3486,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_uitoa(unsigned int value, char *str, int * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ultoa * \sa SDL_itoa @@ -3465,7 +3514,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_ltoa(long value, char *str, int radix); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ltoa * \sa SDL_uitoa @@ -3473,6 +3522,8 @@ extern SDL_DECLSPEC char * SDLCALL SDL_ltoa(long value, char *str, int radix); */ extern SDL_DECLSPEC char * SDLCALL SDL_ultoa(unsigned long value, char *str, int radix); +#ifndef SDL_NOLONGLONG + /** * Convert a long long integer into a string. * @@ -3493,7 +3544,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_ultoa(unsigned long value, char *str, int * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ulltoa * \sa SDL_itoa @@ -3521,13 +3572,14 @@ extern SDL_DECLSPEC char * SDLCALL SDL_lltoa(long long value, char *str, int rad * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_lltoa * \sa SDL_uitoa * \sa SDL_ultoa */ extern SDL_DECLSPEC char * SDLCALL SDL_ulltoa(unsigned long long value, char *str, int radix); +#endif /** * Parse an `int` from a string. @@ -3540,7 +3592,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_ulltoa(unsigned long long value, char *st * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atof * \sa SDL_strtol @@ -3563,7 +3615,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_atoi(const char *str); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atoi * \sa SDL_strtol @@ -3595,7 +3647,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_atof(const char *str); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atoi * \sa SDL_atof @@ -3629,7 +3681,7 @@ extern SDL_DECLSPEC long SDLCALL SDL_strtol(const char *str, char **endp, int ba * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atoi * \sa SDL_atof @@ -3641,6 +3693,8 @@ extern SDL_DECLSPEC long SDLCALL SDL_strtol(const char *str, char **endp, int ba */ extern SDL_DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *str, char **endp, int base); +#ifndef SDL_NOLONGLONG + /** * Parse a `long long` from a string. * @@ -3662,7 +3716,7 @@ extern SDL_DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *str, char **en * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atoi * \sa SDL_atof @@ -3696,7 +3750,7 @@ extern SDL_DECLSPEC long long SDLCALL SDL_strtoll(const char *str, char **endp, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atoi * \sa SDL_atof @@ -3707,6 +3761,7 @@ extern SDL_DECLSPEC long long SDLCALL SDL_strtoll(const char *str, char **endp, * \sa SDL_ulltoa */ extern SDL_DECLSPEC unsigned long long SDLCALL SDL_strtoull(const char *str, char **endp, int base); +#endif /** * Parse a `double` from a string. @@ -3726,7 +3781,7 @@ extern SDL_DECLSPEC unsigned long long SDLCALL SDL_strtoull(const char *str, cha * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atoi * \sa SDL_atof @@ -3753,7 +3808,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_strtod(const char *str, char **endp); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); @@ -3783,7 +3838,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); @@ -3811,7 +3866,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); @@ -3851,7 +3906,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen); @@ -3869,7 +3924,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *st * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char * SDLCALL SDL_strpbrk(const char *str, const char *breakset); @@ -3881,7 +3936,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_strpbrk(const char *str, const char *brea * * This tends to render as something like a question mark in most places. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_StepBackUTF8 * \sa SDL_StepUTF8 @@ -3929,7 +3984,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_strpbrk(const char *str, const char *brea * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_StepUTF8(const char **pstr, size_t *pslen); @@ -3960,7 +4015,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_StepUTF8(const char **pstr, size_t *pslen * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.6. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_StepBackUTF8(const char *start, const char **pstr); @@ -3989,7 +4044,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_StepBackUTF8(const char *start, const cha * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char * SDLCALL SDL_UCS4ToUTF8(Uint32 codepoint, char *dst); @@ -4006,7 +4061,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_UCS4ToUTF8(Uint32 codepoint, char *dst); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_sscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, ...) SDL_SCANF_VARARG_FUNC(2); @@ -4025,7 +4080,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_sscanf(const char *text, SDL_SCANF_FORMAT_ST * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_vsscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, va_list ap) SDL_SCANF_VARARG_FUNCV(2); @@ -4058,7 +4113,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_vsscanf(const char *text, SDL_SCANF_FORMAT_S * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_snprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(3); @@ -4092,7 +4147,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_snprintf(SDL_OUT_Z_CAP(maxlen) char *text, s * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_swprintf(SDL_OUT_Z_CAP(maxlen) wchar_t *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const wchar_t *fmt, ...) SDL_WPRINTF_VARARG_FUNC(3); @@ -4112,7 +4167,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_swprintf(SDL_OUT_Z_CAP(maxlen) wchar_t *text * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(3); @@ -4133,7 +4188,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_vswprintf(SDL_OUT_Z_CAP(maxlen) wchar_t *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const wchar_t *fmt, va_list ap) SDL_WPRINTF_VARARG_FUNCV(3); @@ -4162,7 +4217,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_vswprintf(SDL_OUT_Z_CAP(maxlen) wchar_t *tex * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_asprintf(char **strp, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); @@ -4181,7 +4236,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_asprintf(char **strp, SDL_PRINTF_FORMAT_STRI * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_vasprintf(char **strp, SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(2); @@ -4197,7 +4252,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_vasprintf(char **strp, SDL_PRINTF_FORMAT_STR * \threadsafety This should be called on the same thread that calls * SDL_rand*() * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_rand * \sa SDL_rand_bits @@ -4232,7 +4287,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_srand(Uint64 seed); * * \threadsafety All calls should be made from a single thread * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_srand * \sa SDL_randf @@ -4255,7 +4310,7 @@ extern SDL_DECLSPEC Sint32 SDLCALL SDL_rand(Sint32 n); * * \threadsafety All calls should be made from a single thread * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_srand * \sa SDL_rand @@ -4277,7 +4332,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_randf(void); * * \threadsafety All calls should be made from a single thread * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_rand * \sa SDL_randf @@ -4312,7 +4367,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_rand_bits(void); * \threadsafety This function is thread-safe, as long as the state pointer * isn't shared between threads. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_rand * \sa SDL_rand_bits_r @@ -4339,7 +4394,7 @@ extern SDL_DECLSPEC Sint32 SDLCALL SDL_rand_r(Uint64 *state, Sint32 n); * \threadsafety This function is thread-safe, as long as the state pointer * isn't shared between threads. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_rand_bits_r * \sa SDL_rand_r @@ -4365,7 +4420,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_randf_r(Uint64 *state); * \threadsafety This function is thread-safe, as long as the state pointer * isn't shared between threads. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_rand_r * \sa SDL_randf_r @@ -4377,7 +4432,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_rand_bits_r(Uint64 *state); /** * The value of Pi, as a double-precision floating point literal. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_PI_F */ @@ -4389,7 +4444,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_rand_bits_r(Uint64 *state); /** * The value of Pi, as a single-precision floating point literal. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_PI_D */ @@ -4418,7 +4473,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_rand_bits_r(Uint64 *state); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_acosf * \sa SDL_asin @@ -4448,7 +4503,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_acos(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_acos * \sa SDL_asinf @@ -4478,7 +4533,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_acosf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_asinf * \sa SDL_acos @@ -4508,7 +4563,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_asin(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_asin * \sa SDL_acosf @@ -4540,7 +4595,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_asinf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atanf * \sa SDL_atan2 @@ -4572,7 +4627,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_atan(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atan * \sa SDL_atan2f @@ -4608,7 +4663,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_atanf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atan2f * \sa SDL_atan @@ -4644,7 +4699,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_atan2(double y, double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_atan2f * \sa SDL_atan @@ -4670,7 +4725,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_atan2f(float y, float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ceilf * \sa SDL_floor @@ -4698,7 +4753,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_ceil(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ceil * \sa SDL_floorf @@ -4727,7 +4782,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_ceilf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_copysignf * \sa SDL_fabs @@ -4753,7 +4808,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_copysign(double x, double y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_copysignf * \sa SDL_fabsf @@ -4780,7 +4835,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_copysignf(float x, float y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_cosf * \sa SDL_acos @@ -4808,7 +4863,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_cos(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_cos * \sa SDL_acosf @@ -4841,7 +4896,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_cosf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_expf * \sa SDL_log @@ -4873,7 +4928,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_exp(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_exp * \sa SDL_logf @@ -4895,7 +4950,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_expf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_fabsf */ @@ -4916,7 +4971,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_fabs(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_fabs */ @@ -4940,7 +4995,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_fabsf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_floorf * \sa SDL_ceil @@ -4968,7 +5023,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_floor(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_floor * \sa SDL_ceilf @@ -4996,7 +5051,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_floorf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_truncf * \sa SDL_fmod @@ -5025,7 +5080,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_trunc(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_trunc * \sa SDL_fmodf @@ -5054,7 +5109,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_truncf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_fmodf * \sa SDL_modf @@ -5084,7 +5139,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_fmod(double x, double y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_fmod * \sa SDL_truncf @@ -5104,7 +5159,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_fmodf(float x, float y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isinff */ @@ -5118,7 +5173,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isinf(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isinf */ @@ -5132,7 +5187,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isinff(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isnanf */ @@ -5146,7 +5201,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isnan(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_isnan */ @@ -5174,7 +5229,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_isnanf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_logf * \sa SDL_log10 @@ -5204,7 +5259,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_log(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_log * \sa SDL_expf @@ -5233,7 +5288,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_logf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_log10f * \sa SDL_log @@ -5263,7 +5318,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_log10(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_log10 * \sa SDL_logf @@ -5283,7 +5338,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_log10f(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_modff * \sa SDL_trunc @@ -5303,7 +5358,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_modf(double x, double *y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_modf * \sa SDL_truncf @@ -5335,7 +5390,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_modff(float x, float *y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_powf * \sa SDL_exp @@ -5367,7 +5422,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_pow(double x, double y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_pow * \sa SDL_expf @@ -5394,7 +5449,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_powf(float x, float y); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_roundf * \sa SDL_lround @@ -5423,7 +5478,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_round(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_round * \sa SDL_lroundf @@ -5452,7 +5507,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_roundf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_lroundf * \sa SDL_round @@ -5481,7 +5536,7 @@ extern SDL_DECLSPEC long SDLCALL SDL_lround(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_lround * \sa SDL_roundf @@ -5509,7 +5564,7 @@ extern SDL_DECLSPEC long SDLCALL SDL_lroundf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_scalbnf * \sa SDL_pow @@ -5534,7 +5589,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_scalbn(double x, int n); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_scalbn * \sa SDL_powf @@ -5561,7 +5616,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_scalbnf(float x, int n); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_sinf * \sa SDL_asin @@ -5589,7 +5644,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_sin(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_sin * \sa SDL_asinf @@ -5617,7 +5672,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_sinf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_sqrtf */ @@ -5643,7 +5698,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_sqrt(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_sqrt */ @@ -5669,7 +5724,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_sqrtf(float x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_tanf * \sa SDL_sin @@ -5699,7 +5754,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_tan(double x); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_tan * \sa SDL_sinf @@ -5712,7 +5767,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_tanf(float x); /** * An opaque handle representing string encoding conversion state. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_iconv_open */ @@ -5727,7 +5782,7 @@ typedef struct SDL_iconv_data_t *SDL_iconv_t; * \returns a handle that must be freed with SDL_iconv_close, or * SDL_ICONV_ERROR on failure. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv * \sa SDL_iconv_close @@ -5742,7 +5797,7 @@ extern SDL_DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, * \param cd The character set conversion handle. * \returns 0 on success, or -1 on failure. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv * \sa SDL_iconv_open @@ -5780,7 +5835,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); * \param outbytesleft The number of bytes in the output buffer. * \returns the number of conversions on success, or a negative error code. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv_open * \sa SDL_iconv_close @@ -5815,7 +5870,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, * \param inbytesleft the size of the input string _in bytes_. * \returns a new string, converted to the new encoding, or NULL on error. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv_open * \sa SDL_iconv_close @@ -5838,7 +5893,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, * \param S the string to convert. * \returns a new string, converted to the new encoding, or NULL on error. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) @@ -5852,7 +5907,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, * \param S the string to convert. * \returns a new string, converted to the new encoding, or NULL on error. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1) @@ -5866,7 +5921,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, * \param S the string to convert. * \returns a new string, converted to the new encoding, or NULL on error. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1) @@ -5880,7 +5935,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, * \param S the string to convert. * \returns a new string, converted to the new encoding, or NULL on error. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_iconv_wchar_utf8(S) SDL_iconv_string("UTF-8", "WCHAR_T", (char *)S, (SDL_wcslen(S)+1)*sizeof(wchar_t)) @@ -5971,7 +6026,7 @@ char *strdup(const char *str); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE bool SDL_size_mul_check_overflow(size_t a, size_t b, size_t *ret) { @@ -6010,7 +6065,7 @@ SDL_FORCE_INLINE bool SDL_size_mul_check_overflow_builtin(size_t a, size_t b, si * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ SDL_FORCE_INLINE bool SDL_size_add_check_overflow(size_t a, size_t b, size_t *ret) { @@ -6049,7 +6104,7 @@ SDL_FORCE_INLINE bool SDL_size_add_check_overflow_builtin(size_t a, size_t b, si * perhaps to work around a compiler or existing code, you can define * `SDL_FUNCTION_POINTER_IS_VOID_POINTER` before including any SDL headers. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef void (*SDL_FunctionPointer)(void); #elif defined(SDL_FUNCTION_POINTER_IS_VOID_POINTER) diff --git a/libs/SDL3/include/SDL3/SDL_storage.h b/libs/SDL3/include/SDL3/SDL_storage.h index c408120a..8b89ace1 100644 --- a/libs/SDL3/include/SDL3/SDL_storage.h +++ b/libs/SDL3/include/SDL3/SDL_storage.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -22,7 +22,222 @@ /** * # CategoryStorage * - * SDL storage container management. + * The storage API is a high-level API designed to abstract away the + * portability issues that come up when using something lower-level (in SDL's + * case, this sits on top of the [Filesystem](CategoryFilesystem) and + * [IOStream](CategoryIOStream) subsystems). It is significantly more + * restrictive than a typical filesystem API, for a number of reasons: + * + * 1. **What to Access:** A common pitfall with existing filesystem APIs is + * the assumption that all storage is monolithic. However, many other + * platforms (game consoles in particular) are more strict about what _type_ + * of filesystem is being accessed; for example, game content and user data + * are usually two separate storage devices with entirely different + * characteristics (and possibly different low-level APIs altogether!). + * + * 2. **How to Access:** Another common mistake is applications assuming that + * all storage is universally writeable - again, many platforms treat game + * content and user data as two separate storage devices, and only user data + * is writeable while game content is read-only. + * + * 3. **When to Access:** The most common portability issue with filesystem + * access is _timing_ - you cannot always assume that the storage device is + * always accessible all of the time, nor can you assume that there are no + * limits to how long you have access to a particular device. + * + * Consider the following example: + * + * ```c + * void ReadGameData(void) + * { + * extern char** fileNames; + * extern size_t numFiles; + * for (size_t i = 0; i < numFiles; i += 1) { + * FILE *data = fopen(fileNames[i], "rwb"); + * if (data == NULL) { + * // Something bad happened! + * } else { + * // A bunch of stuff happens here + * fclose(data); + * } + * } + * } + * + * void ReadSave(void) + * { + * FILE *save = fopen("saves/save0.sav", "rb"); + * if (save == NULL) { + * // Something bad happened! + * } else { + * // A bunch of stuff happens here + * fclose(save); + * } + * } + * + * void WriteSave(void) + * { + * FILE *save = fopen("saves/save0.sav", "wb"); + * if (save == NULL) { + * // Something bad happened! + * } else { + * // A bunch of stuff happens here + * fclose(save); + * } + * } + * ``` + * + * Going over the bullet points again: + * + * 1. **What to Access:** This code accesses a global filesystem; game data + * and saves are all presumed to be in the current working directory (which + * may or may not be the game's installation folder!). + * + * 2. **How to Access:** This code assumes that content paths are writeable, + * and that save data is also writeable despite being in the same location as + * the game data. + * + * 3. **When to Access:** This code assumes that they can be called at any + * time, since the filesystem is always accessible and has no limits on how + * long the filesystem is being accessed. + * + * Due to these assumptions, the filesystem code is not portable and will fail + * under these common scenarios: + * + * - The game is installed on a device that is read-only, both content loading + * and game saves will fail or crash outright + * - Game/User storage is not implicitly mounted, so no files will be found + * for either scenario when a platform requires explicitly mounting + * filesystems + * - Save data may not be safe since the I/O is not being flushed or + * validated, so an error occurring elsewhere in the program may result in + * missing/corrupted save data + * + * When using SDL_Storage, these types of problems are virtually impossible to + * trip over: + * + * ```c + * void ReadGameData(void) + * { + * extern char** fileNames; + * extern size_t numFiles; + * + * SDL_Storage *title = SDL_OpenTitleStorage(NULL, 0); + * if (title == NULL) { + * // Something bad happened! + * } + * while (!SDL_StorageReady(title)) { + * SDL_Delay(1); + * } + * + * for (size_t i = 0; i < numFiles; i += 1) { + * void* dst; + * Uint64 dstLen = 0; + * + * if (SDL_GetStorageFileSize(title, fileNames[i], &dstLen) && dstLen > 0) { + * dst = SDL_malloc(dstLen); + * if (SDL_ReadStorageFile(title, fileNames[i], dst, dstLen)) { + * // A bunch of stuff happens here + * } else { + * // Something bad happened! + * } + * SDL_free(dst); + * } else { + * // Something bad happened! + * } + * } + * + * SDL_CloseStorage(title); + * } + * + * void ReadSave(void) + * { + * SDL_Storage *user = SDL_OpenUserStorage("libsdl", "Storage Example", 0); + * if (user == NULL) { + * // Something bad happened! + * } + * while (!SDL_StorageReady(user)) { + * SDL_Delay(1); + * } + * + * Uint64 saveLen = 0; + * if (SDL_GetStorageFileSize(user, "save0.sav", &saveLen) && saveLen > 0) { + * void* dst = SDL_malloc(saveLen); + * if (SDL_ReadStorageFile(user, "save0.sav", dst, saveLen)) { + * // A bunch of stuff happens here + * } else { + * // Something bad happened! + * } + * SDL_free(dst); + * } else { + * // Something bad happened! + * } + * + * SDL_CloseStorage(user); + * } + * + * void WriteSave(void) + * { + * SDL_Storage *user = SDL_OpenUserStorage("libsdl", "Storage Example", 0); + * if (user == NULL) { + * // Something bad happened! + * } + * while (!SDL_StorageReady(user)) { + * SDL_Delay(1); + * } + * + * extern void *saveData; // A bunch of stuff happened here... + * extern Uint64 saveLen; + * if (!SDL_WriteStorageFile(user, "save0.sav", saveData, saveLen)) { + * // Something bad happened! + * } + * + * SDL_CloseStorage(user); + * } + * ``` + * + * Note the improvements that SDL_Storage makes: + * + * 1. **What to Access:** This code explicitly reads from a title or user + * storage device based on the context of the function. + * + * 2. **How to Access:** This code explicitly uses either a read or write + * function based on the context of the function. + * + * 3. **When to Access:** This code explicitly opens the device when it needs + * to, and closes it when it is finished working with the filesystem. + * + * The result is an application that is significantly more robust against the + * increasing demands of platforms and their filesystems! + * + * A publicly available example of an SDL_Storage backend is the + * [Steam Cloud](https://partner.steamgames.com/doc/features/cloud) + * backend - you can initialize Steamworks when starting the program, and then + * SDL will recognize that Steamworks is initialized and automatically use + * ISteamRemoteStorage when the application opens user storage. More + * importantly, when you _open_ storage it knows to begin a "batch" of + * filesystem operations, and when you _close_ storage it knows to end and + * flush the batch. This is used by Steam to support + * [Dynamic Cloud Sync](https://steamcommunity.com/groups/steamworks/announcements/detail/3142949576401813670) + * ; users can save data on one PC, put the device to sleep, and then continue + * playing on another PC (and vice versa) with the save data fully + * synchronized across all devices, allowing for a seamless experience without + * having to do full restarts of the program. + * + * ## Notes on valid paths + * + * All paths in the Storage API use Unix-style path separators ('/'). Using a + * different path separator will not work, even if the underlying platform + * would otherwise accept it. This is to keep code using the Storage API + * portable between platforms and Storage implementations and simplify app + * code. + * + * Paths with relative directories ("." and "..") are forbidden by the Storage + * API. + * + * All valid UTF-8 strings (discounting the NULL terminator character and the + * '/' path separator) are usable for filenames, however, an underlying + * Storage implementation may not support particularly strange sequences and + * refuse to create files with those names, etc. */ #ifndef SDL_storage_h_ @@ -40,8 +255,6 @@ extern "C" { #endif -/* !!! FIXME: Don't let this ship without async R/W support!!! */ - /** * Function interface for SDL_Storage. * @@ -54,7 +267,7 @@ extern "C" { * * This structure should be initialized using SDL_INIT_INTERFACE() * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_INIT_INTERFACE */ @@ -114,7 +327,7 @@ SDL_COMPILE_TIME_ASSERT(SDL_StorageInterface_SIZE, * functions like SDL_OpenTitleStorage or SDL_OpenUserStorage, etc, or create * an object with a custom implementation using SDL_OpenStorage. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_Storage SDL_Storage; @@ -126,7 +339,7 @@ typedef struct SDL_Storage SDL_Storage; * \returns a title storage container on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseStorage * \sa SDL_GetStorageFileSize @@ -149,7 +362,7 @@ extern SDL_DECLSPEC SDL_Storage * SDLCALL SDL_OpenTitleStorage(const char *overr * \returns a user storage container on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseStorage * \sa SDL_GetStorageFileSize @@ -173,7 +386,7 @@ extern SDL_DECLSPEC SDL_Storage * SDLCALL SDL_OpenUserStorage(const char *org, c * \returns a filesystem storage container on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseStorage * \sa SDL_GetStorageFileSize @@ -202,7 +415,7 @@ extern SDL_DECLSPEC SDL_Storage * SDLCALL SDL_OpenFileStorage(const char *path); * \returns a storage container on success or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseStorage * \sa SDL_GetStorageFileSize @@ -223,7 +436,7 @@ extern SDL_DECLSPEC SDL_Storage * SDLCALL SDL_OpenStorage(const SDL_StorageInter * returns an error, the container data will be freed; the error is * only for informational purposes. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenFileStorage * \sa SDL_OpenStorage @@ -242,7 +455,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CloseStorage(SDL_Storage *storage); * \param storage a storage container to query. * \returns true if the container is ready, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_StorageReady(SDL_Storage *storage); @@ -255,7 +468,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_StorageReady(SDL_Storage *storage); * \returns true if the file could be queried or false on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ReadStorageFile * \sa SDL_StorageReady @@ -266,6 +479,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetStorageFileSize(SDL_Storage *storage, co * Synchronously read a file from a storage container into a client-provided * buffer. * + * The value of `length` must match the length of the file exactly; call + * SDL_GetStorageFileSize() to get this value. This behavior may be relaxed in + * a future release. + * * \param storage a storage container to read from. * \param path the relative path of the file to read. * \param destination a client-provided buffer to read the file into. @@ -273,7 +490,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetStorageFileSize(SDL_Storage *storage, co * \returns true if the file was read or false on failure; call SDL_GetError() * for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetStorageFileSize * \sa SDL_StorageReady @@ -291,7 +508,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadStorageFile(SDL_Storage *storage, const * \returns true if the file was written or false on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetStorageSpaceRemaining * \sa SDL_ReadStorageFile @@ -307,7 +524,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteStorageFile(SDL_Storage *storage, cons * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ @@ -326,14 +543,17 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CreateStorageDirectory(SDL_Storage *storage * returned SDL_ENUM_SUCCESS to halt enumeration, or all directory entries * were enumerated. * + * If `path` is NULL, this is treated as a request to enumerate the root of + * the storage container's tree. An empty string also works for this. + * * \param storage a storage container. - * \param path the path of the directory to enumerate. + * \param path the path of the directory to enumerate, or NULL for the root. * \param callback a function that is called for each entry in the directory. * \param userdata a pointer that is passed to `callback`. * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ @@ -347,7 +567,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_EnumerateStorageDirectory(SDL_Storage *stor * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ @@ -362,7 +582,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RemoveStoragePath(SDL_Storage *storage, con * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ @@ -377,7 +597,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenameStoragePath(SDL_Storage *storage, con * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ @@ -393,7 +613,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CopyStorageFile(SDL_Storage *storage, const * \returns true on success or false if the file doesn't exist, or another * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady */ @@ -405,7 +625,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetStoragePathInfo(SDL_Storage *storage, co * \param storage a storage container to query. * \returns the amount of remaining space, in bytes. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_StorageReady * \sa SDL_WriteStorageFile @@ -429,8 +649,11 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetStorageSpaceRemaining(SDL_Storage *sto * convenience, but if `count` is non-NULL, on return it will contain the * number of items in the array, not counting the NULL terminator. * + * If `path` is NULL, this is treated as a request to enumerate the root of + * the storage container's tree. An empty string also works for this. + * * \param storage a storage container. - * \param path the path of the directory to enumerate. + * \param path the path of the directory to enumerate, or NULL for the root. * \param pattern the pattern that files in the directory must match. Can be * NULL. * \param flags `SDL_GLOB_*` bitflags that affect this search. @@ -445,7 +668,7 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetStorageSpaceRemaining(SDL_Storage *sto * \threadsafety It is safe to call this function from any thread, assuming * the `storage` object is thread-safe. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char ** SDLCALL SDL_GlobStorageDirectory(SDL_Storage *storage, const char *path, const char *pattern, SDL_GlobFlags flags, int *count); diff --git a/libs/SDL3/include/SDL3/SDL_surface.h b/libs/SDL3/include/SDL3/SDL_surface.h index 5f95643c..0752f530 100644 --- a/libs/SDL3/include/SDL3/SDL_surface.h +++ b/libs/SDL3/include/SDL3/SDL_surface.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -59,7 +59,7 @@ extern "C" { * * These are generally considered read-only. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_SurfaceFlags; @@ -71,14 +71,14 @@ typedef Uint32 SDL_SurfaceFlags; /** * Evaluates to true if the surface needs to be locked before access. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_MUSTLOCK(S) ((((S)->flags & SDL_SURFACE_LOCK_NEEDED)) == SDL_SURFACE_LOCK_NEEDED) /** * The scaling mode. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ScaleMode { @@ -89,7 +89,7 @@ typedef enum SDL_ScaleMode /** * The flip mode. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_FlipMode { @@ -120,7 +120,7 @@ typedef enum SDL_FlipMode * format with a pitch of 32 would consist of 32x32 bytes of Y plane followed * by 32x16 bytes of UV plane. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateSurface * \sa SDL_DestroySurface @@ -153,7 +153,7 @@ typedef struct SDL_Surface SDL_Surface; * \returns the new SDL_Surface structure that is created or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateSurfaceFrom * \sa SDL_DestroySurface @@ -181,7 +181,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_CreateSurface(int width, int heigh * \returns the new SDL_Surface structure that is created or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateSurface * \sa SDL_DestroySurface @@ -195,7 +195,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_CreateSurfaceFrom(int width, int h * * \param surface the SDL_Surface to free. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateSurface * \sa SDL_CreateSurfaceFrom @@ -226,7 +226,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroySurface(SDL_Surface *surface); * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSurfaceProperties(SDL_Surface *surface); @@ -246,7 +246,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSurfaceProperties(SDL_Surfac * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceColorspace */ @@ -263,7 +263,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceColorspace(SDL_Surface *surface, * \returns the colorspace used by the surface, or SDL_COLORSPACE_UNKNOWN if * the surface is NULL. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceColorspace */ @@ -291,7 +291,7 @@ extern SDL_DECLSPEC SDL_Colorspace SDLCALL SDL_GetSurfaceColorspace(SDL_Surface * the surface didn't have an index format); call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetPaletteColors */ @@ -307,7 +307,7 @@ extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_CreateSurfacePalette(SDL_Surface * * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreatePalette * \sa SDL_GetSurfacePalette @@ -321,7 +321,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfacePalette(SDL_Surface *surface, SDL * \returns a pointer to the palette used by the surface, or NULL if there is * no palette used. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfacePalette */ @@ -344,7 +344,7 @@ extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_GetSurfacePalette(SDL_Surface *sur * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_RemoveSurfaceAlternateImages * \sa SDL_GetSurfaceImages @@ -358,7 +358,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_AddSurfaceAlternateImage(SDL_Surface *surfa * \param surface the SDL_Surface structure to query. * \returns true if alternate versions are available or false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddSurfaceAlternateImage * \sa SDL_RemoveSurfaceAlternateImages @@ -383,7 +383,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SurfaceHasAlternateImages(SDL_Surface *surf * failure; call SDL_GetError() for more information. This should be * freed with SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddSurfaceAlternateImage * \sa SDL_RemoveSurfaceAlternateImages @@ -399,7 +399,7 @@ extern SDL_DECLSPEC SDL_Surface ** SDLCALL SDL_GetSurfaceImages(SDL_Surface *sur * * \param surface the SDL_Surface structure to update. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddSurfaceAlternateImage * \sa SDL_GetSurfaceImages @@ -423,7 +423,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_RemoveSurfaceAlternateImages(SDL_Surface *s * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_MUSTLOCK * \sa SDL_UnlockSurface @@ -435,7 +435,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_LockSurface(SDL_Surface *surface); * * \param surface the SDL_Surface structure to be unlocked. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LockSurface */ @@ -453,7 +453,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface *surface); * \returns a pointer to a new SDL_Surface structure or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySurface * \sa SDL_LoadBMP @@ -471,7 +471,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP_IO(SDL_IOStream *src, bool * \returns a pointer to a new SDL_Surface structure or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySurface * \sa SDL_LoadBMP_IO @@ -495,7 +495,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP(const char *file); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadBMP_IO * \sa SDL_SaveBMP @@ -516,7 +516,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SaveBMP_IO(SDL_Surface *surface, SDL_IOStre * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadBMP * \sa SDL_SaveBMP_IO @@ -534,7 +534,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SaveBMP(SDL_Surface *surface, const char *f * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface * \sa SDL_LockSurface @@ -550,7 +550,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceRLE(SDL_Surface *surface, bool en * \param surface the SDL_Surface structure to query. * \returns true if the surface is RLE enabled, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceRLE */ @@ -572,7 +572,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SurfaceHasRLE(SDL_Surface *surface); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceColorKey * \sa SDL_SetSurfaceRLE @@ -588,7 +588,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceColorKey(SDL_Surface *surface, bo * \param surface the SDL_Surface structure to query. * \returns true if the surface has a color key, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceColorKey * \sa SDL_GetSurfaceColorKey @@ -608,7 +608,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SurfaceHasColorKey(SDL_Surface *surface); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceColorKey * \sa SDL_SurfaceHasColorKey @@ -631,7 +631,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceColorKey(SDL_Surface *surface, Ui * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceColorMod * \sa SDL_SetSurfaceAlphaMod @@ -649,7 +649,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceColorMod(SDL_Surface *surface, Ui * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceAlphaMod * \sa SDL_SetSurfaceColorMod @@ -669,7 +669,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceColorMod(SDL_Surface *surface, Ui * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceAlphaMod * \sa SDL_SetSurfaceColorMod @@ -684,7 +684,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceAlphaMod(SDL_Surface *surface, Ui * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceColorMod * \sa SDL_SetSurfaceAlphaMod @@ -703,7 +703,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceAlphaMod(SDL_Surface *surface, Ui * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceBlendMode */ @@ -717,7 +717,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceBlendMode(SDL_Surface *surface, S * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceBlendMode */ @@ -738,7 +738,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceBlendMode(SDL_Surface *surface, S * \returns true if the rectangle intersects the surface, otherwise false and * blits will be completely clipped. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetSurfaceClipRect */ @@ -757,7 +757,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceClipRect(SDL_Surface *surface, co * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetSurfaceClipRect */ @@ -771,7 +771,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceClipRect(SDL_Surface *surface, SD * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_FlipSurface(SDL_Surface *surface, SDL_FlipMode flip); @@ -787,7 +787,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_FlipSurface(SDL_Surface *surface, SDL_FlipM * \returns a copy of the surface or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySurface */ @@ -806,7 +806,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_DuplicateSurface(SDL_Surface *surf * \returns a copy of the surface or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySurface */ @@ -831,7 +831,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_ScaleSurface(SDL_Surface *surface, * \returns the new SDL_Surface structure that is created or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ConvertSurfaceAndColorspace * \sa SDL_DestroySurface @@ -857,7 +857,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurface(SDL_Surface *surfac * \returns the new SDL_Surface structure that is created or NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ConvertSurface * \sa SDL_DestroySurface @@ -878,7 +878,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurfaceAndColorspace(SDL_Su * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ConvertPixelsAndColorspace */ @@ -907,7 +907,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ConvertPixels(int width, int height, SDL_Pi * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ConvertPixels */ @@ -931,7 +931,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ConvertPixelsAndColorspace(int width, int h * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_PremultiplyAlpha(int width, int height, SDL_PixelFormat src_format, const void *src, int src_pitch, SDL_PixelFormat dst_format, void *dst, int dst_pitch, bool linear); @@ -946,7 +946,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PremultiplyAlpha(int width, int height, SDL * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_PremultiplySurfaceAlpha(SDL_Surface *surface, bool linear); @@ -966,7 +966,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PremultiplySurfaceAlpha(SDL_Surface *surfac * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ClearSurface(SDL_Surface *surface, float r, float g, float b, float a); @@ -989,7 +989,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ClearSurface(SDL_Surface *surface, float r, * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_FillSurfaceRects */ @@ -1014,19 +1014,21 @@ extern SDL_DECLSPEC bool SDLCALL SDL_FillSurfaceRect(SDL_Surface *dst, const SDL * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_FillSurfaceRect */ extern SDL_DECLSPEC bool SDLCALL SDL_FillSurfaceRects(SDL_Surface *dst, const SDL_Rect *rects, int count, Uint32 color); /** - * Performs a fast blit from the source surface to the destination surface. + * Performs a fast blit from the source surface to the destination surface + * with clipping. * - * This assumes that the source and destination rectangles are the same size. * If either `srcrect` or `dstrect` are NULL, the entire surface (`src` or - * `dst`) is copied. The final blit rectangles are saved in `srcrect` and - * `dstrect` after all clipping is performed. + * `dst`) is copied while ensuring clipping to `dst->clip_rect`. + * + * The final blit rectangles are saved in `srcrect` and `dstrect` after all + * clipping is performed. * * The blit function should not be called on a locked surface. * @@ -1089,7 +1091,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_FillSurfaceRects(SDL_Surface *dst, const SD * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurfaceScaled */ @@ -1114,7 +1116,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurface(SDL_Surface *src, const SDL_Rec * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface */ @@ -1139,7 +1141,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurfaceUnchecked(SDL_Surface *src, cons * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface */ @@ -1165,7 +1167,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurfaceScaled(SDL_Surface *src, const S * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurfaceScaled */ @@ -1191,7 +1193,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurfaceUncheckedScaled(SDL_Surface *src * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface */ @@ -1221,7 +1223,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurfaceTiled(SDL_Surface *src, const SD * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface */ @@ -1258,7 +1260,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurfaceTiledWithScale(SDL_Surface *src, * threads at once. It is safe to use the same source surface * from multiple threads. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_BlitSurface */ @@ -1288,7 +1290,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurface9Grid(SDL_Surface *src, const SD * \param b the blue component of the pixel in the range 0-255. * \returns a pixel value. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_MapSurfaceRGBA */ @@ -1319,7 +1321,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapSurfaceRGB(SDL_Surface *surface, Uint8 * \param a the alpha component of the pixel in the range 0-255. * \returns a pixel value. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_MapSurfaceRGB */ @@ -1348,7 +1350,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapSurfaceRGBA(SDL_Surface *surface, Uint * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadSurfacePixel(SDL_Surface *surface, int x, int y, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); @@ -1372,7 +1374,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadSurfacePixel(SDL_Surface *surface, int * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReadSurfacePixelFloat(SDL_Surface *surface, int x, int y, float *r, float *g, float *b, float *a); @@ -1395,7 +1397,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadSurfacePixelFloat(SDL_Surface *surface, * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteSurfacePixel(SDL_Surface *surface, int x, int y, Uint8 r, Uint8 g, Uint8 b, Uint8 a); @@ -1415,7 +1417,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteSurfacePixel(SDL_Surface *surface, int * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_WriteSurfacePixelFloat(SDL_Surface *surface, int x, int y, float r, float g, float b, float a); diff --git a/libs/SDL3/include/SDL3/SDL_system.h b/libs/SDL3/include/SDL3/SDL_system.h index 4e7181df..294089ff 100644 --- a/libs/SDL3/include/SDL3/SDL_system.h +++ b/libs/SDL3/include/SDL3/SDL_system.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -22,7 +22,13 @@ /** * # CategorySystem * - * Platform-specific SDL API functions. + * Platform-specific SDL API functions. These are functions that deal with + * needs of specific operating systems, that didn't make sense to offer as + * platform-independent, generic APIs. + * + * Most apps can make do without these functions, but they can be useful for + * integrating with other parts of a specific system, adding platform-specific + * polish to an app, or solving problems that only affect one target. */ #ifndef SDL_system_h_ @@ -64,7 +70,7 @@ typedef struct tagMSG MSG; * \threadsafety This may only be called (by SDL) from the thread handling the * Windows event loop. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetWindowsMessageHook * \sa SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP @@ -80,7 +86,7 @@ typedef bool (SDLCALL *SDL_WindowsMessageHook)(void *userdata, MSG *msg); * \param callback the SDL_WindowsMessageHook function to call. * \param userdata a pointer to pass to every iteration of `callback`. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_WindowsMessageHook * \sa SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP @@ -101,7 +107,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetWindowsMessageHook(SDL_WindowsMessageHoo * \returns the D3D9 adapter index on success or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetDirect3D9AdapterIndex(SDL_DisplayID displayID); @@ -118,7 +124,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetDirect3D9AdapterIndex(SDL_DisplayID displ * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetDXGIOutputInfo(SDL_DisplayID displayID, int *adapterIndex, int *outputIndex); @@ -148,7 +154,7 @@ typedef union _XEvent XEvent; * \threadsafety This may only be called (by SDL) from the thread handling the * X11 event loop. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetX11EventHook */ @@ -163,7 +169,7 @@ typedef bool (SDLCALL *SDL_X11EventHook)(void *userdata, XEvent *xevent); * \param callback the SDL_X11EventHook function to call. * \param userdata a pointer to pass to every iteration of `callback`. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_SetX11EventHook(SDL_X11EventHook callback, void *userdata); @@ -180,7 +186,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetX11EventHook(SDL_X11EventHook callback, * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetLinuxThreadPriority(Sint64 threadID, int priority); @@ -196,7 +202,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetLinuxThreadPriority(Sint64 threadID, int * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetLinuxThreadPriorityAndPolicy(Sint64 threadID, int sdlPriority, int schedPolicy); @@ -219,7 +225,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetLinuxThreadPriorityAndPolicy(Sint64 thre * \param userdata what was passed as `callbackParam` to * SDL_SetiOSAnimationCallback as `callbackParam`. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetiOSAnimationCallback */ @@ -258,7 +264,7 @@ typedef void (SDLCALL *SDL_iOSAnimationCallback)(void *userdata); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetiOSEventPump */ @@ -271,7 +277,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetiOSAnimationCallback(SDL_Window *window, * * \param enabled true to enable the event pump, false to disable it. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetiOSAnimationCallback */ @@ -301,7 +307,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetiOSEventPump(bool enabled); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAndroidActivity */ @@ -326,7 +332,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetAndroidJNIEnv(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAndroidJNIEnv */ @@ -364,7 +370,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetAndroidActivity(void); * * \returns the Android API level. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetAndroidSDKVersion(void); @@ -373,7 +379,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAndroidSDKVersion(void); * * \returns true if this is a Chromebook, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_IsChromebook(void); @@ -382,7 +388,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_IsChromebook(void); * * \returns true if this is a DeX docking station, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_IsDeXMode(void); @@ -391,7 +397,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_IsDeXMode(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_SendAndroidBackButton(void); @@ -399,7 +405,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SendAndroidBackButton(void); * See the official Android developer guide for more information: * http://developer.android.com/guide/topics/data/data-storage.html * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ANDROID_EXTERNAL_STORAGE_READ 0x01 @@ -407,7 +413,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SendAndroidBackButton(void); * See the official Android developer guide for more information: * http://developer.android.com/guide/topics/data/data-storage.html * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_ANDROID_EXTERNAL_STORAGE_WRITE 0x02 @@ -427,7 +433,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_SendAndroidBackButton(void); * \returns the path used for internal storage or NULL on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAndroidExternalStoragePath * \sa SDL_GetAndroidCachePath @@ -445,7 +451,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidInternalStoragePath(void) * \returns the current state of external storage, or 0 if external storage is * currently unavailable. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAndroidExternalStoragePath */ @@ -467,7 +473,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetAndroidExternalStorageState(void); * \returns the path used for external storage for this application on success * or NULL on failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAndroidExternalStorageState * \sa SDL_GetAndroidInternalStoragePath @@ -490,7 +496,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidExternalStoragePath(void) * \returns the path used for caches for this application on success or NULL * on failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetAndroidInternalStoragePath * \sa SDL_GetAndroidExternalStoragePath @@ -504,7 +510,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAndroidCachePath(void); * \param permission the Android-specific permission name that was requested. * \param granted true if permission is granted, false if denied. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_RequestAndroidPermission */ @@ -542,7 +548,7 @@ typedef void (SDLCALL *SDL_RequestAndroidPermissionCallback)(void *userdata, con * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_RequestAndroidPermission(const char *permission, SDL_RequestAndroidPermissionCallback cb, void *userdata); @@ -570,7 +576,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RequestAndroidPermission(const char *permis * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ShowAndroidToast(const char *message, int duration, int gravity, int xoffset, int yoffset); @@ -586,7 +592,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ShowAndroidToast(const char *message, int d * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SendAndroidMessage(Uint32 command, int param); @@ -599,7 +605,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SendAndroidMessage(Uint32 command, int para * * \returns true if the device is a tablet, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_IsTablet(void); @@ -610,7 +616,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_IsTablet(void); * * \returns true if the device is a TV, false otherwise. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_IsTV(void); @@ -634,7 +640,7 @@ typedef enum SDL_Sandbox * \returns the application sandbox environment or SDL_SANDBOX_NONE if the * application is not running in a sandbox environment. * - * \since This function is available since SDL 3.1.6. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Sandbox SDLCALL SDL_GetSandbox(void); @@ -654,7 +660,7 @@ extern SDL_DECLSPEC SDL_Sandbox SDLCALL SDL_GetSandbox(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillTerminate(void); @@ -671,7 +677,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillTerminate(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidReceiveMemoryWarning(void); @@ -688,7 +694,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidReceiveMemoryWarning(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillEnterBackground(void); @@ -705,7 +711,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillEnterBackground(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidEnterBackground(void); @@ -722,7 +728,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidEnterBackground(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillEnterForeground(void); @@ -739,7 +745,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationWillEnterForeground(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidEnterForeground(void); @@ -758,7 +764,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidEnterForeground(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_OnApplicationDidChangeStatusBarOrientation(void); #endif @@ -782,7 +788,7 @@ typedef struct XUser *XUserHandle; * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetGDKTaskQueue(XTaskQueueHandle *outTaskQueue); @@ -797,7 +803,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetGDKTaskQueue(XTaskQueueHandle *outTaskQu * \returns true if success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetGDKDefaultUser(XUserHandle *outUserHandle); diff --git a/libs/SDL3/include/SDL3/SDL_test.h b/libs/SDL3/include/SDL3/SDL_test.h index 2cf83d80..8b285807 100644 --- a/libs/SDL3/include/SDL3/SDL_test.h +++ b/libs/SDL3/include/SDL3/SDL_test.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/SDL3/SDL_test_assert.h b/libs/SDL3/include/SDL3/SDL_test_assert.h index 4d857b2a..c067608a 100644 --- a/libs/SDL3/include/SDL3/SDL_test_assert.h +++ b/libs/SDL3/include/SDL3/SDL_test_assert.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/SDL3/SDL_test_common.h b/libs/SDL3/include/SDL3/SDL_test_common.h index 8b909311..3ab1ad01 100644 --- a/libs/SDL3/include/SDL3/SDL_test_common.h +++ b/libs/SDL3/include/SDL3/SDL_test_common.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -139,6 +139,7 @@ typedef struct int gl_accum_blue_size; int gl_accum_alpha_size; int gl_stereo; + int gl_release_behavior; int gl_multisamplebuffers; int gl_multisamplesamples; int gl_retained_backing; diff --git a/libs/SDL3/include/SDL3/SDL_test_compare.h b/libs/SDL3/include/SDL3/SDL_test_compare.h index db2ae6c6..7ff24779 100644 --- a/libs/SDL3/include/SDL3/SDL_test_compare.h +++ b/libs/SDL3/include/SDL3/SDL_test_compare.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -63,7 +63,7 @@ int SDLCALL SDLTest_CompareSurfaces(SDL_Surface *surface, SDL_Surface *reference * * \returns 0 if the left and right memory block are equal, non-zero if they are non-equal. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ int SDLCALL SDLTest_CompareMemory(const void *actual, size_t size_actual, const void *reference, size_t size_reference); diff --git a/libs/SDL3/include/SDL3/SDL_test_crc32.h b/libs/SDL3/include/SDL3/SDL_test_crc32.h index 62ece2af..94fe1a34 100644 --- a/libs/SDL3/include/SDL3/SDL_test_crc32.h +++ b/libs/SDL3/include/SDL3/SDL_test_crc32.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/SDL3/SDL_test_font.h b/libs/SDL3/include/SDL3/SDL_test_font.h index bad949e0..fb407949 100644 --- a/libs/SDL3/include/SDL3/SDL_test_font.h +++ b/libs/SDL3/include/SDL3/SDL_test_font.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -91,7 +91,7 @@ typedef struct SDLTest_TextWindow * * \returns the new window, or NULL on failure. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ SDLTest_TextWindow * SDLCALL SDLTest_TextWindowCreate(float x, float y, float w, float h); @@ -103,7 +103,7 @@ SDLTest_TextWindow * SDLCALL SDLTest_TextWindowCreate(float x, float y, float w, * \param textwin The text output window * \param renderer The renderer to use for display * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ void SDLCALL SDLTest_TextWindowDisplay(SDLTest_TextWindow *textwin, SDL_Renderer *renderer); @@ -118,7 +118,7 @@ void SDLCALL SDLTest_TextWindowDisplay(SDLTest_TextWindow *textwin, SDL_Renderer * \param fmt A printf() style format string * \param ... additional parameters matching % tokens in the `fmt` string, if any * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ void SDLCALL SDLTest_TextWindowAddText(SDLTest_TextWindow *textwin, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); @@ -133,7 +133,7 @@ void SDLCALL SDLTest_TextWindowAddText(SDLTest_TextWindow *textwin, SDL_PRINTF_F * \param text The text to add to the window * \param len The length, in bytes, of the text to add to the window * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ void SDLCALL SDLTest_TextWindowAddTextWithLength(SDLTest_TextWindow *textwin, const char *text, size_t len); @@ -142,7 +142,7 @@ void SDLCALL SDLTest_TextWindowAddTextWithLength(SDLTest_TextWindow *textwin, co * * \param textwin The text output window * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ void SDLCALL SDLTest_TextWindowClear(SDLTest_TextWindow *textwin); @@ -151,7 +151,7 @@ void SDLCALL SDLTest_TextWindowClear(SDLTest_TextWindow *textwin); * * \param textwin The text output window * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ void SDLCALL SDLTest_TextWindowDestroy(SDLTest_TextWindow *textwin); diff --git a/libs/SDL3/include/SDL3/SDL_test_fuzzer.h b/libs/SDL3/include/SDL3/SDL_test_fuzzer.h index 4fdfd498..caf11f25 100644 --- a/libs/SDL3/include/SDL3/SDL_test_fuzzer.h +++ b/libs/SDL3/include/SDL3/SDL_test_fuzzer.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/SDL3/SDL_test_harness.h b/libs/SDL3/include/SDL3/SDL_test_harness.h index 925dc78c..5d4963e7 100644 --- a/libs/SDL3/include/SDL3/SDL_test_harness.h +++ b/libs/SDL3/include/SDL3/SDL_test_harness.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/SDL3/SDL_test_log.h b/libs/SDL3/include/SDL3/SDL_test_log.h index 625d545d..0d48044a 100644 --- a/libs/SDL3/include/SDL3/SDL_test_log.h +++ b/libs/SDL3/include/SDL3/SDL_test_log.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/SDL3/SDL_test_md5.h b/libs/SDL3/include/SDL3/SDL_test_md5.h index a2954398..e9d96398 100644 --- a/libs/SDL3/include/SDL3/SDL_test_md5.h +++ b/libs/SDL3/include/SDL3/SDL_test_md5.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/SDL3/SDL_test_memory.h b/libs/SDL3/include/SDL3/SDL_test_memory.h index d1d0ef34..1bd94667 100644 --- a/libs/SDL3/include/SDL3/SDL_test_memory.h +++ b/libs/SDL3/include/SDL3/SDL_test_memory.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/SDL3/SDL_thread.h b/libs/SDL3/include/SDL3/SDL_thread.h index 6bac1e40..277535fc 100644 --- a/libs/SDL3/include/SDL3/SDL_thread.h +++ b/libs/SDL3/include/SDL3/SDL_thread.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -25,7 +25,19 @@ /** * # CategoryThread * - * SDL thread management routines. + * SDL offers cross-platform thread management functions. These are mostly + * concerned with starting threads, setting their priority, and dealing with + * their termination. + * + * In addition, there is support for Thread Local Storage (data that is unique + * to each thread, but accessed from a single key). + * + * On platforms without thread support (such as Emscripten when built without + * pthreads), these functions still exist, but things like SDL_CreateThread() + * will report failure without doing anything. + * + * If you're going to work with threads, you almost certainly need to have a + * good understanding of [CategoryMutex](CategoryMutex) as well. */ #include @@ -50,7 +62,7 @@ extern "C" { * * These are opaque data. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_CreateThread * \sa SDL_WaitThread @@ -64,7 +76,7 @@ typedef struct SDL_Thread SDL_Thread; * application will operate on, but having a way to uniquely identify a thread * can be useful at times. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetThreadID * \sa SDL_GetCurrentThreadID @@ -77,7 +89,7 @@ typedef Uint64 SDL_ThreadID; * 0 is the invalid ID. An app can create these and then set data for these * IDs that is unique to each thread. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetTLS * \sa SDL_SetTLS @@ -93,7 +105,7 @@ typedef SDL_AtomicInt SDL_TLSID; * state. SDL_HINT_THREAD_PRIORITY_POLICY can be used to control aspects of * this behavior. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_ThreadPriority { SDL_THREAD_PRIORITY_LOW, @@ -105,19 +117,18 @@ typedef enum SDL_ThreadPriority { /** * The SDL thread state. * - * SDL stores the current state of a thread in an atomic int. The current - * state of a thread can be checked by calling SDL_GetThreadState. + * The current state of a thread can be checked by calling SDL_GetThreadState. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetThreadState */ typedef enum SDL_ThreadState { - SDL_THREAD_STATE_ALIVE, - SDL_THREAD_STATE_DETACHED, - SDL_THREAD_STATE_ZOMBIE, - SDL_THREAD_STATE_CLEANED, + SDL_THREAD_UNKNOWN, /**< The thread is not valid */ + SDL_THREAD_ALIVE, /**< The thread is currently running */ + SDL_THREAD_DETACHED, /**< The thread is detached and can't be waited on */ + SDL_THREAD_COMPLETE /**< The thread has finished and should be cleaned up with SDL_WaitThread() */ } SDL_ThreadState; /** @@ -126,7 +137,7 @@ typedef enum SDL_ThreadState * \param data what was passed as `data` to SDL_CreateThread(). * \returns a value that can be reported through SDL_WaitThread(). * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef int (SDLCALL * SDL_ThreadFunction) (void *data); @@ -196,7 +207,7 @@ typedef int (SDLCALL * SDL_ThreadFunction) (void *data); * new thread could not be created; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateThreadWithProperties * \sa SDL_WaitThread @@ -262,7 +273,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(SDL_ThreadFunction fn, * new thread could not be created; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateThread * \sa SDL_WaitThread @@ -317,7 +328,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithProperties(SDL_Prop * new thread could not be created; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadRuntime(SDL_ThreadFunction fn, const char *name, void *data, SDL_FunctionPointer pfnBeginThread, SDL_FunctionPointer pfnEndThread); @@ -331,7 +342,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadRuntime(SDL_ThreadFunct * new thread could not be created; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithPropertiesRuntime(SDL_PropertiesID props, SDL_FunctionPointer pfnBeginThread, SDL_FunctionPointer pfnEndThread); @@ -351,7 +362,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithPropertiesRuntime(S * \returns a pointer to a UTF-8 string that names the specified thread, or * NULL if it doesn't have a name. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetThreadName(SDL_Thread *thread); @@ -367,7 +378,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetThreadName(SDL_Thread *thread); * * \returns the ID of the current thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetThreadID */ @@ -384,7 +395,7 @@ extern SDL_DECLSPEC SDL_ThreadID SDLCALL SDL_GetCurrentThreadID(void); * \returns the ID of the specified thread, or the ID of the current thread if * `thread` is NULL. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCurrentThreadID */ @@ -401,22 +412,22 @@ extern SDL_DECLSPEC SDL_ThreadID SDLCALL SDL_GetThreadID(SDL_Thread *thread); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetCurrentThreadPriority(SDL_ThreadPriority priority); /** * Wait for a thread to finish. * - * Threads that haven't been detached will remain (as a "zombie") until this - * function cleans them up. Not doing so is a resource leak. + * Threads that haven't been detached will remain until this function cleans + * them up. Not doing so is a resource leak. * * Once a thread has been cleaned up through this function, the SDL_Thread * that references it becomes invalid and should not be referenced again. As * such, only one thread may call SDL_WaitThread() on another. * - * The return code for the thread function is placed in the area pointed to by - * `status`, if `status` is not NULL. + * The return code from the thread function is placed in the area pointed to + * by `status`, if `status` is not NULL. * * You may not wait on a thread that has been used in a call to * SDL_DetachThread(). Use either that function or this one, but not both, or @@ -429,11 +440,11 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetCurrentThreadPriority(SDL_ThreadPriority * * \param thread the SDL_Thread pointer that was returned from the * SDL_CreateThread() call that started this thread. - * \param status pointer to an integer that will receive the value returned - * from the thread function by its 'return', or NULL to not - * receive such value back. + * \param status a pointer filled in with the value returned from the thread + * function by its 'return', or -1 if the thread has been + * detached or isn't valid, may be NULL. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateThread * \sa SDL_DetachThread @@ -443,9 +454,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread *thread, int *status) /** * Get the current state of a thread. * - * \param thread the thread whose status you want to check. - * \returns the current state of a thread as defined in the SDL_ThreadState - * enum. + * \param thread the thread to query. + * \returns the current state of a thread, or SDL_THREAD_UNKNOWN if the thread + * isn't valid. * * \since This function is available since SDL 3.2.0. * @@ -482,7 +493,7 @@ extern SDL_DECLSPEC SDL_ThreadState SDLCALL SDL_GetThreadState(SDL_Thread *threa * \param thread the SDL_Thread pointer that was returned from the * SDL_CreateThread() call that started this thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateThread * \sa SDL_WaitThread @@ -498,7 +509,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DetachThread(SDL_Thread *thread); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetTLS */ @@ -511,7 +522,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetTLS(SDL_TLSID *id); * * \param value a pointer previously handed to SDL_SetTLS. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_SetTLS */ @@ -539,7 +550,7 @@ typedef void (SDLCALL *SDL_TLSDestructorCallback)(void *value); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTLS */ @@ -554,7 +565,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetTLS(SDL_TLSID *id, const void *value, SD * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_CleanupTLS(void); diff --git a/libs/SDL3/include/SDL3/SDL_time.h b/libs/SDL3/include/SDL3/SDL_time.h index 4dfe84f9..b6d3f6d0 100644 --- a/libs/SDL3/include/SDL3/SDL_time.h +++ b/libs/SDL3/include/SDL3/SDL_time.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer -Copyright (C) 1997-2024 Sam Lantinga +Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -26,6 +26,14 @@ freely, subject to the following restrictions: * # CategoryTime * * SDL realtime clock and date/time routines. + * + * There are two data types that are used in this category: SDL_Time, which + * represents the nanoseconds since a specific moment (an "epoch"), and + * SDL_DateTime, which breaks time down into human-understandable components: + * years, months, days, hours, etc. + * + * Much of the functionality is involved in converting those two types to + * other useful forms. */ #include @@ -41,7 +49,7 @@ extern "C" { * A structure holding a calendar date and time broken down into its * components. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_DateTime { @@ -59,7 +67,7 @@ typedef struct SDL_DateTime /** * The preferred date format of the current system locale. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetDateTimeLocalePreferences */ @@ -73,7 +81,7 @@ typedef enum SDL_DateFormat /** * The preferred time format of the current system locale. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_GetDateTimeLocalePreferences */ @@ -98,7 +106,7 @@ typedef enum SDL_TimeFormat * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetDateTimeLocalePreferences(SDL_DateFormat *dateFormat, SDL_TimeFormat *timeFormat); @@ -110,7 +118,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetDateTimeLocalePreferences(SDL_DateFormat * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetCurrentTime(SDL_Time *ticks); @@ -126,7 +134,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetCurrentTime(SDL_Time *ticks); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_TimeToDateTime(SDL_Time ticks, SDL_DateTime *dt, bool localTime); @@ -141,7 +149,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_TimeToDateTime(SDL_Time ticks, SDL_DateTime * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_DateTimeToTime(const SDL_DateTime *dt, SDL_Time *ticks); @@ -157,7 +165,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_DateTimeToTime(const SDL_DateTime *dt, SDL_ * \param dwHighDateTime a pointer filled in with the high portion of the * Windows FILETIME value. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_TimeToWindows(SDL_Time ticks, Uint32 *dwLowDateTime, Uint32 *dwHighDateTime); @@ -172,7 +180,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_TimeToWindows(SDL_Time ticks, Uint32 *dwLow * \param dwHighDateTime the high portion of the Windows FILETIME value. * \returns the converted SDL time. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Time SDLCALL SDL_TimeFromWindows(Uint32 dwLowDateTime, Uint32 dwHighDateTime); @@ -184,7 +192,7 @@ extern SDL_DECLSPEC SDL_Time SDLCALL SDL_TimeFromWindows(Uint32 dwLowDateTime, U * \returns the number of days in the requested month or -1 on failure; call * SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetDaysInMonth(int year, int month); @@ -197,7 +205,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetDaysInMonth(int year, int month); * \returns the day of year [0-365] if the date is valid or -1 on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetDayOfYear(int year, int month, int day); @@ -210,7 +218,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetDayOfYear(int year, int month, int day); * \returns a value between 0 and 6 (0 being Sunday) if the date is valid or * -1 on failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetDayOfWeek(int year, int month, int day); diff --git a/libs/SDL3/include/SDL3/SDL_timer.h b/libs/SDL3/include/SDL3/SDL_timer.h index 121ba3f5..cf94881d 100644 --- a/libs/SDL3/include/SDL3/SDL_timer.h +++ b/libs/SDL3/include/SDL3/SDL_timer.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -25,7 +25,20 @@ /** * # CategoryTimer * - * SDL time management routines. + * SDL provides time management functionality. It is useful for dealing with + * (usually) small durations of time. + * + * This is not to be confused with _calendar time_ management, which is + * provided by [CategoryTime](CategoryTime). + * + * This category covers measuring time elapsed (SDL_GetTicks(), + * SDL_GetPerformanceCounter()), putting a thread to sleep for a certain + * amount of time (SDL_Delay(), SDL_DelayNS(), SDL_DelayPrecise()), and firing + * a callback function after a certain amount of time has elasped + * (SDL_AddTimer(), etc). + * + * There are also useful macros to convert between time units, like + * SDL_SECONDS_TO_NS() and such. */ #include @@ -44,7 +57,7 @@ extern "C" { * * This is always 1000. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_MS_PER_SECOND 1000 @@ -53,7 +66,7 @@ extern "C" { * * This is always 1000000. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_US_PER_SECOND 1000000 @@ -62,7 +75,7 @@ extern "C" { * * This is always 1000000000. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_NS_PER_SECOND 1000000000LL @@ -71,7 +84,7 @@ extern "C" { * * This is always 1000000. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_NS_PER_MS 1000000 @@ -80,7 +93,7 @@ extern "C" { * * This is always 1000. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_NS_PER_US 1000 @@ -94,7 +107,7 @@ extern "C" { * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_SECONDS_TO_NS(S) (((Uint64)(S)) * SDL_NS_PER_SECOND) @@ -109,7 +122,7 @@ extern "C" { * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_NS_TO_SECONDS(NS) ((NS) / SDL_NS_PER_SECOND) @@ -123,7 +136,7 @@ extern "C" { * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_MS_TO_NS(MS) (((Uint64)(MS)) * SDL_NS_PER_MS) @@ -138,7 +151,7 @@ extern "C" { * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_NS_TO_MS(NS) ((NS) / SDL_NS_PER_MS) @@ -152,7 +165,7 @@ extern "C" { * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_US_TO_NS(US) (((Uint64)(US)) * SDL_NS_PER_US) @@ -167,7 +180,7 @@ extern "C" { * * \threadsafety It is safe to call this macro from any thread. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_NS_TO_US(NS) ((NS) / SDL_NS_PER_US) @@ -179,7 +192,7 @@ extern "C" { * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetTicks(void); @@ -191,7 +204,7 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetTicks(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetTicksNS(void); @@ -208,7 +221,7 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetTicksNS(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPerformanceFrequency */ @@ -221,7 +234,7 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetPerformanceCounter(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPerformanceCounter */ @@ -238,7 +251,10 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetPerformanceFrequency(void); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_DelayNS + * \sa SDL_DelayPrecise */ extern SDL_DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); @@ -253,7 +269,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_Delay + * \sa SDL_DelayPrecise */ extern SDL_DECLSPEC void SDLCALL SDL_DelayNS(Uint64 ns); @@ -268,14 +287,17 @@ extern SDL_DECLSPEC void SDLCALL SDL_DelayNS(Uint64 ns); * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.6. + * \since This function is available since SDL 3.2.0. + * + * \sa SDL_Delay + * \sa SDL_DelayNS */ extern SDL_DECLSPEC void SDLCALL SDL_DelayPrecise(Uint64 ns); /** * Definition of the timer ID type. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_TimerID; @@ -299,7 +321,7 @@ typedef Uint32 SDL_TimerID; * thread; the application is responsible for locking resources * the callback touches that need to be protected. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_AddTimer */ @@ -334,7 +356,7 @@ typedef Uint32 (SDLCALL *SDL_TimerCallback)(void *userdata, SDL_TimerID timerID, * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddTimerNS * \sa SDL_RemoveTimer @@ -361,7 +383,7 @@ extern SDL_DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, SDL_TimerC * thread; the application is responsible for locking resources * the callback touches that need to be protected. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_AddTimerNS */ @@ -396,7 +418,7 @@ typedef Uint64 (SDLCALL *SDL_NSTimerCallback)(void *userdata, SDL_TimerID timerI * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddTimer * \sa SDL_RemoveTimer @@ -412,7 +434,7 @@ extern SDL_DECLSPEC SDL_TimerID SDLCALL SDL_AddTimerNS(Uint64 interval, SDL_NSTi * * \threadsafety It is safe to call this function from any thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_AddTimer */ diff --git a/libs/SDL3/include/SDL3/SDL_touch.h b/libs/SDL3/include/SDL3/SDL_touch.h index 6fbb08e6..64845a15 100644 --- a/libs/SDL3/include/SDL3/SDL_touch.h +++ b/libs/SDL3/include/SDL3/SDL_touch.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -22,7 +22,18 @@ /** * # CategoryTouch * - * SDL touch management. + * SDL offers touch input, on platforms that support it. It can manage + * multiple touch devices and track multiple fingers on those devices. + * + * Touches are mostly dealt with through the event system, in the + * SDL_EVENT_FINGER_DOWN, SDL_EVENT_FINGER_MOTION, and SDL_EVENT_FINGER_UP + * events, but there are also functions to query for hardware details, etc. + * + * The touch system, by default, will also send virtual mouse events; this can + * be useful for making a some desktop apps work on a phone without + * significant changes. For apps that care about mouse and touch input + * separately, they should ignore mouse events that have a `which` field of + * SDL_TOUCH_MOUSEID. */ #ifndef SDL_touch_h_ @@ -46,7 +57,7 @@ extern "C" { * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint64 SDL_TouchID; @@ -60,14 +71,14 @@ typedef Uint64 SDL_TouchID; * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint64 SDL_FingerID; /** * An enum that describes the type of a touch device. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_TouchDeviceType { @@ -84,7 +95,7 @@ typedef enum SDL_TouchDeviceType * contact with the touch device (so a "touch" can be a "multitouch," in * reality), and this struct reports details of the specific fingers. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetTouchFingers */ @@ -99,14 +110,14 @@ typedef struct SDL_Finger /** * The SDL_MouseID for mouse events simulated with touch input. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_TOUCH_MOUSEID ((SDL_MouseID)-1) /** * The SDL_TouchID for touch events simulated with mouse input. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_MOUSE_TOUCHID ((SDL_TouchID)-1) @@ -124,7 +135,7 @@ typedef struct SDL_Finger * SDL_GetError() for more information. This should be freed with * SDL_free() when it is no longer needed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_TouchID * SDLCALL SDL_GetTouchDevices(int *count); @@ -135,7 +146,7 @@ extern SDL_DECLSPEC SDL_TouchID * SDLCALL SDL_GetTouchDevices(int *count); * \returns touch device name, or NULL on failure; call SDL_GetError() for * more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetTouchDeviceName(SDL_TouchID touchID); @@ -145,7 +156,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetTouchDeviceName(SDL_TouchID touc * \param touchID the ID of a touch device. * \returns touch device type. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_TouchDeviceType SDLCALL SDL_GetTouchDeviceType(SDL_TouchID touchID); @@ -160,7 +171,7 @@ extern SDL_DECLSPEC SDL_TouchDeviceType SDLCALL SDL_GetTouchDeviceType(SDL_Touch * allocation that should be freed with SDL_free() when it is no * longer needed. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Finger ** SDLCALL SDL_GetTouchFingers(SDL_TouchID touchID, int *count); diff --git a/libs/SDL3/include/SDL3/SDL_tray.h b/libs/SDL3/include/SDL3/SDL_tray.h index a9f48283..0b05db25 100644 --- a/libs/SDL3/include/SDL3/SDL_tray.h +++ b/libs/SDL3/include/SDL3/SDL_tray.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -22,7 +22,11 @@ /** * # CategoryTray * - * System tray menu support. + * SDL offers a way to add items to the "system tray" (more correctly called + * the "notification area" on Windows). On platforms that offer this concept, + * an SDL app can add a tray icon, submenus, checkboxes, and clickable + * entries, and register a callback that is fired when the user clicks on + * these pieces. */ #ifndef SDL_tray_h_ @@ -39,8 +43,25 @@ extern "C" { #endif +/** + * An opaque handle representing a toplevel system tray object. + * + * \since This struct is available since SDL 3.2.0. + */ typedef struct SDL_Tray SDL_Tray; + +/** + * An opaque handle representing a menu/submenu on a system tray object. + * + * \since This struct is available since SDL 3.2.0. + */ typedef struct SDL_TrayMenu SDL_TrayMenu; + +/** + * An opaque handle representing an entry on a system tray object. + * + * \since This struct is available since SDL 3.2.0. + */ typedef struct SDL_TrayEntry SDL_TrayEntry; /** @@ -50,7 +71,7 @@ typedef struct SDL_TrayEntry SDL_TrayEntry; * the time a tray entry is created. Other flags are optional; zero or more of * those can be OR'ed together with the required flag. * - * \since This datatype is available since SDL 3.0.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_InsertTrayEntryAt */ @@ -69,6 +90,8 @@ typedef Uint32 SDL_TrayEntryFlags; * it will be invoked. * \param entry the tray entry that was selected. * + * \since This datatype is available since SDL 3.2.0. + * * \sa SDL_SetTrayEntryCallback */ typedef void (SDLCALL *SDL_TrayCallback)(void *userdata, SDL_TrayEntry *entry); @@ -83,10 +106,12 @@ typedef void (SDLCALL *SDL_TrayCallback)(void *userdata, SDL_TrayEntry *entry); * Using tray icons require the video subsystem. * * \param icon a surface to be used as icon. May be NULL. - * \param tooltip a tooltip to be displayed when the mouse hovers the icon. - * Not supported on all platforms. May be NULL. + * \param tooltip a tooltip to be displayed when the mouse hovers the icon in + * UTF-8 encoding. Not supported on all platforms. May be NULL. * \returns The newly created system tray icon. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTrayMenu @@ -101,6 +126,9 @@ extern SDL_DECLSPEC SDL_Tray *SDLCALL SDL_CreateTray(SDL_Surface *icon, const ch * \param tray the tray icon to be updated. * \param icon the new icon. May be NULL. * + * \threadsafety This function should be called on the thread that created the + * tray. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTray @@ -111,7 +139,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetTrayIcon(SDL_Tray *tray, SDL_Surface *ic * Updates the system tray icon's tooltip. * * \param tray the tray icon to be updated. - * \param tooltip the new tooltip. May be NULL. + * \param tooltip the new tooltip in UTF-8 encoding. May be NULL. + * + * \threadsafety This function should be called on the thread that created the + * tray. * * \since This function is available since SDL 3.2.0. * @@ -132,6 +163,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetTrayTooltip(SDL_Tray *tray, const char * * \param tray the tray to bind the menu to. * \returns the newly created menu. * + * \threadsafety This function should be called on the thread that created the + * tray. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTray @@ -153,6 +187,9 @@ extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_CreateTrayMenu(SDL_Tray *tray); * \param entry the tray entry to bind the menu to. * \returns the newly created menu. * + * \threadsafety This function should be called on the thread that created the + * tray. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_InsertTrayEntryAt @@ -175,6 +212,9 @@ extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_CreateTraySubmenu(SDL_TrayEntry *e * \param tray the tray entry to bind the menu to. * \returns the newly created menu. * + * \threadsafety This function should be called on the thread that created the + * tray. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTray @@ -185,7 +225,7 @@ extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_GetTrayMenu(SDL_Tray *tray); /** * Gets a previously created tray entry submenu. * - * You should have called SDL_CreateTraySubenu() on the entry object. This + * You should have called SDL_CreateTraySubmenu() on the entry object. This * function allows you to fetch it again later. * * This function does the same thing as SDL_GetTrayMenu(), except that it @@ -196,6 +236,9 @@ extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_GetTrayMenu(SDL_Tray *tray); * \param entry the tray entry to bind the menu to. * \returns the newly created menu. * + * \threadsafety This function should be called on the thread that created the + * tray. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_InsertTrayEntryAt @@ -209,9 +252,12 @@ extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_GetTraySubmenu(SDL_TrayEntry *entr * \param menu The menu to get entries from. * \param size An optional pointer to obtain the number of entries in the * menu. - * \returns the entries within the given menu. The pointer becomes invalid - * when any function that inserts or deletes entries in the menu is - * called. + * \returns a NULL-terminated list of entries within the given menu. The + * pointer becomes invalid when any function that inserts or deletes + * entries in the menu is called. + * + * \threadsafety This function should be called on the thread that created the + * tray. * * \since This function is available since SDL 3.2.0. * @@ -225,6 +271,9 @@ extern SDL_DECLSPEC const SDL_TrayEntry **SDLCALL SDL_GetTrayEntries(SDL_TrayMen * * \param entry The entry to be deleted. * + * \threadsafety This function should be called on the thread that created the + * tray. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTrayEntries @@ -243,11 +292,14 @@ extern SDL_DECLSPEC void SDLCALL SDL_RemoveTrayEntry(SDL_TrayEntry *entry); * \param menu the menu to append the entry to. * \param pos the desired position for the new entry. Entries at or following * this place will be moved. If pos is -1, the entry is appended. - * \param label the text to be displayed on the entry, or NULL for a - * separator. + * \param label the text to be displayed on the entry, in UTF-8 encoding, or + * NULL for a separator. * \param flags a combination of flags, some of which are mandatory. * \returns the newly created entry, or NULL if pos is out of bounds. * + * \threadsafety This function should be called on the thread that created the + * tray. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_TrayEntryFlags @@ -266,7 +318,10 @@ extern SDL_DECLSPEC SDL_TrayEntry *SDLCALL SDL_InsertTrayEntryAt(SDL_TrayMenu *m * label. The function will silently fail if that happens. * * \param entry the entry to be updated. - * \param label the new label for the entry. + * \param label the new label for the entry in UTF-8 encoding. + * + * \threadsafety This function should be called on the thread that created the + * tray. * * \since This function is available since SDL 3.2.0. * @@ -282,7 +337,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetTrayEntryLabel(SDL_TrayEntry *entry, con * If the returned value is NULL, the entry is a separator. * * \param entry the entry to be read. - * \returns the label of the entry. + * \returns the label of the entry in UTF-8 encoding. + * + * \threadsafety This function should be called on the thread that created the + * tray. * * \since This function is available since SDL 3.2.0. * @@ -298,8 +356,10 @@ extern SDL_DECLSPEC const char *SDLCALL SDL_GetTrayEntryLabel(SDL_TrayEntry *ent * The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag. * * \param entry the entry to be updated. - * \param checked SDL_TRUE if the entry should be checked; SDL_FALSE - * otherwise. + * \param checked true if the entry should be checked; false otherwise. + * + * \threadsafety This function should be called on the thread that created the + * tray. * * \since This function is available since SDL 3.2.0. * @@ -315,7 +375,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetTrayEntryChecked(SDL_TrayEntry *entry, b * The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag. * * \param entry the entry to be read. - * \returns SDL_TRUE if the entry is checked; SDL_FALSE otherwise. + * \returns true if the entry is checked; false otherwise. + * + * \threadsafety This function should be called on the thread that created the + * tray. * * \since This function is available since SDL 3.2.0. * @@ -329,8 +392,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetTrayEntryChecked(SDL_TrayEntry *entry); * Sets whether or not an entry is enabled. * * \param entry the entry to be updated. - * \param enabled SDL_TRUE if the entry should be enabled; SDL_FALSE - * otherwise. + * \param enabled true if the entry should be enabled; false otherwise. + * + * \threadsafety This function should be called on the thread that created the + * tray. * * \since This function is available since SDL 3.2.0. * @@ -344,7 +409,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetTrayEntryEnabled(SDL_TrayEntry *entry, b * Gets whether or not an entry is enabled. * * \param entry the entry to be read. - * \returns SDL_TRUE if the entry is enabled; SDL_FALSE otherwise. + * \returns true if the entry is enabled; false otherwise. + * + * \threadsafety This function should be called on the thread that created the + * tray. * * \since This function is available since SDL 3.2.0. * @@ -362,6 +430,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetTrayEntryEnabled(SDL_TrayEntry *entry); * \param userdata an optional pointer to pass extra data to the callback when * it will be invoked. * + * \threadsafety This function should be called on the thread that created the + * tray. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetTrayEntries @@ -369,6 +440,18 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetTrayEntryEnabled(SDL_TrayEntry *entry); */ extern SDL_DECLSPEC void SDLCALL SDL_SetTrayEntryCallback(SDL_TrayEntry *entry, SDL_TrayCallback callback, void *userdata); +/** + * Simulate a click on a tray entry. + * + * \param entry The entry to activate. + * + * \threadsafety This function should be called on the thread that created the + * tray. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC void SDLCALL SDL_ClickTrayEntry(SDL_TrayEntry *entry); + /** * Destroys a tray object. * @@ -376,6 +459,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetTrayEntryCallback(SDL_TrayEntry *entry, * * \param tray the tray icon to be destroyed. * + * \threadsafety This function should be called on the thread that created the + * tray. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTray @@ -383,11 +469,14 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetTrayEntryCallback(SDL_TrayEntry *entry, extern SDL_DECLSPEC void SDLCALL SDL_DestroyTray(SDL_Tray *tray); /** - * Gets the menu contianing a certain tray entry. + * Gets the menu containing a certain tray entry. * * \param entry the entry for which to get the parent menu. * \returns the parent menu. * + * \threadsafety This function should be called on the thread that created the + * tray. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_InsertTrayEntryAt @@ -404,6 +493,9 @@ extern SDL_DECLSPEC SDL_TrayMenu *SDLCALL SDL_GetTrayEntryParent(SDL_TrayEntry * * \param menu the menu for which to get the parent entry. * \returns the parent entry, or NULL if this menu is not a submenu. * + * \threadsafety This function should be called on the thread that created the + * tray. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTraySubmenu @@ -421,6 +513,9 @@ extern SDL_DECLSPEC SDL_TrayEntry *SDLCALL SDL_GetTrayMenuParentEntry(SDL_TrayMe * \param menu the menu for which to get the parent enttrayry. * \returns the parent tray, or NULL if this menu is a submenu. * + * \threadsafety This function should be called on the thread that created the + * tray. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateTrayMenu @@ -428,6 +523,18 @@ extern SDL_DECLSPEC SDL_TrayEntry *SDLCALL SDL_GetTrayMenuParentEntry(SDL_TrayMe */ extern SDL_DECLSPEC SDL_Tray *SDLCALL SDL_GetTrayMenuParentTray(SDL_TrayMenu *menu); +/** + * Update the trays. + * + * This is called automatically by the event loop and is only needed if you're + * using trays but aren't handling SDL events. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.2.0. + */ +extern SDL_DECLSPEC void SDLCALL SDL_UpdateTrays(void); + /* Ends C function definitions when using C++ */ #ifdef __cplusplus } diff --git a/libs/SDL3/include/SDL3/SDL_version.h b/libs/SDL3/include/SDL3/SDL_version.h index 427612b0..55014e3c 100644 --- a/libs/SDL3/include/SDL3/SDL_version.h +++ b/libs/SDL3/include/SDL3/SDL_version.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -42,7 +42,7 @@ extern "C" { * * If this were SDL version 3.2.1, this value would be 3. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_MAJOR_VERSION 3 @@ -51,18 +51,18 @@ extern "C" { * * If this were SDL version 3.2.1, this value would be 2. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ -#define SDL_MINOR_VERSION 1 +#define SDL_MINOR_VERSION 2 /** * The current micro (or patchlevel) version of the SDL headers. * * If this were SDL version 3.2.1, this value would be 1. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ -#define SDL_MICRO_VERSION 7 +#define SDL_MICRO_VERSION 0 /** * This macro turns the version numbers into a numeric value. @@ -73,7 +73,7 @@ extern "C" { * \param minor the minorversion number. * \param patch the patch version number. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSIONNUM(major, minor, patch) \ ((major) * 1000000 + (minor) * 1000 + (patch)) @@ -85,7 +85,7 @@ extern "C" { * * \param version the version number. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSIONNUM_MAJOR(version) ((version) / 1000000) @@ -96,7 +96,7 @@ extern "C" { * * \param version the version number. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSIONNUM_MINOR(version) (((version) / 1000) % 1000) @@ -107,14 +107,14 @@ extern "C" { * * \param version the version number. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSIONNUM_MICRO(version) ((version) % 1000) /** * This is the version number macro for the current SDL version. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. * * \sa SDL_GetVersion */ @@ -124,7 +124,7 @@ extern "C" { /** * This macro will evaluate to true if compiled with SDL at least X.Y.Z. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSION_ATLEAST(X, Y, Z) \ (SDL_VERSION >= SDL_VERSIONNUM(X, Y, Z)) @@ -141,7 +141,7 @@ extern "C" { * * \returns the version of the linked library. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRevision */ @@ -167,7 +167,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetVersion(void); * \returns an arbitrary string, uniquely identifying the exact revision of * the SDL library in use. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetVersion */ diff --git a/libs/SDL3/include/SDL3/SDL_video.h b/libs/SDL3/include/SDL3/SDL_video.h index 388d1e7a..a7afc326 100644 --- a/libs/SDL3/include/SDL3/SDL_video.h +++ b/libs/SDL3/include/SDL3/SDL_video.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -70,7 +70,7 @@ extern "C" { * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_DisplayID; @@ -79,7 +79,7 @@ typedef Uint32 SDL_DisplayID; * * The value 0 is an invalid ID. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_WindowID; @@ -103,7 +103,7 @@ typedef Uint32 SDL_WindowID; /** * System theme. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_SystemTheme { @@ -117,7 +117,7 @@ typedef enum SDL_SystemTheme * * This lives as a field in SDL_DisplayMode, as opaque data. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_DisplayMode */ @@ -126,7 +126,7 @@ typedef struct SDL_DisplayModeData SDL_DisplayModeData; /** * The structure that defines a display mode. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_GetFullscreenDisplayModes * \sa SDL_GetDesktopDisplayMode @@ -152,7 +152,7 @@ typedef struct SDL_DisplayMode /** * Display orientation values; the way a display is rotated. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_DisplayOrientation { @@ -166,7 +166,7 @@ typedef enum SDL_DisplayOrientation /** * The struct used as an opaque handle to a window. * - * \since This struct is available since SDL 3.1.3. + * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateWindow */ @@ -180,7 +180,7 @@ typedef struct SDL_Window SDL_Window; * changed on existing windows by the app, and some of it might be altered by * the user or system outside of the app's control. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetWindowFlags */ @@ -219,7 +219,7 @@ typedef Uint64 SDL_WindowFlags; * Generally this macro isn't used directly, but rather through * SDL_WINDOWPOS_UNDEFINED or SDL_WINDOWPOS_UNDEFINED_DISPLAY. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_WINDOWPOS_UNDEFINED_MASK 0x1FFF0000u @@ -231,7 +231,7 @@ typedef Uint64 SDL_WindowFlags; * * \param X the SDL_DisplayID of the display to use. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_WINDOWPOS_UNDEFINED_DISPLAY(X) (SDL_WINDOWPOS_UNDEFINED_MASK|(X)) @@ -240,7 +240,7 @@ typedef Uint64 SDL_WindowFlags; * * This always uses the primary display. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_WINDOWPOS_UNDEFINED SDL_WINDOWPOS_UNDEFINED_DISPLAY(0) @@ -249,7 +249,7 @@ typedef Uint64 SDL_WindowFlags; * * \param X the window position value. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_WINDOWPOS_ISUNDEFINED(X) (((X)&0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK) @@ -259,7 +259,7 @@ typedef Uint64 SDL_WindowFlags; * Generally this macro isn't used directly, but rather through * SDL_WINDOWPOS_CENTERED or SDL_WINDOWPOS_CENTERED_DISPLAY. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_WINDOWPOS_CENTERED_MASK 0x2FFF0000u @@ -271,7 +271,7 @@ typedef Uint64 SDL_WindowFlags; * * \param X the SDL_DisplayID of the display to use. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_WINDOWPOS_CENTERED_DISPLAY(X) (SDL_WINDOWPOS_CENTERED_MASK|(X)) @@ -280,7 +280,7 @@ typedef Uint64 SDL_WindowFlags; * * This always uses the primary display. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_WINDOWPOS_CENTERED SDL_WINDOWPOS_CENTERED_DISPLAY(0) @@ -289,7 +289,7 @@ typedef Uint64 SDL_WindowFlags; * * \param X the window position value. * - * \since This macro is available since SDL 3.1.3. + * \since This macro is available since SDL 3.2.0. */ #define SDL_WINDOWPOS_ISCENTERED(X) \ (((X)&0xFFFF0000) == SDL_WINDOWPOS_CENTERED_MASK) @@ -298,7 +298,7 @@ typedef Uint64 SDL_WindowFlags; /** * Window flash operation. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_FlashOperation { @@ -310,7 +310,7 @@ typedef enum SDL_FlashOperation /** * An opaque handle to an OpenGL context. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GL_CreateContext */ @@ -319,35 +319,35 @@ typedef struct SDL_GLContextState *SDL_GLContext; /** * Opaque type for an EGL display. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef void *SDL_EGLDisplay; /** * Opaque type for an EGL config. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef void *SDL_EGLConfig; /** * Opaque type for an EGL surface. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef void *SDL_EGLSurface; /** * An EGL attribute, used when creating an EGL context. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef intptr_t SDL_EGLAttrib; /** * An EGL integer attribute, used when creating an EGL surface. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef int SDL_EGLint; @@ -370,7 +370,7 @@ typedef int SDL_EGLint; * \param userdata an app-controlled pointer that is passed to the callback. * \returns a newly-allocated array of attributes, terminated with `EGL_NONE`. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_EGL_SetAttributeCallbacks */ @@ -401,7 +401,7 @@ typedef SDL_EGLAttrib *(SDLCALL *SDL_EGLAttribArrayCallback)(void *userdata); * \param config the EGL config to be used. * \returns a newly-allocated array of attributes, terminated with `EGL_NONE`. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_EGL_SetAttributeCallbacks */ @@ -422,7 +422,7 @@ typedef SDL_EGLint *(SDLCALL *SDL_EGLIntArrayCallback)(void *userdata, SDL_EGLDi * fail if the GL can't provide your requested attributes at a minimum, but * you should check to see exactly what you got. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_GLAttr { @@ -459,7 +459,7 @@ typedef enum SDL_GLAttr /** * Possible values to be set for the SDL_GL_CONTEXT_PROFILE_MASK attribute. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_GLProfile; @@ -471,7 +471,7 @@ typedef Uint32 SDL_GLProfile; /** * Possible flags to be set for the SDL_GL_CONTEXT_FLAGS attribute. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_GLContextFlag; @@ -485,7 +485,7 @@ typedef Uint32 SDL_GLContextFlag; * Possible values to be set for the SDL_GL_CONTEXT_RELEASE_BEHAVIOR * attribute. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_GLContextReleaseFlag; @@ -496,7 +496,7 @@ typedef Uint32 SDL_GLContextReleaseFlag; /** * Possible values to be set SDL_GL_CONTEXT_RESET_NOTIFICATION attribute. * - * \since This datatype is available since SDL 3.1.3. + * \since This datatype is available since SDL 3.2.0. */ typedef Uint32 SDL_GLContextResetNotification; @@ -513,7 +513,7 @@ typedef Uint32 SDL_GLContextResetNotification; * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetVideoDriver */ @@ -534,7 +534,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumVideoDrivers(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumVideoDrivers */ @@ -552,7 +552,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetVideoDriver(int index); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumVideoDrivers * \sa SDL_GetVideoDriver @@ -566,7 +566,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentVideoDriver(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_SystemTheme SDLCALL SDL_GetSystemTheme(void); @@ -581,7 +581,7 @@ extern SDL_DECLSPEC SDL_SystemTheme SDLCALL SDL_GetSystemTheme(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_DisplayID * SDLCALL SDL_GetDisplays(int *count); @@ -593,7 +593,7 @@ extern SDL_DECLSPEC SDL_DisplayID * SDLCALL SDL_GetDisplays(int *count); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays */ @@ -623,7 +623,7 @@ extern SDL_DECLSPEC SDL_DisplayID SDLCALL SDL_GetPrimaryDisplay(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetDisplayProperties(SDL_DisplayID displayID); @@ -639,7 +639,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetDisplayProperties(SDL_Displa * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays */ @@ -648,7 +648,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetDisplayName(SDL_DisplayID displa /** * Get the desktop area represented by a display. * - * The primary display is always located at (0,0). + * The primary display is often located at (0,0), but may be placed at a + * different location depending on monitor layout. * * \param displayID the instance ID of the display to query. * \param rect the SDL_Rect structure filled in with the display bounds. @@ -657,7 +658,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetDisplayName(SDL_DisplayID displa * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplayUsableBounds * \sa SDL_GetDisplays @@ -683,7 +684,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetDisplayBounds(SDL_DisplayID displayID, S * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplayBounds * \sa SDL_GetDisplays @@ -699,7 +700,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetDisplayUsableBounds(SDL_DisplayID displa * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays */ @@ -714,7 +715,7 @@ extern SDL_DECLSPEC SDL_DisplayOrientation SDLCALL SDL_GetNaturalDisplayOrientat * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays */ @@ -728,14 +729,21 @@ extern SDL_DECLSPEC SDL_DisplayOrientation SDLCALL SDL_GetCurrentDisplayOrientat * display scale, which means that the user expects UI elements to be twice as * big on this display, to aid in readability. * + * After window creation, SDL_GetWindowDisplayScale() should be used to query + * the content scale factor for individual windows instead of querying the + * display for a window and calling this function, as the per-window content + * scale factor may differ from the base value of the display it is on, + * particularly on high-DPI and/or multi-monitor desktop configurations. + * * \param displayID the instance ID of the display to query. * \returns the content scale of the display, or 0.0f on failure; call * SDL_GetError() for more information. * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * + * \sa SDL_GetWindowDisplayScale * \sa SDL_GetDisplays */ extern SDL_DECLSPEC float SDLCALL SDL_GetDisplayContentScale(SDL_DisplayID displayID); @@ -762,7 +770,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetDisplayContentScale(SDL_DisplayID displ * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays */ @@ -792,7 +800,7 @@ extern SDL_DECLSPEC SDL_DisplayMode ** SDLCALL SDL_GetFullscreenDisplayModes(SDL * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplays * \sa SDL_GetFullscreenDisplayModes @@ -813,7 +821,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetClosestFullscreenDisplayMode(SDL_Display * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCurrentDisplayMode * \sa SDL_GetDisplays @@ -834,7 +842,7 @@ extern SDL_DECLSPEC const SDL_DisplayMode * SDLCALL SDL_GetDesktopDisplayMode(SD * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDesktopDisplayMode * \sa SDL_GetDisplays @@ -850,7 +858,7 @@ extern SDL_DECLSPEC const SDL_DisplayMode * SDLCALL SDL_GetCurrentDisplayMode(SD * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplayBounds * \sa SDL_GetDisplays @@ -867,7 +875,7 @@ extern SDL_DECLSPEC SDL_DisplayID SDLCALL SDL_GetDisplayForPoint(const SDL_Point * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplayBounds * \sa SDL_GetDisplays @@ -884,7 +892,7 @@ extern SDL_DECLSPEC SDL_DisplayID SDLCALL SDL_GetDisplayForRect(const SDL_Rect * * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetDisplayBounds * \sa SDL_GetDisplays @@ -904,7 +912,7 @@ extern SDL_DECLSPEC SDL_DisplayID SDLCALL SDL_GetDisplayForWindow(SDL_Window *wi * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowDisplayScale */ @@ -930,7 +938,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetWindowPixelDensity(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC float SDLCALL SDL_GetWindowDisplayScale(SDL_Window *window); @@ -961,7 +969,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetWindowDisplayScale(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFullscreenMode * \sa SDL_SetWindowFullscreen @@ -978,7 +986,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowFullscreenMode(SDL_Window *window, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowFullscreenMode * \sa SDL_SetWindowFullscreen @@ -996,7 +1004,7 @@ extern SDL_DECLSPEC const SDL_DisplayMode * SDLCALL SDL_GetWindowFullscreenMode( * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void * SDLCALL SDL_GetWindowICCProfile(SDL_Window *window, size_t *size); @@ -1010,7 +1018,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetWindowICCProfile(SDL_Window *window, s * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PixelFormat SDLCALL SDL_GetWindowPixelFormat(SDL_Window *window); @@ -1026,7 +1034,7 @@ extern SDL_DECLSPEC SDL_PixelFormat SDLCALL SDL_GetWindowPixelFormat(SDL_Window * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Window ** SDLCALL SDL_GetWindows(int *count); @@ -1107,7 +1115,7 @@ extern SDL_DECLSPEC SDL_Window ** SDLCALL SDL_GetWindows(int *count); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateWindowAndRenderer * \sa SDL_CreatePopupWindow @@ -1169,7 +1177,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(const char *title, int * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateWindow * \sa SDL_CreateWindowWithProperties @@ -1228,10 +1236,12 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreatePopupWindow(SDL_Window *paren * - `SDL_PROP_WINDOW_CREATE_WIDTH_NUMBER`: the width of the window * - `SDL_PROP_WINDOW_CREATE_X_NUMBER`: the x position of the window, or * `SDL_WINDOWPOS_CENTERED`, defaults to `SDL_WINDOWPOS_UNDEFINED`. This is - * relative to the parent for windows with the "parent" property set. + * relative to the parent for windows with the "tooltip" or "menu" property + * set. * - `SDL_PROP_WINDOW_CREATE_Y_NUMBER`: the y position of the window, or * `SDL_WINDOWPOS_CENTERED`, defaults to `SDL_WINDOWPOS_UNDEFINED`. This is - * relative to the parent for windows with the "parent" property set. + * relative to the parent for windows with the "tooltip" or "menu" property + * set. * * These are additional supported properties on macOS: * @@ -1289,7 +1299,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreatePopupWindow(SDL_Window *paren * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateProperties * \sa SDL_CreateWindow @@ -1344,7 +1354,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreateWindowWithProperties(SDL_Prop * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFromID */ @@ -1362,7 +1372,7 @@ extern SDL_DECLSPEC SDL_WindowID SDLCALL SDL_GetWindowID(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowID */ @@ -1377,7 +1387,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowFromID(SDL_WindowID id); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreatePopupWindow */ @@ -1501,7 +1511,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowParent(SDL_Window *window) * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetWindowProperties(SDL_Window *window); @@ -1549,7 +1559,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetWindowProperties(SDL_Window * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateWindow * \sa SDL_HideWindow @@ -1573,7 +1583,7 @@ extern SDL_DECLSPEC SDL_WindowFlags SDLCALL SDL_GetWindowFlags(SDL_Window *windo * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowTitle */ @@ -1588,7 +1598,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowTitle(SDL_Window *window, const ch * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowTitle */ @@ -1614,7 +1624,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetWindowTitle(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowIcon(SDL_Window *window, SDL_Surface *icon); @@ -1652,7 +1662,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowIcon(SDL_Window *window, SDL_Surfa * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowPosition * \sa SDL_SyncWindow @@ -1678,7 +1688,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowPosition(SDL_Window *window, int x * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowPosition */ @@ -1713,7 +1723,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowPosition(SDL_Window *window, int * * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSize * \sa SDL_SetWindowFullscreenMode @@ -1736,7 +1746,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowSize(SDL_Window *window, int w, in * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRenderOutputSize * \sa SDL_GetWindowSizeInPixels @@ -1762,7 +1772,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSize(SDL_Window *window, int *w, i * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSafeArea(SDL_Window *window, SDL_Rect *rect); @@ -1800,7 +1810,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSafeArea(SDL_Window *window, SDL_R * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowAspectRatio * \sa SDL_SyncWindow @@ -1820,7 +1830,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowAspectRatio(SDL_Window *window, fl * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowAspectRatio */ @@ -1857,7 +1867,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowAspectRatio(SDL_Window *window, fl * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSize */ @@ -1876,7 +1886,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowBordersSize(SDL_Window *window, in * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateWindow * \sa SDL_GetWindowSize @@ -1894,7 +1904,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSizeInPixels(SDL_Window *window, i * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMinimumSize * \sa SDL_SetWindowMaximumSize @@ -1914,7 +1924,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowMinimumSize(SDL_Window *window, in * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMaximumSize * \sa SDL_SetWindowMinimumSize @@ -1932,7 +1942,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowMinimumSize(SDL_Window *window, in * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMaximumSize * \sa SDL_SetWindowMinimumSize @@ -1952,7 +1962,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowMaximumSize(SDL_Window *window, in * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMinimumSize * \sa SDL_SetWindowMaximumSize @@ -1975,7 +1985,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowMaximumSize(SDL_Window *window, in * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFlags */ @@ -1997,7 +2007,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowBordered(SDL_Window *window, bool * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFlags */ @@ -2016,7 +2026,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowResizable(SDL_Window *window, bool * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFlags */ @@ -2031,7 +2041,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowAlwaysOnTop(SDL_Window *window, bo * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_HideWindow * \sa SDL_RaiseWindow @@ -2047,7 +2057,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ShowWindow(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_ShowWindow * \sa SDL_WINDOW_HIDDEN @@ -2070,7 +2080,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HideWindow(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_RaiseWindow(SDL_Window *window); @@ -2100,7 +2110,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RaiseWindow(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_MinimizeWindow * \sa SDL_RestoreWindow @@ -2129,7 +2139,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_MaximizeWindow(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_MaximizeWindow * \sa SDL_RestoreWindow @@ -2159,7 +2169,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_MinimizeWindow(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_MaximizeWindow * \sa SDL_MinimizeWindow @@ -2190,7 +2200,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RestoreWindow(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowFullscreenMode * \sa SDL_SetWindowFullscreenMode @@ -2218,7 +2228,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowFullscreen(SDL_Window *window, boo * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowSize * \sa SDL_SetWindowPosition @@ -2239,7 +2249,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SyncWindow(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSurface */ @@ -2265,7 +2275,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WindowHasSurface(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyWindowSurface * \sa SDL_WindowHasSurface @@ -2294,7 +2304,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_GetWindowSurface(SDL_Window *windo * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSurfaceVSync */ @@ -2314,7 +2324,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowSurfaceVSync(SDL_Window *window, i * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowSurfaceVSync */ @@ -2334,7 +2344,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSurfaceVSync(SDL_Window *window, i * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSurface * \sa SDL_UpdateWindowSurfaceRects @@ -2363,7 +2373,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_UpdateWindowSurface(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSurface * \sa SDL_UpdateWindowSurface @@ -2379,7 +2389,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_UpdateWindowSurfaceRects(SDL_Window *window * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowSurface * \sa SDL_WindowHasSurface @@ -2412,7 +2422,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_DestroyWindowSurface(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowKeyboardGrab * \sa SDL_SetWindowMouseGrab @@ -2431,7 +2441,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowKeyboardGrab(SDL_Window *window, b * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMouseRect * \sa SDL_SetWindowMouseRect @@ -2448,7 +2458,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowMouseGrab(SDL_Window *window, bool * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowKeyboardGrab */ @@ -2462,7 +2472,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowKeyboardGrab(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMouseRect * \sa SDL_SetWindowMouseRect @@ -2478,7 +2488,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowMouseGrab(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowMouseGrab * \sa SDL_SetWindowKeyboardGrab @@ -2499,7 +2509,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetGrabbedWindow(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowMouseRect * \sa SDL_GetWindowMouseGrab @@ -2516,7 +2526,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowMouseRect(SDL_Window *window, cons * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowMouseRect * \sa SDL_GetWindowMouseGrab @@ -2539,7 +2549,7 @@ extern SDL_DECLSPEC const SDL_Rect * SDLCALL SDL_GetWindowMouseRect(SDL_Window * * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GetWindowOpacity */ @@ -2557,7 +2567,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowOpacity(SDL_Window *window, float * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowOpacity */ @@ -2591,7 +2601,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetWindowOpacity(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowModal */ @@ -2610,7 +2620,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowParent(SDL_Window *window, SDL_Win * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_SetWindowParent * \sa SDL_WINDOW_MODAL @@ -2627,7 +2637,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowModal(SDL_Window *window, bool mod * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowFocusable(SDL_Window *window, bool focusable); @@ -2653,7 +2663,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowFocusable(SDL_Window *window, bool * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ShowWindowSystemMenu(SDL_Window *window, int x, int y); @@ -2662,7 +2672,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ShowWindowSystemMenu(SDL_Window *window, in * * \threadsafety This function should only be called on the main thread. * - * \since This enum is available since SDL 3.1.3. + * \since This enum is available since SDL 3.2.0. * * \sa SDL_HitTest */ @@ -2734,7 +2744,7 @@ typedef SDL_HitTestResult (SDLCALL *SDL_HitTest)(SDL_Window *win, * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowHitTest(SDL_Window *window, SDL_HitTest callback, void *callback_data); @@ -2762,7 +2772,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowHitTest(SDL_Window *window, SDL_Hi * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowShape(SDL_Window *window, SDL_Surface *shape); @@ -2776,7 +2786,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowShape(SDL_Window *window, SDL_Surf * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_FlashWindow(SDL_Window *window, SDL_FlashOperation operation); @@ -2786,11 +2796,15 @@ extern SDL_DECLSPEC bool SDLCALL SDL_FlashWindow(SDL_Window *window, SDL_FlashOp * Any child windows owned by the window will be recursively destroyed as * well. * + * Note that on some platforms, the visible window may not actually be removed + * from the screen until the SDL event loop is pumped again, even though the + * SDL_Window is no longer valid after this call. + * * \param window the window to destroy. * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_CreatePopupWindow * \sa SDL_CreateWindow @@ -2810,7 +2824,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyWindow(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DisableScreenSaver * \sa SDL_EnableScreenSaver @@ -2825,7 +2839,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ScreenSaverEnabled(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_DisableScreenSaver * \sa SDL_ScreenSaverEnabled @@ -2846,7 +2860,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_EnableScreenSaver(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_EnableScreenSaver * \sa SDL_ScreenSaverEnabled @@ -2876,7 +2890,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_DisableScreenSaver(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_GetProcAddress * \sa SDL_GL_UnloadLibrary @@ -2930,7 +2944,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GL_LoadLibrary(const char *path); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_ExtensionSupported * \sa SDL_GL_LoadLibrary @@ -2951,7 +2965,7 @@ extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_GL_GetProcAddress(const char * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_EGL_GetCurrentDisplay */ @@ -2962,7 +2976,7 @@ extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_EGL_GetProcAddress(const cha * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_LoadLibrary */ @@ -2987,7 +3001,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GL_UnloadLibrary(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GL_ExtensionSupported(const char *extension); @@ -2996,7 +3010,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GL_ExtensionSupported(const char *extension * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_GetAttribute * \sa SDL_GL_SetAttribute @@ -3019,7 +3033,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GL_ResetAttributes(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_GetAttribute * \sa SDL_GL_ResetAttributes @@ -3037,7 +3051,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GL_SetAttribute(SDL_GLAttr attr, int value) * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_ResetAttributes * \sa SDL_GL_SetAttribute @@ -3061,7 +3075,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GL_GetAttribute(SDL_GLAttr attr, int *value * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_DestroyContext * \sa SDL_GL_MakeCurrent @@ -3080,7 +3094,7 @@ extern SDL_DECLSPEC SDL_GLContext SDLCALL SDL_GL_CreateContext(SDL_Window *windo * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_CreateContext */ @@ -3094,7 +3108,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GL_MakeCurrent(SDL_Window *window, SDL_GLCo * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GL_GetCurrentWindow(void); @@ -3106,7 +3120,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GL_GetCurrentWindow(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_MakeCurrent */ @@ -3120,7 +3134,7 @@ extern SDL_DECLSPEC SDL_GLContext SDLCALL SDL_GL_GetCurrentContext(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_EGLDisplay SDLCALL SDL_EGL_GetCurrentDisplay(void); @@ -3132,7 +3146,7 @@ extern SDL_DECLSPEC SDL_EGLDisplay SDLCALL SDL_EGL_GetCurrentDisplay(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_EGLConfig SDLCALL SDL_EGL_GetCurrentConfig(void); @@ -3145,7 +3159,7 @@ extern SDL_DECLSPEC SDL_EGLConfig SDLCALL SDL_EGL_GetCurrentConfig(void); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_EGLSurface SDLCALL SDL_EGL_GetWindowSurface(SDL_Window *window); @@ -3167,7 +3181,7 @@ extern SDL_DECLSPEC SDL_EGLSurface SDLCALL SDL_EGL_GetWindowSurface(SDL_Window * * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_EGL_SetAttributeCallbacks(SDL_EGLAttribArrayCallback platformAttribCallback, SDL_EGLIntArrayCallback surfaceAttribCallback, @@ -3198,7 +3212,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_EGL_SetAttributeCallbacks(SDL_EGLAttribArra * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_GetSwapInterval */ @@ -3219,7 +3233,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GL_SetSwapInterval(int interval); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_SetSwapInterval */ @@ -3241,7 +3255,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GL_GetSwapInterval(int *interval); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GL_SwapWindow(SDL_Window *window); @@ -3254,7 +3268,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GL_SwapWindow(SDL_Window *window); * * \threadsafety This function should only be called on the main thread. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_GL_CreateContext */ diff --git a/libs/SDL3/include/SDL3/SDL_vulkan.h b/libs/SDL3/include/SDL3/SDL_vulkan.h index 1ce0e34c..5a487561 100644 --- a/libs/SDL3/include/SDL3/SDL_vulkan.h +++ b/libs/SDL3/include/SDL3/SDL_vulkan.h @@ -87,6 +87,13 @@ struct VkAllocationCallbacks; * creating any Vulkan windows. If no Vulkan loader library is loaded, the * default library will be loaded upon creation of the first Vulkan window. * + * SDL keeps a counter of how many times this function has been successfully + * called, so it is safe to call this function multiple times, so long as it + * is eventually paired with an equivalent number of calls to + * SDL_Vulkan_UnloadLibrary. The `path` argument is ignored unless there is no + * library currently loaded, and and the library isn't actually unloaded until + * there have been an equivalent number of calls to SDL_Vulkan_UnloadLibrary. + * * It is fairly common for Vulkan applications to link with libvulkan instead * of explicitly loading it at run time. This will work with SDL provided the * application links to a dynamic library and both it and SDL use the same @@ -116,7 +123,9 @@ struct VkAllocationCallbacks; * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_GetVkGetInstanceProcAddr * \sa SDL_Vulkan_UnloadLibrary @@ -140,14 +149,27 @@ extern SDL_DECLSPEC bool SDLCALL SDL_Vulkan_LoadLibrary(const char *path); * \returns the function pointer for `vkGetInstanceProcAddr` or NULL on * failure; call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_Vulkan_GetVkGetInstanceProcAddr(void); /** * Unload the Vulkan library previously loaded by SDL_Vulkan_LoadLibrary(). * - * \since This function is available since SDL 3.1.3. + * SDL keeps a counter of how many times this function has been called, so it + * is safe to call this function multiple times, so long as it is paired with + * an equivalent number of calls to SDL_Vulkan_LoadLibrary. The library isn't + * actually unloaded until there have been an equivalent number of calls to + * SDL_Vulkan_UnloadLibrary. + * + * Once the library has actually been unloaded, if any Vulkan instances + * remain, they will likely crash the program. Clean up any existing Vulkan + * resources, and destroy appropriate windows, renderers and GPU devices + * before calling this function. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_LoadLibrary */ @@ -171,7 +193,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_Vulkan_UnloadLibrary(void); * \returns an array of extension name strings on success, NULL on failure; * call SDL_GetError() for more information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_CreateSurface */ @@ -196,7 +218,7 @@ extern SDL_DECLSPEC char const * const * SDLCALL SDL_Vulkan_GetInstanceExtension * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_GetInstanceExtensions * \sa SDL_Vulkan_DestroySurface @@ -224,7 +246,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_Vulkan_CreateSurface(SDL_Window *window, * \param allocator a VkAllocationCallbacks struct, which lets the app set the * allocator that destroys the surface. Can be NULL. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_GetInstanceExtensions * \sa SDL_Vulkan_CreateSurface @@ -246,7 +268,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_Vulkan_DestroySurface(VkInstance instance, * device. * \returns true if supported, false if unsupported or an error occurred. * - * \since This function is available since SDL 3.1.3. + * \since This function is available since SDL 3.2.0. * * \sa SDL_Vulkan_GetInstanceExtensions */ diff --git a/libs/SDL3/include/build_config/SDL_build_config.h b/libs/SDL3/include/build_config/SDL_build_config.h index afd1dbd5..83031b70 100644 --- a/libs/SDL3/include/build_config/SDL_build_config.h +++ b/libs/SDL3/include/build_config/SDL_build_config.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/build_config/SDL_build_config.h.cmake b/libs/SDL3/include/build_config/SDL_build_config.h.cmake index 9fac7d0f..6ce491e7 100644 --- a/libs/SDL3/include/build_config/SDL_build_config.h.cmake +++ b/libs/SDL3/include/build_config/SDL_build_config.h.cmake @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/build_config/SDL_build_config_android.h b/libs/SDL3/include/build_config/SDL_build_config_android.h index 13bb9469..a0727f50 100644 --- a/libs/SDL3/include/build_config/SDL_build_config_android.h +++ b/libs/SDL3/include/build_config/SDL_build_config_android.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/build_config/SDL_build_config_ios.h b/libs/SDL3/include/build_config/SDL_build_config_ios.h index a6b06c53..be1ec29a 100644 --- a/libs/SDL3/include/build_config/SDL_build_config_ios.h +++ b/libs/SDL3/include/build_config/SDL_build_config_ios.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/build_config/SDL_build_config_macos.h b/libs/SDL3/include/build_config/SDL_build_config_macos.h index d14d708a..1a66449a 100644 --- a/libs/SDL3/include/build_config/SDL_build_config_macos.h +++ b/libs/SDL3/include/build_config/SDL_build_config_macos.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/build_config/SDL_build_config_minimal.h b/libs/SDL3/include/build_config/SDL_build_config_minimal.h index 6ae04eb3..d5fe736e 100644 --- a/libs/SDL3/include/build_config/SDL_build_config_minimal.h +++ b/libs/SDL3/include/build_config/SDL_build_config_minimal.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/build_config/SDL_build_config_windows.h b/libs/SDL3/include/build_config/SDL_build_config_windows.h index fd7cc0cb..44275176 100644 --- a/libs/SDL3/include/build_config/SDL_build_config_windows.h +++ b/libs/SDL3/include/build_config/SDL_build_config_windows.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/build_config/SDL_build_config_wingdk.h b/libs/SDL3/include/build_config/SDL_build_config_wingdk.h index d26e2cb0..502eb929 100644 --- a/libs/SDL3/include/build_config/SDL_build_config_wingdk.h +++ b/libs/SDL3/include/build_config/SDL_build_config_wingdk.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/build_config/SDL_build_config_xbox.h b/libs/SDL3/include/build_config/SDL_build_config_xbox.h index a79db916..5834e71f 100644 --- a/libs/SDL3/include/build_config/SDL_build_config_xbox.h +++ b/libs/SDL3/include/build_config/SDL_build_config_xbox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/include/build_config/SDL_revision.h.cmake b/libs/SDL3/include/build_config/SDL_revision.h.cmake index d002306f..28144ade 100644 --- a/libs/SDL3/include/build_config/SDL_revision.h.cmake +++ b/libs/SDL3/include/build_config/SDL_revision.h.cmake @@ -1,28 +1,30 @@ /* - Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. */ -/** - * \file SDL_revision.h - * - * Header file containing the SDL revision. +/* WIKI CATEGORY: Version */ + +/* + * SDL_revision.h contains the SDL revision, which might be defined on the + * compiler command line, or generated right into the header itself by the + * build system. */ #ifndef SDL_revision_h_ @@ -30,10 +32,10 @@ #cmakedefine SDL_VENDOR_INFO "@SDL_VENDOR_INFO@" -#ifdef SDL_VENDOR_INFO -#define SDL_REVISION "@SDL_REVISION@ (" SDL_VENDOR_INFO ")" +#if defined(SDL_VENDOR_INFO) +#define SDL_REVISION "release-3.2.0-0-g535d80bad (" SDL_VENDOR_INFO ")" #else -#define SDL_REVISION "@SDL_REVISION@" +#define SDL_REVISION "release-3.2.0-0-g535d80bad" #endif #endif /* SDL_revision_h_ */ diff --git a/libs/SDL3/src/SDL.c b/libs/SDL3/src/SDL.c index c99ee401..e9c9fb1a 100644 --- a/libs/SDL3/src/SDL.c +++ b/libs/SDL3/src/SDL.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -51,11 +51,12 @@ #include "sensor/SDL_sensor_c.h" #include "stdlib/SDL_getenv_c.h" #include "thread/SDL_thread_c.h" +#include "tray/SDL_tray_utils.h" #include "video/SDL_pixels_c.h" #include "video/SDL_surface_c.h" #include "video/SDL_video_c.h" #include "filesystem/SDL_filesystem_c.h" -#include "file/SDL_asyncio_c.h" +#include "io/SDL_asyncio_c.h" #ifdef SDL_PLATFORM_ANDROID #include "core/android/SDL_android.h" #endif @@ -642,6 +643,7 @@ void SDL_Quit(void) SDL_HelperWindowDestroy(); #endif SDL_QuitSubSystem(SDL_INIT_EVERYTHING); + SDL_CleanupTrays(); #ifdef SDL_USE_LIBDBUS SDL_DBus_Quit(); diff --git a/libs/SDL3/src/SDL_assert.c b/libs/SDL3/src/SDL_assert.c index e7f75962..62a90ca2 100644 --- a/libs/SDL3/src/SDL_assert.c +++ b/libs/SDL3/src/SDL_assert.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/SDL_assert_c.h b/libs/SDL3/src/SDL_assert_c.h index 93b1753a..d892dbef 100644 --- a/libs/SDL3/src/SDL_assert_c.h +++ b/libs/SDL3/src/SDL_assert_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/SDL_error.c b/libs/SDL3/src/SDL_error.c index dca5a86c..3c62c8af 100644 --- a/libs/SDL3/src/SDL_error.c +++ b/libs/SDL3/src/SDL_error.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -61,10 +61,12 @@ bool SDL_SetErrorV(SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) } } - if (SDL_GetLogPriority(SDL_LOG_CATEGORY_ERROR) <= SDL_LOG_PRIORITY_DEBUG) { - // If we are in debug mode, print out the error message - SDL_LogDebug(SDL_LOG_CATEGORY_ERROR, "%s", error->str); - } +// Enable this if you want to see all errors printed as they occur. +// Note that there are many recoverable errors that may happen internally and +// can be safely ignored if the public API doesn't return an error code. +#if 0 + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "%s", error->str); +#endif } return false; diff --git a/libs/SDL3/src/SDL_error_c.h b/libs/SDL3/src/SDL_error_c.h index 228f5472..da9f8b5c 100644 --- a/libs/SDL3/src/SDL_error_c.h +++ b/libs/SDL3/src/SDL_error_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/SDL_guid.c b/libs/SDL3/src/SDL_guid.c index b7efe9a9..6c355d8d 100644 --- a/libs/SDL3/src/SDL_guid.c +++ b/libs/SDL3/src/SDL_guid.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/SDL_hashtable.c b/libs/SDL3/src/SDL_hashtable.c index 192121a3..571e3769 100644 --- a/libs/SDL3/src/SDL_hashtable.c +++ b/libs/SDL3/src/SDL_hashtable.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -22,8 +22,31 @@ #include "SDL_hashtable.h" // XXX: We can't use SDL_assert here because it's going to call into hashtable code -#include -#define HT_ASSERT(x) assert(x) +#ifdef NDEBUG +#define HT_ASSERT(x) (void)(0) +#else +#if (defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN)) && !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) +#include +#endif +/* This is not declared in any header, although it is shared between some + parts of SDL, because we don't want anything calling it without an + extremely good reason. */ +extern SDL_NORETURN void SDL_ExitProcess(int exitcode); +static void HT_ASSERT_FAIL(const char *msg) +{ + const char *caption = "SDL_HashTable Assertion Failure!"; + (void)caption; +#if (defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN)) && !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) + MessageBoxA(NULL, msg, caption, MB_OK | MB_ICONERROR); +#elif defined(HAVE_STDIO_H) + fprintf(stderr, "\n\n%s\n%s\n\n", caption, msg); + fflush(stderr); +#endif + SDL_TriggerBreakpoint(); + SDL_ExitProcess(-1); +} +#define HT_ASSERT(x) if (!(x)) HT_ASSERT_FAIL("SDL_HashTable Assertion Failure: " #x) +#endif typedef struct SDL_HashItem { diff --git a/libs/SDL3/src/SDL_hashtable.h b/libs/SDL3/src/SDL_hashtable.h index 5d0f8105..5983b8d3 100644 --- a/libs/SDL3/src/SDL_hashtable.h +++ b/libs/SDL3/src/SDL_hashtable.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/SDL_hints.c b/libs/SDL3/src/SDL_hints.c index 91c2bfec..9c4ccd4b 100644 --- a/libs/SDL3/src/SDL_hints.c +++ b/libs/SDL3/src/SDL_hints.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/SDL_hints_c.h b/libs/SDL3/src/SDL_hints_c.h index ab254e36..dd54cba6 100644 --- a/libs/SDL3/src/SDL_hints_c.h +++ b/libs/SDL3/src/SDL_hints_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/SDL_internal.h b/libs/SDL3/src/SDL_internal.h index 8364c1ac..ac018f9b 100644 --- a/libs/SDL3/src/SDL_internal.h +++ b/libs/SDL3/src/SDL_internal.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -78,7 +78,18 @@ #ifndef _DARWIN_C_SOURCE #define _DARWIN_C_SOURCE 1 // for memset_pattern4() #endif +#include + +#ifndef __IPHONE_OS_VERSION_MAX_ALLOWED +#define __IPHONE_OS_VERSION_MAX_ALLOWED 0 #endif +#ifndef __APPLETV_OS_VERSION_MAX_ALLOWED +#define __APPLETV_OS_VERSION_MAX_ALLOWED 0 +#endif +#ifndef __MAC_OS_X_VERSION_MAX_ALLOWED +#define __MAC_OS_X_VERSION_MAX_ALLOWED 0 +#endif +#endif // SDL_PLATFORM_APPLE #ifdef HAVE_SYS_TYPES_H #include @@ -217,6 +228,10 @@ #define SDL_EndThreadFunction NULL #endif +#ifdef SDL_NOLONGLONG +#error We cannot build a valid SDL3 library without long long support +#endif + /* Enable internal definitions in SDL API headers */ #define SDL_INTERNAL diff --git a/libs/SDL3/src/SDL_list.c b/libs/SDL3/src/SDL_list.c index d66cf0a8..04cc0825 100644 --- a/libs/SDL3/src/SDL_list.c +++ b/libs/SDL3/src/SDL_list.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/SDL_list.h b/libs/SDL3/src/SDL_list.h index aa2de3bb..83ec844b 100644 --- a/libs/SDL3/src/SDL_list.h +++ b/libs/SDL3/src/SDL_list.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/SDL_log.c b/libs/SDL3/src/SDL_log.c index f9598487..10a814ff 100644 --- a/libs/SDL3/src/SDL_log.c +++ b/libs/SDL3/src/SDL_log.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/SDL_log_c.h b/libs/SDL3/src/SDL_log_c.h index bb79ed60..887a3253 100644 --- a/libs/SDL3/src/SDL_log_c.h +++ b/libs/SDL3/src/SDL_log_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/SDL_properties.c b/libs/SDL3/src/SDL_properties.c index ce3e0200..9dc10a67 100644 --- a/libs/SDL3/src/SDL_properties.c +++ b/libs/SDL3/src/SDL_properties.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/SDL_properties_c.h b/libs/SDL3/src/SDL_properties_c.h index e7a471cd..8d1d39da 100644 --- a/libs/SDL3/src/SDL_properties_c.h +++ b/libs/SDL3/src/SDL_properties_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/SDL_utils.c b/libs/SDL3/src/SDL_utils.c index 5487b9d5..a877360f 100644 --- a/libs/SDL3/src/SDL_utils.c +++ b/libs/SDL3/src/SDL_utils.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -178,6 +178,22 @@ bool SDL_ObjectValid(void *object, SDL_ObjectType type) return (((SDL_ObjectType)(uintptr_t)object_type) == type); } +int SDL_GetObjects(SDL_ObjectType type, void **objects, int count) +{ + const void *object, *object_type; + void *iter = NULL; + int num_objects = 0; + while (SDL_IterateHashTable(SDL_objects, &object, &object_type, &iter)) { + if ((SDL_ObjectType)(uintptr_t)object_type == type) { + if (num_objects < count) { + objects[num_objects] = (void *)object; + } + ++num_objects; + } + } + return num_objects; +} + void SDL_SetObjectsInvalid(void) { if (SDL_ShouldQuit(&SDL_objects_init)) { @@ -214,6 +230,12 @@ void SDL_SetObjectsInvalid(void) case SDL_OBJECT_TYPE_HIDAPI_JOYSTICK: type = "hidapi joystick"; break; + case SDL_OBJECT_TYPE_THREAD: + type = "thread"; + break; + case SDL_OBJECT_TYPE_TRAY: + type = "SDL_Tray"; + break; default: type = "unknown object"; break; diff --git a/libs/SDL3/src/SDL_utils_c.h b/libs/SDL3/src/SDL_utils_c.h index adb150a9..557dad49 100644 --- a/libs/SDL3/src/SDL_utils_c.h +++ b/libs/SDL3/src/SDL_utils_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -60,12 +60,15 @@ typedef enum SDL_OBJECT_TYPE_SENSOR, SDL_OBJECT_TYPE_HIDAPI_DEVICE, SDL_OBJECT_TYPE_HIDAPI_JOYSTICK, + SDL_OBJECT_TYPE_THREAD, + SDL_OBJECT_TYPE_TRAY, } SDL_ObjectType; extern Uint32 SDL_GetNextObjectID(void); extern void SDL_SetObjectValid(void *object, SDL_ObjectType type, bool valid); extern bool SDL_ObjectValid(void *object, SDL_ObjectType type); +extern int SDL_GetObjects(SDL_ObjectType type, void **objects, int count); extern void SDL_SetObjectsInvalid(void); extern const char *SDL_GetPersistentString(const char *string); diff --git a/libs/SDL3/src/atomic/SDL_atomic.c b/libs/SDL3/src/atomic/SDL_atomic.c index 70ee1607..5e7774da 100644 --- a/libs/SDL3/src/atomic/SDL_atomic.c +++ b/libs/SDL3/src/atomic/SDL_atomic.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/atomic/SDL_spinlock.c b/libs/SDL3/src/atomic/SDL_spinlock.c index b1f47698..8e35c8a7 100644 --- a/libs/SDL3/src/atomic/SDL_spinlock.c +++ b/libs/SDL3/src/atomic/SDL_spinlock.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/SDL_audio.c b/libs/SDL3/src/audio/SDL_audio.c index e477a749..db4c55f3 100644 --- a/libs/SDL3/src/audio/SDL_audio.c +++ b/libs/SDL3/src/audio/SDL_audio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -281,6 +281,18 @@ bool SDL_AudioSpecsEqual(const SDL_AudioSpec *a, const SDL_AudioSpec *b, const i return true; } +bool SDL_AudioChannelMapsEqual(int channels, const int *channel_map_a, const int *channel_map_b) +{ + if (channel_map_a == channel_map_b) { + return true; + } else if ((channel_map_a != NULL) != (channel_map_b != NULL)) { + return false; + } else if (channel_map_a && (SDL_memcmp(channel_map_a, channel_map_b, sizeof (*channel_map_a) * channels) != 0)) { + return false; + } + return true; +} + // Zombie device implementation... @@ -1134,7 +1146,7 @@ bool SDL_PlaybackAudioThreadIterate(SDL_AudioDevice *device) SDL_AudioStream *stream = logdev->bound_streams; // We should have updated this elsewhere if the format changed! - SDL_assert(SDL_AudioSpecsEqual(&stream->dst_spec, &device->spec, stream->dst_chmap, device->chmap)); + SDL_assert(SDL_AudioSpecsEqual(&stream->dst_spec, &device->spec, NULL, NULL)); const int br = SDL_GetAtomicInt(&logdev->paused) ? 0 : SDL_GetAudioStreamDataAdjustGain(stream, device_buffer, buffer_size, logdev->gain); if (br < 0) { // Probably OOM. Kill the audio device; the whole thing is likely dying soon anyhow. @@ -1143,6 +1155,12 @@ bool SDL_PlaybackAudioThreadIterate(SDL_AudioDevice *device) } else if (br < buffer_size) { SDL_memset(device_buffer + br, device->silence_value, buffer_size - br); // silence whatever we didn't write to. } + + // generally channel maps will line up, but if the audio stream's chmap has been explicitly changed, do a final swizzle to device layout. + if ((br > 0) && (!SDL_AudioChannelMapsEqual(device->spec.channels, stream->dst_chmap, device->chmap))) { + ConvertAudio(br / SDL_AUDIO_FRAMESIZE(device->spec), device_buffer, device->spec.format, device->spec.channels, NULL, + device_buffer, device->spec.format, device->spec.channels, device->chmap, NULL, 1.0f); + } } else { // need to actually mix (or silence the buffer) float *final_mix_buffer = (float *) ((device->spec.format == SDL_AUDIO_F32) ? device_buffer : device->mix_buffer); const int needed_samples = buffer_size / SDL_AUDIO_BYTESIZE(device->spec.format); @@ -1170,7 +1188,7 @@ bool SDL_PlaybackAudioThreadIterate(SDL_AudioDevice *device) for (SDL_AudioStream *stream = logdev->bound_streams; stream; stream = stream->next_binding) { // We should have updated this elsewhere if the format changed! - SDL_assert(SDL_AudioSpecsEqual(&stream->dst_spec, &outspec, stream->dst_chmap, device->chmap)); + SDL_assert(SDL_AudioSpecsEqual(&stream->dst_spec, &outspec, NULL, NULL)); /* this will hold a lock on `stream` while getting. We don't explicitly lock the streams for iterating here because the binding linked list can only change while the device lock is held. @@ -1181,6 +1199,11 @@ bool SDL_PlaybackAudioThreadIterate(SDL_AudioDevice *device) failed = true; break; } else if (br > 0) { // it's okay if we get less than requested, we mix what we have. + // generally channel maps will line up, but if the audio stream's chmap has been explicitly changed, do a final swizzle to device layout. + if (!SDL_AudioChannelMapsEqual(device->spec.channels, stream->dst_chmap, device->chmap)) { + ConvertAudio(br / SDL_AUDIO_FRAMESIZE(device->spec), device->work_buffer, device->spec.format, device->spec.channels, NULL, + device->work_buffer, device->spec.format, device->spec.channels, device->chmap, NULL, 1.0f); + } MixFloat32Audio(mix_buffer, (float *) device->work_buffer, br); } } @@ -1303,11 +1326,20 @@ bool SDL_RecordingAudioThreadIterate(SDL_AudioDevice *device) SDL_assert(stream->src_spec.channels == device->spec.channels); SDL_assert(stream->src_spec.freq == device->spec.freq); + void *final_buf = output_buffer; + + // generally channel maps will line up, but if the audio stream's chmap has been explicitly changed, do a final swizzle to stream layout. + if (!SDL_AudioChannelMapsEqual(device->spec.channels, stream->src_chmap, device->chmap)) { + final_buf = device->mix_buffer; // this is otherwise unused on recording devices, so it makes convenient scratch space here. + ConvertAudio(br / SDL_AUDIO_FRAMESIZE(device->spec), output_buffer, device->spec.format, device->spec.channels, NULL, + final_buf, device->spec.format, device->spec.channels, stream->src_chmap, NULL, 1.0f); + } + /* this will hold a lock on `stream` while putting. We don't explicitly lock the streams for iterating here because the binding linked list can only change while the device lock is held. (we _do_ lock the stream during binding/unbinding to make sure that two threads can't try to bind the same stream to different devices at the same time, though.) */ - if (!SDL_PutAudioStreamData(stream, output_buffer, br)) { + if (!SDL_PutAudioStreamData(stream, final_buf, br)) { // oh crud, we probably ran out of memory. This is possibly an overreaction to kill the audio device, but it's likely the whole thing is going down in a moment anyhow. failed = true; break; @@ -1858,7 +1890,7 @@ bool SDL_SetAudioPostmixCallback(SDL_AudioDeviceID devid, SDL_AudioPostmixCallba return result; } -bool SDL_BindAudioStreams(SDL_AudioDeviceID devid, SDL_AudioStream **streams, int num_streams) +bool SDL_BindAudioStreams(SDL_AudioDeviceID devid, SDL_AudioStream * const *streams, int num_streams) { const bool islogical = !(devid & (1<<1)); SDL_AudioDevice *device = NULL; @@ -1947,8 +1979,12 @@ bool SDL_BindAudioStream(SDL_AudioDeviceID devid, SDL_AudioStream *stream) } // !!! FIXME: this and BindAudioStreams are mutex nightmares. :/ -void SDL_UnbindAudioStreams(SDL_AudioStream **streams, int num_streams) +void SDL_UnbindAudioStreams(SDL_AudioStream * const *streams, int num_streams) { + if (num_streams <= 0 || !streams) { + return; // nothing to do + } + /* to prevent deadlock when holding both locks, we _must_ lock the device first, and the stream second, as that is the order the audio thread will do it. But this means we have an unlikely, pathological case where a stream could change its binding between when we lookup its bound device and when we lock everything, so we double-check here. */ @@ -2126,6 +2162,16 @@ bool SDL_ResumeAudioStreamDevice(SDL_AudioStream *stream) return SDL_ResumeAudioDevice(devid); } +bool SDL_AudioStreamDevicePaused(SDL_AudioStream *stream) +{ + SDL_AudioDeviceID devid = SDL_GetAudioStreamDevice(stream); + if (!devid) { + return false; + } + + return SDL_AudioDevicePaused(devid); +} + #if SDL_BYTEORDER == SDL_LIL_ENDIAN #define NATIVE(type) SDL_AUDIO_##type##LE #define SWAPPED(type) SDL_AUDIO_##type##BE diff --git a/libs/SDL3/src/audio/SDL_audio_c.h b/libs/SDL3/src/audio/SDL_audio_c.h index 148489f1..0e673f1d 100644 --- a/libs/SDL3/src/audio/SDL_audio_c.h +++ b/libs/SDL3/src/audio/SDL_audio_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/SDL_audio_channel_converters.h b/libs/SDL3/src/audio/SDL_audio_channel_converters.h index bee3858d..ab682e6c 100644 --- a/libs/SDL3/src/audio/SDL_audio_channel_converters.h +++ b/libs/SDL3/src/audio/SDL_audio_channel_converters.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/SDL_audiocvt.c b/libs/SDL3/src/audio/SDL_audiocvt.c index 4f375034..daf44da0 100644 --- a/libs/SDL3/src/audio/SDL_audiocvt.c +++ b/libs/SDL3/src/audio/SDL_audiocvt.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -154,7 +154,7 @@ static void SwizzleAudio(const int num_frames, void *dst, const void *src, int c { const int bitsize = (int) SDL_AUDIO_BITSIZE(fmt); - bool has_null_mappings = false; + bool has_null_mappings = false; // !!! FIXME: calculate this when setting the channel map instead. for (int i = 0; i < channels; i++) { if (map[i] == -1) { has_null_mappings = true; @@ -257,6 +257,11 @@ void ConvertAudio(int num_frames, const int dst_bitsize = (int) SDL_AUDIO_BITSIZE(dst_format); const int dst_sample_frame_size = (dst_bitsize / 8) * dst_channels; + const bool chmaps_match = (src_channels == dst_channels) && SDL_AudioChannelMapsEqual(src_channels, src_map, dst_map); + if (chmaps_match) { + src_map = dst_map = NULL; // NULL both these out so we don't do any unnecessary swizzling. + } + /* Type conversion goes like this now: - swizzle through source channel map to "standard" layout. - byteswap to CPU native format first if necessary. @@ -635,8 +640,6 @@ bool SetAudioStreamChannelMap(SDL_AudioStream *stream, const SDL_AudioSpec *spec // already have this map, don't allocate/copy it again. } else if (SDL_ChannelMapIsBogus(chmap, channels)) { result = SDL_SetError("Invalid channel mapping"); - } else if ((isinput != -1) && stream->bound_device && (!!isinput == !!stream->bound_device->physical_device->recording)) { - // quietly refuse to change the format of the end currently bound to a device. } else { if (SDL_ChannelMapIsDefault(chmap, channels)) { chmap = NULL; // just apply a default mapping. @@ -661,12 +664,12 @@ bool SetAudioStreamChannelMap(SDL_AudioStream *stream, const SDL_AudioSpec *spec bool SDL_SetAudioStreamInputChannelMap(SDL_AudioStream *stream, const int *chmap, int channels) { - return SetAudioStreamChannelMap(stream, &stream->src_spec, &stream->src_chmap, chmap, channels, true); + return SetAudioStreamChannelMap(stream, &stream->src_spec, &stream->src_chmap, chmap, channels, 1); } bool SDL_SetAudioStreamOutputChannelMap(SDL_AudioStream *stream, const int *chmap, int channels) { - return SetAudioStreamChannelMap(stream, &stream->dst_spec, &stream->dst_chmap, chmap, channels, false); + return SetAudioStreamChannelMap(stream, &stream->dst_spec, &stream->dst_chmap, chmap, channels, 0); } int *SDL_GetAudioStreamInputChannelMap(SDL_AudioStream *stream, int *count) diff --git a/libs/SDL3/src/audio/SDL_audiodev.c b/libs/SDL3/src/audio/SDL_audiodev.c index f48a5b25..623a3800 100644 --- a/libs/SDL3/src/audio/SDL_audiodev.c +++ b/libs/SDL3/src/audio/SDL_audiodev.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/SDL_audiodev_c.h b/libs/SDL3/src/audio/SDL_audiodev_c.h index 8f344480..ded13fc8 100644 --- a/libs/SDL3/src/audio/SDL_audiodev_c.h +++ b/libs/SDL3/src/audio/SDL_audiodev_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/SDL_audioqueue.c b/libs/SDL3/src/audio/SDL_audioqueue.c index ec5800be..18ed346f 100644 --- a/libs/SDL3/src/audio/SDL_audioqueue.c +++ b/libs/SDL3/src/audio/SDL_audioqueue.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/SDL_audioqueue.h b/libs/SDL3/src/audio/SDL_audioqueue.h index 3a6a5fe5..46629462 100644 --- a/libs/SDL3/src/audio/SDL_audioqueue.h +++ b/libs/SDL3/src/audio/SDL_audioqueue.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/SDL_audioresample.c b/libs/SDL3/src/audio/SDL_audioresample.c index 07d0b4a6..dd2451bf 100644 --- a/libs/SDL3/src/audio/SDL_audioresample.c +++ b/libs/SDL3/src/audio/SDL_audioresample.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/SDL_audioresample.h b/libs/SDL3/src/audio/SDL_audioresample.h index 9a6920e0..66200738 100644 --- a/libs/SDL3/src/audio/SDL_audioresample.h +++ b/libs/SDL3/src/audio/SDL_audioresample.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/SDL_audiotypecvt.c b/libs/SDL3/src/audio/SDL_audiotypecvt.c index a2978ee1..d80a831f 100644 --- a/libs/SDL3/src/audio/SDL_audiotypecvt.c +++ b/libs/SDL3/src/audio/SDL_audiotypecvt.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/SDL_mixer.c b/libs/SDL3/src/audio/SDL_mixer.c index e6924ddc..047c6fdf 100644 --- a/libs/SDL3/src/audio/SDL_mixer.c +++ b/libs/SDL3/src/audio/SDL_mixer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/SDL_sysaudio.h b/libs/SDL3/src/audio/SDL_sysaudio.h index 265f98c8..c5cce0e4 100644 --- a/libs/SDL3/src/audio/SDL_sysaudio.h +++ b/libs/SDL3/src/audio/SDL_sysaudio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -125,9 +125,13 @@ extern void ConvertAudio(int num_frames, // Compare two SDL_AudioSpecs, return true if they match exactly. // Using SDL_memcmp directly isn't safe, since potential padding might not be initialized. -// either channel maps can be NULL for the default (and both should be if you don't care about them). +// either channel map can be NULL for the default (and both should be if you don't care about them). extern bool SDL_AudioSpecsEqual(const SDL_AudioSpec *a, const SDL_AudioSpec *b, const int *channel_map_a, const int *channel_map_b); +// See if two channel maps match +// either channel map can be NULL for the default (and both should be if you don't care about them). +extern bool SDL_AudioChannelMapsEqual(int channels, const int *channel_map_a, const int *channel_map_b); + // allocate+copy a channel map. extern int *SDL_ChannelMapDup(const int *origchmap, int channels); @@ -301,8 +305,11 @@ struct SDL_AudioDevice // The device's current audio specification SDL_AudioSpec spec; + + // The size, in bytes, of the device's playback/recording buffer. int buffer_size; + // The device's channel map, or NULL for SDL default layout. int *chmap; // The device's default audio specification diff --git a/libs/SDL3/src/audio/SDL_wave.c b/libs/SDL3/src/audio/SDL_wave.c index 2facaaeb..1d53e79d 100644 --- a/libs/SDL3/src/audio/SDL_wave.c +++ b/libs/SDL3/src/audio/SDL_wave.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/SDL_wave.h b/libs/SDL3/src/audio/SDL_wave.h index 47fe2b51..0ec89656 100644 --- a/libs/SDL3/src/audio/SDL_wave.h +++ b/libs/SDL3/src/audio/SDL_wave.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/aaudio/SDL_aaudio.c b/libs/SDL3/src/audio/aaudio/SDL_aaudio.c index 2ce1f6cc..fd075b53 100644 --- a/libs/SDL3/src/audio/aaudio/SDL_aaudio.c +++ b/libs/SDL3/src/audio/aaudio/SDL_aaudio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/aaudio/SDL_aaudio.h b/libs/SDL3/src/audio/aaudio/SDL_aaudio.h index 1047c987..5326bad4 100644 --- a/libs/SDL3/src/audio/aaudio/SDL_aaudio.h +++ b/libs/SDL3/src/audio/aaudio/SDL_aaudio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/aaudio/SDL_aaudiofuncs.h b/libs/SDL3/src/audio/aaudio/SDL_aaudiofuncs.h index 59771b38..02988212 100644 --- a/libs/SDL3/src/audio/aaudio/SDL_aaudiofuncs.h +++ b/libs/SDL3/src/audio/aaudio/SDL_aaudiofuncs.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright , (C) 1997-2024 Sam Lantinga + Copyright , (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/alsa/SDL_alsa_audio.c b/libs/SDL3/src/audio/alsa/SDL_alsa_audio.c index 2b1c12cb..652a1a5c 100644 --- a/libs/SDL3/src/audio/alsa/SDL_alsa_audio.c +++ b/libs/SDL3/src/audio/alsa/SDL_alsa_audio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -497,6 +497,7 @@ struct ALSA_pcm_cfg_ctx { static enum snd_pcm_chmap_position sdl_channel_maps[SDL_AUDIO_ALSA__SDL_CHMAPS_N][SDL_AUDIO_ALSA__CHMAP_CHANS_N_MAX] = { // 0 channels { + 0 }, // 1 channel { diff --git a/libs/SDL3/src/audio/alsa/SDL_alsa_audio.h b/libs/SDL3/src/audio/alsa/SDL_alsa_audio.h index e840b2f6..c68dda89 100644 --- a/libs/SDL3/src/audio/alsa/SDL_alsa_audio.h +++ b/libs/SDL3/src/audio/alsa/SDL_alsa_audio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/coreaudio/SDL_coreaudio.h b/libs/SDL3/src/audio/coreaudio/SDL_coreaudio.h index e00d835b..f117c092 100644 --- a/libs/SDL3/src/audio/coreaudio/SDL_coreaudio.h +++ b/libs/SDL3/src/audio/coreaudio/SDL_coreaudio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/coreaudio/SDL_coreaudio.m b/libs/SDL3/src/audio/coreaudio/SDL_coreaudio.m index 76b6e326..cfa0616d 100644 --- a/libs/SDL3/src/audio/coreaudio/SDL_coreaudio.m +++ b/libs/SDL3/src/audio/coreaudio/SDL_coreaudio.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -467,31 +467,16 @@ static bool UpdateAudioSession(SDL_AudioDevice *device, bool open, bool allow_pl options |= AVAudioSessionCategoryOptionDuckOthers; } - if ([session respondsToSelector:@selector(setCategory:mode:options:error:)]) { - if (![session.category isEqualToString:category] || session.categoryOptions != options) { - // Stop the current session so we don't interrupt other application audio - PauseAudioDevices(); - [session setActive:NO error:nil]; - session_active = false; + if (![session.category isEqualToString:category] || session.categoryOptions != options) { + // Stop the current session so we don't interrupt other application audio + PauseAudioDevices(); + [session setActive:NO error:nil]; + session_active = false; - if (![session setCategory:category mode:mode options:options error:&err]) { - NSString *desc = err.description; - SDL_SetError("Could not set Audio Session category: %s", desc.UTF8String); - return false; - } - } - } else { - if (![session.category isEqualToString:category]) { - // Stop the current session so we don't interrupt other application audio - PauseAudioDevices(); - [session setActive:NO error:nil]; - session_active = false; - - if (![session setCategory:category error:&err]) { - NSString *desc = err.description; - SDL_SetError("Could not set Audio Session category: %s", desc.UTF8String); - return false; - } + if (![session setCategory:category mode:mode options:options error:&err]) { + NSString *desc = err.description; + SDL_SetError("Could not set Audio Session category: %s", desc.UTF8String); + return false; } } @@ -780,12 +765,40 @@ static bool PrepareAudioQueue(SDL_AudioDevice *device) layout.mChannelLayoutTag = kAudioChannelLayoutTag_DVD_12; break; case 7: - // L R C LFE Cs Ls Rs - layout.mChannelLayoutTag = kAudioChannelLayoutTag_WAVE_6_1; + if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)) { + // L R C LFE Cs Ls Rs + layout.mChannelLayoutTag = kAudioChannelLayoutTag_WAVE_6_1; + } else { + // L R C LFE Ls Rs Cs + layout.mChannelLayoutTag = kAudioChannelLayoutTag_MPEG_6_1_A; + + // Convert from SDL channel layout to kAudioChannelLayoutTag_MPEG_6_1_A + static const int swizzle_map[7] = { + 0, 1, 2, 3, 6, 4, 5 + }; + device->chmap = SDL_ChannelMapDup(swizzle_map, SDL_arraysize(swizzle_map)); + if (!device->chmap) { + return false; + } + } break; case 8: - // L R C LFE Rls Rrs Ls Rs - layout.mChannelLayoutTag = kAudioChannelLayoutTag_WAVE_7_1; + if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)) { + // L R C LFE Rls Rrs Ls Rs + layout.mChannelLayoutTag = kAudioChannelLayoutTag_WAVE_7_1; + } else { + // L R C LFE Ls Rs Rls Rrs + layout.mChannelLayoutTag = kAudioChannelLayoutTag_MPEG_7_1_C; + + // Convert from SDL channel layout to kAudioChannelLayoutTag_MPEG_7_1_C + static const int swizzle_map[8] = { + 0, 1, 2, 3, 6, 7, 4, 5 + }; + device->chmap = SDL_ChannelMapDup(swizzle_map, SDL_arraysize(swizzle_map)); + if (!device->chmap) { + return false; + } + } break; default: return SDL_SetError("Unsupported audio channels"); @@ -804,7 +817,11 @@ static bool PrepareAudioQueue(SDL_AudioDevice *device) } #endif - int numAudioBuffers = 2; + // we use THREE audio buffers by default, unlike most things that would + // choose two alternating buffers, because it helps with issues on + // Bluetooth headsets when recording and playing at the same time. + // See conversation in #8192 for details. + int numAudioBuffers = 3; const double msecs = (device->sample_frames / ((double)device->spec.freq)) * 1000.0; if (msecs < MINIMUM_AUDIO_BUFFER_TIME_MS) { // use more buffers if we have a VERY small sample set. numAudioBuffers = ((int)SDL_ceil(MINIMUM_AUDIO_BUFFER_TIME_MS / msecs) * 2); diff --git a/libs/SDL3/src/audio/directsound/SDL_directsound.c b/libs/SDL3/src/audio/directsound/SDL_directsound.c index 609e1b37..da4390df 100644 --- a/libs/SDL3/src/audio/directsound/SDL_directsound.c +++ b/libs/SDL3/src/audio/directsound/SDL_directsound.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/directsound/SDL_directsound.h b/libs/SDL3/src/audio/directsound/SDL_directsound.h index e3e0c269..a4fa2faf 100644 --- a/libs/SDL3/src/audio/directsound/SDL_directsound.h +++ b/libs/SDL3/src/audio/directsound/SDL_directsound.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/disk/SDL_diskaudio.c b/libs/SDL3/src/audio/disk/SDL_diskaudio.c index bf1e3d4f..c59bd2ec 100644 --- a/libs/SDL3/src/audio/disk/SDL_diskaudio.c +++ b/libs/SDL3/src/audio/disk/SDL_diskaudio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/disk/SDL_diskaudio.h b/libs/SDL3/src/audio/disk/SDL_diskaudio.h index 3a7bbc7e..d8d99801 100644 --- a/libs/SDL3/src/audio/disk/SDL_diskaudio.h +++ b/libs/SDL3/src/audio/disk/SDL_diskaudio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/dsp/SDL_dspaudio.c b/libs/SDL3/src/audio/dsp/SDL_dspaudio.c index 62e2f4c4..111caeb5 100644 --- a/libs/SDL3/src/audio/dsp/SDL_dspaudio.c +++ b/libs/SDL3/src/audio/dsp/SDL_dspaudio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/dsp/SDL_dspaudio.h b/libs/SDL3/src/audio/dsp/SDL_dspaudio.h index b7634e16..65dea601 100644 --- a/libs/SDL3/src/audio/dsp/SDL_dspaudio.h +++ b/libs/SDL3/src/audio/dsp/SDL_dspaudio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/dummy/SDL_dummyaudio.c b/libs/SDL3/src/audio/dummy/SDL_dummyaudio.c index c3b01f20..c5999fbd 100644 --- a/libs/SDL3/src/audio/dummy/SDL_dummyaudio.c +++ b/libs/SDL3/src/audio/dummy/SDL_dummyaudio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/dummy/SDL_dummyaudio.h b/libs/SDL3/src/audio/dummy/SDL_dummyaudio.h index fd46c3a8..d5e75c78 100644 --- a/libs/SDL3/src/audio/dummy/SDL_dummyaudio.h +++ b/libs/SDL3/src/audio/dummy/SDL_dummyaudio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/emscripten/SDL_emscriptenaudio.c b/libs/SDL3/src/audio/emscripten/SDL_emscriptenaudio.c index e25083d1..84ba63b0 100644 --- a/libs/SDL3/src/audio/emscripten/SDL_emscriptenaudio.c +++ b/libs/SDL3/src/audio/emscripten/SDL_emscriptenaudio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -190,7 +190,7 @@ static bool EMSCRIPTENAUDIO_OpenDevice(SDL_AudioDevice *device) // limit to native freq device->spec.freq = EM_ASM_INT({ return Module['SDL3'].audioContext.sampleRate; }); - device->sample_frames = SDL_GetDefaultSampleFramesFromFreq(device->spec.freq); + device->sample_frames = SDL_GetDefaultSampleFramesFromFreq(device->spec.freq) * 2; // double the buffer size, some browsers need more, and we'll just have to live with the latency. SDL_UpdatedAudioDeviceFormat(device); diff --git a/libs/SDL3/src/audio/emscripten/SDL_emscriptenaudio.h b/libs/SDL3/src/audio/emscripten/SDL_emscriptenaudio.h index d10d4a2a..aaf761be 100644 --- a/libs/SDL3/src/audio/emscripten/SDL_emscriptenaudio.h +++ b/libs/SDL3/src/audio/emscripten/SDL_emscriptenaudio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/haiku/SDL_haikuaudio.cc b/libs/SDL3/src/audio/haiku/SDL_haikuaudio.cc index 5fe65381..9401d88a 100644 --- a/libs/SDL3/src/audio/haiku/SDL_haikuaudio.cc +++ b/libs/SDL3/src/audio/haiku/SDL_haikuaudio.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/haiku/SDL_haikuaudio.h b/libs/SDL3/src/audio/haiku/SDL_haikuaudio.h index 6ba2bb22..9547546a 100644 --- a/libs/SDL3/src/audio/haiku/SDL_haikuaudio.h +++ b/libs/SDL3/src/audio/haiku/SDL_haikuaudio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/jack/SDL_jackaudio.c b/libs/SDL3/src/audio/jack/SDL_jackaudio.c index b590386e..0ed79f53 100644 --- a/libs/SDL3/src/audio/jack/SDL_jackaudio.c +++ b/libs/SDL3/src/audio/jack/SDL_jackaudio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/jack/SDL_jackaudio.h b/libs/SDL3/src/audio/jack/SDL_jackaudio.h index 4fe0053f..4f972d59 100644 --- a/libs/SDL3/src/audio/jack/SDL_jackaudio.h +++ b/libs/SDL3/src/audio/jack/SDL_jackaudio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/n3ds/SDL_n3dsaudio.c b/libs/SDL3/src/audio/n3ds/SDL_n3dsaudio.c index 900969ea..8144d907 100644 --- a/libs/SDL3/src/audio/n3ds/SDL_n3dsaudio.c +++ b/libs/SDL3/src/audio/n3ds/SDL_n3dsaudio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/n3ds/SDL_n3dsaudio.h b/libs/SDL3/src/audio/n3ds/SDL_n3dsaudio.h index 115ccc93..c9ae4f8e 100644 --- a/libs/SDL3/src/audio/n3ds/SDL_n3dsaudio.h +++ b/libs/SDL3/src/audio/n3ds/SDL_n3dsaudio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/netbsd/SDL_netbsdaudio.c b/libs/SDL3/src/audio/netbsd/SDL_netbsdaudio.c index 7e105007..cc0840b7 100644 --- a/libs/SDL3/src/audio/netbsd/SDL_netbsdaudio.c +++ b/libs/SDL3/src/audio/netbsd/SDL_netbsdaudio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/netbsd/SDL_netbsdaudio.h b/libs/SDL3/src/audio/netbsd/SDL_netbsdaudio.h index dc3247cb..dcdc6f4a 100644 --- a/libs/SDL3/src/audio/netbsd/SDL_netbsdaudio.h +++ b/libs/SDL3/src/audio/netbsd/SDL_netbsdaudio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/openslES/SDL_openslES.c b/libs/SDL3/src/audio/openslES/SDL_openslES.c index 2ab0de0e..08fd6783 100644 --- a/libs/SDL3/src/audio/openslES/SDL_openslES.c +++ b/libs/SDL3/src/audio/openslES/SDL_openslES.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/openslES/SDL_openslES.h b/libs/SDL3/src/audio/openslES/SDL_openslES.h index 9148c790..0ae26641 100644 --- a/libs/SDL3/src/audio/openslES/SDL_openslES.h +++ b/libs/SDL3/src/audio/openslES/SDL_openslES.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/pipewire/SDL_pipewire.c b/libs/SDL3/src/audio/pipewire/SDL_pipewire.c index 775c558d..08f0db6c 100644 --- a/libs/SDL3/src/audio/pipewire/SDL_pipewire.c +++ b/libs/SDL3/src/audio/pipewire/SDL_pipewire.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/pipewire/SDL_pipewire.h b/libs/SDL3/src/audio/pipewire/SDL_pipewire.h index 1b07185c..e609e252 100644 --- a/libs/SDL3/src/audio/pipewire/SDL_pipewire.h +++ b/libs/SDL3/src/audio/pipewire/SDL_pipewire.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/ps2/SDL_ps2audio.c b/libs/SDL3/src/audio/ps2/SDL_ps2audio.c index 8396b265..2995eed1 100644 --- a/libs/SDL3/src/audio/ps2/SDL_ps2audio.c +++ b/libs/SDL3/src/audio/ps2/SDL_ps2audio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/ps2/SDL_ps2audio.h b/libs/SDL3/src/audio/ps2/SDL_ps2audio.h index d75cb8bf..5a0eceae 100644 --- a/libs/SDL3/src/audio/ps2/SDL_ps2audio.h +++ b/libs/SDL3/src/audio/ps2/SDL_ps2audio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/psp/SDL_pspaudio.c b/libs/SDL3/src/audio/psp/SDL_pspaudio.c index 9eb793b0..328387e8 100644 --- a/libs/SDL3/src/audio/psp/SDL_pspaudio.c +++ b/libs/SDL3/src/audio/psp/SDL_pspaudio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/psp/SDL_pspaudio.h b/libs/SDL3/src/audio/psp/SDL_pspaudio.h index 6b3c0006..d7b20566 100644 --- a/libs/SDL3/src/audio/psp/SDL_pspaudio.h +++ b/libs/SDL3/src/audio/psp/SDL_pspaudio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/pulseaudio/SDL_pulseaudio.c b/libs/SDL3/src/audio/pulseaudio/SDL_pulseaudio.c index 240b11e3..75365147 100644 --- a/libs/SDL3/src/audio/pulseaudio/SDL_pulseaudio.c +++ b/libs/SDL3/src/audio/pulseaudio/SDL_pulseaudio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/pulseaudio/SDL_pulseaudio.h b/libs/SDL3/src/audio/pulseaudio/SDL_pulseaudio.h index 62b0d4ea..9ea44c0e 100644 --- a/libs/SDL3/src/audio/pulseaudio/SDL_pulseaudio.h +++ b/libs/SDL3/src/audio/pulseaudio/SDL_pulseaudio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/qnx/SDL_qsa_audio.c b/libs/SDL3/src/audio/qnx/SDL_qsa_audio.c index 3a549b87..715ee328 100644 --- a/libs/SDL3/src/audio/qnx/SDL_qsa_audio.c +++ b/libs/SDL3/src/audio/qnx/SDL_qsa_audio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/qnx/SDL_qsa_audio.h b/libs/SDL3/src/audio/qnx/SDL_qsa_audio.h index 3bb0b6f7..902752cd 100644 --- a/libs/SDL3/src/audio/qnx/SDL_qsa_audio.h +++ b/libs/SDL3/src/audio/qnx/SDL_qsa_audio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/sndio/SDL_sndioaudio.c b/libs/SDL3/src/audio/sndio/SDL_sndioaudio.c index 0776a452..00562916 100644 --- a/libs/SDL3/src/audio/sndio/SDL_sndioaudio.c +++ b/libs/SDL3/src/audio/sndio/SDL_sndioaudio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/sndio/SDL_sndioaudio.h b/libs/SDL3/src/audio/sndio/SDL_sndioaudio.h index 11a8d608..d4ff7259 100644 --- a/libs/SDL3/src/audio/sndio/SDL_sndioaudio.h +++ b/libs/SDL3/src/audio/sndio/SDL_sndioaudio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/vita/SDL_vitaaudio.c b/libs/SDL3/src/audio/vita/SDL_vitaaudio.c index ad479f98..c02c9fa6 100644 --- a/libs/SDL3/src/audio/vita/SDL_vitaaudio.c +++ b/libs/SDL3/src/audio/vita/SDL_vitaaudio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/vita/SDL_vitaaudio.h b/libs/SDL3/src/audio/vita/SDL_vitaaudio.h index 35b46e5f..1e974996 100644 --- a/libs/SDL3/src/audio/vita/SDL_vitaaudio.h +++ b/libs/SDL3/src/audio/vita/SDL_vitaaudio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/audio/wasapi/SDL_wasapi.c b/libs/SDL3/src/audio/wasapi/SDL_wasapi.c index a6f15774..71eb3291 100644 --- a/libs/SDL3/src/audio/wasapi/SDL_wasapi.c +++ b/libs/SDL3/src/audio/wasapi/SDL_wasapi.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -353,14 +353,18 @@ static void WASAPI_DetectDevices(SDL_AudioDevice **default_playback, SDL_AudioDe static bool mgmtthrtask_DisconnectDevice(void *userdata) { - SDL_AudioDeviceDisconnected((SDL_AudioDevice *)userdata); + SDL_AudioDevice *device = (SDL_AudioDevice *) userdata; + SDL_AudioDeviceDisconnected(device); + UnrefPhysicalAudioDevice(device); return true; } void WASAPI_DisconnectDevice(SDL_AudioDevice *device) { - bool rc; // block on this; don't disconnect while holding the device lock! - WASAPI_ProxyToManagementThread(mgmtthrtask_DisconnectDevice, device, &rc); + if (SDL_CompareAndSwapAtomicInt(&device->hidden->device_disconnecting, 0, 1)) { + RefPhysicalAudioDevice(device); // will unref when the task ends. + WASAPI_ProxyToManagementThread(mgmtthrtask_DisconnectDevice, device, NULL); + } } static bool WasapiFailed(SDL_AudioDevice *device, const HRESULT err) @@ -503,8 +507,10 @@ static bool RecoverWasapiDevice(SDL_AudioDevice *device) static bool RecoverWasapiIfLost(SDL_AudioDevice *device) { if (SDL_GetAtomicInt(&device->shutdown)) { - return false; // already failed. - } else if (device->hidden->device_dead) { // had a fatal error elsewhere, clean up and quit + return false; // closing, stop trying. + } else if (SDL_GetAtomicInt(&device->hidden->device_disconnecting)) { + return false; // failing via the WASAPI management thread, stop trying. + } else if (device->hidden->device_dead) { // had a fatal error elsewhere, clean up and quit IAudioClient_Stop(device->hidden->client); WASAPI_DisconnectDevice(device); SDL_assert(SDL_GetAtomicInt(&device->shutdown)); // so we don't come back through here. @@ -541,7 +547,7 @@ static Uint8 *WASAPI_GetDeviceBuf(SDL_AudioDevice *device, int *buffer_size) static bool WASAPI_PlayDevice(SDL_AudioDevice *device, const Uint8 *buffer, int buflen) { - if (device->hidden->render) { // definitely activated? + if (device->hidden->render && !SDL_GetAtomicInt(&device->hidden->device_disconnecting)) { // definitely activated? // WasapiFailed() will mark the device for reacquisition or removal elsewhere. WasapiFailed(device, IAudioRenderClient_ReleaseBuffer(device->hidden->render, device->sample_frames, 0)); } diff --git a/libs/SDL3/src/audio/wasapi/SDL_wasapi.h b/libs/SDL3/src/audio/wasapi/SDL_wasapi.h index 6c5f45f4..5e528dc7 100644 --- a/libs/SDL3/src/audio/wasapi/SDL_wasapi.h +++ b/libs/SDL3/src/audio/wasapi/SDL_wasapi.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -40,6 +40,7 @@ struct SDL_PrivateAudioData HANDLE task; bool coinitialized; int framesize; + SDL_AtomicInt device_disconnecting; bool device_lost; bool device_dead; }; diff --git a/libs/SDL3/src/camera/SDL_camera.c b/libs/SDL3/src/camera/SDL_camera.c index c11f08af..fdd90904 100644 --- a/libs/SDL3/src/camera/SDL_camera.c +++ b/libs/SDL3/src/camera/SDL_camera.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -32,12 +32,12 @@ // Available camera drivers static const CameraBootStrap *const bootstrap[] = { -#ifdef SDL_CAMERA_DRIVER_PIPEWIRE - &PIPEWIRECAMERA_bootstrap, -#endif #ifdef SDL_CAMERA_DRIVER_V4L2 &V4L2_bootstrap, #endif +#ifdef SDL_CAMERA_DRIVER_PIPEWIRE + &PIPEWIRECAMERA_bootstrap, +#endif #ifdef SDL_CAMERA_DRIVER_COREMEDIA &COREMEDIA_bootstrap, #endif diff --git a/libs/SDL3/src/camera/SDL_camera_c.h b/libs/SDL3/src/camera/SDL_camera_c.h index 7436ab43..316ae7d7 100644 --- a/libs/SDL3/src/camera/SDL_camera_c.h +++ b/libs/SDL3/src/camera/SDL_camera_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/camera/SDL_syscamera.h b/libs/SDL3/src/camera/SDL_syscamera.h index 4fa78e7a..7af115ad 100644 --- a/libs/SDL3/src/camera/SDL_syscamera.h +++ b/libs/SDL3/src/camera/SDL_syscamera.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/camera/android/SDL_camera_android.c b/libs/SDL3/src/camera/android/SDL_camera_android.c index 7c60bfd6..54b539a1 100644 --- a/libs/SDL3/src/camera/android/SDL_camera_android.c +++ b/libs/SDL3/src/camera/android/SDL_camera_android.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -327,31 +327,40 @@ static SDL_CameraFrameResult ANDROIDCAMERA_AcquireFrame(SDL_Camera *device, SDL_ num_planes--; // treat the interleaved planes as one. } - // !!! FIXME: we have an open issue in SDL3 to allow SDL_Surface to support non-contiguous planar data, but we don't have it yet. size_t buflen = 0; + pAImage_getPlaneRowStride(image, 0, &frame->pitch); for (int i = 0; (i < num_planes) && (i < 3); i++) { - uint8_t *data = NULL; - int32_t datalen = 0; - pAImage_getPlaneData(image, i, &data, &datalen); - buflen += (int) datalen; + int32_t expected; + if (i == 0) { + expected = frame->pitch * frame->h; + } else { + expected = frame->pitch * (frame->h + 1) / 2; + } + buflen += expected; } frame->pixels = SDL_aligned_alloc(SDL_GetSIMDAlignment(), buflen); if (frame->pixels == NULL) { result = SDL_CAMERA_FRAME_ERROR; } else { - int32_t row_stride = 0; Uint8 *dst = frame->pixels; - pAImage_getPlaneRowStride(image, 0, &row_stride); - frame->pitch = (int) row_stride; // this is what SDL3 currently expects, probably incorrectly. for (int i = 0; (i < num_planes) && (i < 3); i++) { uint8_t *data = NULL; int32_t datalen = 0; + int32_t expected; + if (i == 0) { + expected = frame->pitch * frame->h; + } else { + expected = frame->pitch * (frame->h + 1) / 2; + } pAImage_getPlaneData(image, i, &data, &datalen); - const void *src = data; - SDL_memcpy(dst, src, datalen); - dst += datalen; + + int32_t row_stride = 0; + pAImage_getPlaneRowStride(image, i, &row_stride); + SDL_assert(row_stride == frame->pitch); + SDL_memcpy(dst, data, SDL_min(expected, datalen)); + dst += expected; } } @@ -631,8 +640,8 @@ static void GatherCameraSpecs(const char *devid, CameraFormatAddData *add_data, const int32_t *i32ptr = cfgentry.data.i32; for (int i = 0; i < cfgentry.count; i++, i32ptr += 4) { const int32_t fmt = i32ptr[0]; - const int w = (int) i32ptr[1]; - const int h = (int) i32ptr[2]; + const int w = i32ptr[1]; + const int h = i32ptr[2]; const int32_t type = i32ptr[3]; SDL_PixelFormat sdlfmt = SDL_PIXELFORMAT_UNKNOWN; SDL_Colorspace colorspace = SDL_COLORSPACE_UNKNOWN; diff --git a/libs/SDL3/src/camera/coremedia/SDL_camera_coremedia.m b/libs/SDL3/src/camera/coremedia/SDL_camera_coremedia.m index 800340b4..2ecfd13c 100644 --- a/libs/SDL3/src/camera/coremedia/SDL_camera_coremedia.m +++ b/libs/SDL3/src/camera/coremedia/SDL_camera_coremedia.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2023 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/camera/dummy/SDL_camera_dummy.c b/libs/SDL3/src/camera/dummy/SDL_camera_dummy.c index d2e9a898..b2a4dc13 100644 --- a/libs/SDL3/src/camera/dummy/SDL_camera_dummy.c +++ b/libs/SDL3/src/camera/dummy/SDL_camera_dummy.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2023 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/camera/emscripten/SDL_camera_emscripten.c b/libs/SDL3/src/camera/emscripten/SDL_camera_emscripten.c index 3662bffc..986c899c 100644 --- a/libs/SDL3/src/camera/emscripten/SDL_camera_emscripten.c +++ b/libs/SDL3/src/camera/emscripten/SDL_camera_emscripten.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2023 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/camera/mediafoundation/SDL_camera_mediafoundation.c b/libs/SDL3/src/camera/mediafoundation/SDL_camera_mediafoundation.c index 1e794169..086868f8 100644 --- a/libs/SDL3/src/camera/mediafoundation/SDL_camera_mediafoundation.c +++ b/libs/SDL3/src/camera/mediafoundation/SDL_camera_mediafoundation.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2023 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/camera/pipewire/SDL_camera_pipewire.c b/libs/SDL3/src/camera/pipewire/SDL_camera_pipewire.c index f5cdad95..43e54d26 100644 --- a/libs/SDL3/src/camera/pipewire/SDL_camera_pipewire.c +++ b/libs/SDL3/src/camera/pipewire/SDL_camera_pipewire.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2023 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga Copyright (C) 2024 Wim Taymans This software is provided 'as-is', without any express or implied @@ -359,21 +359,14 @@ static struct sdl_video_format { SDL_Colorspace colorspace; uint32_t id; } sdl_video_formats[] = { -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - { SDL_PIXELFORMAT_RGBX8888, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_RGBx }, - { SDL_PIXELFORMAT_BGRX8888, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_BGRx }, - { SDL_PIXELFORMAT_RGBA8888, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_RGBA }, - { SDL_PIXELFORMAT_ARGB8888, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_ARGB }, - { SDL_PIXELFORMAT_BGRA8888, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_BGRA }, - { SDL_PIXELFORMAT_ABGR8888, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_ABGR }, -#else - { SDL_PIXELFORMAT_RGBX8888, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_xBGR }, - { SDL_PIXELFORMAT_BGRX8888, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_xRGB }, - { SDL_PIXELFORMAT_RGBA8888, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_ABGR }, - { SDL_PIXELFORMAT_ARGB8888, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_BGRA }, - { SDL_PIXELFORMAT_BGRA8888, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_ARGB }, - { SDL_PIXELFORMAT_ABGR8888, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_RGBA }, -#endif + { SDL_PIXELFORMAT_RGBX32, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_RGBx }, + { SDL_PIXELFORMAT_XRGB32, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_xRGB }, + { SDL_PIXELFORMAT_BGRX32, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_BGRx }, + { SDL_PIXELFORMAT_XBGR32, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_xBGR }, + { SDL_PIXELFORMAT_RGBA32, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_RGBA }, + { SDL_PIXELFORMAT_ARGB32, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_ARGB }, + { SDL_PIXELFORMAT_BGRA32, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_BGRA }, + { SDL_PIXELFORMAT_ABGR32, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_ABGR }, { SDL_PIXELFORMAT_RGB24, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_RGB }, { SDL_PIXELFORMAT_BGR24, SDL_COLORSPACE_SRGB, SPA_VIDEO_FORMAT_BGR }, { SDL_PIXELFORMAT_YV12, SDL_COLORSPACE_BT709_LIMITED, SPA_VIDEO_FORMAT_YV12 }, diff --git a/libs/SDL3/src/camera/v4l2/SDL_camera_v4l2.c b/libs/SDL3/src/camera/v4l2/SDL_camera_v4l2.c index 8a192809..a4d4df63 100644 --- a/libs/SDL3/src/camera/v4l2/SDL_camera_v4l2.c +++ b/libs/SDL3/src/camera/v4l2/SDL_camera_v4l2.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/camera/vita/SDL_camera_vita.c b/libs/SDL3/src/camera/vita/SDL_camera_vita.c index 8c9bf429..42a5a89d 100644 --- a/libs/SDL3/src/camera/vita/SDL_camera_vita.c +++ b/libs/SDL3/src/camera/vita/SDL_camera_vita.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2023 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/SDL_core_unsupported.c b/libs/SDL3/src/core/SDL_core_unsupported.c index b36c7f74..9a6b98f5 100644 --- a/libs/SDL3/src/core/SDL_core_unsupported.c +++ b/libs/SDL3/src/core/SDL_core_unsupported.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/android/SDL_android.c b/libs/SDL3/src/core/android/SDL_android.c index e24a7547..daf0f29f 100644 --- a/libs/SDL3/src/core/android/SDL_android.c +++ b/libs/SDL3/src/core/android/SDL_android.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -28,6 +28,7 @@ #include "../../video/android/SDL_androidkeyboard.h" #include "../../video/android/SDL_androidmouse.h" #include "../../video/android/SDL_androidtouch.h" +#include "../../video/android/SDL_androidpen.h" #include "../../video/android/SDL_androidvideo.h" #include "../../video/android/SDL_androidwindow.h" #include "../../joystick/android/SDL_sysjoystick_c.h" @@ -118,6 +119,10 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeMouse)( JNIEnv *env, jclass jcls, jint button, jint action, jfloat x, jfloat y, jboolean relative); +JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativePen)( + JNIEnv *env, jclass jcls, + jint pen_id_in, jint button, jint action, jfloat x, jfloat y, jfloat p); + JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeAccel)( JNIEnv *env, jclass jcls, jfloat x, jfloat y, jfloat z); @@ -209,6 +214,7 @@ static JNINativeMethod SDLActivity_tab[] = { { "onNativeKeyboardFocusLost", "()V", SDL_JAVA_INTERFACE(onNativeKeyboardFocusLost) }, { "onNativeTouch", "(IIIFFF)V", SDL_JAVA_INTERFACE(onNativeTouch) }, { "onNativeMouse", "(IIFFZ)V", SDL_JAVA_INTERFACE(onNativeMouse) }, + { "onNativePen", "(IIIFFF)V", SDL_JAVA_INTERFACE(onNativePen) }, { "onNativeAccel", "(FFF)V", SDL_JAVA_INTERFACE(onNativeAccel) }, { "onNativeClipboardChanged", "()V", SDL_JAVA_INTERFACE(onNativeClipboardChanged) }, { "nativeLowMemory", "()V", SDL_JAVA_INTERFACE(nativeLowMemory) }, @@ -398,9 +404,6 @@ static void Internal_Android_Destroy_AssetManager(void); static AAssetManager *asset_manager = NULL; static jobject javaAssetManagerRef = 0; -// Re-create activity hint -static SDL_AtomicInt bAllowRecreateActivity; - static SDL_Mutex *Android_ActivityMutex = NULL; static SDL_Mutex *Android_LifecycleMutex = NULL; static SDL_Semaphore *Android_LifecycleEventSem = NULL; @@ -558,7 +561,6 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) register_methods(env, "org/libsdl/app/SDLAudioManager", SDLAudioManager_tab, SDL_arraysize(SDLAudioManager_tab)); register_methods(env, "org/libsdl/app/SDLControllerManager", SDLControllerManager_tab, SDL_arraysize(SDLControllerManager_tab)); register_methods(env, "org/libsdl/app/HIDDeviceManager", HIDDeviceManager_tab, SDL_arraysize(HIDDeviceManager_tab)); - SDL_SetAtomicInt(&bAllowRecreateActivity, false); return JNI_VERSION_1_4; } @@ -758,28 +760,16 @@ JNIEXPORT int JNICALL SDL_JAVA_INTERFACE(nativeCheckSDLThreadCounter)( return tmp; } -static void SDLCALL SDL_AllowRecreateActivityChanged(void *userdata, const char *name, const char *oldValue, const char *hint) -{ - if (SDL_GetStringBoolean(hint, false)) { - SDL_SetAtomicInt(&bAllowRecreateActivity, true); - } else { - SDL_SetAtomicInt(&bAllowRecreateActivity, false); - } -} - JNIEXPORT jboolean JNICALL SDL_JAVA_INTERFACE(nativeAllowRecreateActivity)( JNIEnv *env, jclass jcls) { - return SDL_GetAtomicInt(&bAllowRecreateActivity); + return SDL_GetHintBoolean(SDL_HINT_ANDROID_ALLOW_RECREATE_ACTIVITY, false); } JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeInitMainThread)( JNIEnv *env, jclass jcls) { __android_log_print(ANDROID_LOG_VERBOSE, "SDL", "nativeInitSDLThread() %d time", run_count); - if (run_count == 1) { - SDL_AddHintCallback(SDL_HINT_ANDROID_ALLOW_RECREATE_ACTIVITY, SDL_AllowRecreateActivityChanged, NULL); - } run_count += 1; // Save JNIEnv of SDLThread @@ -893,7 +883,7 @@ static int FindLifecycleEvent(SDL_AndroidLifecycleEvent event) static void RemoveLifecycleEvent(int index) { if (index < Android_NumLifecycleEvents - 1) { - SDL_memcpy(&Android_LifecycleEvents[index], &Android_LifecycleEvents[index+1], (Android_NumLifecycleEvents - index - 1) * sizeof(Android_LifecycleEvents[index])); + SDL_memmove(&Android_LifecycleEvents[index], &Android_LifecycleEvents[index+1], (Android_NumLifecycleEvents - index - 1) * sizeof(Android_LifecycleEvents[index])); } --Android_NumLifecycleEvents; } @@ -1057,10 +1047,7 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeRotationChanged)( break; } - if (Android_Window) { - SDL_VideoDisplay *display = SDL_GetVideoDisplay(SDL_GetPrimaryDisplay()); - SDL_SendDisplayEvent(display, SDL_EVENT_DISPLAY_ORIENTATION, displayCurrentOrientation, 0); - } + Android_SetOrientation(displayCurrentOrientation); SDL_UnlockMutex(Android_ActivityMutex); } @@ -1071,9 +1058,7 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeInsetsChanged)( { SDL_LockMutex(Android_ActivityMutex); - if (Android_Window) { - SDL_SetWindowSafeAreaInsets(Android_Window, left, right, top, bottom); - } + Android_SetWindowSafeAreaInsets(left, right, top, bottom); SDL_UnlockMutex(Android_ActivityMutex); } @@ -1362,6 +1347,18 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeMouse)( SDL_UnlockMutex(Android_ActivityMutex); } +// Pen +JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativePen)( + JNIEnv *env, jclass jcls, + jint pen_id_in, jint button, jint action, jfloat x, jfloat y, jfloat p) +{ + SDL_LockMutex(Android_ActivityMutex); + + Android_OnPen(Android_Window, pen_id_in, button, action, x, y, p); + + SDL_UnlockMutex(Android_ActivityMutex); +} + // Accelerometer JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeAccel)( JNIEnv *env, jclass jcls, diff --git a/libs/SDL3/src/core/android/SDL_android.h b/libs/SDL3/src/core/android/SDL_android.h index 4c3fb5fb..3541c2a9 100644 --- a/libs/SDL3/src/core/android/SDL_android.h +++ b/libs/SDL3/src/core/android/SDL_android.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/freebsd/SDL_evdev_kbd_freebsd.c b/libs/SDL3/src/core/freebsd/SDL_evdev_kbd_freebsd.c index 6f076b10..16a21713 100644 --- a/libs/SDL3/src/core/freebsd/SDL_evdev_kbd_freebsd.c +++ b/libs/SDL3/src/core/freebsd/SDL_evdev_kbd_freebsd.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/gdk/SDL_gdk.cpp b/libs/SDL3/src/core/gdk/SDL_gdk.cpp index efd56f31..738daa5b 100644 --- a/libs/SDL3/src/core/gdk/SDL_gdk.cpp +++ b/libs/SDL3/src/core/gdk/SDL_gdk.cpp @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/gdk/SDL_gdk.h b/libs/SDL3/src/core/gdk/SDL_gdk.h index db2affa3..14f4e6f1 100644 --- a/libs/SDL3/src/core/gdk/SDL_gdk.h +++ b/libs/SDL3/src/core/gdk/SDL_gdk.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/haiku/SDL_BApp.h b/libs/SDL3/src/core/haiku/SDL_BApp.h index 14b69055..b13b9e6d 100644 --- a/libs/SDL3/src/core/haiku/SDL_BApp.h +++ b/libs/SDL3/src/core/haiku/SDL_BApp.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/haiku/SDL_BeApp.cc b/libs/SDL3/src/core/haiku/SDL_BeApp.cc index 39612b8c..350f7f3e 100644 --- a/libs/SDL3/src/core/haiku/SDL_BeApp.cc +++ b/libs/SDL3/src/core/haiku/SDL_BeApp.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/haiku/SDL_BeApp.h b/libs/SDL3/src/core/haiku/SDL_BeApp.h index b45e10ea..de5bb6bf 100644 --- a/libs/SDL3/src/core/haiku/SDL_BeApp.h +++ b/libs/SDL3/src/core/haiku/SDL_BeApp.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_dbus.c b/libs/SDL3/src/core/linux/SDL_dbus.c index 3fd78c75..e0ffea3c 100644 --- a/libs/SDL3/src/core/linux/SDL_dbus.c +++ b/libs/SDL3/src/core/linux/SDL_dbus.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_dbus.h b/libs/SDL3/src/core/linux/SDL_dbus.h index 55fb8ac7..2073d6ce 100644 --- a/libs/SDL3/src/core/linux/SDL_dbus.h +++ b/libs/SDL3/src/core/linux/SDL_dbus.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_evdev.c b/libs/SDL3/src/core/linux/SDL_evdev.c index 456a04f1..5746e2ef 100644 --- a/libs/SDL3/src/core/linux/SDL_evdev.c +++ b/libs/SDL3/src/core/linux/SDL_evdev.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -546,11 +546,11 @@ void SDL_EVDEV_Poll(void) * be window-relative in that case. */ switch (item->touchscreen_data->slots[j].delta) { case EVDEV_TOUCH_SLOTDELTA_DOWN: - SDL_SendTouch(SDL_EVDEV_GetEventTimestamp(event), item->fd, item->touchscreen_data->slots[j].tracking_id, NULL, true, norm_x, norm_y, norm_pressure); + SDL_SendTouch(SDL_EVDEV_GetEventTimestamp(event), item->fd, item->touchscreen_data->slots[j].tracking_id, NULL, SDL_EVENT_FINGER_DOWN, norm_x, norm_y, norm_pressure); item->touchscreen_data->slots[j].delta = EVDEV_TOUCH_SLOTDELTA_NONE; break; case EVDEV_TOUCH_SLOTDELTA_UP: - SDL_SendTouch(SDL_EVDEV_GetEventTimestamp(event), item->fd, item->touchscreen_data->slots[j].tracking_id, NULL, false, norm_x, norm_y, norm_pressure); + SDL_SendTouch(SDL_EVDEV_GetEventTimestamp(event), item->fd, item->touchscreen_data->slots[j].tracking_id, NULL, SDL_EVENT_FINGER_UP, norm_x, norm_y, norm_pressure); item->touchscreen_data->slots[j].tracking_id = 0; item->touchscreen_data->slots[j].delta = EVDEV_TOUCH_SLOTDELTA_NONE; break; diff --git a/libs/SDL3/src/core/linux/SDL_evdev.h b/libs/SDL3/src/core/linux/SDL_evdev.h index 0eaa6006..d3e2fe16 100644 --- a/libs/SDL3/src/core/linux/SDL_evdev.h +++ b/libs/SDL3/src/core/linux/SDL_evdev.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_evdev_capabilities.c b/libs/SDL3/src/core/linux/SDL_evdev_capabilities.c index 1a04f6b5..61e240e7 100644 --- a/libs/SDL3/src/core/linux/SDL_evdev_capabilities.c +++ b/libs/SDL3/src/core/linux/SDL_evdev_capabilities.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga Copyright (C) 2020 Collabora Ltd. This software is provided 'as-is', without any express or implied diff --git a/libs/SDL3/src/core/linux/SDL_evdev_capabilities.h b/libs/SDL3/src/core/linux/SDL_evdev_capabilities.h index 57667d25..5a70bdd6 100644 --- a/libs/SDL3/src/core/linux/SDL_evdev_capabilities.h +++ b/libs/SDL3/src/core/linux/SDL_evdev_capabilities.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga Copyright (C) 2020 Collabora Ltd. This software is provided 'as-is', without any express or implied diff --git a/libs/SDL3/src/core/linux/SDL_evdev_kbd.c b/libs/SDL3/src/core/linux/SDL_evdev_kbd.c index 5ea7b555..b1a56644 100644 --- a/libs/SDL3/src/core/linux/SDL_evdev_kbd.c +++ b/libs/SDL3/src/core/linux/SDL_evdev_kbd.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_evdev_kbd.h b/libs/SDL3/src/core/linux/SDL_evdev_kbd.h index 39f1d722..6ea19fb0 100644 --- a/libs/SDL3/src/core/linux/SDL_evdev_kbd.h +++ b/libs/SDL3/src/core/linux/SDL_evdev_kbd.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_evdev_kbd_default_accents.h b/libs/SDL3/src/core/linux/SDL_evdev_kbd_default_accents.h index 259e6572..b6d034c4 100644 --- a/libs/SDL3/src/core/linux/SDL_evdev_kbd_default_accents.h +++ b/libs/SDL3/src/core/linux/SDL_evdev_kbd_default_accents.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_evdev_kbd_default_keymap.h b/libs/SDL3/src/core/linux/SDL_evdev_kbd_default_keymap.h index 790dac9b..05294546 100644 --- a/libs/SDL3/src/core/linux/SDL_evdev_kbd_default_keymap.h +++ b/libs/SDL3/src/core/linux/SDL_evdev_kbd_default_keymap.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_fcitx.c b/libs/SDL3/src/core/linux/SDL_fcitx.c index 72451e03..d7a9ed66 100644 --- a/libs/SDL3/src/core/linux/SDL_fcitx.c +++ b/libs/SDL3/src/core/linux/SDL_fcitx.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_fcitx.h b/libs/SDL3/src/core/linux/SDL_fcitx.h index 59dc9135..82c544e8 100644 --- a/libs/SDL3/src/core/linux/SDL_fcitx.h +++ b/libs/SDL3/src/core/linux/SDL_fcitx.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_ibus.c b/libs/SDL3/src/core/linux/SDL_ibus.c index dbbc3e17..ea58ed57 100644 --- a/libs/SDL3/src/core/linux/SDL_ibus.c +++ b/libs/SDL3/src/core/linux/SDL_ibus.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_ibus.h b/libs/SDL3/src/core/linux/SDL_ibus.h index ffd7e8e5..ba08be69 100644 --- a/libs/SDL3/src/core/linux/SDL_ibus.h +++ b/libs/SDL3/src/core/linux/SDL_ibus.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_ime.c b/libs/SDL3/src/core/linux/SDL_ime.c index a853618b..c15defb8 100644 --- a/libs/SDL3/src/core/linux/SDL_ime.c +++ b/libs/SDL3/src/core/linux/SDL_ime.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_ime.h b/libs/SDL3/src/core/linux/SDL_ime.h index 2b75cdd3..ac192fa0 100644 --- a/libs/SDL3/src/core/linux/SDL_ime.h +++ b/libs/SDL3/src/core/linux/SDL_ime.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_system_theme.c b/libs/SDL3/src/core/linux/SDL_system_theme.c index 570d9325..6d6087db 100644 --- a/libs/SDL3/src/core/linux/SDL_system_theme.c +++ b/libs/SDL3/src/core/linux/SDL_system_theme.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_system_theme.h b/libs/SDL3/src/core/linux/SDL_system_theme.h index 2693e5d0..2cd55cd6 100644 --- a/libs/SDL3/src/core/linux/SDL_system_theme.h +++ b/libs/SDL3/src/core/linux/SDL_system_theme.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_threadprio.c b/libs/SDL3/src/core/linux/SDL_threadprio.c index fb5b27be..1a3e22fa 100644 --- a/libs/SDL3/src/core/linux/SDL_threadprio.c +++ b/libs/SDL3/src/core/linux/SDL_threadprio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_udev.c b/libs/SDL3/src/core/linux/SDL_udev.c index bcd910bb..907c34c7 100644 --- a/libs/SDL3/src/core/linux/SDL_udev.c +++ b/libs/SDL3/src/core/linux/SDL_udev.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/linux/SDL_udev.h b/libs/SDL3/src/core/linux/SDL_udev.h index c165bfec..738f4baf 100644 --- a/libs/SDL3/src/core/linux/SDL_udev.h +++ b/libs/SDL3/src/core/linux/SDL_udev.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/openbsd/SDL_wscons.h b/libs/SDL3/src/core/openbsd/SDL_wscons.h index c56b1098..f9b7bf88 100644 --- a/libs/SDL3/src/core/openbsd/SDL_wscons.h +++ b/libs/SDL3/src/core/openbsd/SDL_wscons.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/openbsd/SDL_wscons_kbd.c b/libs/SDL3/src/core/openbsd/SDL_wscons_kbd.c index 09e41ed9..5a71044f 100644 --- a/libs/SDL3/src/core/openbsd/SDL_wscons_kbd.c +++ b/libs/SDL3/src/core/openbsd/SDL_wscons_kbd.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/openbsd/SDL_wscons_mouse.c b/libs/SDL3/src/core/openbsd/SDL_wscons_mouse.c index 81f336f6..51195f39 100644 --- a/libs/SDL3/src/core/openbsd/SDL_wscons_mouse.c +++ b/libs/SDL3/src/core/openbsd/SDL_wscons_mouse.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/unix/SDL_appid.c b/libs/SDL3/src/core/unix/SDL_appid.c index 046b8824..996e216c 100644 --- a/libs/SDL3/src/core/unix/SDL_appid.c +++ b/libs/SDL3/src/core/unix/SDL_appid.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/unix/SDL_appid.h b/libs/SDL3/src/core/unix/SDL_appid.h index 37c9e11f..34825212 100644 --- a/libs/SDL3/src/core/unix/SDL_appid.h +++ b/libs/SDL3/src/core/unix/SDL_appid.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer -Copyright (C) 1997-2024 Sam Lantinga +Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/unix/SDL_poll.c b/libs/SDL3/src/core/unix/SDL_poll.c index b164efd4..9440bff9 100644 --- a/libs/SDL3/src/core/unix/SDL_poll.c +++ b/libs/SDL3/src/core/unix/SDL_poll.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/unix/SDL_poll.h b/libs/SDL3/src/core/unix/SDL_poll.h index 8034b1dc..571619d4 100644 --- a/libs/SDL3/src/core/unix/SDL_poll.h +++ b/libs/SDL3/src/core/unix/SDL_poll.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/windows/SDL_directx.h b/libs/SDL3/src/core/windows/SDL_directx.h index 3acf0ae4..6101e922 100644 --- a/libs/SDL3/src/core/windows/SDL_directx.h +++ b/libs/SDL3/src/core/windows/SDL_directx.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/windows/SDL_hid.c b/libs/SDL3/src/core/windows/SDL_hid.c index 419cb727..98748154 100644 --- a/libs/SDL3/src/core/windows/SDL_hid.c +++ b/libs/SDL3/src/core/windows/SDL_hid.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/windows/SDL_hid.h b/libs/SDL3/src/core/windows/SDL_hid.h index 50c5d38c..8b20df11 100644 --- a/libs/SDL3/src/core/windows/SDL_hid.h +++ b/libs/SDL3/src/core/windows/SDL_hid.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/windows/SDL_immdevice.c b/libs/SDL3/src/core/windows/SDL_immdevice.c index ddf55cda..802a412e 100644 --- a/libs/SDL3/src/core/windows/SDL_immdevice.c +++ b/libs/SDL3/src/core/windows/SDL_immdevice.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/windows/SDL_immdevice.h b/libs/SDL3/src/core/windows/SDL_immdevice.h index 5181e34d..66fdf13b 100644 --- a/libs/SDL3/src/core/windows/SDL_immdevice.h +++ b/libs/SDL3/src/core/windows/SDL_immdevice.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/windows/SDL_windows.c b/libs/SDL3/src/core/windows/SDL_windows.c index c8a157c7..286e8e68 100644 --- a/libs/SDL3/src/core/windows/SDL_windows.c +++ b/libs/SDL3/src/core/windows/SDL_windows.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/windows/SDL_windows.h b/libs/SDL3/src/core/windows/SDL_windows.h index a6d85798..b781b123 100644 --- a/libs/SDL3/src/core/windows/SDL_windows.h +++ b/libs/SDL3/src/core/windows/SDL_windows.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/windows/SDL_xinput.c b/libs/SDL3/src/core/windows/SDL_xinput.c index 76b5bd2c..ba5e4c10 100644 --- a/libs/SDL3/src/core/windows/SDL_xinput.c +++ b/libs/SDL3/src/core/windows/SDL_xinput.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/windows/SDL_xinput.h b/libs/SDL3/src/core/windows/SDL_xinput.h index ff72b239..d499cd58 100644 --- a/libs/SDL3/src/core/windows/SDL_xinput.h +++ b/libs/SDL3/src/core/windows/SDL_xinput.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/windows/pch.c b/libs/SDL3/src/core/windows/pch.c index 7e84b1a4..4b0c6f8f 100644 --- a/libs/SDL3/src/core/windows/pch.c +++ b/libs/SDL3/src/core/windows/pch.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/windows/pch_cpp.cpp b/libs/SDL3/src/core/windows/pch_cpp.cpp index 7e84b1a4..4b0c6f8f 100644 --- a/libs/SDL3/src/core/windows/pch_cpp.cpp +++ b/libs/SDL3/src/core/windows/pch_cpp.cpp @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/core/windows/version.rc b/libs/SDL3/src/core/windows/version.rc index 93c7dca0..83c5f637 100644 --- a/libs/SDL3/src/core/windows/version.rc +++ b/libs/SDL3/src/core/windows/version.rc @@ -9,8 +9,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,1,7,0 - PRODUCTVERSION 3,1,7,0 + FILEVERSION 3,2,0,0 + PRODUCTVERSION 3,2,0,0 FILEFLAGSMASK 0x3fL FILEFLAGS 0x0L FILEOS 0x40004L @@ -23,12 +23,12 @@ BEGIN BEGIN VALUE "CompanyName", "\0" VALUE "FileDescription", "SDL\0" - VALUE "FileVersion", "3, 1, 7, 0\0" + VALUE "FileVersion", "3, 2, 0, 0\0" VALUE "InternalName", "SDL\0" - VALUE "LegalCopyright", "Copyright (C) 2024 Sam Lantinga\0" + VALUE "LegalCopyright", "Copyright (C) 2025 Sam Lantinga\0" VALUE "OriginalFilename", "SDL3.dll\0" VALUE "ProductName", "Simple DirectMedia Layer\0" - VALUE "ProductVersion", "3, 1, 7, 0\0" + VALUE "ProductVersion", "3, 2, 0, 0\0" END END BLOCK "VarFileInfo" diff --git a/libs/SDL3/src/cpuinfo/SDL_cpuinfo.c b/libs/SDL3/src/cpuinfo/SDL_cpuinfo.c index 6fdf3c02..bf425a38 100644 --- a/libs/SDL3/src/cpuinfo/SDL_cpuinfo.c +++ b/libs/SDL3/src/cpuinfo/SDL_cpuinfo.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/cpuinfo/SDL_cpuinfo_c.h b/libs/SDL3/src/cpuinfo/SDL_cpuinfo_c.h index 1e239bd8..9da31a99 100644 --- a/libs/SDL3/src/cpuinfo/SDL_cpuinfo_c.h +++ b/libs/SDL3/src/cpuinfo/SDL_cpuinfo_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/dialog/SDL_dialog.c b/libs/SDL3/src/dialog/SDL_dialog.c index 4831362b..a77e4433 100644 --- a/libs/SDL3/src/dialog/SDL_dialog.c +++ b/libs/SDL3/src/dialog/SDL_dialog.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/dialog/SDL_dialog.h b/libs/SDL3/src/dialog/SDL_dialog.h index b3d3318f..beee7ddf 100644 --- a/libs/SDL3/src/dialog/SDL_dialog.h +++ b/libs/SDL3/src/dialog/SDL_dialog.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/dialog/SDL_dialog_utils.c b/libs/SDL3/src/dialog/SDL_dialog_utils.c index 9d7acbe5..8d2b1869 100644 --- a/libs/SDL3/src/dialog/SDL_dialog_utils.c +++ b/libs/SDL3/src/dialog/SDL_dialog_utils.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/dialog/SDL_dialog_utils.h b/libs/SDL3/src/dialog/SDL_dialog_utils.h index 1fd71bef..1343dd75 100644 --- a/libs/SDL3/src/dialog/SDL_dialog_utils.h +++ b/libs/SDL3/src/dialog/SDL_dialog_utils.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/dialog/android/SDL_androiddialog.c b/libs/SDL3/src/dialog/android/SDL_androiddialog.c index d4723f84..5eaf9455 100644 --- a/libs/SDL3/src/dialog/android/SDL_androiddialog.c +++ b/libs/SDL3/src/dialog/android/SDL_androiddialog.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/dialog/cocoa/SDL_cocoadialog.m b/libs/SDL3/src/dialog/cocoa/SDL_cocoadialog.m index 22f67b6c..fb9c5ad8 100644 --- a/libs/SDL3/src/dialog/cocoa/SDL_cocoadialog.m +++ b/libs/SDL3/src/dialog/cocoa/SDL_cocoadialog.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -146,8 +146,7 @@ void SDL_SYS_ShowFileDialogWithProperties(SDL_FileDialogType type, SDL_DialogFil if (w) { // [dialog beginWithCompletionHandler:^(NSInteger result) { [dialog beginSheetModalForWindow:w completionHandler:^(NSInteger result) { - // NSModalResponseOK for >= 10.13 - if (result == NSFileHandlingPanelOKButton) { + if (result == NSModalResponseOK) { if (dialog_as_open) { NSArray* urls = [dialog_as_open URLs]; const char *files[[urls count] + 1]; @@ -166,8 +165,7 @@ void SDL_SYS_ShowFileDialogWithProperties(SDL_FileDialogType type, SDL_DialogFil } }]; } else { - // NSModalResponseOK for >= 10.10 - if ([dialog runModal] == NSOKButton) { + if ([dialog runModal] == NSModalResponseOK) { if (dialog_as_open) { NSArray* urls = [dialog_as_open URLs]; const char *files[[urls count] + 1]; diff --git a/libs/SDL3/src/dialog/dummy/SDL_dummydialog.c b/libs/SDL3/src/dialog/dummy/SDL_dummydialog.c index 16cf1802..121a090f 100644 --- a/libs/SDL3/src/dialog/dummy/SDL_dummydialog.c +++ b/libs/SDL3/src/dialog/dummy/SDL_dummydialog.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/dialog/haiku/SDL_haikudialog.cc b/libs/SDL3/src/dialog/haiku/SDL_haikudialog.cc index 1ebf000a..d60e3434 100644 --- a/libs/SDL3/src/dialog/haiku/SDL_haikudialog.cc +++ b/libs/SDL3/src/dialog/haiku/SDL_haikudialog.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/dialog/unix/SDL_portaldialog.c b/libs/SDL3/src/dialog/unix/SDL_portaldialog.c index 2d0567dd..1d068ff2 100644 --- a/libs/SDL3/src/dialog/unix/SDL_portaldialog.c +++ b/libs/SDL3/src/dialog/unix/SDL_portaldialog.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -153,49 +153,54 @@ static void DBus_AppendByteArray(SDL_DBusContext *dbus, DBusMessageIter *options dbus->message_iter_close_container(options, &options_pair); } -static DBusHandlerResult DBus_MessageFilter(DBusConnection *conn, DBusMessage *msg, void *data) { +static DBusHandlerResult DBus_MessageFilter(DBusConnection *conn, DBusMessage *msg, void *data) +{ SDL_DBusContext *dbus = SDL_DBus_GetContext(); SignalCallback *signal_data = (SignalCallback *)data; - if (dbus->message_is_signal(msg, SIGNAL_INTERFACE, SIGNAL_NAME) - && dbus->message_has_path(msg, signal_data->path)) { + if (dbus->message_is_signal(msg, SIGNAL_INTERFACE, SIGNAL_NAME) && + dbus->message_has_path(msg, signal_data->path)) { DBusMessageIter signal_iter, result_array, array_entry, value_entry, uri_entry; uint32_t result; size_t length = 2, current = 0; - const char **path; + const char **path = NULL; dbus->message_iter_init(msg, &signal_iter); // Check if the parameters are what we expect - if (dbus->message_iter_get_arg_type(&signal_iter) != DBUS_TYPE_UINT32) + if (dbus->message_iter_get_arg_type(&signal_iter) != DBUS_TYPE_UINT32) { goto not_our_signal; + } dbus->message_iter_get_basic(&signal_iter, &result); if (result == 1 || result == 2) { // cancelled const char *result_data[] = { NULL }; signal_data->callback(signal_data->userdata, result_data, -1); // TODO: Set this to the last selected filter - goto handled; - } - else if (result) { + goto done; + + } else if (result) { // some error occurred signal_data->callback(signal_data->userdata, NULL, -1); - goto handled; + goto done; } - if (!dbus->message_iter_next(&signal_iter)) + if (!dbus->message_iter_next(&signal_iter)) { goto not_our_signal; + } - if (dbus->message_iter_get_arg_type(&signal_iter) != DBUS_TYPE_ARRAY) + if (dbus->message_iter_get_arg_type(&signal_iter) != DBUS_TYPE_ARRAY) { goto not_our_signal; + } + dbus->message_iter_recurse(&signal_iter, &result_array); - while (dbus->message_iter_get_arg_type(&result_array) == DBUS_TYPE_DICT_ENTRY) - { + while (dbus->message_iter_get_arg_type(&result_array) == DBUS_TYPE_DICT_ENTRY) { const char *method; dbus->message_iter_recurse(&result_array, &array_entry); - if (dbus->message_iter_get_arg_type(&array_entry) != DBUS_TYPE_STRING) + if (dbus->message_iter_get_arg_type(&array_entry) != DBUS_TYPE_STRING) { goto not_our_signal; + } dbus->message_iter_get_basic(&array_entry, &method); if (!SDL_strcmp(method, "uris")) { @@ -203,38 +208,42 @@ static DBusHandlerResult DBus_MessageFilter(DBusConnection *conn, DBusMessage *m break; } - if (!dbus->message_iter_next(&result_array)) + if (!dbus->message_iter_next(&result_array)) { goto not_our_signal; + } } - if (!dbus->message_iter_next(&array_entry)) + if (!dbus->message_iter_next(&array_entry)) { goto not_our_signal; + } - if (dbus->message_iter_get_arg_type(&array_entry) != DBUS_TYPE_VARIANT) + if (dbus->message_iter_get_arg_type(&array_entry) != DBUS_TYPE_VARIANT) { goto not_our_signal; + } dbus->message_iter_recurse(&array_entry, &value_entry); - if (dbus->message_iter_get_arg_type(&value_entry) != DBUS_TYPE_ARRAY) + if (dbus->message_iter_get_arg_type(&value_entry) != DBUS_TYPE_ARRAY) { goto not_our_signal; + } dbus->message_iter_recurse(&value_entry, &uri_entry); - path = SDL_malloc(sizeof(const char *) * length); + path = SDL_malloc(length * sizeof(const char *)); if (!path) { signal_data->callback(signal_data->userdata, NULL, -1); - goto cleanup; + goto done; } - while (dbus->message_iter_get_arg_type(&uri_entry) == DBUS_TYPE_STRING) - { + while (dbus->message_iter_get_arg_type(&uri_entry) == DBUS_TYPE_STRING) { const char *uri = NULL; if (current >= length - 1) { ++length; - path = SDL_realloc(path, sizeof(const char *) * length); - if (!path) { + const char **newpath = SDL_realloc(path, length * sizeof(const char *)); + if (!newpath) { signal_data->callback(signal_data->userdata, NULL, -1); - goto cleanup; + goto done; } + path = newpath; } dbus->message_iter_get_basic(&uri_entry, &uri); @@ -248,29 +257,28 @@ static DBusHandlerResult DBus_MessageFilter(DBusConnection *conn, DBusMessage *m SDL_free(decoded_uri); SDL_SetError("Portal dialogs: Unsupported protocol: %s", uri); signal_data->callback(signal_data->userdata, NULL, -1); - goto cleanup; + goto done; } dbus->message_iter_next(&uri_entry); ++current; } - path[length - 1] = NULL; + path[current] = NULL; signal_data->callback(signal_data->userdata, path, -1); // TODO: Fetch the index of the filter that was used -cleanup: +done: dbus->connection_remove_filter(conn, &DBus_MessageFilter, signal_data); if (path) { for (size_t i = 0; i < current; ++i) { SDL_free((char *)path[i]); } + SDL_free(path); } - - SDL_free(path); SDL_free((void *)signal_data->path); SDL_free(signal_data); -handled: return DBUS_HANDLER_RESULT_HANDLED; } + not_our_signal: return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } diff --git a/libs/SDL3/src/dialog/unix/SDL_portaldialog.h b/libs/SDL3/src/dialog/unix/SDL_portaldialog.h index f7258d02..4497287c 100644 --- a/libs/SDL3/src/dialog/unix/SDL_portaldialog.h +++ b/libs/SDL3/src/dialog/unix/SDL_portaldialog.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/dialog/unix/SDL_unixdialog.c b/libs/SDL3/src/dialog/unix/SDL_unixdialog.c index 02305f32..bec2ac95 100644 --- a/libs/SDL3/src/dialog/unix/SDL_unixdialog.c +++ b/libs/SDL3/src/dialog/unix/SDL_unixdialog.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/dialog/unix/SDL_zenitydialog.c b/libs/SDL3/src/dialog/unix/SDL_zenitydialog.c index 3f0f285e..4632c8e1 100644 --- a/libs/SDL3/src/dialog/unix/SDL_zenitydialog.c +++ b/libs/SDL3/src/dialog/unix/SDL_zenitydialog.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/dialog/unix/SDL_zenitydialog.h b/libs/SDL3/src/dialog/unix/SDL_zenitydialog.h index 1ccf5f20..4cfe8926 100644 --- a/libs/SDL3/src/dialog/unix/SDL_zenitydialog.h +++ b/libs/SDL3/src/dialog/unix/SDL_zenitydialog.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/dialog/windows/SDL_windowsdialog.c b/libs/SDL3/src/dialog/windows/SDL_windowsdialog.c index 9f647ae2..2de224fe 100644 --- a/libs/SDL3/src/dialog/windows/SDL_windowsdialog.c +++ b/libs/SDL3/src/dialog/windows/SDL_windowsdialog.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -34,29 +34,49 @@ typedef struct { bool is_save; - const SDL_DialogFileFilter *filters; - int nfilters; - const char* default_file; - SDL_Window* parent; + wchar_t *filters_str; + char *default_file; + SDL_Window *parent; DWORD flags; SDL_DialogFileCallback callback; - void* userdata; - const char* title; - const char* accept; - const char* cancel; + void *userdata; + char *title; + char *accept; + char *cancel; } winArgs; typedef struct { - SDL_Window* parent; + SDL_Window *parent; SDL_DialogFileCallback callback; - const char* default_folder; - void* userdata; - const char* title; - const char* accept; - const char* cancel; + char *default_folder; + void *userdata; + char *title; + char *accept; + char *cancel; } winFArgs; +void freeWinArgs(winArgs *args) +{ + SDL_free(args->default_file); + SDL_free(args->filters_str); + SDL_free(args->title); + SDL_free(args->accept); + SDL_free(args->cancel); + + SDL_free(args); +} + +void freeWinFArgs(winFArgs *args) +{ + SDL_free(args->default_folder); + SDL_free(args->title); + SDL_free(args->accept); + SDL_free(args->cancel); + + SDL_free(args); +} + /** Converts dialog.nFilterIndex to SDL-compatible value */ int getFilterIndex(int as_reported_by_windows) { @@ -86,14 +106,13 @@ void windows_ShowFileDialog(void *ptr) { winArgs *args = (winArgs *) ptr; bool is_save = args->is_save; - const SDL_DialogFileFilter *filters = args->filters; - int nfilters = args->nfilters; - const char* default_file = args->default_file; - SDL_Window* parent = args->parent; + const char *default_file = args->default_file; + SDL_Window *parent = args->parent; DWORD flags = args->flags; SDL_DialogFileCallback callback = args->callback; - void* userdata = args->userdata; + void *userdata = args->userdata; const char *title = args->title; + wchar_t *filter_wchar = args->filters_str; /* GetOpenFileName and GetSaveFileName have the same signature (yes, LPOPENFILENAMEW even for the save dialog) */ @@ -174,69 +193,15 @@ void windows_ShowFileDialog(void *ptr) } } - wchar_t *filter_wchar = NULL; - - if (filters) { - // '\x01' is used in place of a null byte - // suffix needs two null bytes in case the filter list is empty - char *filterlist = convert_filters(filters, nfilters, clear_filt_names, "", "", - "\x01\x01", "", "\x01", "\x01", - "*.", ";*.", ""); - - if (!filterlist) { - callback(userdata, NULL, -1); - SDL_free(filebuffer); - return; - } - - int filter_len = (int)SDL_strlen(filterlist); - - for (char *c = filterlist; *c; c++) { - if (*c == '\x01') { - *c = '\0'; - } - } - - int filter_wlen = MultiByteToWideChar(CP_UTF8, 0, filterlist, filter_len, NULL, 0); - filter_wchar = (wchar_t *)SDL_malloc(filter_wlen * sizeof(wchar_t)); - if (!filter_wchar) { - SDL_free(filterlist); - callback(userdata, NULL, -1); - SDL_free(filebuffer); - return; - } - - MultiByteToWideChar(CP_UTF8, 0, filterlist, filter_len, filter_wchar, filter_wlen); - - SDL_free(filterlist); - } - wchar_t *title_w = NULL; if (title) { - int title_len = (int) SDL_strlen(title); - - /* If the title is longer than 2GB, it might be exploitable. */ - if (title_len < 0) { - title_len = 0; - } - - int title_wlen = MultiByteToWideChar(CP_UTF8, 0, title, -1, NULL, 0); - - if (title_wlen < 0) { - title_wlen = 0; - } - - title_w = (wchar_t *)SDL_malloc(title_wlen * sizeof(wchar_t)); - + title_w = WIN_UTF8ToStringW(title); if (!title_w) { - SDL_free(filter_wchar); SDL_free(filebuffer); callback(userdata, NULL, -1); return; } - - MultiByteToWideChar(CP_UTF8, 0, title, -1, title_w, title_wlen); } OPENFILENAMEW dialog; @@ -264,14 +229,13 @@ void windows_ShowFileDialog(void *ptr) BOOL result = pGetAnyFileName(&dialog); - SDL_free(filter_wchar); SDL_free(title_w); if (result) { if (!(flags & OFN_ALLOWMULTISELECT)) { // File is a C string stored in dialog.lpstrFile char *chosen_file = WIN_StringToUTF8W(dialog.lpstrFile); - const char* opts[2] = { chosen_file, NULL }; + const char *opts[2] = { chosen_file, NULL }; callback(userdata, opts, getFilterIndex(dialog.nFilterIndex)); SDL_free(chosen_file); } else { @@ -400,7 +364,7 @@ void windows_ShowFileDialog(void *ptr) code to 0 after calling GetOpenFileName if another Windows function before set a different error code, so it's safe to check for success. */ - const char* opts[1] = { NULL }; + const char *opts[1] = { NULL }; callback(userdata, opts, getFilterIndex(dialog.nFilterIndex)); } else { SDL_SetError("Windows error, CommDlgExtendedError: %ld", pCommDlgExtendedError()); @@ -411,10 +375,10 @@ void windows_ShowFileDialog(void *ptr) SDL_free(filebuffer); } -int windows_file_dialog_thread(void* ptr) +int windows_file_dialog_thread(void *ptr) { windows_ShowFileDialog(ptr); - SDL_free(ptr); + freeWinArgs(ptr); return 0; } @@ -436,7 +400,7 @@ int CALLBACK browse_callback_proc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lp return 0; } -void windows_ShowFolderDialog(void* ptr) +void windows_ShowFolderDialog(void *ptr) { winFArgs *args = (winFArgs *) ptr; SDL_Window *window = args->parent; @@ -452,27 +416,11 @@ void windows_ShowFolderDialog(void* ptr) wchar_t *title_w = NULL; if (title) { - int title_len = (int) SDL_strlen(title); - - /* If the title is longer than 2GB, it might be exploitable. */ - if (title_len < 0) { - title_len = 0; - } - - int title_wlen = MultiByteToWideChar(CP_UTF8, 0, title, title_len, NULL, 0); - - if (title_wlen < 0) { - title_wlen = 0; - } - - title_w = (wchar_t *)SDL_malloc(title_wlen * sizeof(wchar_t)); - + title_w = WIN_UTF8ToStringW(title); if (!title_w) { callback(userdata, NULL, -1); return; } - - MultiByteToWideChar(CP_UTF8, 0, title, title_len, title_w, title_wlen); } wchar_t buffer[MAX_PATH]; @@ -503,17 +451,56 @@ void windows_ShowFolderDialog(void* ptr) } } -int windows_folder_dialog_thread(void* ptr) +int windows_folder_dialog_thread(void *ptr) { windows_ShowFolderDialog(ptr); - SDL_free(ptr); + freeWinFArgs((winFArgs *)ptr); return 0; } -static void ShowFileDialog(SDL_DialogFileCallback callback, void* userdata, SDL_Window* window, const SDL_DialogFileFilter *filters, int nfilters, const char* default_location, bool allow_many, bool is_save, const char* title, const char* accept, const char* cancel) +wchar_t *win_get_filters(const SDL_DialogFileFilter *filters, int nfilters) +{ + wchar_t *filter_wchar = NULL; + + if (filters) { + // '\x01' is used in place of a null byte + // suffix needs two null bytes in case the filter list is empty + char *filterlist = convert_filters(filters, nfilters, clear_filt_names, + "", "", "\x01\x01", "", "\x01", + "\x01", "*.", ";*.", ""); + + if (!filterlist) { + return NULL; + } + + int filter_len = (int)SDL_strlen(filterlist); + + for (char *c = filterlist; *c; c++) { + if (*c == '\x01') { + *c = '\0'; + } + } + + int filter_wlen = MultiByteToWideChar(CP_UTF8, 0, filterlist, filter_len, NULL, 0); + filter_wchar = (wchar_t *)SDL_malloc(filter_wlen * sizeof(wchar_t)); + if (!filter_wchar) { + SDL_free(filterlist); + return NULL; + } + + MultiByteToWideChar(CP_UTF8, 0, filterlist, filter_len, filter_wchar, filter_wlen); + + SDL_free(filterlist); + } + + return filter_wchar; +} + +static void ShowFileDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const SDL_DialogFileFilter *filters, int nfilters, const char *default_location, bool allow_many, bool is_save, const char *title, const char *accept, const char *cancel) { winArgs *args; SDL_Thread *thread; + wchar_t *filters_str; if (SDL_GetHint(SDL_HINT_FILE_DIALOG_DRIVER) != NULL) { SDL_SetError("File dialog driver unsupported"); @@ -527,30 +514,38 @@ static void ShowFileDialog(SDL_DialogFileCallback callback, void* userdata, SDL_ return; } + filters_str = win_get_filters(filters, nfilters); + + if (!filters_str && filters) { + callback(userdata, NULL, -1); + SDL_free(args); + return; + } + args->is_save = is_save; - args->filters = filters; - args->nfilters = nfilters; - args->default_file = default_location; + args->filters_str = filters_str; + args->default_file = default_location ? SDL_strdup(default_location) : NULL; args->parent = window; args->flags = allow_many ? OFN_ALLOWMULTISELECT : 0; args->callback = callback; args->userdata = userdata; - args->title = title; - args->accept = accept; - args->cancel = cancel; + args->title = title ? SDL_strdup(title) : NULL; + args->accept = accept ? SDL_strdup(accept) : NULL; + args->cancel = cancel ? SDL_strdup(cancel) : NULL; thread = SDL_CreateThread(windows_file_dialog_thread, "SDL_Windows_ShowFileDialog", (void *) args); if (thread == NULL) { callback(userdata, NULL, -1); - SDL_free(args); + // The thread won't have run, therefore the data won't have been freed + freeWinArgs(args); return; } SDL_DetachThread(thread); } -void ShowFolderDialog(SDL_DialogFileCallback callback, void* userdata, SDL_Window* window, const char* default_location, bool allow_many, const char* title, const char* accept, const char* cancel) +void ShowFolderDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const char *default_location, bool allow_many, const char *title, const char *accept, const char *cancel) { winFArgs *args; SDL_Thread *thread; @@ -569,17 +564,18 @@ void ShowFolderDialog(SDL_DialogFileCallback callback, void* userdata, SDL_Windo args->parent = window; args->callback = callback; - args->default_folder = default_location; + args->default_folder = default_location ? SDL_strdup(default_location) : NULL; args->userdata = userdata; - args->title = title; - args->accept = accept; - args->cancel = cancel; + args->title = title ? SDL_strdup(title) : NULL; + args->accept = accept ? SDL_strdup(accept) : NULL; + args->cancel = cancel ? SDL_strdup(cancel) : NULL; thread = SDL_CreateThread(windows_folder_dialog_thread, "SDL_Windows_ShowFolderDialog", (void *) args); if (thread == NULL) { callback(userdata, NULL, -1); - SDL_free(args); + // The thread won't have run, therefore the data won't have been freed + freeWinFArgs(args); return; } @@ -590,14 +586,14 @@ void SDL_SYS_ShowFileDialogWithProperties(SDL_FileDialogType type, SDL_DialogFil { /* The internal functions will start threads, and the properties may be freed as soon as this function returns. Save a copy of what we need before invoking the functions and starting the threads. */ - SDL_Window* window = SDL_GetPointerProperty(props, SDL_PROP_FILE_DIALOG_WINDOW_POINTER, NULL); + SDL_Window *window = SDL_GetPointerProperty(props, SDL_PROP_FILE_DIALOG_WINDOW_POINTER, NULL); SDL_DialogFileFilter *filters = SDL_GetPointerProperty(props, SDL_PROP_FILE_DIALOG_FILTERS_POINTER, NULL); int nfilters = (int) SDL_GetNumberProperty(props, SDL_PROP_FILE_DIALOG_NFILTERS_NUMBER, 0); bool allow_many = SDL_GetBooleanProperty(props, SDL_PROP_FILE_DIALOG_MANY_BOOLEAN, false); - const char* default_location = SDL_GetStringProperty(props, SDL_PROP_FILE_DIALOG_LOCATION_STRING, NULL); - const char* title = SDL_GetStringProperty(props, SDL_PROP_FILE_DIALOG_TITLE_STRING, NULL); - const char* accept = SDL_GetStringProperty(props, SDL_PROP_FILE_DIALOG_ACCEPT_STRING, NULL); - const char* cancel = SDL_GetStringProperty(props, SDL_PROP_FILE_DIALOG_CANCEL_STRING, NULL); + const char *default_location = SDL_GetStringProperty(props, SDL_PROP_FILE_DIALOG_LOCATION_STRING, NULL); + const char *title = SDL_GetStringProperty(props, SDL_PROP_FILE_DIALOG_TITLE_STRING, NULL); + const char *accept = SDL_GetStringProperty(props, SDL_PROP_FILE_DIALOG_ACCEPT_STRING, NULL); + const char *cancel = SDL_GetStringProperty(props, SDL_PROP_FILE_DIALOG_CANCEL_STRING, NULL); bool is_save = false; switch (type) { diff --git a/libs/SDL3/src/dynapi/SDL_dynapi.c b/libs/SDL3/src/dynapi/SDL_dynapi.c index fa6872e3..f35f3e8b 100644 --- a/libs/SDL3/src/dynapi/SDL_dynapi.c +++ b/libs/SDL3/src/dynapi/SDL_dynapi.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -520,6 +520,9 @@ static void SDL_InitDynamicAPILocked(void) if (initialize_jumptable(SDL_DYNAPI_VERSION, &jump_table, sizeof(jump_table)) < 0) { // Now we're screwed. Should definitely abort now. dynapi_warn("Failed to initialize internal SDL dynapi. As this would otherwise crash, we have to abort now."); +#ifndef NDEBUG + SDL_TriggerBreakpoint(); +#endif SDL_ExitProcess(86); } } diff --git a/libs/SDL3/src/dynapi/SDL_dynapi.h b/libs/SDL3/src/dynapi/SDL_dynapi.h index e03882e7..99ef9a9e 100644 --- a/libs/SDL3/src/dynapi/SDL_dynapi.h +++ b/libs/SDL3/src/dynapi/SDL_dynapi.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/dynapi/SDL_dynapi.sym b/libs/SDL3/src/dynapi/SDL_dynapi.sym index 47ddb603..b4dcc383 100644 --- a/libs/SDL3/src/dynapi/SDL_dynapi.sym +++ b/libs/SDL3/src/dynapi/SDL_dynapi.sym @@ -974,7 +974,6 @@ SDL3_0.0.0 { SDL_WaitEventTimeout; SDL_WaitForGPUFences; SDL_WaitForGPUIdle; - SDL_WaitForGPUSwapchain; SDL_WaitProcess; SDL_WaitSemaphore; SDL_WaitSemaphoreTimeout; @@ -1206,6 +1205,7 @@ SDL3_0.0.0 { SDL_RunOnMainThread; SDL_SetGPUAllowedFramesInFlight; SDL_RenderTextureAffine; + SDL_WaitForGPUSwapchain; SDL_WaitAndAcquireGPUSwapchainTexture; SDL_RenderDebugTextFormat; SDL_CreateTray; @@ -1230,6 +1230,9 @@ SDL3_0.0.0 { SDL_GetTrayMenuParentEntry; SDL_GetTrayMenuParentTray; SDL_GetThreadState; + SDL_AudioStreamDevicePaused; + SDL_ClickTrayEntry; + SDL_UpdateTrays; # extra symbols go here (don't modify this line) local: *; }; diff --git a/libs/SDL3/src/dynapi/SDL_dynapi_overrides.h b/libs/SDL3/src/dynapi/SDL_dynapi_overrides.h index cf47d1c9..d90b6fd0 100644 --- a/libs/SDL3/src/dynapi/SDL_dynapi_overrides.h +++ b/libs/SDL3/src/dynapi/SDL_dynapi_overrides.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -999,7 +999,6 @@ #define SDL_WaitEventTimeout SDL_WaitEventTimeout_REAL #define SDL_WaitForGPUFences SDL_WaitForGPUFences_REAL #define SDL_WaitForGPUIdle SDL_WaitForGPUIdle_REAL -#define SDL_WaitForGPUSwapchain SDL_WaitForGPUSwapchain_REAL #define SDL_WaitProcess SDL_WaitProcess_REAL #define SDL_WaitSemaphore SDL_WaitSemaphore_REAL #define SDL_WaitSemaphoreTimeout SDL_WaitSemaphoreTimeout_REAL @@ -1231,6 +1230,7 @@ #define SDL_RunOnMainThread SDL_RunOnMainThread_REAL #define SDL_SetGPUAllowedFramesInFlight SDL_SetGPUAllowedFramesInFlight_REAL #define SDL_RenderTextureAffine SDL_RenderTextureAffine_REAL +#define SDL_WaitForGPUSwapchain SDL_WaitForGPUSwapchain_REAL #define SDL_WaitAndAcquireGPUSwapchainTexture SDL_WaitAndAcquireGPUSwapchainTexture_REAL #define SDL_RenderDebugTextFormat SDL_RenderDebugTextFormat_REAL #define SDL_CreateTray SDL_CreateTray_REAL @@ -1255,3 +1255,6 @@ #define SDL_GetTrayMenuParentEntry SDL_GetTrayMenuParentEntry_REAL #define SDL_GetTrayMenuParentTray SDL_GetTrayMenuParentTray_REAL #define SDL_GetThreadState SDL_GetThreadState_REAL +#define SDL_AudioStreamDevicePaused SDL_AudioStreamDevicePaused_REAL +#define SDL_ClickTrayEntry SDL_ClickTrayEntry_REAL +#define SDL_UpdateTrays SDL_UpdateTrays_REAL diff --git a/libs/SDL3/src/dynapi/SDL_dynapi_procs.h b/libs/SDL3/src/dynapi/SDL_dynapi_procs.h index 01f6a4de..e57603d1 100644 --- a/libs/SDL3/src/dynapi/SDL_dynapi_procs.h +++ b/libs/SDL3/src/dynapi/SDL_dynapi_procs.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -67,7 +67,7 @@ SDL_DYNAPI_PROC(SDL_GPUComputePass*,SDL_BeginGPUComputePass,(SDL_GPUCommandBuffe SDL_DYNAPI_PROC(SDL_GPUCopyPass*,SDL_BeginGPUCopyPass,(SDL_GPUCommandBuffer *a),(a),return) SDL_DYNAPI_PROC(SDL_GPURenderPass*,SDL_BeginGPURenderPass,(SDL_GPUCommandBuffer *a, const SDL_GPUColorTargetInfo *b, Uint32 c, const SDL_GPUDepthStencilTargetInfo *d),(a,b,c,d),return) SDL_DYNAPI_PROC(bool,SDL_BindAudioStream,(SDL_AudioDeviceID a, SDL_AudioStream *b),(a,b),return) -SDL_DYNAPI_PROC(bool,SDL_BindAudioStreams,(SDL_AudioDeviceID a, SDL_AudioStream **b, int c),(a,b,c),return) +SDL_DYNAPI_PROC(bool,SDL_BindAudioStreams,(SDL_AudioDeviceID a, SDL_AudioStream * const *b, int c),(a,b,c),return) SDL_DYNAPI_PROC(void,SDL_BindGPUComputePipeline,(SDL_GPUComputePass *a, SDL_GPUComputePipeline *b),(a,b),) SDL_DYNAPI_PROC(void,SDL_BindGPUComputeSamplers,(SDL_GPUComputePass *a, Uint32 b, const SDL_GPUTextureSamplerBinding *c, Uint32 d),(a,b,c,d),) SDL_DYNAPI_PROC(void,SDL_BindGPUComputeStorageBuffers,(SDL_GPUComputePass *a, Uint32 b, SDL_GPUBuffer *const *c, Uint32 d),(a,b,c,d),) @@ -972,7 +972,7 @@ SDL_DYNAPI_PROC(bool,SDL_TryLockSpinlock,(SDL_SpinLock *a),(a),return) SDL_DYNAPI_PROC(bool,SDL_TryWaitSemaphore,(SDL_Semaphore *a),(a),return) SDL_DYNAPI_PROC(char*,SDL_UCS4ToUTF8,(Uint32 a, char *b),(a,b),return) SDL_DYNAPI_PROC(void,SDL_UnbindAudioStream,(SDL_AudioStream *a),(a),) -SDL_DYNAPI_PROC(void,SDL_UnbindAudioStreams,(SDL_AudioStream **a, int b),(a,b),) +SDL_DYNAPI_PROC(void,SDL_UnbindAudioStreams,(SDL_AudioStream * const *a, int b),(a,b),) SDL_DYNAPI_PROC(void,SDL_UnloadObject,(SDL_SharedObject *a),(a),) SDL_DYNAPI_PROC(bool,SDL_UnlockAudioStream,(SDL_AudioStream *a),(a),return) SDL_DYNAPI_PROC(void,SDL_UnlockJoysticks,(void),(),) @@ -1009,7 +1009,6 @@ SDL_DYNAPI_PROC(bool,SDL_WaitEvent,(SDL_Event *a),(a),return) SDL_DYNAPI_PROC(bool,SDL_WaitEventTimeout,(SDL_Event *a, Sint32 b),(a,b),return) SDL_DYNAPI_PROC(bool,SDL_WaitForGPUFences,(SDL_GPUDevice *a, bool b, SDL_GPUFence *const *c, Uint32 d),(a,b,c,d),return) SDL_DYNAPI_PROC(bool,SDL_WaitForGPUIdle,(SDL_GPUDevice *a),(a),return) -SDL_DYNAPI_PROC(bool,SDL_WaitForGPUSwapchain,(SDL_GPUDevice *a, SDL_Window *b),(a,b),return) SDL_DYNAPI_PROC(bool,SDL_WaitProcess,(SDL_Process *a, bool b, int *c),(a,b,c),return) SDL_DYNAPI_PROC(void,SDL_WaitSemaphore,(SDL_Semaphore *a),(a),) SDL_DYNAPI_PROC(bool,SDL_WaitSemaphoreTimeout,(SDL_Semaphore *a, Sint32 b),(a,b),return) @@ -1237,6 +1236,7 @@ SDL_DYNAPI_PROC(bool,SDL_IsMainThread,(void),(),return) SDL_DYNAPI_PROC(bool,SDL_RunOnMainThread,(SDL_MainThreadCallback a,void *b,bool c),(a,b,c),return) SDL_DYNAPI_PROC(bool,SDL_SetGPUAllowedFramesInFlight,(SDL_GPUDevice *a,Uint32 b),(a,b),return) SDL_DYNAPI_PROC(bool,SDL_RenderTextureAffine,(SDL_Renderer *a,SDL_Texture *b,const SDL_FRect *c,const SDL_FPoint *d,const SDL_FPoint *e,const SDL_FPoint *f),(a,b,c,d,e,f),return) +SDL_DYNAPI_PROC(bool,SDL_WaitForGPUSwapchain,(SDL_GPUDevice *a, SDL_Window *b),(a,b),return) SDL_DYNAPI_PROC(bool,SDL_WaitAndAcquireGPUSwapchainTexture,(SDL_GPUCommandBuffer *a,SDL_Window *b,SDL_GPUTexture **c,Uint32 *d,Uint32 *e),(a,b,c,d,e),return) #ifndef SDL_DYNAPI_PROC_NO_VARARGS SDL_DYNAPI_PROC(bool,SDL_RenderDebugTextFormat,(SDL_Renderer *a,float b,float c,SDL_PRINTF_FORMAT_STRING const char *d,...),(a,b,c,d),return) @@ -1263,3 +1263,6 @@ SDL_DYNAPI_PROC(SDL_TrayMenu*,SDL_GetTrayEntryParent,(SDL_TrayEntry *a),(a),retu SDL_DYNAPI_PROC(SDL_TrayEntry*,SDL_GetTrayMenuParentEntry,(SDL_TrayMenu *a),(a),return) SDL_DYNAPI_PROC(SDL_Tray*,SDL_GetTrayMenuParentTray,(SDL_TrayMenu *a),(a),return) SDL_DYNAPI_PROC(SDL_ThreadState,SDL_GetThreadState,(SDL_Thread *a),(a),return) +SDL_DYNAPI_PROC(bool,SDL_AudioStreamDevicePaused,(SDL_AudioStream *a),(a),return) +SDL_DYNAPI_PROC(void,SDL_ClickTrayEntry,(SDL_TrayEntry *a),(a),) +SDL_DYNAPI_PROC(void,SDL_UpdateTrays,(void),(),) diff --git a/libs/SDL3/src/dynapi/SDL_dynapi_unsupported.h b/libs/SDL3/src/dynapi/SDL_dynapi_unsupported.h index 780e6d6b..143943ab 100644 --- a/libs/SDL3/src/dynapi/SDL_dynapi_unsupported.h +++ b/libs/SDL3/src/dynapi/SDL_dynapi_unsupported.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/dynapi/gendynapi.py b/libs/SDL3/src/dynapi/gendynapi.py index c780dac6..09155231 100644 --- a/libs/SDL3/src/dynapi/gendynapi.py +++ b/libs/SDL3/src/dynapi/gendynapi.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # Simple DirectMedia Layer -# Copyright (C) 1997-2024 Sam Lantinga +# Copyright (C) 1997-2025 Sam Lantinga # # This software is provided 'as-is', without any express or implied # warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/SDL_categories.c b/libs/SDL3/src/events/SDL_categories.c index 5f085347..cb41f6fe 100644 --- a/libs/SDL3/src/events/SDL_categories.c +++ b/libs/SDL3/src/events/SDL_categories.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -136,6 +136,7 @@ SDL_EventCategory SDL_GetEventCategory(Uint32 type) case SDL_EVENT_FINGER_DOWN: case SDL_EVENT_FINGER_UP: + case SDL_EVENT_FINGER_CANCELED: case SDL_EVENT_FINGER_MOTION: return SDL_EVENTCATEGORY_TFINGER; diff --git a/libs/SDL3/src/events/SDL_categories_c.h b/libs/SDL3/src/events/SDL_categories_c.h index 1f72c2aa..31d926a2 100644 --- a/libs/SDL3/src/events/SDL_categories_c.h +++ b/libs/SDL3/src/events/SDL_categories_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/SDL_clipboardevents.c b/libs/SDL3/src/events/SDL_clipboardevents.c index 95245e19..96bfd041 100644 --- a/libs/SDL3/src/events/SDL_clipboardevents.c +++ b/libs/SDL3/src/events/SDL_clipboardevents.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -24,9 +24,16 @@ #include "SDL_events_c.h" #include "SDL_clipboardevents_c.h" +#include "../video/SDL_clipboard_c.h" -void SDL_SendClipboardUpdate(bool owner, char **mime_types, size_t n_mime_types) +void SDL_SendClipboardUpdate(bool owner, char **mime_types, size_t num_mime_types) { + if (!owner) { + // Clear our internal clipboard contents when external clipboard is set + SDL_CancelClipboardData(0); + SDL_SaveClipboardMimeTypes((const char **)mime_types, num_mime_types); + } + if (SDL_EventEnabled(SDL_EVENT_CLIPBOARD_UPDATE)) { SDL_Event event; event.type = SDL_EVENT_CLIPBOARD_UPDATE; @@ -35,7 +42,7 @@ void SDL_SendClipboardUpdate(bool owner, char **mime_types, size_t n_mime_types) cevent->timestamp = 0; cevent->owner = owner; cevent->mime_types = (const char **)mime_types; - cevent->n_mime_types = (Uint32)n_mime_types; + cevent->num_mime_types = (Uint32)num_mime_types; SDL_PushEvent(&event); } } diff --git a/libs/SDL3/src/events/SDL_clipboardevents_c.h b/libs/SDL3/src/events/SDL_clipboardevents_c.h index 140cc482..0b0f6288 100644 --- a/libs/SDL3/src/events/SDL_clipboardevents_c.h +++ b/libs/SDL3/src/events/SDL_clipboardevents_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -23,6 +23,6 @@ #ifndef SDL_clipboardevents_c_h_ #define SDL_clipboardevents_c_h_ -extern void SDL_SendClipboardUpdate(bool owner, char **mime_types, size_t n_mime_types); +extern void SDL_SendClipboardUpdate(bool owner, char **mime_types, size_t num_mime_types); #endif // SDL_clipboardevents_c_h_ diff --git a/libs/SDL3/src/events/SDL_displayevents.c b/libs/SDL3/src/events/SDL_displayevents.c index b736fd4a..e41f75cc 100644 --- a/libs/SDL3/src/events/SDL_displayevents.c +++ b/libs/SDL3/src/events/SDL_displayevents.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/SDL_displayevents_c.h b/libs/SDL3/src/events/SDL_displayevents_c.h index 497b50b1..ae0730c7 100644 --- a/libs/SDL3/src/events/SDL_displayevents_c.h +++ b/libs/SDL3/src/events/SDL_displayevents_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/SDL_dropevents.c b/libs/SDL3/src/events/SDL_dropevents.c index 22388f36..661f4f3e 100644 --- a/libs/SDL3/src/events/SDL_dropevents.c +++ b/libs/SDL3/src/events/SDL_dropevents.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/SDL_dropevents_c.h b/libs/SDL3/src/events/SDL_dropevents_c.h index 5dbdcf85..efce0ac0 100644 --- a/libs/SDL3/src/events/SDL_dropevents_c.h +++ b/libs/SDL3/src/events/SDL_dropevents_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/SDL_events.c b/libs/SDL3/src/events/SDL_events.c index bc04ee91..ca11afff 100644 --- a/libs/SDL3/src/events/SDL_events.c +++ b/libs/SDL3/src/events/SDL_events.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -705,6 +705,9 @@ static void SDL_LogEvent(const SDL_Event *event) SDL_EVENT_CASE(SDL_EVENT_FINGER_UP) PRINT_FINGER_EVENT(event); break; + SDL_EVENT_CASE(SDL_EVENT_FINGER_CANCELED) + PRINT_FINGER_EVENT(event); + break; SDL_EVENT_CASE(SDL_EVENT_FINGER_MOTION) PRINT_FINGER_EVENT(event); break; @@ -1351,6 +1354,35 @@ bool SDL_RunOnMainThread(SDL_MainThreadCallback callback, void *userdata, bool w } } +void SDL_PumpEventMaintenance(void) +{ +#ifndef SDL_AUDIO_DISABLED + SDL_UpdateAudio(); +#endif + +#ifndef SDL_CAMERA_DISABLED + SDL_UpdateCamera(); +#endif + +#ifndef SDL_SENSOR_DISABLED + // Check for sensor state change + if (SDL_update_sensors) { + SDL_UpdateSensors(); + } +#endif + +#ifndef SDL_JOYSTICK_DISABLED + // Check for joystick state change + if (SDL_update_joysticks) { + SDL_UpdateJoysticks(); + } +#endif + + SDL_UpdateTrays(); + + SDL_SendPendingSignalEvents(); // in case we had a signal handler fire, etc. +} + // Run the system dependent event loops static void SDL_PumpEventsInternal(bool push_sentinel) { @@ -1374,29 +1406,7 @@ static void SDL_PumpEventsInternal(bool push_sentinel) } #endif -#ifndef SDL_AUDIO_DISABLED - SDL_UpdateAudio(); -#endif - -#ifndef SDL_CAMERA_DISABLED - SDL_UpdateCamera(); -#endif - -#ifndef SDL_SENSOR_DISABLED - // Check for sensor state change - if (SDL_update_sensors) { - SDL_UpdateSensors(); - } -#endif - -#ifndef SDL_JOYSTICK_DISABLED - // Check for joystick state change - if (SDL_update_joysticks) { - SDL_UpdateJoysticks(); - } -#endif - - SDL_SendPendingSignalEvents(); // in case we had a signal handler fire, etc. + SDL_PumpEventMaintenance(); if (push_sentinel && SDL_EventEnabled(SDL_EVENT_POLL_SENTINEL)) { SDL_Event sentinel; diff --git a/libs/SDL3/src/events/SDL_events_c.h b/libs/SDL3/src/events/SDL_events_c.h index d8f86eb3..e56ac475 100644 --- a/libs/SDL3/src/events/SDL_events_c.h +++ b/libs/SDL3/src/events/SDL_events_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -51,6 +51,8 @@ extern const char *SDL_CreateTemporaryString(const char *string); extern void *SDL_ClaimTemporaryMemory(const void *mem); extern void SDL_FreeTemporaryMemory(void); +extern void SDL_PumpEventMaintenance(void); + extern void SDL_SendQuit(void); extern bool SDL_InitEvents(void); diff --git a/libs/SDL3/src/events/SDL_keyboard.c b/libs/SDL3/src/events/SDL_keyboard.c index a7f5c084..e4664fba 100644 --- a/libs/SDL3/src/events/SDL_keyboard.c +++ b/libs/SDL3/src/events/SDL_keyboard.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -26,7 +26,9 @@ #include "SDL_keymap_c.h" #include "../video/SDL_sysvideo.h" -// #define DEBUG_KEYBOARD +#if 0 +#define DEBUG_KEYBOARD +#endif // Global keyboard information @@ -160,7 +162,7 @@ void SDL_RemoveKeyboard(SDL_KeyboardID keyboardID, bool send_event) SDL_free(SDL_keyboards[keyboard_index].name); if (keyboard_index != SDL_keyboard_count - 1) { - SDL_memcpy(&SDL_keyboards[keyboard_index], &SDL_keyboards[keyboard_index + 1], (SDL_keyboard_count - keyboard_index - 1) * sizeof(SDL_keyboards[keyboard_index])); + SDL_memmove(&SDL_keyboards[keyboard_index], &SDL_keyboards[keyboard_index + 1], (SDL_keyboard_count - keyboard_index - 1) * sizeof(SDL_keyboards[keyboard_index])); } --SDL_keyboard_count; @@ -206,6 +208,7 @@ const char *SDL_GetKeyboardNameForID(SDL_KeyboardID instance_id) { int keyboard_index = SDL_GetKeyboardIndex(instance_id); if (keyboard_index < 0) { + SDL_SetError("Keyboard %" SDL_PRIu32 " not found", instance_id); return NULL; } return SDL_GetPersistentString(SDL_keyboards[keyboard_index].name); @@ -217,7 +220,7 @@ void SDL_ResetKeyboard(void) int scancode; #ifdef DEBUG_KEYBOARD - printf("Resetting keyboard\n"); + SDL_Log("Resetting keyboard\n"); #endif for (scancode = SDL_SCANCODE_UNKNOWN; scancode < SDL_SCANCODE_COUNT; ++scancode) { if (keyboard->keystate[scancode]) { @@ -514,7 +517,7 @@ static bool SDL_SendKeyboardKeyInternal(Uint64 timestamp, Uint32 flags, SDL_Keyb const Uint8 source = flags & KEYBOARD_SOURCE_MASK; #ifdef DEBUG_KEYBOARD - printf("The '%s' key has been %s\n", SDL_GetScancodeName(scancode), down ? "pressed" : "released"); + SDL_Log("The '%s' key has been %s\n", SDL_GetScancodeName(scancode), down ? "pressed" : "released"); #endif // Figure out what type of event this is diff --git a/libs/SDL3/src/events/SDL_keyboard_c.h b/libs/SDL3/src/events/SDL_keyboard_c.h index 4023822f..ddfb5c57 100644 --- a/libs/SDL3/src/events/SDL_keyboard_c.h +++ b/libs/SDL3/src/events/SDL_keyboard_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/SDL_keymap.c b/libs/SDL3/src/events/SDL_keymap.c index d48b0378..5c3f784c 100644 --- a/libs/SDL3/src/events/SDL_keymap.c +++ b/libs/SDL3/src/events/SDL_keymap.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -50,8 +50,8 @@ SDL_Keymap *SDL_CreateKeymap(void) static SDL_Keymod NormalizeModifierStateForKeymap(SDL_Keymod modstate) { - // The modifiers that affect the keymap are: SHIFT, CAPS, ALT, and MODE - modstate &= (SDL_KMOD_SHIFT | SDL_KMOD_CAPS | SDL_KMOD_ALT | SDL_KMOD_MODE); + // The modifiers that affect the keymap are: SHIFT, CAPS, ALT, MODE, and LEVEL5 + modstate &= (SDL_KMOD_SHIFT | SDL_KMOD_CAPS | SDL_KMOD_ALT | SDL_KMOD_MODE | SDL_KMOD_LEVEL5); // If either right or left Shift are set, set both in the output if (modstate & SDL_KMOD_SHIFT) { @@ -189,6 +189,18 @@ static const SDL_Keycode shifted_default_symbols[] = { SDLK_QUESTION }; +static const struct +{ + SDL_Keycode keycode; + SDL_Scancode scancode; +} extended_default_symbols[] = { + { SDLK_LEFT_TAB, SDL_SCANCODE_TAB }, + { SDLK_MULTI_KEY_COMPOSE, SDL_SCANCODE_APPLICATION }, // Sun keyboards + { SDLK_LMETA, SDL_SCANCODE_LGUI }, + { SDLK_RMETA, SDL_SCANCODE_RGUI }, + { SDLK_RHYPER, SDL_SCANCODE_APPLICATION } +}; + static SDL_Keycode SDL_GetDefaultKeyFromScancode(SDL_Scancode scancode, SDL_Keymod modstate) { if (((int)scancode) < SDL_SCANCODE_UNKNOWN || scancode >= SDL_SCANCODE_COUNT) { @@ -600,6 +612,16 @@ static SDL_Scancode SDL_GetDefaultScancodeFromKey(SDL_Keycode key, SDL_Keymod *m return SDL_SCANCODE_UNKNOWN; } + if (key & SDLK_EXTENDED_MASK) { + for (int i = 0; i < SDL_arraysize(extended_default_symbols); ++i) { + if (extended_default_symbols[i].keycode == key) { + return extended_default_symbols[i].scancode; + } + } + + return SDL_SCANCODE_UNKNOWN; + } + if (key & SDLK_SCANCODE_MASK) { return (SDL_Scancode)(key & ~SDLK_SCANCODE_MASK); } @@ -932,6 +954,16 @@ static const char *SDL_scancode_names[SDL_SCANCODE_COUNT] = /* 290 */ "EndCall", }; +static const char *SDL_extended_key_names[] = { + "LeftTab", /* 0x01 SDLK_LEFT_TAB */ + "Level5Shift", /* 0x02 SDLK_LEVEL5_SHIFT */ + "MultiKeyCompose", /* 0x03 SDLK_MULTI_KEY_COMPOSE */ + "Left Meta", /* 0x04 SDLK_LMETA */ + "Right Meta", /* 0x05 SDLK_RMETA */ + "Left Hyper", /* 0x06 SDLK_LHYPER */ + "Right Hyper" /* 0x07 SDLK_RHYPER */ +}; + bool SDL_SetScancodeName(SDL_Scancode scancode, const char *name) { if (((int)scancode) < SDL_SCANCODE_UNKNOWN || scancode >= SDL_SCANCODE_COUNT) { @@ -990,6 +1022,17 @@ const char *SDL_GetKeyName(SDL_Keycode key) return SDL_GetScancodeName((SDL_Scancode)(key & ~SDLK_SCANCODE_MASK)); } + if (key & SDLK_EXTENDED_MASK) { + const SDL_Keycode idx = (key & ~SDLK_EXTENDED_MASK); + if (idx > 0 && (idx - 1) < SDL_arraysize(SDL_extended_key_names)) { + return SDL_extended_key_names[idx - 1]; + } + + // Key out of name index bounds. + SDL_InvalidParamError("key"); + return ""; + } + switch (key) { case SDLK_RETURN: return SDL_GetScancodeName(SDL_SCANCODE_RETURN); @@ -1080,12 +1123,19 @@ SDL_Keycode SDL_GetKeyFromName(const char *name) SDL_Keymap *keymap = SDL_GetCurrentKeymap(); SDL_Keymod modstate; SDL_Scancode scancode = SDL_GetKeymapScancode(keymap, key, &modstate); - if (scancode != SDL_SCANCODE_UNKNOWN && (modstate & SDL_KMOD_SHIFT)) { + if (scancode != SDL_SCANCODE_UNKNOWN && (modstate & (SDL_KMOD_SHIFT | SDL_KMOD_CAPS))) { key = SDL_GetKeymapKeycode(keymap, scancode, SDL_KMOD_NONE); } } return key; } + // Check the extended key names + for (SDL_Keycode i = 0; i < SDL_arraysize(SDL_extended_key_names); ++i) { + if (SDL_strcasecmp(name, SDL_extended_key_names[i]) == 0) { + return (i + 1) | SDLK_EXTENDED_MASK; + } + } + return SDL_GetKeyFromScancode(SDL_GetScancodeFromName(name), SDL_KMOD_NONE, false); } diff --git a/libs/SDL3/src/events/SDL_keymap_c.h b/libs/SDL3/src/events/SDL_keymap_c.h index 1f8cff46..9c803978 100644 --- a/libs/SDL3/src/events/SDL_keymap_c.h +++ b/libs/SDL3/src/events/SDL_keymap_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/SDL_keysym_to_keycode.c b/libs/SDL3/src/events/SDL_keysym_to_keycode.c new file mode 100644 index 00000000..7cbfcb62 --- /dev/null +++ b/libs/SDL3/src/events/SDL_keysym_to_keycode.c @@ -0,0 +1,68 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "SDL_internal.h" + +#if defined(SDL_VIDEO_DRIVER_WAYLAND) || defined(SDL_VIDEO_DRIVER_X11) + +#include "SDL_keyboard_c.h" +#include "SDL_keysym_to_scancode_c.h" +#include "imKStoUCS.h" + + +// Extended key code mappings +static const struct +{ + Uint32 keysym; + SDL_Keycode keycode; +} keysym_to_keycode_table[] = { + { 0xfe03, SDLK_MODE }, // XK_ISO_Level3_Shift + { 0xfe11, SDLK_LEVEL5_SHIFT }, // XK_ISO_Level5_Shift + { 0xfe20, SDLK_LEFT_TAB }, // XK_ISO_Left_Tab + { 0xff20, SDLK_MULTI_KEY_COMPOSE }, // XK_Multi_key + { 0xffe7, SDLK_LMETA }, // XK_Meta_L + { 0xffe8, SDLK_RMETA }, // XK_Meta_R + { 0xffed, SDLK_LHYPER }, // XK_Hyper_L + { 0xffee, SDLK_RHYPER }, // XK_Hyper_R +}; + +SDL_Keycode SDL_GetKeyCodeFromKeySym(Uint32 keysym, Uint32 keycode, SDL_Keymod modifiers) +{ + SDL_Keycode sdl_keycode = SDL_KeySymToUcs4(keysym); + + if (!sdl_keycode) { + for (int i = 0; i < SDL_arraysize(keysym_to_keycode_table); ++i) { + if (keysym == keysym_to_keycode_table[i].keysym) { + return keysym_to_keycode_table[i].keycode; + } + } + } + + if (!sdl_keycode) { + const SDL_Scancode scancode = SDL_GetScancodeFromKeySym(keysym, keycode); + if (scancode != SDL_SCANCODE_UNKNOWN) { + sdl_keycode = SDL_GetKeymapKeycode(NULL, scancode, modifiers); + } + } + + return sdl_keycode; +} + +#endif // SDL_VIDEO_DRIVER_WAYLAND || SDL_VIDEO_DRIVER_X11 diff --git a/libs/SDL3/src/events/SDL_keysym_to_keycode_c.h b/libs/SDL3/src/events/SDL_keysym_to_keycode_c.h new file mode 100644 index 00000000..2321d202 --- /dev/null +++ b/libs/SDL3/src/events/SDL_keysym_to_keycode_c.h @@ -0,0 +1,28 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_keysym_to_keycode_c_h_ +#define SDL_keysym_to_keycode_c_h_ + +// Convert a keysym to an SDL key code +extern SDL_Keycode SDL_GetKeyCodeFromKeySym(Uint32 keysym, Uint32 keycode, SDL_Keymod modifiers); + +#endif // SDL_keysym_to_scancode_c_h_ diff --git a/libs/SDL3/src/events/SDL_keysym_to_scancode.c b/libs/SDL3/src/events/SDL_keysym_to_scancode.c index e80b6f6d..8d43ca35 100644 --- a/libs/SDL3/src/events/SDL_keysym_to_scancode.c +++ b/libs/SDL3/src/events/SDL_keysym_to_scancode.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -45,6 +45,7 @@ static const struct { { 0xFF62, SDL_SCANCODE_EXECUTE }, // XK_Execute { 0xFFEE, SDL_SCANCODE_APPLICATION }, // XK_Hyper_R { 0xFE03, SDL_SCANCODE_RALT }, // XK_ISO_Level3_Shift + { 0xFE20, SDL_SCANCODE_TAB }, // XK_ISO_Left_Tab { 0xFFEB, SDL_SCANCODE_LGUI }, // XK_Super_L { 0xFFEC, SDL_SCANCODE_RGUI }, // XK_Super_R { 0xFF7E, SDL_SCANCODE_MODE }, // XK_Mode_switch diff --git a/libs/SDL3/src/events/SDL_keysym_to_scancode_c.h b/libs/SDL3/src/events/SDL_keysym_to_scancode_c.h index 2d504145..8d0e2143 100644 --- a/libs/SDL3/src/events/SDL_keysym_to_scancode_c.h +++ b/libs/SDL3/src/events/SDL_keysym_to_scancode_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/SDL_mouse.c b/libs/SDL3/src/events/SDL_mouse.c index 5cad582e..df892715 100644 --- a/libs/SDL3/src/events/SDL_mouse.c +++ b/libs/SDL3/src/events/SDL_mouse.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -143,14 +143,14 @@ static void SDLCALL SDL_VitaTouchMouseDeviceChanged(void *userdata, const char * switch (*hint) { default: case '0': - mouse->vita_touch_mouse_device = 0; - break; - case '1': mouse->vita_touch_mouse_device = 1; break; - case '2': + case '1': mouse->vita_touch_mouse_device = 2; break; + case '2': + mouse->vita_touch_mouse_device = 3; + break; } } } @@ -169,7 +169,41 @@ static void SDLCALL SDL_MouseTouchEventsChanged(void *userdata, const char *name mouse->mouse_touch_events = SDL_GetStringBoolean(hint, default_value); if (mouse->mouse_touch_events) { - SDL_AddTouch(SDL_MOUSE_TOUCHID, SDL_TOUCH_DEVICE_DIRECT, "mouse_input"); + if (!mouse->added_mouse_touch_device) { + SDL_AddTouch(SDL_MOUSE_TOUCHID, SDL_TOUCH_DEVICE_DIRECT, "mouse_input"); + mouse->added_mouse_touch_device = true; + } + } else { + if (mouse->added_mouse_touch_device) { + SDL_DelTouch(SDL_MOUSE_TOUCHID); + mouse->added_mouse_touch_device = false; + } + } +} + +static void SDLCALL SDL_PenMouseEventsChanged(void *userdata, const char *name, const char *oldValue, const char *hint) +{ + SDL_Mouse *mouse = (SDL_Mouse *)userdata; + + mouse->pen_mouse_events = SDL_GetStringBoolean(hint, true); +} + +static void SDLCALL SDL_PenTouchEventsChanged(void *userdata, const char *name, const char *oldValue, const char *hint) +{ + SDL_Mouse *mouse = (SDL_Mouse *)userdata; + + mouse->pen_touch_events = SDL_GetStringBoolean(hint, true); + + if (mouse->pen_touch_events) { + if (!mouse->added_pen_touch_device) { + SDL_AddTouch(SDL_PEN_TOUCHID, SDL_TOUCH_DEVICE_DIRECT, "pen_input"); + mouse->added_pen_touch_device = true; + } + } else { + if (mouse->added_pen_touch_device) { + SDL_DelTouch(SDL_PEN_TOUCHID); + mouse->added_pen_touch_device = false; + } } } @@ -239,6 +273,12 @@ bool SDL_PreInitMouse(void) SDL_AddHintCallback(SDL_HINT_MOUSE_TOUCH_EVENTS, SDL_MouseTouchEventsChanged, mouse); + SDL_AddHintCallback(SDL_HINT_PEN_MOUSE_EVENTS, + SDL_PenMouseEventsChanged, mouse); + + SDL_AddHintCallback(SDL_HINT_PEN_TOUCH_EVENTS, + SDL_PenTouchEventsChanged, mouse); + SDL_AddHintCallback(SDL_HINT_MOUSE_AUTO_CAPTURE, SDL_MouseAutoCaptureChanged, mouse); @@ -328,7 +368,7 @@ void SDL_RemoveMouse(SDL_MouseID mouseID, bool send_event) SDL_free(SDL_mice[mouse_index].name); if (mouse_index != SDL_mouse_count - 1) { - SDL_memcpy(&SDL_mice[mouse_index], &SDL_mice[mouse_index + 1], (SDL_mouse_count - mouse_index - 1) * sizeof(SDL_mice[mouse_index])); + SDL_memmove(&SDL_mice[mouse_index], &SDL_mice[mouse_index + 1], (SDL_mouse_count - mouse_index - 1) * sizeof(SDL_mice[mouse_index])); } --SDL_mouse_count; @@ -339,7 +379,7 @@ void SDL_RemoveMouse(SDL_MouseID mouseID, bool send_event) if (source->mouseID == mouseID) { SDL_free(source->clickstate); if (i != mouse->num_sources - 1) { - SDL_memcpy(&mouse->sources[i], &mouse->sources[i + 1], (mouse->num_sources - i - 1) * sizeof(mouse->sources[i])); + SDL_memmove(&mouse->sources[i], &mouse->sources[i + 1], (mouse->num_sources - i - 1) * sizeof(mouse->sources[i])); } --mouse->num_sources; break; @@ -388,6 +428,7 @@ const char *SDL_GetMouseNameForID(SDL_MouseID instance_id) { int mouse_index = SDL_GetMouseIndex(instance_id); if (mouse_index < 0) { + SDL_SetError("Mouse %" SDL_PRIu32 " not found", instance_id); return NULL; } return SDL_GetPersistentString(SDL_mice[mouse_index].name); @@ -669,14 +710,15 @@ static void SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL if (relative) { if (mouse->relative_mode) { - if (mouse->enable_relative_speed_scale) { - x *= mouse->relative_speed_scale; - y *= mouse->relative_speed_scale; - } else if (mouse->enable_relative_system_scale) { + if (mouse->enable_relative_system_scale) { if (mouse->ApplySystemScale) { mouse->ApplySystemScale(mouse->system_scale_data, timestamp, window, mouseID, &x, &y); } } + if (mouse->enable_relative_speed_scale) { + x *= mouse->relative_speed_scale; + y *= mouse->relative_speed_scale; + } } else { if (mouse->enable_normal_speed_scale) { x *= mouse->normal_speed_scale; @@ -827,7 +869,7 @@ static SDL_MouseClickState *GetMouseClickState(SDL_MouseInputSource *source, Uin static void SDL_PrivateSendMouseButton(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, Uint8 button, bool down, int clicks) { SDL_Mouse *mouse = SDL_GetMouse(); - Uint32 type; + SDL_EventType type; Uint32 buttonstate; SDL_MouseInputSource *source; @@ -851,9 +893,10 @@ static void SDL_PrivateSendMouseButton(Uint64 timestamp, SDL_Window *window, SDL track_mouse_down = false; } if (window) { + type = track_mouse_down ? SDL_EVENT_FINGER_DOWN : SDL_EVENT_FINGER_UP; float normalized_x = mouse->x / (float)window->w; float normalized_y = mouse->y / (float)window->h; - SDL_SendTouch(timestamp, SDL_MOUSE_TOUCHID, SDL_BUTTON_LEFT, window, track_mouse_down, normalized_x, normalized_y, 1.0f); + SDL_SendTouch(timestamp, SDL_MOUSE_TOUCHID, SDL_BUTTON_LEFT, window, type, normalized_x, normalized_y, 1.0f); } } } @@ -984,6 +1027,14 @@ void SDL_QuitMouse(void) SDL_Cursor *cursor, *next; SDL_Mouse *mouse = SDL_GetMouse(); + if (mouse->added_mouse_touch_device) { + SDL_DelTouch(SDL_MOUSE_TOUCHID); + } + + if (mouse->added_pen_touch_device) { + SDL_DelTouch(SDL_PEN_TOUCHID); + } + if (mouse->CaptureMouse) { SDL_CaptureMouse(false); SDL_UpdateMouseCapture(true); @@ -1041,6 +1092,12 @@ void SDL_QuitMouse(void) SDL_RemoveHintCallback(SDL_HINT_MOUSE_TOUCH_EVENTS, SDL_MouseTouchEventsChanged, mouse); + SDL_RemoveHintCallback(SDL_HINT_PEN_MOUSE_EVENTS, + SDL_PenMouseEventsChanged, mouse); + + SDL_RemoveHintCallback(SDL_HINT_PEN_TOUCH_EVENTS, + SDL_PenTouchEventsChanged, mouse); + SDL_RemoveHintCallback(SDL_HINT_MOUSE_AUTO_CAPTURE, SDL_MouseAutoCaptureChanged, mouse); diff --git a/libs/SDL3/src/events/SDL_mouse_c.h b/libs/SDL3/src/events/SDL_mouse_c.h index 074e6422..43cc5207 100644 --- a/libs/SDL3/src/events/SDL_mouse_c.h +++ b/libs/SDL3/src/events/SDL_mouse_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -118,7 +118,11 @@ typedef struct int double_click_radius; bool touch_mouse_events; bool mouse_touch_events; + bool pen_mouse_events; + bool pen_touch_events; bool was_touch_mouse_events; // Was a touch-mouse event pending? + bool added_mouse_touch_device; // did we SDL_AddTouch() a virtual touch device for the mouse? + bool added_pen_touch_device; // did we SDL_AddTouch() a virtual touch device for pens? #ifdef SDL_PLATFORM_VITA Uint8 vita_touch_mouse_device; #endif diff --git a/libs/SDL3/src/events/SDL_pen.c b/libs/SDL3/src/events/SDL_pen.c index 65f77208..afc2ea03 100644 --- a/libs/SDL3/src/events/SDL_pen.c +++ b/libs/SDL3/src/events/SDL_pen.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -26,6 +26,8 @@ #include "SDL_events_c.h" #include "SDL_pen_c.h" +static SDL_PenID pen_touching = 0; // used for synthetic mouse/touch events. + typedef struct SDL_Pen { SDL_PenID instance_id; @@ -111,6 +113,7 @@ void SDL_QuitPen(void) SDL_free(pen_devices); pen_devices = NULL; pen_device_count = 0; + pen_touching = 0; } #if 0 // not a public API at the moment. @@ -158,6 +161,16 @@ bool SDL_GetPenInfo(SDL_PenID instance_id, SDL_PenInfo *info) return result; } +bool SDL_PenConnected(SDL_PenID instance_id) +{ + SDL_LockRWLockForReading(pen_device_rwlock); + const SDL_Pen *pen = FindPenByInstanceId(instance_id); + const bool result = (pen != NULL); + SDL_UnlockRWLock(pen_device_rwlock); + return result; +} +#endif + SDL_PenInputFlags SDL_GetPenStatus(SDL_PenID instance_id, float *axes, int num_axes) { if (num_axes < 0) { @@ -181,16 +194,6 @@ SDL_PenInputFlags SDL_GetPenStatus(SDL_PenID instance_id, float *axes, int num_a return result; } -bool SDL_PenConnected(SDL_PenID instance_id) -{ - SDL_LockRWLockForReading(pen_device_rwlock); - const SDL_Pen *pen = FindPenByInstanceId(instance_id); - const bool result = (pen != NULL); - SDL_UnlockRWLock(pen_device_rwlock); - return result; -} -#endif - SDL_PenCapabilityFlags SDL_GetPenCapabilityFromAxis(SDL_PenAxis axis) { // the initial capability bits happen to match up, but as @@ -309,7 +312,7 @@ void SDL_RemoveAllPenDevices(void (*callback)(SDL_PenID instance_id, void *handl SDL_UnlockRWLock(pen_device_rwlock); } -void SDL_SendPenTouch(Uint64 timestamp, SDL_PenID instance_id, const SDL_Window *window, bool eraser, bool down) +void SDL_SendPenTouch(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *window, bool eraser, bool down) { bool send_event = false; SDL_PenInputFlags input_state = 0; @@ -363,10 +366,45 @@ void SDL_SendPenTouch(Uint64 timestamp, SDL_PenID instance_id, const SDL_Window event.ptouch.down = down; SDL_PushEvent(&event); } + + SDL_Mouse *mouse = SDL_GetMouse(); + if (mouse && window) { + if (mouse->pen_mouse_events) { + if (down) { + if (!pen_touching) { + SDL_SendMouseMotion(timestamp, window, SDL_PEN_MOUSEID, false, x, y); + SDL_SendMouseButton(timestamp, window, SDL_PEN_MOUSEID, SDL_BUTTON_LEFT, true); + } + } else { + if (pen_touching == instance_id) { + SDL_SendMouseButton(timestamp, window, SDL_PEN_MOUSEID, SDL_BUTTON_LEFT, false); + } + } + } + + if (mouse->pen_touch_events) { + const SDL_EventType touchtype = down ? SDL_EVENT_FINGER_DOWN : SDL_EVENT_FINGER_UP; + const float normalized_x = x / (float)window->w; + const float normalized_y = y / (float)window->h; + if (!pen_touching || (pen_touching == instance_id)) { + SDL_SendTouch(timestamp, SDL_PEN_TOUCHID, SDL_BUTTON_LEFT, window, touchtype, normalized_x, normalized_y, pen->axes[SDL_PEN_AXIS_PRESSURE]); + } + } + } + + if (down) { + if (!pen_touching) { + pen_touching = instance_id; + } + } else { + if (pen_touching == instance_id) { + pen_touching = 0; + } + } } } -void SDL_SendPenAxis(Uint64 timestamp, SDL_PenID instance_id, const SDL_Window *window, SDL_PenAxis axis, float value) +void SDL_SendPenAxis(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *window, SDL_PenAxis axis, float value) { SDL_assert((axis >= 0) && (axis < SDL_PEN_AXIS_COUNT)); // fix the backend if this triggers. @@ -405,10 +443,19 @@ void SDL_SendPenAxis(Uint64 timestamp, SDL_PenID instance_id, const SDL_Window * event.paxis.axis = axis; event.paxis.value = value; SDL_PushEvent(&event); + + if (window && (axis == SDL_PEN_AXIS_PRESSURE) && (pen_touching == instance_id)) { + SDL_Mouse *mouse = SDL_GetMouse(); + if (mouse && mouse->pen_touch_events) { + const float normalized_x = x / (float)window->w; + const float normalized_y = y / (float)window->h; + SDL_SendTouchMotion(timestamp, SDL_PEN_TOUCHID, SDL_BUTTON_LEFT, window, normalized_x, normalized_y, value); + } + } } } -void SDL_SendPenMotion(Uint64 timestamp, SDL_PenID instance_id, const SDL_Window *window, float x, float y) +void SDL_SendPenMotion(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *window, float x, float y) { bool send_event = false; SDL_PenInputFlags input_state = 0; @@ -440,10 +487,30 @@ void SDL_SendPenMotion(Uint64 timestamp, SDL_PenID instance_id, const SDL_Window event.pmotion.x = x; event.pmotion.y = y; SDL_PushEvent(&event); + + if (window) { + SDL_Mouse *mouse = SDL_GetMouse(); + if (mouse) { + if (pen_touching == instance_id) { + if (mouse->pen_mouse_events) { + SDL_SendMouseMotion(timestamp, window, SDL_PEN_MOUSEID, false, x, y); + } + + if (mouse->pen_touch_events) { + const float normalized_x = x / (float)window->w; + const float normalized_y = y / (float)window->h; + SDL_SendTouchMotion(timestamp, SDL_PEN_TOUCHID, SDL_BUTTON_LEFT, window, normalized_x, normalized_y, pen->axes[SDL_PEN_AXIS_PRESSURE]); + } + } else if (pen_touching == 0) { // send mouse motion (without a pressed button) for pens that aren't touching. + // this might cause a little chaos if you have multiple pens hovering at the same time, but this seems unlikely in the real world, and also something you did to yourself. :) + SDL_SendMouseMotion(timestamp, window, SDL_PEN_MOUSEID, false, x, y); + } + } + } } } -void SDL_SendPenButton(Uint64 timestamp, SDL_PenID instance_id, const SDL_Window *window, Uint8 button, bool down) +void SDL_SendPenButton(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *window, Uint8 button, bool down) { bool send_event = false; SDL_PenInputFlags input_state = 0; @@ -492,6 +559,13 @@ void SDL_SendPenButton(Uint64 timestamp, SDL_PenID instance_id, const SDL_Window event.pbutton.button = button; event.pbutton.down = down; SDL_PushEvent(&event); + + if (window && (pen_touching == instance_id)) { + SDL_Mouse *mouse = SDL_GetMouse(); + if (mouse && mouse->pen_mouse_events) { + SDL_SendMouseButton(timestamp, window, SDL_PEN_MOUSEID, button + 1, down); + } + } } } } diff --git a/libs/SDL3/src/events/SDL_pen_c.h b/libs/SDL3/src/events/SDL_pen_c.h index 7e069b00..1eff47f2 100644 --- a/libs/SDL3/src/events/SDL_pen_c.h +++ b/libs/SDL3/src/events/SDL_pen_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -67,16 +67,16 @@ extern void SDL_RemovePenDevice(Uint64 timestamp, SDL_PenID instance_id); extern void SDL_RemoveAllPenDevices(void (*callback)(SDL_PenID instance_id, void *handle, void *userdata), void *userdata); // Backend calls this when a pen's button changes, to generate events and update state. -extern void SDL_SendPenTouch(Uint64 timestamp, SDL_PenID instance_id, const SDL_Window *window, bool eraser, bool down); +extern void SDL_SendPenTouch(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *window, bool eraser, bool down); // Backend calls this when a pen moves on the tablet, to generate events and update state. -extern void SDL_SendPenMotion(Uint64 timestamp, SDL_PenID instance_id, const SDL_Window *window, float x, float y); +extern void SDL_SendPenMotion(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *window, float x, float y); // Backend calls this when a pen's axis changes, to generate events and update state. -extern void SDL_SendPenAxis(Uint64 timestamp, SDL_PenID instance_id, const SDL_Window *window, SDL_PenAxis axis, float value); +extern void SDL_SendPenAxis(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *window, SDL_PenAxis axis, float value); // Backend calls this when a pen's button changes, to generate events and update state. -extern void SDL_SendPenButton(Uint64 timestamp, SDL_PenID instance_id, const SDL_Window *window, Uint8 button, bool down); +extern void SDL_SendPenButton(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *window, Uint8 button, bool down); // Backend can optionally use this to find the SDL_PenID for the `handle` that was passed to SDL_AddPenDevice. extern SDL_PenID SDL_FindPenByHandle(void *handle); @@ -84,6 +84,9 @@ extern SDL_PenID SDL_FindPenByHandle(void *handle); // Backend can optionally use this to find a SDL_PenID, selected by a callback examining all devices. Zero if not found. extern SDL_PenID SDL_FindPenByCallback(bool (*callback)(void *handle, void *userdata), void *userdata); +// Backend can use this to query current pen status. +SDL_PenInputFlags SDL_GetPenStatus(SDL_PenID instance_id, float *axes, int num_axes); + // Backend can use this to map an axis to a capability bit. SDL_PenCapabilityFlags SDL_GetPenCapabilityFromAxis(SDL_PenAxis axis); diff --git a/libs/SDL3/src/events/SDL_quit.c b/libs/SDL3/src/events/SDL_quit.c index c408291e..5456203e 100644 --- a/libs/SDL3/src/events/SDL_quit.c +++ b/libs/SDL3/src/events/SDL_quit.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/SDL_scancode_tables.c b/libs/SDL3/src/events/SDL_scancode_tables.c index 03c53688..a780f133 100644 --- a/libs/SDL3/src/events/SDL_scancode_tables.c +++ b/libs/SDL3/src/events/SDL_scancode_tables.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/SDL_scancode_tables_c.h b/libs/SDL3/src/events/SDL_scancode_tables_c.h index 655f627c..c8ad5fcd 100644 --- a/libs/SDL3/src/events/SDL_scancode_tables_c.h +++ b/libs/SDL3/src/events/SDL_scancode_tables_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/SDL_touch.c b/libs/SDL3/src/events/SDL_touch.c index 3ad041d8..ec4acb14 100644 --- a/libs/SDL3/src/events/SDL_touch.c +++ b/libs/SDL3/src/events/SDL_touch.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -29,14 +29,9 @@ static int SDL_num_touch = 0; static SDL_Touch **SDL_touchDevices = NULL; // for mapping touch events to mice - -#define SYNTHESIZE_TOUCH_TO_MOUSE 1 - -#if SYNTHESIZE_TOUCH_TO_MOUSE static bool finger_touching = false; static SDL_FingerID track_fingerid; static SDL_TouchID track_touchid; -#endif // Public functions bool SDL_InitTouch(void) @@ -254,29 +249,28 @@ static void SDL_DelFinger(SDL_Touch *touch, SDL_FingerID fingerid) } } -void SDL_SendTouch(Uint64 timestamp, SDL_TouchID id, SDL_FingerID fingerid, SDL_Window *window, bool down, float x, float y, float pressure) +void SDL_SendTouch(Uint64 timestamp, SDL_TouchID id, SDL_FingerID fingerid, SDL_Window *window, SDL_EventType type, float x, float y, float pressure) { SDL_Finger *finger; - SDL_Mouse *mouse; + bool down = (type == SDL_EVENT_FINGER_DOWN); SDL_Touch *touch = SDL_GetTouch(id); if (!touch) { return; } - mouse = SDL_GetMouse(); + SDL_Mouse *mouse = SDL_GetMouse(); -#if SYNTHESIZE_TOUCH_TO_MOUSE // SDL_HINT_TOUCH_MOUSE_EVENTS: controlling whether touch events should generate synthetic mouse events // SDL_HINT_VITA_TOUCH_MOUSE_DEVICE: controlling which touchpad should generate synthetic mouse events, PSVita-only { + // FIXME: maybe we should only restrict to a few SDL_TouchDeviceType + if ((id != SDL_MOUSE_TOUCHID) && (id != SDL_PEN_TOUCHID)) { #ifdef SDL_PLATFORM_VITA - if (mouse->touch_mouse_events && ((mouse->vita_touch_mouse_device == id) || (mouse->vita_touch_mouse_device == 2))) { + if (mouse->touch_mouse_events && ((mouse->vita_touch_mouse_device == id) || (mouse->vita_touch_mouse_device == 3))) { #else - if (mouse->touch_mouse_events) { + if (mouse->touch_mouse_events) { #endif - // FIXME: maybe we should only restrict to a few SDL_TouchDeviceType - if (id != SDL_MOUSE_TOUCHID) { if (window) { if (down) { if (finger_touching == false) { @@ -317,13 +311,12 @@ void SDL_SendTouch(Uint64 timestamp, SDL_TouchID id, SDL_FingerID fingerid, SDL_ } } } -#endif // SDL_HINT_MOUSE_TOUCH_EVENTS: if not set, discard synthetic touch events coming from platform layer - if (mouse->mouse_touch_events == 0) { - if (id == SDL_MOUSE_TOUCHID) { - return; - } + if (!mouse->mouse_touch_events && (id == SDL_MOUSE_TOUCHID)) { + return; + } else if (!mouse->pen_touch_events && (id == SDL_PEN_TOUCHID)) { + return; } finger = SDL_GetFinger(touch, fingerid); @@ -331,16 +324,16 @@ void SDL_SendTouch(Uint64 timestamp, SDL_TouchID id, SDL_FingerID fingerid, SDL_ if (finger) { /* This finger is already down. Assume the finger-up for the previous touch was lost, and send it. */ - SDL_SendTouch(timestamp, id, fingerid, window, false, x, y, pressure); + SDL_SendTouch(timestamp, id, fingerid, window, SDL_EVENT_FINGER_CANCELED, x, y, pressure); } if (!SDL_AddFinger(touch, fingerid, x, y, pressure)) { return; } - if (SDL_EventEnabled(SDL_EVENT_FINGER_DOWN)) { + if (SDL_EventEnabled(type)) { SDL_Event event; - event.type = SDL_EVENT_FINGER_DOWN; + event.type = type; event.common.timestamp = timestamp; event.tfinger.touchID = id; event.tfinger.fingerID = fingerid; @@ -358,9 +351,9 @@ void SDL_SendTouch(Uint64 timestamp, SDL_TouchID id, SDL_FingerID fingerid, SDL_ return; } - if (SDL_EventEnabled(SDL_EVENT_FINGER_UP)) { + if (SDL_EventEnabled(type)) { SDL_Event event; - event.type = SDL_EVENT_FINGER_UP; + event.type = type; event.common.timestamp = timestamp; event.tfinger.touchID = id; event.tfinger.fingerID = fingerid; @@ -383,7 +376,6 @@ void SDL_SendTouchMotion(Uint64 timestamp, SDL_TouchID id, SDL_FingerID fingerid { SDL_Touch *touch; SDL_Finger *finger; - SDL_Mouse *mouse; float xrel, yrel, prel; touch = SDL_GetTouch(id); @@ -391,13 +383,12 @@ void SDL_SendTouchMotion(Uint64 timestamp, SDL_TouchID id, SDL_FingerID fingerid return; } - mouse = SDL_GetMouse(); + SDL_Mouse *mouse = SDL_GetMouse(); -#if SYNTHESIZE_TOUCH_TO_MOUSE // SDL_HINT_TOUCH_MOUSE_EVENTS: controlling whether touch events should generate synthetic mouse events { - if (mouse->touch_mouse_events) { - if (id != SDL_MOUSE_TOUCHID) { + if ((id != SDL_MOUSE_TOUCHID) && (id != SDL_PEN_TOUCHID)) { + if (mouse->touch_mouse_events) { if (window) { if (finger_touching == true && track_touchid == id && track_fingerid == fingerid) { float pos_x = (x * (float)window->w); @@ -420,7 +411,6 @@ void SDL_SendTouchMotion(Uint64 timestamp, SDL_TouchID id, SDL_FingerID fingerid } } } -#endif // SDL_HINT_MOUSE_TOUCH_EVENTS: if not set, discard synthetic touch events coming from platform layer if (mouse->mouse_touch_events == 0) { @@ -431,7 +421,7 @@ void SDL_SendTouchMotion(Uint64 timestamp, SDL_TouchID id, SDL_FingerID fingerid finger = SDL_GetFinger(touch, fingerid); if (!finger) { - SDL_SendTouch(timestamp, id, fingerid, window, true, x, y, pressure); + SDL_SendTouch(timestamp, id, fingerid, window, SDL_EVENT_FINGER_DOWN, x, y, pressure); return; } diff --git a/libs/SDL3/src/events/SDL_touch_c.h b/libs/SDL3/src/events/SDL_touch_c.h index 43e4fd17..db2d64b8 100644 --- a/libs/SDL3/src/events/SDL_touch_c.h +++ b/libs/SDL3/src/events/SDL_touch_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -46,7 +46,7 @@ extern int SDL_AddTouch(SDL_TouchID id, SDL_TouchDeviceType type, const char *na extern SDL_Touch *SDL_GetTouch(SDL_TouchID id); // Send a touch down/up event for a touch -extern void SDL_SendTouch(Uint64 timestamp, SDL_TouchID id, SDL_FingerID fingerid, SDL_Window *window, bool down, float x, float y, float pressure); +extern void SDL_SendTouch(Uint64 timestamp, SDL_TouchID id, SDL_FingerID fingerid, SDL_Window *window, SDL_EventType type, float x, float y, float pressure); // Send a touch motion event for a touch extern void SDL_SendTouchMotion(Uint64 timestamp, SDL_TouchID id, SDL_FingerID fingerid, SDL_Window *window, float x, float y, float pressure); diff --git a/libs/SDL3/src/events/SDL_windowevents.c b/libs/SDL3/src/events/SDL_windowevents.c index 5535ec50..2258ce79 100644 --- a/libs/SDL3/src/events/SDL_windowevents.c +++ b/libs/SDL3/src/events/SDL_windowevents.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -24,7 +24,7 @@ #include "SDL_events_c.h" #include "SDL_mouse_c.h" - +#include "../tray/SDL_tray_utils.h" static bool SDLCALL RemoveSupercededWindowEvents(void *userdata, SDL_Event *event) { @@ -247,7 +247,7 @@ bool SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent, int data break; } - if (windowevent == SDL_EVENT_WINDOW_CLOSE_REQUESTED && !window->parent) { + if (windowevent == SDL_EVENT_WINDOW_CLOSE_REQUESTED && !window->parent && !SDL_HasActiveTrays()) { int toplevel_count = 0; SDL_Window *n; for (n = SDL_GetVideoDevice()->windows; n; n = n->next) { diff --git a/libs/SDL3/src/events/SDL_windowevents_c.h b/libs/SDL3/src/events/SDL_windowevents_c.h index addab6ef..b7f0681e 100644 --- a/libs/SDL3/src/events/SDL_windowevents_c.h +++ b/libs/SDL3/src/events/SDL_windowevents_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/blank_cursor.h b/libs/SDL3/src/events/blank_cursor.h index fd84744c..d8d9b4db 100644 --- a/libs/SDL3/src/events/blank_cursor.h +++ b/libs/SDL3/src/events/blank_cursor.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/default_cursor.h b/libs/SDL3/src/events/default_cursor.h index 5068f069..9a76f94d 100644 --- a/libs/SDL3/src/events/default_cursor.h +++ b/libs/SDL3/src/events/default_cursor.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/scancodes_darwin.h b/libs/SDL3/src/events/scancodes_darwin.h index 0006070d..c3a2d4cd 100644 --- a/libs/SDL3/src/events/scancodes_darwin.h +++ b/libs/SDL3/src/events/scancodes_darwin.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/scancodes_linux.h b/libs/SDL3/src/events/scancodes_linux.h index e90bbf1c..fc26e494 100644 --- a/libs/SDL3/src/events/scancodes_linux.h +++ b/libs/SDL3/src/events/scancodes_linux.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/scancodes_windows.h b/libs/SDL3/src/events/scancodes_windows.h index 3d00d9dc..6f35114b 100644 --- a/libs/SDL3/src/events/scancodes_windows.h +++ b/libs/SDL3/src/events/scancodes_windows.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/events/scancodes_xfree86.h b/libs/SDL3/src/events/scancodes_xfree86.h index beefffbd..5e51bb17 100644 --- a/libs/SDL3/src/events/scancodes_xfree86.h +++ b/libs/SDL3/src/events/scancodes_xfree86.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/filesystem/SDL_filesystem.c b/libs/SDL3/src/filesystem/SDL_filesystem.c index 46cb74b7..28388517 100644 --- a/libs/SDL3/src/filesystem/SDL_filesystem.c +++ b/libs/SDL3/src/filesystem/SDL_filesystem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -121,7 +121,7 @@ bool SDL_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback cal } else if (!callback) { return SDL_InvalidParamError("callback"); } - return SDL_SYS_EnumerateDirectory(path, path, callback, userdata); + return SDL_SYS_EnumerateDirectory(path, callback, userdata); } bool SDL_GetPathInfo(const char *path, SDL_PathInfo *info) @@ -307,7 +307,7 @@ static SDL_EnumerationResult SDLCALL GlobDirectoryCallback(void *userdata, const // !!! FIXME: and only casefold the new pieces instead of allocating and folding full paths for all of this. char *fullpath = NULL; - if (SDL_asprintf(&fullpath, "%s/%s", dirname, fname) < 0) { + if (SDL_asprintf(&fullpath, "%s%s", dirname, fname) < 0) { return SDL_ENUM_FAILURE; } @@ -417,7 +417,8 @@ char **SDL_InternalGlobDirectory(const char *path, const char *pattern, SDL_Glob data.enumerator = enumerator; data.getpathinfo = getpathinfo; data.fsuserdata = userdata; - data.basedirlen = SDL_strlen(path) + 1; // +1 for the '/' we'll be adding. + data.basedirlen = *path ? (SDL_strlen(path) + 1) : 0; // +1 for the '/' we'll be adding. + char **result = NULL; if (data.enumerator(path, GlobDirectoryCallback, &data, data.fsuserdata)) { diff --git a/libs/SDL3/src/filesystem/SDL_filesystem_c.h b/libs/SDL3/src/filesystem/SDL_filesystem_c.h index 4cf8725c..8cfdcabf 100644 --- a/libs/SDL3/src/filesystem/SDL_filesystem_c.h +++ b/libs/SDL3/src/filesystem/SDL_filesystem_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/filesystem/SDL_sysfilesystem.h b/libs/SDL3/src/filesystem/SDL_sysfilesystem.h index cec031f4..f9f4c592 100644 --- a/libs/SDL3/src/filesystem/SDL_sysfilesystem.h +++ b/libs/SDL3/src/filesystem/SDL_sysfilesystem.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -28,7 +28,7 @@ extern char *SDL_SYS_GetPrefPath(const char *org, const char *app); extern char *SDL_SYS_GetUserFolder(SDL_Folder folder); extern char *SDL_SYS_GetCurrentDirectory(void); -extern bool SDL_SYS_EnumerateDirectory(const char *path, const char *dirname, SDL_EnumerateDirectoryCallback cb, void *userdata); +extern bool SDL_SYS_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback cb, void *userdata); extern bool SDL_SYS_RemovePath(const char *path); extern bool SDL_SYS_RenamePath(const char *oldpath, const char *newpath); extern bool SDL_SYS_CopyFile(const char *oldpath, const char *newpath); diff --git a/libs/SDL3/src/filesystem/android/SDL_sysfilesystem.c b/libs/SDL3/src/filesystem/android/SDL_sysfilesystem.c index b97bda2b..bb424098 100644 --- a/libs/SDL3/src/filesystem/android/SDL_sysfilesystem.c +++ b/libs/SDL3/src/filesystem/android/SDL_sysfilesystem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/filesystem/cocoa/SDL_sysfilesystem.m b/libs/SDL3/src/filesystem/cocoa/SDL_sysfilesystem.m index 07a75ff7..a5fa67bc 100644 --- a/libs/SDL3/src/filesystem/cocoa/SDL_sysfilesystem.m +++ b/libs/SDL3/src/filesystem/cocoa/SDL_sysfilesystem.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/filesystem/dummy/SDL_sysfilesystem.c b/libs/SDL3/src/filesystem/dummy/SDL_sysfilesystem.c index 4aebe958..5634c702 100644 --- a/libs/SDL3/src/filesystem/dummy/SDL_sysfilesystem.c +++ b/libs/SDL3/src/filesystem/dummy/SDL_sysfilesystem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/filesystem/dummy/SDL_sysfsops.c b/libs/SDL3/src/filesystem/dummy/SDL_sysfsops.c index a7c40fe0..d8553e91 100644 --- a/libs/SDL3/src/filesystem/dummy/SDL_sysfsops.c +++ b/libs/SDL3/src/filesystem/dummy/SDL_sysfsops.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -28,7 +28,7 @@ #include "../SDL_sysfilesystem.h" -bool SDL_SYS_EnumerateDirectory(const char *path, const char *dirname, SDL_EnumerateDirectoryCallback cb, void *userdata) +bool SDL_SYS_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback cb, void *userdata) { return SDL_Unsupported(); } diff --git a/libs/SDL3/src/filesystem/emscripten/SDL_sysfilesystem.c b/libs/SDL3/src/filesystem/emscripten/SDL_sysfilesystem.c index e10081c7..29dc0535 100644 --- a/libs/SDL3/src/filesystem/emscripten/SDL_sysfilesystem.c +++ b/libs/SDL3/src/filesystem/emscripten/SDL_sysfilesystem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/filesystem/gdk/SDL_sysfilesystem.cpp b/libs/SDL3/src/filesystem/gdk/SDL_sysfilesystem.cpp index edfee0d4..ffafe43a 100644 --- a/libs/SDL3/src/filesystem/gdk/SDL_sysfilesystem.cpp +++ b/libs/SDL3/src/filesystem/gdk/SDL_sysfilesystem.cpp @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/filesystem/haiku/SDL_sysfilesystem.cc b/libs/SDL3/src/filesystem/haiku/SDL_sysfilesystem.cc index 60e7d5b0..af8b5ab4 100644 --- a/libs/SDL3/src/filesystem/haiku/SDL_sysfilesystem.cc +++ b/libs/SDL3/src/filesystem/haiku/SDL_sysfilesystem.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/filesystem/n3ds/SDL_sysfilesystem.c b/libs/SDL3/src/filesystem/n3ds/SDL_sysfilesystem.c index e4a118c9..8386a91c 100644 --- a/libs/SDL3/src/filesystem/n3ds/SDL_sysfilesystem.c +++ b/libs/SDL3/src/filesystem/n3ds/SDL_sysfilesystem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/filesystem/posix/SDL_sysfsops.c b/libs/SDL3/src/filesystem/posix/SDL_sysfsops.c index ec2cc15c..015b8d4b 100644 --- a/libs/SDL3/src/filesystem/posix/SDL_sysfsops.c +++ b/libs/SDL3/src/filesystem/posix/SDL_sysfsops.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -35,27 +35,44 @@ #include #include -bool SDL_SYS_EnumerateDirectory(const char *path, const char *dirname, SDL_EnumerateDirectoryCallback cb, void *userdata) +bool SDL_SYS_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback cb, void *userdata) { - SDL_EnumerationResult result = SDL_ENUM_CONTINUE; + char *pathwithsep = NULL; + int pathwithseplen = SDL_asprintf(&pathwithsep, "%s/", path); + if ((pathwithseplen == -1) || (!pathwithsep)) { + return false; + } - DIR *dir = opendir(path); + // trim down to a single path separator at the end, in case the caller added one or more. + pathwithseplen--; + while ((pathwithseplen >= 0) && (pathwithsep[pathwithseplen] == '/')) { + pathwithsep[pathwithseplen--] = '\0'; + } + + DIR *dir = opendir(pathwithsep); if (!dir) { + SDL_free(pathwithsep); return SDL_SetError("Can't open directory: %s", strerror(errno)); } + // make sure there's a path separator at the end now for the actual callback. + pathwithsep[++pathwithseplen] = '/'; + pathwithsep[++pathwithseplen] = '\0'; + + SDL_EnumerationResult result = SDL_ENUM_CONTINUE; struct dirent *ent; - while ((result == SDL_ENUM_CONTINUE) && ((ent = readdir(dir)) != NULL)) - { + while ((result == SDL_ENUM_CONTINUE) && ((ent = readdir(dir)) != NULL)) { const char *name = ent->d_name; if ((SDL_strcmp(name, ".") == 0) || (SDL_strcmp(name, "..") == 0)) { continue; } - result = cb(userdata, dirname, name); + result = cb(userdata, pathwithsep, name); } closedir(dir); + SDL_free(pathwithsep); + return (result != SDL_ENUM_FAILURE); } @@ -200,7 +217,7 @@ char *SDL_SYS_GetCurrentDirectory(void) } buf = (char *) ptr; - if (getcwd(buf, buflen) != NULL) { + if (getcwd(buf, buflen-1) != NULL) { break; // we got it! } @@ -214,6 +231,14 @@ char *SDL_SYS_GetCurrentDirectory(void) return NULL; } + // make sure there's a path separator at the end. + SDL_assert(SDL_strlen(buf) < (buflen + 2)); + buflen = SDL_strlen(buf); + if ((buflen == 0) || (buf[buflen-1] != '/')) { + buf[buflen] = '/'; + buf[buflen + 1] = '\0'; + } + return buf; } diff --git a/libs/SDL3/src/filesystem/ps2/SDL_sysfilesystem.c b/libs/SDL3/src/filesystem/ps2/SDL_sysfilesystem.c index ee90aabf..ca69c2bd 100644 --- a/libs/SDL3/src/filesystem/ps2/SDL_sysfilesystem.c +++ b/libs/SDL3/src/filesystem/ps2/SDL_sysfilesystem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/filesystem/psp/SDL_sysfilesystem.c b/libs/SDL3/src/filesystem/psp/SDL_sysfilesystem.c index 8f8d1c3a..4b40055b 100644 --- a/libs/SDL3/src/filesystem/psp/SDL_sysfilesystem.c +++ b/libs/SDL3/src/filesystem/psp/SDL_sysfilesystem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/filesystem/riscos/SDL_sysfilesystem.c b/libs/SDL3/src/filesystem/riscos/SDL_sysfilesystem.c index 25e6e238..95ed80fd 100644 --- a/libs/SDL3/src/filesystem/riscos/SDL_sysfilesystem.c +++ b/libs/SDL3/src/filesystem/riscos/SDL_sysfilesystem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/filesystem/unix/SDL_sysfilesystem.c b/libs/SDL3/src/filesystem/unix/SDL_sysfilesystem.c index 6f46a5b3..b0f2dd5c 100644 --- a/libs/SDL3/src/filesystem/unix/SDL_sysfilesystem.c +++ b/libs/SDL3/src/filesystem/unix/SDL_sysfilesystem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/filesystem/vita/SDL_sysfilesystem.c b/libs/SDL3/src/filesystem/vita/SDL_sysfilesystem.c index f9161834..8b65e8ae 100644 --- a/libs/SDL3/src/filesystem/vita/SDL_sysfilesystem.c +++ b/libs/SDL3/src/filesystem/vita/SDL_sysfilesystem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/filesystem/windows/SDL_sysfilesystem.c b/libs/SDL3/src/filesystem/windows/SDL_sysfilesystem.c index 3b627ada..39ba4148 100644 --- a/libs/SDL3/src/filesystem/windows/SDL_sysfilesystem.c +++ b/libs/SDL3/src/filesystem/windows/SDL_sysfilesystem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -355,11 +355,17 @@ char *SDL_SYS_GetCurrentDirectory(void) if (bw == 0) { WIN_SetError("GetCurrentDirectoryW failed"); return NULL; - } else if (bw < buflen) { - break; // we got it! + } else if (bw < buflen) { // we got it! + // make sure there's a path separator at the end. + SDL_assert(bw < (buflen + 2)); + if ((bw == 0) || (wstr[bw-1] != '\\')) { + wstr[bw] = '\\'; + wstr[bw + 1] = '\0'; + } + break; } - void *ptr = SDL_realloc(wstr, bw * sizeof (WCHAR)); + void *ptr = SDL_realloc(wstr, (bw + 1) * sizeof (WCHAR)); if (!ptr) { SDL_free(wstr); return NULL; diff --git a/libs/SDL3/src/filesystem/windows/SDL_sysfsops.c b/libs/SDL3/src/filesystem/windows/SDL_sysfsops.c index f61f9395..9c48ba95 100644 --- a/libs/SDL3/src/filesystem/windows/SDL_sysfsops.c +++ b/libs/SDL3/src/filesystem/windows/SDL_sysfsops.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -29,40 +29,50 @@ #include "../../core/windows/SDL_windows.h" #include "../SDL_sysfilesystem.h" -bool SDL_SYS_EnumerateDirectory(const char *path, const char *dirname, SDL_EnumerateDirectoryCallback cb, void *userdata) +bool SDL_SYS_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback cb, void *userdata) { SDL_EnumerationResult result = SDL_ENUM_CONTINUE; if (*path == '\0') { // if empty (completely at the root), we need to enumerate drive letters. const DWORD drives = GetLogicalDrives(); - char name[3] = { 0, ':', '\0' }; + char name[] = { 0, ':', '\\', '\0' }; for (int i = 'A'; (result == SDL_ENUM_CONTINUE) && (i <= 'Z'); i++) { if (drives & (1 << (i - 'A'))) { name[0] = (char) i; - result = cb(userdata, dirname, name); + result = cb(userdata, "", name); } } } else { - const size_t patternlen = SDL_strlen(path) + 3; - char *pattern = (char *) SDL_malloc(patternlen); - if (!pattern) { - return false; - } - // you need a wildcard to enumerate through FindFirstFileEx(), but the wildcard is only checked in the // filename element at the end of the path string, so always tack on a "\\*" to get everything, and // also prevent any wildcards inserted by the app from being respected. - SDL_snprintf(pattern, patternlen, "%s\\*", path); - - WCHAR *wpattern = WIN_UTF8ToStringW(pattern); - SDL_free(pattern); - if (!wpattern) { + char *pattern = NULL; + int patternlen = SDL_asprintf(&pattern, "%s\\\\", path); // we'll replace that second '\\' in the trimdown. + if ((patternlen == -1) || (!pattern)) { return false; } + // trim down to a single path separator at the end, in case the caller added one or more. + patternlen--; + while ((patternlen >= 0) && ((pattern[patternlen] == '\\') || (pattern[patternlen] == '/'))) { + pattern[patternlen--] ='\0'; + } + pattern[++patternlen] = '\\'; + pattern[++patternlen] = '*'; + pattern[++patternlen] = '\0'; + + WCHAR *wpattern = WIN_UTF8ToStringW(pattern); + if (!wpattern) { + SDL_free(pattern); + return false; + } + + pattern[--patternlen] = '\0'; // chop off the '*' so we just have the dirname with a path separator. + WIN32_FIND_DATAW entw; HANDLE dir = FindFirstFileExW(wpattern, FindExInfoStandard, &entw, FindExSearchNameMatch, NULL, 0); SDL_free(wpattern); if (dir == INVALID_HANDLE_VALUE) { + SDL_free(pattern); return WIN_SetError("Failed to enumerate directory"); } @@ -79,12 +89,13 @@ bool SDL_SYS_EnumerateDirectory(const char *path, const char *dirname, SDL_Enume if (!utf8fn) { result = SDL_ENUM_FAILURE; } else { - result = cb(userdata, dirname, utf8fn); + result = cb(userdata, pattern, utf8fn); SDL_free(utf8fn); } } while ((result == SDL_ENUM_CONTINUE) && (FindNextFileW(dir, &entw) != 0)); FindClose(dir); + SDL_free(pattern); } return (result != SDL_ENUM_FAILURE); diff --git a/libs/SDL3/src/gpu/SDL_gpu.c b/libs/SDL3/src/gpu/SDL_gpu.c index bc1cb1a2..b3148c27 100644 --- a/libs/SDL3/src/gpu/SDL_gpu.c +++ b/libs/SDL3/src/gpu/SDL_gpu.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -801,6 +801,10 @@ SDL_GPUGraphicsPipeline *SDL_CreateGPUGraphicsPipeline( SDL_assert_release(!"Color target formats cannot be a depth format!"); return NULL; } + if (!SDL_GPUTextureSupportsFormat(device, graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].format, SDL_GPU_TEXTURETYPE_2D, SDL_GPU_TEXTUREUSAGE_COLOR_TARGET)) { + SDL_assert_release(!"Format is not supported for color targets on this device!"); + return NULL; + } if (graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].blend_state.enable_blend) { const SDL_GPUColorTargetBlendState *blend_state = &graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].blend_state; CHECK_BLENDFACTOR_ENUM_INVALID(blend_state->src_color_blendfactor, NULL) @@ -817,6 +821,10 @@ SDL_GPUGraphicsPipeline *SDL_CreateGPUGraphicsPipeline( SDL_assert_release(!"Depth-stencil target format must be a depth format!"); return NULL; } + if (!SDL_GPUTextureSupportsFormat(device, graphicsPipelineCreateInfo->target_info.depth_stencil_format, SDL_GPU_TEXTURETYPE_2D, SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET)) { + SDL_assert_release(!"Format is not supported for depth targets on this device!"); + return NULL; + } } if (graphicsPipelineCreateInfo->vertex_input_state.num_vertex_buffers > 0 && graphicsPipelineCreateInfo->vertex_input_state.vertex_buffer_descriptions == NULL) { SDL_assert_release(!"Vertex buffer descriptions array pointer cannot be NULL!"); @@ -1055,10 +1063,13 @@ SDL_GPUBuffer *SDL_CreateGPUBuffer( return NULL; } + const char *debugName = SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING, NULL); + return device->CreateBuffer( device->driverData, createinfo->usage, - createinfo->size); + createinfo->size, + debugName); } SDL_GPUTransferBuffer *SDL_CreateGPUTransferBuffer( @@ -1071,10 +1082,13 @@ SDL_GPUTransferBuffer *SDL_CreateGPUTransferBuffer( return NULL; } + const char *debugName = SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING, NULL); + return device->CreateTransferBuffer( device->driverData, createinfo->usage, - createinfo->size); + createinfo->size, + debugName); } // Debug Naming diff --git a/libs/SDL3/src/gpu/SDL_sysgpu.h b/libs/SDL3/src/gpu/SDL_sysgpu.h index 901fd9ab..98f4be9f 100644 --- a/libs/SDL3/src/gpu/SDL_sysgpu.h +++ b/libs/SDL3/src/gpu/SDL_sysgpu.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -76,7 +76,7 @@ typedef struct BlitPipelineCacheEntry #define SDL_GPU_STENCILOP_MAX_ENUM_VALUE (SDL_GPU_STENCILOP_DECREMENT_AND_WRAP + 1) #define SDL_GPU_BLENDOP_MAX_ENUM_VALUE (SDL_GPU_BLENDOP_MAX + 1) #define SDL_GPU_BLENDFACTOR_MAX_ENUM_VALUE (SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE + 1) -#define SDL_GPU_SWAPCHAINCOMPOSITION_MAX_ENUM_VALUE (SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2048 + 1) +#define SDL_GPU_SWAPCHAINCOMPOSITION_MAX_ENUM_VALUE (SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084 + 1) #define SDL_GPU_PRESENTMODE_MAX_ENUM_VALUE (SDL_GPU_PRESENTMODE_MAILBOX + 1) static inline Sint32 Texture_GetBlockWidth( @@ -474,12 +474,14 @@ struct SDL_GPUDevice SDL_GPUBuffer *(*CreateBuffer)( SDL_GPURenderer *driverData, SDL_GPUBufferUsageFlags usageFlags, - Uint32 size); + Uint32 size, + const char *debugName); SDL_GPUTransferBuffer *(*CreateTransferBuffer)( SDL_GPURenderer *driverData, SDL_GPUTransferBufferUsage usage, - Uint32 size); + Uint32 size, + const char *debugName); // Debug Naming diff --git a/libs/SDL3/src/gpu/d3d12/SDL_gpu_d3d12.c b/libs/SDL3/src/gpu/d3d12/SDL_gpu_d3d12.c index dc02000e..c142bae4 100644 --- a/libs/SDL3/src/gpu/d3d12/SDL_gpu_d3d12.c +++ b/libs/SDL3/src/gpu/d3d12/SDL_gpu_d3d12.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -160,7 +160,6 @@ static const IID D3D_IID_IDXGIDebug = { 0x119e7452, 0xde9e, 0x40fe, { 0x88, 0x06 static const IID D3D_IID_IDXGIInfoQueue = { 0xd67441c7, 0x672a, 0x476f, { 0x9e, 0x82, 0xcd, 0x55, 0xb4, 0x49, 0x49, 0xce } }; #endif static const GUID D3D_IID_DXGI_DEBUG_ALL = { 0xe48ae283, 0xda80, 0x490b, { 0x87, 0xe6, 0x43, 0xe9, 0xa9, 0xcf, 0xda, 0x08 } }; -static const GUID D3D_IID_D3DDebugObjectName = { 0x429b8c22, 0x9188, 0x4b0c, { 0x87, 0x42, 0xac, 0xb0, 0xbf, 0x85, 0xc2, 0x00 } }; static const IID D3D_IID_ID3D12Device = { 0x189819f1, 0x1db6, 0x4b57, { 0xbe, 0x54, 0x18, 0x21, 0x33, 0x9b, 0x85, 0xf7 } }; static const IID D3D_IID_ID3D12CommandQueue = { 0x0ec870a6, 0x5d7e, 0x4c22, { 0x8c, 0xfc, 0x5b, 0xaa, 0xe0, 0x76, 0x16, 0xed } }; @@ -191,23 +190,23 @@ typedef enum D3D12BufferType static SDL_GPUTextureFormat SwapchainCompositionToSDLTextureFormat[] = { SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM, // SDR - SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB, // SDR_SRGB - SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT, // HDR - SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM, // HDR_ADVANCED + SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB, // SDR_LINEAR + SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT, // HDR_EXTENDED_LINEAR + SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM, // HDR10_ST2084 }; static DXGI_FORMAT SwapchainCompositionToTextureFormat[] = { - DXGI_FORMAT_B8G8R8A8_UNORM, // SDR - DXGI_FORMAT_B8G8R8A8_UNORM, /* SDR_SRGB */ // NOTE: The RTV uses the sRGB format - DXGI_FORMAT_R16G16B16A16_FLOAT, // HDR - DXGI_FORMAT_R10G10B10A2_UNORM, // HDR_ADVANCED + DXGI_FORMAT_B8G8R8A8_UNORM, // SDR + DXGI_FORMAT_B8G8R8A8_UNORM, // SDR_LINEAR (NOTE: The RTV uses the sRGB format) + DXGI_FORMAT_R16G16B16A16_FLOAT, // HDR_EXTENDED_LINEAR + DXGI_FORMAT_R10G10B10A2_UNORM, // HDR10_ST2084 }; static DXGI_COLOR_SPACE_TYPE SwapchainCompositionToColorSpace[] = { DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709, // SDR - DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709, // SDR_SRGB - DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709, // HDR - DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 // HDR_ADVANCED + DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709, // SDR_LINEAR + DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709, // HDR_EXTENDED_LINEAR + DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 // HDR10_ST2084 }; static D3D12_BLEND SDLToD3D12_BlendFactor[] = { @@ -962,6 +961,7 @@ struct D3D12Shader void *bytecode; size_t bytecodeSize; + SDL_GPUShaderStage stage; Uint32 num_samplers; Uint32 numUniformBuffers; Uint32 numStorageBuffers; @@ -1176,22 +1176,6 @@ static void D3D12_INTERNAL_SetError( SDL_SetError("%s! Error Code: %s " HRESULT_FMT, msg, wszMsgBuff, res); } -// Debug Naming - -static void D3D12_INTERNAL_SetResourceName( - D3D12Renderer *renderer, - ID3D12Resource *resource, - const char *text) -{ - if (renderer->debug_mode) { - ID3D12DeviceChild_SetPrivateData( - resource, - D3D_GUID(D3D_IID_D3DDebugObjectName), - (UINT)SDL_strlen(text), - text); - } -} - // Release / Cleanup static void D3D12_INTERNAL_ReleaseStagingDescriptorHandle( @@ -1951,6 +1935,127 @@ static void D3D12_INTERNAL_TrackComputePipeline( #undef TRACK_RESOURCE +// Debug Naming + +static void D3D12_INTERNAL_SetPipelineStateName( + D3D12Renderer *renderer, + ID3D12PipelineState *pipelineState, + const char *text +) { + if (renderer->debug_mode && text != NULL) { + WCHAR *wchar_text = WIN_UTF8ToStringW(text); + ID3D12PipelineState_SetName( + pipelineState, + wchar_text); + SDL_free(wchar_text); + } +} + +static void D3D12_INTERNAL_SetResourceName( + D3D12Renderer *renderer, + ID3D12Resource *resource, + const char *text +) { + if (renderer->debug_mode && text != NULL) { + WCHAR *wchar_text = WIN_UTF8ToStringW(text); + ID3D12Resource_SetName( + resource, + wchar_text); + SDL_free(wchar_text); + } +} + +static void D3D12_SetBufferName( + SDL_GPURenderer *driverData, + SDL_GPUBuffer *buffer, + const char *text) +{ + D3D12Renderer *renderer = (D3D12Renderer *)driverData; + D3D12BufferContainer *container = (D3D12BufferContainer *)buffer; + + if (renderer->debug_mode && text != NULL) { + if (container->debugName != NULL) { + SDL_free(container->debugName); + } + + container->debugName = SDL_strdup(text); + + for (Uint32 i = 0; i < container->bufferCount; i += 1) { + D3D12_INTERNAL_SetResourceName( + renderer, + container->buffers[i]->handle, + text); + } + } +} + +static void D3D12_SetTextureName( + SDL_GPURenderer *driverData, + SDL_GPUTexture *texture, + const char *text) +{ + D3D12Renderer *renderer = (D3D12Renderer *)driverData; + D3D12TextureContainer *container = (D3D12TextureContainer *)texture; + + if (renderer->debug_mode && text != NULL) { + if (container->debugName != NULL) { + SDL_free(container->debugName); + } + + container->debugName = SDL_strdup(text); + + for (Uint32 i = 0; i < container->textureCount; i += 1) { + D3D12_INTERNAL_SetResourceName( + renderer, + container->textures[i]->resource, + text); + } + } +} + +/* These debug functions are all marked as "for internal usage only" + * on D3D12... works on renderdoc! + */ + +static void D3D12_InsertDebugLabel( + SDL_GPUCommandBuffer *commandBuffer, + const char *text) +{ + D3D12CommandBuffer *d3d12CommandBuffer = (D3D12CommandBuffer *)commandBuffer; + WCHAR *wchar_text = WIN_UTF8ToStringW(text); + + ID3D12GraphicsCommandList_SetMarker( + d3d12CommandBuffer->graphicsCommandList, + 0, + wchar_text, + (UINT)SDL_wcslen(wchar_text)); + + SDL_free(wchar_text); +} + +static void D3D12_PushDebugGroup( + SDL_GPUCommandBuffer *commandBuffer, + const char *name) +{ + D3D12CommandBuffer *d3d12CommandBuffer = (D3D12CommandBuffer *)commandBuffer; + WCHAR *wchar_text = WIN_UTF8ToStringW(name); + + ID3D12GraphicsCommandList_BeginEvent( + d3d12CommandBuffer->graphicsCommandList, + 0, + wchar_text, + (UINT)SDL_wcslen(wchar_text)); + + SDL_free(wchar_text); +} + +static void D3D12_PopDebugGroup( + SDL_GPUCommandBuffer *commandBuffer) +{ + D3D12CommandBuffer *d3d12CommandBuffer = (D3D12CommandBuffer *)commandBuffer; + ID3D12GraphicsCommandList_EndEvent(d3d12CommandBuffer->graphicsCommandList); +} + // State Creation static D3D12DescriptorHeap *D3D12_INTERNAL_CreateDescriptorHeap( @@ -2680,6 +2785,13 @@ static SDL_GPUComputePipeline *D3D12_CreateComputePipeline( computePipeline->numUniformBuffers = createinfo->num_uniform_buffers; SDL_SetAtomicInt(&computePipeline->referenceCount, 0); + if (renderer->debug_mode && SDL_HasProperty(createinfo->props, SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING)) { + D3D12_INTERNAL_SetPipelineStateName( + renderer, + computePipeline->pipelineState, + SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING, NULL)); + } + return (SDL_GPUComputePipeline *)computePipeline; } @@ -2858,6 +2970,15 @@ static SDL_GPUGraphicsPipeline *D3D12_CreateGraphicsPipeline( D3D12Shader *vertShader = (D3D12Shader *)createinfo->vertex_shader; D3D12Shader *fragShader = (D3D12Shader *)createinfo->fragment_shader; + if (renderer->debug_mode) { + if (vertShader->stage != SDL_GPU_SHADERSTAGE_VERTEX) { + SDL_assert_release(!"CreateGraphicsPipeline was passed a fragment shader for the vertex stage"); + } + if (fragShader->stage != SDL_GPU_SHADERSTAGE_FRAGMENT) { + SDL_assert_release(!"CreateGraphicsPipeline was passed a vertex shader for the fragment stage"); + } + } + D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc; SDL_zero(psoDesc); psoDesc.VS.pShaderBytecode = vertShader->bytecode; @@ -2955,6 +3076,14 @@ static SDL_GPUGraphicsPipeline *D3D12_CreateGraphicsPipeline( pipeline->fragmentUniformBufferCount = fragShader->numUniformBuffers; SDL_SetAtomicInt(&pipeline->referenceCount, 0); + + if (renderer->debug_mode && SDL_HasProperty(createinfo->props, SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING)) { + D3D12_INTERNAL_SetPipelineStateName( + renderer, + pipeline->pipelineState, + SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING, NULL)); + } + return (SDL_GPUGraphicsPipeline *)pipeline; } @@ -3000,6 +3129,9 @@ static SDL_GPUSampler *D3D12_CreateSampler( sampler->createInfo = *createinfo; SDL_SetAtomicInt(&sampler->referenceCount, 0); + + // Ignore name property because it is not applicable to D3D12. + return (SDL_GPUSampler *)sampler; } @@ -3028,6 +3160,7 @@ static SDL_GPUShader *D3D12_CreateShader( SDL_free(bytecode); return NULL; } + shader->stage = createinfo->stage; shader->num_samplers = createinfo->num_samplers; shader->numStorageBuffers = createinfo->num_storage_buffers; shader->numStorageTextures = createinfo->num_storage_textures; @@ -3036,13 +3169,16 @@ static SDL_GPUShader *D3D12_CreateShader( shader->bytecode = bytecode; shader->bytecodeSize = bytecodeSize; + // Ignore name property because it is not applicable to D3D12. + return (SDL_GPUShader *)shader; } static D3D12Texture *D3D12_INTERNAL_CreateTexture( D3D12Renderer *renderer, const SDL_GPUTextureCreateInfo *createinfo, - bool isSwapchainTexture) + bool isSwapchainTexture, + const char *debugName) { D3D12Texture *texture; ID3D12Resource *handle; @@ -3073,17 +3209,17 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture( if (createinfo->usage & SDL_GPU_TEXTUREUSAGE_COLOR_TARGET) { resourceFlags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; useClearValue = true; - clearValue.Color[0] = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_R_FLOAT, 0); - clearValue.Color[1] = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_G_FLOAT, 0); - clearValue.Color[2] = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_B_FLOAT, 0); - clearValue.Color[3] = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_A_FLOAT, 0); + clearValue.Color[0] = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT, 0); + clearValue.Color[1] = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT, 0); + clearValue.Color[2] = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT, 0); + clearValue.Color[3] = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT, 0); } if (createinfo->usage & SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET) { resourceFlags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL; useClearValue = true; - clearValue.DepthStencil.Depth = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_DEPTH_FLOAT, 0); - clearValue.DepthStencil.Stencil = (UINT8)SDL_GetNumberProperty(createinfo->props, SDL_PROP_GPU_CREATETEXTURE_D3D12_CLEAR_STENCIL_UINT8, 0); + clearValue.DepthStencil.Depth = SDL_GetFloatProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT, 0); + clearValue.DepthStencil.Stencil = (UINT8)SDL_GetNumberProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_UINT8, 0); format = SDLToD3D12_DepthFormat[createinfo->format]; } @@ -3329,6 +3465,11 @@ static D3D12Texture *D3D12_INTERNAL_CreateTexture( } } + D3D12_INTERNAL_SetResourceName( + renderer, + texture->resource, + debugName); + return texture; } @@ -3341,7 +3482,11 @@ static SDL_GPUTexture *D3D12_CreateTexture( return NULL; } + // Copy properties so we don't lose information when the client destroys them container->header.info = *createinfo; + container->header.info.props = SDL_CreateProperties(); + SDL_CopyProperties(createinfo->props, container->header.info.props); + container->textureCapacity = 1; container->textureCount = 1; container->textures = (D3D12Texture **)SDL_calloc( @@ -3353,12 +3498,17 @@ static SDL_GPUTexture *D3D12_CreateTexture( } container->debugName = NULL; + if (SDL_HasProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING)) { + container->debugName = SDL_strdup(SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING, NULL)); + } + container->canBeCycled = true; D3D12Texture *texture = D3D12_INTERNAL_CreateTexture( (D3D12Renderer *)driverData, createinfo, - false); + false, + container->debugName); if (!texture) { SDL_free(container->textures); @@ -3379,7 +3529,8 @@ static D3D12Buffer *D3D12_INTERNAL_CreateBuffer( D3D12Renderer *renderer, SDL_GPUBufferUsageFlags usageFlags, Uint32 size, - D3D12BufferType type) + D3D12BufferType type, + const char *debugName) { D3D12Buffer *buffer; ID3D12Resource *handle; @@ -3568,6 +3719,12 @@ static D3D12Buffer *D3D12_INTERNAL_CreateBuffer( buffer->transitioned = initialState != D3D12_RESOURCE_STATE_COMMON; SDL_SetAtomicInt(&buffer->referenceCount, 0); + + D3D12_INTERNAL_SetResourceName( + renderer, + buffer->handle, + debugName); + return buffer; } @@ -3575,7 +3732,8 @@ static D3D12BufferContainer *D3D12_INTERNAL_CreateBufferContainer( D3D12Renderer *renderer, SDL_GPUBufferUsageFlags usageFlags, Uint32 size, - D3D12BufferType type) + D3D12BufferType type, + const char *debugName) { D3D12BufferContainer *container; D3D12Buffer *buffer; @@ -3603,7 +3761,8 @@ static D3D12BufferContainer *D3D12_INTERNAL_CreateBufferContainer( renderer, usageFlags, size, - type); + type, + debugName); if (buffer == NULL) { SDL_free(container->buffers); @@ -3616,190 +3775,39 @@ static D3D12BufferContainer *D3D12_INTERNAL_CreateBufferContainer( buffer->container = container; buffer->containerIndex = 0; + if (debugName != NULL) { + container->debugName = SDL_strdup(debugName); + } + return container; } static SDL_GPUBuffer *D3D12_CreateBuffer( SDL_GPURenderer *driverData, SDL_GPUBufferUsageFlags usageFlags, - Uint32 size) + Uint32 size, + const char *debugName) { return (SDL_GPUBuffer *)D3D12_INTERNAL_CreateBufferContainer( (D3D12Renderer *)driverData, usageFlags, size, - D3D12_BUFFER_TYPE_GPU); + D3D12_BUFFER_TYPE_GPU, + debugName); } static SDL_GPUTransferBuffer *D3D12_CreateTransferBuffer( SDL_GPURenderer *driverData, SDL_GPUTransferBufferUsage usage, - Uint32 size) + Uint32 size, + const char *debugName) { return (SDL_GPUTransferBuffer *)D3D12_INTERNAL_CreateBufferContainer( (D3D12Renderer *)driverData, 0, size, - usage == SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD ? D3D12_BUFFER_TYPE_UPLOAD : D3D12_BUFFER_TYPE_DOWNLOAD); -} - -// Debug Naming - -static void D3D12_SetBufferName( - SDL_GPURenderer *driverData, - SDL_GPUBuffer *buffer, - const char *text) -{ - D3D12Renderer *renderer = (D3D12Renderer *)driverData; - D3D12BufferContainer *container = (D3D12BufferContainer *)buffer; - size_t textLength = SDL_strlen(text) + 1; - - if (renderer->debug_mode) { - container->debugName = (char *)SDL_realloc( - container->debugName, - textLength); - - SDL_utf8strlcpy( - container->debugName, - text, - textLength); - - for (Uint32 i = 0; i < container->bufferCount; i += 1) { - D3D12_INTERNAL_SetResourceName( - renderer, - container->buffers[i]->handle, - text); - } - } -} - -static void D3D12_SetTextureName( - SDL_GPURenderer *driverData, - SDL_GPUTexture *texture, - const char *text) -{ - D3D12Renderer *renderer = (D3D12Renderer *)driverData; - D3D12TextureContainer *container = (D3D12TextureContainer *)texture; - size_t textLength = SDL_strlen(text) + 1; - - if (renderer->debug_mode) { - container->debugName = (char *)SDL_realloc( - container->debugName, - textLength); - - SDL_utf8strlcpy( - container->debugName, - text, - textLength); - - for (Uint32 i = 0; i < container->textureCount; i += 1) { - D3D12_INTERNAL_SetResourceName( - renderer, - container->textures[i]->resource, - text); - } - } -} - -/* These debug functions are all marked as "for internal usage only" - * on D3D12... works on renderdoc! - */ - -static bool D3D12_INTERNAL_StrToWStr( - D3D12Renderer *renderer, - const char *str, - wchar_t *wstr, - size_t wstrSize, - Uint32 *outSize) -{ - size_t inlen, result; - size_t outBytesLeft = wstrSize; - *outSize = 0; - - if (renderer->iconv == NULL) { - renderer->iconv = SDL_iconv_open("WCHAR_T", "UTF-8"); - SDL_assert(renderer->iconv); - } - - // Convert... - inlen = SDL_strlen(str) + 1; - result = SDL_iconv( - renderer->iconv, - &str, - &inlen, - (char **)&wstr, - &outBytesLeft); - - - // Check... - switch (result) { - case SDL_ICONV_ERROR: - case SDL_ICONV_E2BIG: - case SDL_ICONV_EILSEQ: - case SDL_ICONV_EINVAL: - SDL_LogWarn(SDL_LOG_CATEGORY_GPU, "Failed to convert string to wchar_t!"); - return false; - default: - break; - } - - *outSize = (Uint32)(wstrSize - outBytesLeft); - return true; -} - -static void D3D12_InsertDebugLabel( - SDL_GPUCommandBuffer *commandBuffer, - const char *text) -{ - D3D12CommandBuffer *d3d12CommandBuffer = (D3D12CommandBuffer *)commandBuffer; - wchar_t wstr[256]; - Uint32 convSize; - - if (!D3D12_INTERNAL_StrToWStr( - d3d12CommandBuffer->renderer, - text, - wstr, - sizeof(wstr), - &convSize)) { - return; - } - - ID3D12GraphicsCommandList_SetMarker( - d3d12CommandBuffer->graphicsCommandList, - 0, - wstr, - convSize); -} - -static void D3D12_PushDebugGroup( - SDL_GPUCommandBuffer *commandBuffer, - const char *name) -{ - D3D12CommandBuffer *d3d12CommandBuffer = (D3D12CommandBuffer *)commandBuffer; - wchar_t wstr[256]; - Uint32 convSize; - - if (!D3D12_INTERNAL_StrToWStr( - d3d12CommandBuffer->renderer, - name, - wstr, - sizeof(wstr), - &convSize)) { - return; - } - - ID3D12GraphicsCommandList_BeginEvent( - d3d12CommandBuffer->graphicsCommandList, - 0, - wstr, - convSize); -} - -static void D3D12_PopDebugGroup( - SDL_GPUCommandBuffer *commandBuffer) -{ - D3D12CommandBuffer *d3d12CommandBuffer = (D3D12CommandBuffer *)commandBuffer; - ID3D12GraphicsCommandList_EndEvent(d3d12CommandBuffer->graphicsCommandList); + usage == SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD ? D3D12_BUFFER_TYPE_UPLOAD : D3D12_BUFFER_TYPE_DOWNLOAD, + debugName); } // Disposal @@ -4017,7 +4025,8 @@ static void D3D12_INTERNAL_CycleActiveTexture( texture = D3D12_INTERNAL_CreateTexture( renderer, &container->header.info, - false); + false, + container->debugName); if (!texture) { return; @@ -4036,13 +4045,6 @@ static void D3D12_INTERNAL_CycleActiveTexture( container->textureCount += 1; container->activeTexture = texture; - - if (renderer->debug_mode && container->debugName != NULL) { - D3D12_INTERNAL_SetResourceName( - renderer, - container->activeTexture->resource, - container->debugName); - } } static D3D12TextureSubresource *D3D12_INTERNAL_PrepareTextureSubresourceForWrite( @@ -4098,7 +4100,8 @@ static void D3D12_INTERNAL_CycleActiveBuffer( renderer, container->usage, container->size, - container->type); + container->type, + container->debugName); if (!buffer) { return; @@ -4372,7 +4375,8 @@ static D3D12UniformBuffer *D3D12_INTERNAL_AcquireUniformBufferFromPool( renderer, 0, UNIFORM_BUFFER_SIZE, - D3D12_BUFFER_TYPE_UNIFORM); + D3D12_BUFFER_TYPE_UNIFORM, + NULL); if (!uniformBuffer->buffer) { SDL_UnlockMutex(renderer->acquireUniformBufferLock); return NULL; @@ -5751,7 +5755,8 @@ static void D3D12_UploadToTexture( d3d12CommandBuffer->renderer, 0, alignedRowPitch * destination->h * destination->d, - D3D12_BUFFER_TYPE_UPLOAD); + D3D12_BUFFER_TYPE_UPLOAD, + NULL); if (!temporaryBuffer) { return; @@ -5797,7 +5802,8 @@ static void D3D12_UploadToTexture( d3d12CommandBuffer->renderer, 0, alignedRowPitch * destination->h * destination->d, - D3D12_BUFFER_TYPE_UPLOAD); + D3D12_BUFFER_TYPE_UPLOAD, + NULL); if (!temporaryBuffer) { return; @@ -6080,7 +6086,8 @@ static void D3D12_DownloadFromTexture( d3d12CommandBuffer->renderer, 0, alignedRowPitch * rowsPerSlice * source->d, - D3D12_BUFFER_TYPE_DOWNLOAD); + D3D12_BUFFER_TYPE_DOWNLOAD, + NULL); if (!textureDownload->temporaryBuffer) { SDL_free(textureDownload); @@ -6222,16 +6229,16 @@ static void D3D12_GenerateMipmaps( blitInfo.source.layer_or_depth_plane = layerOrDepthIndex; blitInfo.source.x = 0; blitInfo.source.y = 0; - blitInfo.source.w = container->header.info.width >> (levelIndex - 1); - blitInfo.source.h = container->header.info.height >> (levelIndex - 1); + blitInfo.source.w = SDL_max(container->header.info.width >> (levelIndex - 1), 1); + blitInfo.source.h = SDL_max(container->header.info.height >> (levelIndex - 1), 1); blitInfo.destination.texture = texture; blitInfo.destination.mip_level = levelIndex; blitInfo.destination.layer_or_depth_plane = layerOrDepthIndex; blitInfo.destination.x = 0; blitInfo.destination.y = 0; - blitInfo.destination.w = container->header.info.width >> levelIndex; - blitInfo.destination.h = container->header.info.height >> levelIndex; + blitInfo.destination.w = SDL_max(container->header.info.width >> levelIndex, 1); + blitInfo.destination.h = SDL_max(container->header.info.height >> levelIndex, 1); blitInfo.load_op = SDL_GPU_LOADOP_DONT_CARE; blitInfo.filter = SDL_GPU_FILTER_LINEAR; @@ -6396,7 +6403,7 @@ static bool D3D12_INTERNAL_CreateSwapchain( createInfo.num_levels = 1; for (Uint32 i = 0; i < windowData->swapchainTextureCount; i += 1) { - texture = D3D12_INTERNAL_CreateTexture(renderer, &createInfo, true); + texture = D3D12_INTERNAL_CreateTexture(renderer, &createInfo, true, "Swapchain"); texture->container = &windowData->textureContainers[i]; windowData->textureContainers[i].activeTexture = texture; windowData->textureContainers[i].canBeCycled = false; diff --git a/libs/SDL3/src/gpu/metal/SDL_gpu_metal.m b/libs/SDL3/src/gpu/metal/SDL_gpu_metal.m index d2a970a1..ac712d52 100644 --- a/libs/SDL3/src/gpu/metal/SDL_gpu_metal.m +++ b/libs/SDL3/src/gpu/metal/SDL_gpu_metal.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -369,7 +369,7 @@ static SDL_GPUTextureFormat SwapchainCompositionToFormat[] = { SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM, // SDR SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB, // SDR_LINEAR SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT, // HDR_EXTENDED_LINEAR - SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM, // HDR10_ST2048 + SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM, // HDR10_ST2084 }; static CFStringRef SwapchainCompositionToColorSpace[4]; // initialized on device creation @@ -386,11 +386,7 @@ static MTLTextureType SDLToMetal_TextureType(SDL_GPUTextureType textureType, boo case SDL_GPU_TEXTURETYPE_CUBE: return MTLTextureTypeCube; case SDL_GPU_TEXTURETYPE_CUBE_ARRAY: - if (@available(iOS 11.0, tvOS 11.0, *)) { - return MTLTextureTypeCubeArray; - } else { - return MTLTextureType2D; // FIXME: I guess...? - } + return MTLTextureTypeCubeArray; default: return MTLTextureType2D; } @@ -471,6 +467,7 @@ typedef struct MetalShader id library; id function; + SDL_GPUShaderStage stage; Uint32 numSamplers; Uint32 numUniformBuffers; Uint32 numStorageBuffers; @@ -1042,7 +1039,15 @@ static SDL_GPUComputePipeline *METAL_CreateComputePipeline( return NULL; } - handle = [renderer->device newComputePipelineStateWithFunction:libraryFunction.function error:&error]; + MTLComputePipelineDescriptor *descriptor = [MTLComputePipelineDescriptor new]; + descriptor.computeFunction = libraryFunction.function; + + if (renderer->debugMode && SDL_HasProperty(createinfo->props, SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING)) { + const char *name = SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING, NULL); + descriptor.label = @(name); + } + + handle = [renderer->device newComputePipelineStateWithDescriptor:descriptor options:MTLPipelineOptionNone reflection: nil error:&error]; if (error != NULL) { SET_ERROR_AND_RETURN("Creating compute pipeline failed: %s", [[error description] UTF8String], NULL); } @@ -1083,6 +1088,14 @@ static SDL_GPUGraphicsPipeline *METAL_CreateGraphicsPipeline( NSError *error = NULL; MetalGraphicsPipeline *result = NULL; + if (renderer->debugMode) { + if (vertexShader->stage != SDL_GPU_SHADERSTAGE_VERTEX) { + SDL_assert_release(!"CreateGraphicsPipeline was passed a fragment shader for the vertex stage"); + } + if (fragmentShader->stage != SDL_GPU_SHADERSTAGE_FRAGMENT) { + SDL_assert_release(!"CreateGraphicsPipeline was passed a vertex shader for the fragment stage"); + } + } pipelineDescriptor = [MTLRenderPipelineDescriptor new]; // Blend @@ -1112,10 +1125,11 @@ static SDL_GPUGraphicsPipeline *METAL_CreateGraphicsPipeline( if (createinfo->target_info.has_depth_stencil_target) { pipelineDescriptor.depthAttachmentPixelFormat = SDLToMetal_TextureFormat(createinfo->target_info.depth_stencil_format); + if (IsStencilFormat(createinfo->target_info.depth_stencil_format)) { + pipelineDescriptor.stencilAttachmentPixelFormat = SDLToMetal_TextureFormat(createinfo->target_info.depth_stencil_format); + } if (createinfo->depth_stencil_state.enable_stencil_test) { - pipelineDescriptor.stencilAttachmentPixelFormat = SDLToMetal_TextureFormat(createinfo->target_info.depth_stencil_format); - frontStencilDescriptor = [MTLStencilDescriptor new]; frontStencilDescriptor.stencilCompareFunction = SDLToMetal_CompareOp[createinfo->depth_stencil_state.front_stencil_state.compare_op]; frontStencilDescriptor.stencilFailureOperation = SDLToMetal_StencilOp[createinfo->depth_stencil_state.front_stencil_state.fail_op]; @@ -1135,7 +1149,8 @@ static SDL_GPUGraphicsPipeline *METAL_CreateGraphicsPipeline( depthStencilDescriptor = [MTLDepthStencilDescriptor new]; depthStencilDescriptor.depthCompareFunction = createinfo->depth_stencil_state.enable_depth_test ? SDLToMetal_CompareOp[createinfo->depth_stencil_state.compare_op] : MTLCompareFunctionAlways; - depthStencilDescriptor.depthWriteEnabled = createinfo->depth_stencil_state.enable_depth_write; + // Disable write when test is disabled, to match other APIs' behavior + depthStencilDescriptor.depthWriteEnabled = createinfo->depth_stencil_state.enable_depth_write && createinfo->depth_stencil_state.enable_depth_test; depthStencilDescriptor.frontFaceStencil = frontStencilDescriptor; depthStencilDescriptor.backFaceStencil = backStencilDescriptor; @@ -1172,6 +1187,11 @@ static SDL_GPUGraphicsPipeline *METAL_CreateGraphicsPipeline( pipelineDescriptor.vertexDescriptor = vertexDescriptor; } + if (renderer->debugMode && SDL_HasProperty(createinfo->props, SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING)) { + const char *name = SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING, NULL); + pipelineDescriptor.label = @(name); + } + // Create the graphics pipeline pipelineState = [renderer->device newRenderPipelineStateWithDescriptor:pipelineDescriptor error:&error]; @@ -1211,17 +1231,13 @@ static void METAL_SetBufferName( @autoreleasepool { MetalRenderer *renderer = (MetalRenderer *)driverData; MetalBufferContainer *container = (MetalBufferContainer *)buffer; - size_t textLength = SDL_strlen(text) + 1; - if (renderer->debugMode) { - container->debugName = SDL_realloc( - container->debugName, - textLength); + if (renderer->debugMode && text != NULL) { + if (container->debugName != NULL) { + SDL_free(container->debugName); + } - SDL_utf8strlcpy( - container->debugName, - text, - textLength); + container->debugName = SDL_strdup(text); for (Uint32 i = 0; i < container->bufferCount; i += 1) { container->buffers[i]->handle.label = @(text); @@ -1238,17 +1254,13 @@ static void METAL_SetTextureName( @autoreleasepool { MetalRenderer *renderer = (MetalRenderer *)driverData; MetalTextureContainer *container = (MetalTextureContainer *)texture; - size_t textLength = SDL_strlen(text) + 1; - if (renderer->debugMode) { - container->debugName = SDL_realloc( - container->debugName, - textLength); + if (renderer->debugMode && text != NULL) { + if (container->debugName != NULL) { + SDL_free(container->debugName); + } - SDL_utf8strlcpy( - container->debugName, - text, - textLength); + container->debugName = SDL_strdup(text); for (Uint32 i = 0; i < container->textureCount; i += 1) { container->textures[i]->handle.label = @(text); @@ -1273,10 +1285,8 @@ static void METAL_InsertDebugLabel( [metalCommandBuffer->computeEncoder insertDebugSignpost:label]; } else { // Metal doesn't have insertDebugSignpost for command buffers... - if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) { - [metalCommandBuffer->handle pushDebugGroup:label]; - [metalCommandBuffer->handle popDebugGroup]; - } + [metalCommandBuffer->handle pushDebugGroup:label]; + [metalCommandBuffer->handle popDebugGroup]; } } } @@ -1296,9 +1306,7 @@ static void METAL_PushDebugGroup( } else if (metalCommandBuffer->computeEncoder) { [metalCommandBuffer->computeEncoder pushDebugGroup:label]; } else { - if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) { - [metalCommandBuffer->handle pushDebugGroup:label]; - } + [metalCommandBuffer->handle pushDebugGroup:label]; } } } @@ -1316,9 +1324,7 @@ static void METAL_PopDebugGroup( } else if (metalCommandBuffer->computeEncoder) { [metalCommandBuffer->computeEncoder popDebugGroup]; } else { - if (@available(macOS 10.13, iOS 11.0, tvOS 11.0, *)) { - [metalCommandBuffer->handle popDebugGroup]; - } + [metalCommandBuffer->handle popDebugGroup]; } } } @@ -1346,6 +1352,11 @@ static SDL_GPUSampler *METAL_CreateSampler( samplerDesc.maxAnisotropy = (NSUInteger)((createinfo->enable_anisotropy) ? createinfo->max_anisotropy : 1); samplerDesc.compareFunction = (createinfo->enable_compare) ? SDLToMetal_CompareOp[createinfo->compare_op] : MTLCompareFunctionAlways; + if (renderer->debugMode && SDL_HasProperty(createinfo->props, SDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING)) { + const char *name = SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING, NULL); + samplerDesc.label = @(name); + } + sampler = [renderer->device newSamplerStateWithDescriptor:samplerDesc]; if (sampler == NULL) { SET_STRING_ERROR_AND_RETURN("Failed to create sampler", NULL); @@ -1379,6 +1390,7 @@ static SDL_GPUShader *METAL_CreateShader( result = SDL_calloc(1, sizeof(MetalShader)); result->library = libraryFunction.library; result->function = libraryFunction.function; + result->stage = createinfo->stage; result->numSamplers = createinfo->num_samplers; result->numStorageBuffers = createinfo->num_storage_buffers; result->numStorageTextures = createinfo->num_storage_textures; @@ -1445,6 +1457,11 @@ static MetalTexture *METAL_INTERNAL_CreateTexture( metalTexture = (MetalTexture *)SDL_calloc(1, sizeof(MetalTexture)); metalTexture->handle = texture; SDL_SetAtomicInt(&metalTexture->referenceCount, 0); + + if (renderer->debugMode && SDL_HasProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING)) { + metalTexture->handle.label = @(SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING, NULL)); + } + return metalTexture; } @@ -1479,7 +1496,12 @@ static SDL_GPUTexture *METAL_CreateTexture( container = SDL_calloc(1, sizeof(MetalTextureContainer)); container->canBeCycled = 1; + + // Copy properties so we don't lose information when the client destroys them container->header.info = *createinfo; + container->header.info.props = SDL_CreateProperties(); + SDL_CopyProperties(createinfo->props, container->header.info.props); + container->activeTexture = texture; container->textureCapacity = 1; container->textureCount = 1; @@ -1488,6 +1510,10 @@ static SDL_GPUTexture *METAL_CreateTexture( container->textures[0] = texture; container->debugName = NULL; + if (SDL_HasProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING)) { + container->debugName = SDL_strdup(SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING, NULL)); + } + return (SDL_GPUTexture *)container; } } @@ -1522,10 +1548,6 @@ static MetalTexture *METAL_INTERNAL_PrepareTextureForWrite( container->textureCount += 1; container->activeTexture = container->textures[container->textureCount - 1]; - - if (renderer->debugMode && container->debugName != NULL) { - container->activeTexture->handle.label = @(container->debugName); - } } return container->activeTexture; @@ -1535,7 +1557,8 @@ static MetalTexture *METAL_INTERNAL_PrepareTextureForWrite( static MetalBuffer *METAL_INTERNAL_CreateBuffer( MetalRenderer *renderer, Uint32 size, - MTLResourceOptions resourceOptions) + MTLResourceOptions resourceOptions, + const char *debugName) { id bufferHandle; MetalBuffer *metalBuffer; @@ -1553,6 +1576,10 @@ static MetalBuffer *METAL_INTERNAL_CreateBuffer( metalBuffer->handle = bufferHandle; SDL_SetAtomicInt(&metalBuffer->referenceCount, 0); + if (debugName != NULL) { + metalBuffer->handle.label = @(debugName); + } + return metalBuffer; } @@ -1561,7 +1588,8 @@ static MetalBufferContainer *METAL_INTERNAL_CreateBufferContainer( MetalRenderer *renderer, Uint32 size, bool isPrivate, - bool isWriteOnly) + bool isWriteOnly, + const char *debugName) { MetalBufferContainer *container = SDL_calloc(1, sizeof(MetalBufferContainer)); MTLResourceOptions resourceOptions; @@ -1574,6 +1602,9 @@ static MetalBufferContainer *METAL_INTERNAL_CreateBufferContainer( container->isPrivate = isPrivate; container->isWriteOnly = isWriteOnly; container->debugName = NULL; + if (container->debugName != NULL) { + container->debugName = SDL_strdup(debugName); + } if (isPrivate) { resourceOptions = MTLResourceStorageModePrivate; @@ -1588,7 +1619,9 @@ static MetalBufferContainer *METAL_INTERNAL_CreateBufferContainer( container->buffers[0] = METAL_INTERNAL_CreateBuffer( renderer, size, - resourceOptions); + resourceOptions, + debugName); + container->activeBuffer = container->buffers[0]; return container; @@ -1597,28 +1630,32 @@ static MetalBufferContainer *METAL_INTERNAL_CreateBufferContainer( static SDL_GPUBuffer *METAL_CreateBuffer( SDL_GPURenderer *driverData, SDL_GPUBufferUsageFlags usage, - Uint32 size) + Uint32 size, + const char *debugName) { @autoreleasepool { return (SDL_GPUBuffer *)METAL_INTERNAL_CreateBufferContainer( (MetalRenderer *)driverData, size, true, - false); + false, + debugName); } } static SDL_GPUTransferBuffer *METAL_CreateTransferBuffer( SDL_GPURenderer *driverData, SDL_GPUTransferBufferUsage usage, - Uint32 size) + Uint32 size, + const char *debugName) { @autoreleasepool { return (SDL_GPUTransferBuffer *)METAL_INTERNAL_CreateBufferContainer( (MetalRenderer *)driverData, size, false, - usage == SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD); + usage == SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD, + debugName); } } @@ -1682,14 +1719,11 @@ static MetalBuffer *METAL_INTERNAL_PrepareBufferForWrite( container->buffers[container->bufferCount] = METAL_INTERNAL_CreateBuffer( renderer, container->size, - resourceOptions); + resourceOptions, + container->debugName); container->bufferCount += 1; container->activeBuffer = container->buffers[container->bufferCount - 1]; - - if (renderer->debugMode && container->debugName != NULL) { - container->activeBuffer->handle.label = @(container->debugName); - } } return container->activeBuffer; @@ -2374,9 +2408,7 @@ static void METAL_BindGraphicsPipeline( [metalCommandBuffer->renderEncoder setTriangleFillMode:SDLToMetal_PolygonMode[metalGraphicsPipeline->rasterizerState.fill_mode]]; [metalCommandBuffer->renderEncoder setCullMode:SDLToMetal_CullMode[metalGraphicsPipeline->rasterizerState.cull_mode]]; [metalCommandBuffer->renderEncoder setFrontFacingWinding:SDLToMetal_FrontFace[metalGraphicsPipeline->rasterizerState.front_face]]; - if (@available(iOS 11.0, tvOS 11.0, *)) { - [metalCommandBuffer->renderEncoder setDepthClipMode:SDLToMetal_DepthClipMode(metalGraphicsPipeline->rasterizerState.enable_depth_clip)]; - } + [metalCommandBuffer->renderEncoder setDepthClipMode:SDLToMetal_DepthClipMode(metalGraphicsPipeline->rasterizerState.enable_depth_clip)]; [metalCommandBuffer->renderEncoder setDepthBias:((rast->enable_depth_bias) ? rast->depth_bias_constant_factor : 0) slopeScale:((rast->enable_depth_bias) ? rast->depth_bias_slope_factor : 0) @@ -3490,7 +3522,7 @@ static bool METAL_SupportsSwapchainComposition( SDL_GPUSwapchainComposition swapchainComposition) { #ifndef SDL_PLATFORM_MACOS - if (swapchainComposition == SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2048) { + if (swapchainComposition == SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084) { return false; } #endif @@ -3498,7 +3530,7 @@ static bool METAL_SupportsSwapchainComposition( if (@available(macOS 11.0, *)) { return true; } else { - return swapchainComposition != SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2048; + return swapchainComposition != SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084; } } @@ -4374,6 +4406,7 @@ static SDL_GPUDevice *METAL_CreateDevice(bool debugMode, bool preferLowPower, SD } #ifdef SDL_PLATFORM_MACOS + hasHardwareSupport = true; if (@available(macOS 10.15, *)) { hasHardwareSupport = [device supportsFamily:MTLGPUFamilyMac2]; } else if (@available(macOS 10.14, *)) { diff --git a/libs/SDL3/src/gpu/vulkan/SDL_gpu_vulkan.c b/libs/SDL3/src/gpu/vulkan/SDL_gpu_vulkan.c index 0e6f505a..d684ff9d 100644 --- a/libs/SDL3/src/gpu/vulkan/SDL_gpu_vulkan.c +++ b/libs/SDL3/src/gpu/vulkan/SDL_gpu_vulkan.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -271,14 +271,14 @@ static VkFormat SwapchainCompositionToFormat[] = { VK_FORMAT_B8G8R8A8_UNORM, // SDR VK_FORMAT_B8G8R8A8_SRGB, // SDR_LINEAR VK_FORMAT_R16G16B16A16_SFLOAT, // HDR_EXTENDED_LINEAR - VK_FORMAT_A2B10G10R10_UNORM_PACK32 // HDR10_ST2048 + VK_FORMAT_A2B10G10R10_UNORM_PACK32 // HDR10_ST2084 }; static VkFormat SwapchainCompositionToFallbackFormat[] = { - VK_FORMAT_R8G8B8A8_UNORM, - VK_FORMAT_R8G8B8A8_SRGB, - VK_FORMAT_UNDEFINED, // no fallback - VK_FORMAT_UNDEFINED // no fallback + VK_FORMAT_R8G8B8A8_UNORM, // SDR + VK_FORMAT_R8G8B8A8_SRGB, // SDR_LINEAR + VK_FORMAT_UNDEFINED, // HDR_EXTENDED_LINEAR (no fallback) + VK_FORMAT_UNDEFINED // HDR10_ST2084 (no fallback) }; static SDL_GPUTextureFormat SwapchainCompositionToSDLFormat( @@ -292,7 +292,7 @@ static SDL_GPUTextureFormat SwapchainCompositionToSDLFormat( return usingFallback ? SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB : SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB; case SDL_GPU_SWAPCHAINCOMPOSITION_HDR_EXTENDED_LINEAR: return SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT; - case SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2048: + case SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084: return SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM; default: return SDL_GPU_TEXTUREFORMAT_INVALID; @@ -300,18 +300,18 @@ static SDL_GPUTextureFormat SwapchainCompositionToSDLFormat( } static VkColorSpaceKHR SwapchainCompositionToColorSpace[] = { - VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, - VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, - VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT, - VK_COLOR_SPACE_HDR10_ST2084_EXT + VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, // SDR + VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, // SDR_LINEAR + VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT, // HDR_EXTENDED_LINEAR + VK_COLOR_SPACE_HDR10_ST2084_EXT // HDR10_ST2084 }; static VkComponentMapping SwapchainCompositionSwizzle[] = { IDENTITY_SWIZZLE, // SDR - IDENTITY_SWIZZLE, // SDR_SRGB - IDENTITY_SWIZZLE, // HDR + IDENTITY_SWIZZLE, // SDR_LINEAR + IDENTITY_SWIZZLE, // HDR_EXTENDED_LINEAR { - // HDR_ADVANCED + // HDR10_ST2084 VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, @@ -479,6 +479,7 @@ static VkSamplerAddressMode SDLToVK_SamplerAddressMode[] = { typedef struct VulkanMemoryAllocation VulkanMemoryAllocation; typedef struct VulkanBuffer VulkanBuffer; typedef struct VulkanBufferContainer VulkanBufferContainer; +typedef struct VulkanUniformBuffer VulkanUniformBuffer; typedef struct VulkanTexture VulkanTexture; typedef struct VulkanTextureContainer VulkanTextureContainer; @@ -573,6 +574,7 @@ struct VulkanBuffer SDL_AtomicInt referenceCount; bool transitioned; bool markedForDestroy; // so that defrag doesn't double-free + VulkanUniformBuffer *uniformBufferForDefrag; }; struct VulkanBufferContainer @@ -607,6 +609,7 @@ typedef struct VulkanShader { VkShaderModule shaderModule; const char *entrypointName; + SDL_GPUShaderStage stage; Uint32 numSamplers; Uint32 numStorageTextures; Uint32 numStorageBuffers; @@ -1197,7 +1200,6 @@ struct VulkanRenderer SDL_Mutex *submitLock; SDL_Mutex *acquireCommandBufferLock; SDL_Mutex *acquireUniformBufferLock; - SDL_Mutex *renderPassFetchLock; SDL_Mutex *framebufferFetchLock; SDL_Mutex *windowLock; @@ -4068,7 +4070,8 @@ static VulkanBuffer *VULKAN_INTERNAL_CreateBuffer( VkDeviceSize size, SDL_GPUBufferUsageFlags usageFlags, VulkanBufferType type, - bool dedicated) + bool dedicated, + const char *debugName) { VulkanBuffer *buffer; VkResult vulkanResult; @@ -4101,7 +4104,7 @@ static VulkanBuffer *VULKAN_INTERNAL_CreateBuffer( vulkanUsageFlags |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; } - buffer = SDL_malloc(sizeof(VulkanBuffer)); + buffer = SDL_calloc(1, sizeof(VulkanBuffer)); buffer->size = size; buffer->usage = usageFlags; @@ -4154,6 +4157,19 @@ static VulkanBuffer *VULKAN_INTERNAL_CreateBuffer( SDL_SetAtomicInt(&buffer->referenceCount, 0); + if (renderer->debugMode && renderer->supportsDebugUtils && debugName != NULL) { + VkDebugUtilsObjectNameInfoEXT nameInfo; + nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + nameInfo.pNext = NULL; + nameInfo.pObjectName = debugName; + nameInfo.objectType = VK_OBJECT_TYPE_BUFFER; + nameInfo.objectHandle = (uint64_t)buffer->buffer; + + renderer->vkSetDebugUtilsObjectNameEXT( + renderer->logicalDevice, + &nameInfo); + } + return buffer; } @@ -4162,7 +4178,8 @@ static VulkanBufferContainer *VULKAN_INTERNAL_CreateBufferContainer( VkDeviceSize size, SDL_GPUBufferUsageFlags usageFlags, VulkanBufferType type, - bool dedicated) + bool dedicated, + const char *debugName) { VulkanBufferContainer *bufferContainer; VulkanBuffer *buffer; @@ -4172,13 +4189,14 @@ static VulkanBufferContainer *VULKAN_INTERNAL_CreateBufferContainer( size, usageFlags, type, - dedicated); + dedicated, + debugName); if (buffer == NULL) { return NULL; } - bufferContainer = SDL_malloc(sizeof(VulkanBufferContainer)); + bufferContainer = SDL_calloc(1, sizeof(VulkanBufferContainer)); bufferContainer->activeBuffer = buffer; buffer->container = bufferContainer; @@ -4186,12 +4204,15 @@ static VulkanBufferContainer *VULKAN_INTERNAL_CreateBufferContainer( bufferContainer->bufferCapacity = 1; bufferContainer->bufferCount = 1; - bufferContainer->buffers = SDL_malloc( - bufferContainer->bufferCapacity * sizeof(VulkanBuffer *)); + bufferContainer->buffers = SDL_calloc(bufferContainer->bufferCapacity, sizeof(VulkanBuffer *)); bufferContainer->buffers[0] = bufferContainer->activeBuffer; bufferContainer->dedicated = dedicated; bufferContainer->debugName = NULL; + if (debugName != NULL) { + bufferContainer->debugName = SDL_strdup(debugName); + } + return bufferContainer; } @@ -4463,6 +4484,7 @@ static Uint32 VULKAN_INTERNAL_CreateSwapchain( &windowData->surface)) { return false; } + SDL_assert(windowData->surface); if (!VULKAN_INTERNAL_QuerySwapchainSupport( renderer, @@ -4902,7 +4924,6 @@ static void VULKAN_DestroyDevice( SDL_DestroyMutex(renderer->submitLock); SDL_DestroyMutex(renderer->acquireCommandBufferLock); SDL_DestroyMutex(renderer->acquireUniformBufferLock); - SDL_DestroyMutex(renderer->renderPassFetchLock); SDL_DestroyMutex(renderer->framebufferFetchLock); SDL_DestroyMutex(renderer->windowLock); @@ -5761,6 +5782,20 @@ static VulkanTexture *VULKAN_INTERNAL_CreateTexture( } } + // Set debug name if applicable + if (renderer->debugMode && renderer->supportsDebugUtils && SDL_HasProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING)) { + VkDebugUtilsObjectNameInfoEXT nameInfo; + nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + nameInfo.pNext = NULL; + nameInfo.pObjectName = SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING, NULL); + nameInfo.objectType = VK_OBJECT_TYPE_IMAGE; + nameInfo.objectHandle = (uint64_t)texture->image; + + renderer->vkSetDebugUtilsObjectNameEXT( + renderer->logicalDevice, + &nameInfo); + } + // Let's transition to the default barrier state, because for some reason Vulkan doesn't let us do that with initialLayout. VulkanCommandBuffer *barrierCommandBuffer = (VulkanCommandBuffer *)VULKAN_AcquireCommandBuffer((SDL_GPURenderer *)renderer); VULKAN_INTERNAL_TextureTransitionToDefaultUsage( @@ -5795,7 +5830,8 @@ static void VULKAN_INTERNAL_CycleActiveBuffer( container->activeBuffer->size, container->activeBuffer->usage, container->activeBuffer->type, - container->dedicated); + container->dedicated, + container->debugName); if (!buffer) { return; @@ -5814,13 +5850,6 @@ static void VULKAN_INTERNAL_CycleActiveBuffer( container->bufferCount += 1; container->activeBuffer = buffer; - - if (renderer->debugMode && renderer->supportsDebugUtils && container->debugName != NULL) { - VULKAN_INTERNAL_SetBufferName( - renderer, - container->activeBuffer, - container->debugName); - } } static void VULKAN_INTERNAL_CycleActiveTexture( @@ -5861,13 +5890,6 @@ static void VULKAN_INTERNAL_CycleActiveTexture( container->textureCount += 1; container->activeTexture = texture; - - if (renderer->debugMode && renderer->supportsDebugUtils && container->debugName != NULL) { - VULKAN_INTERNAL_SetTextureName( - renderer, - container->activeTexture, - container->debugName); - } } static VulkanBuffer *VULKAN_INTERNAL_PrepareBufferForWrite( @@ -6228,6 +6250,15 @@ static SDL_GPUGraphicsPipeline *VULKAN_CreateGraphicsPipeline( shaderStageCreateInfos[1].pName = graphicsPipeline->fragmentShader->entrypointName; shaderStageCreateInfos[1].pSpecializationInfo = NULL; + if (renderer->debugMode) { + if (graphicsPipeline->vertexShader->stage != SDL_GPU_SHADERSTAGE_VERTEX) { + SDL_assert_release(!"CreateGraphicsPipeline was passed a fragment shader for the vertex stage"); + } + if (graphicsPipeline->fragmentShader->stage != SDL_GPU_SHADERSTAGE_FRAGMENT) { + SDL_assert_release(!"CreateGraphicsPipeline was passed a vertex shader for the fragment stage"); + } + } + // Vertex input for (i = 0; i < createinfo->vertex_input_state.num_vertex_buffers; i += 1) { @@ -6474,6 +6505,19 @@ static SDL_GPUGraphicsPipeline *VULKAN_CreateGraphicsPipeline( SDL_SetAtomicInt(&graphicsPipeline->referenceCount, 0); + if (renderer->debugMode && renderer->supportsDebugUtils && SDL_HasProperty(createinfo->props, SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING)) { + VkDebugUtilsObjectNameInfoEXT nameInfo; + nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + nameInfo.pNext = NULL; + nameInfo.pObjectName = SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING, NULL); + nameInfo.objectType = VK_OBJECT_TYPE_PIPELINE; + nameInfo.objectHandle = (uint64_t)graphicsPipeline->pipeline; + + renderer->vkSetDebugUtilsObjectNameEXT( + renderer->logicalDevice, + &nameInfo); + } + return (SDL_GPUGraphicsPipeline *)graphicsPipeline; } @@ -6555,6 +6599,19 @@ static SDL_GPUComputePipeline *VULKAN_CreateComputePipeline( SDL_SetAtomicInt(&vulkanComputePipeline->referenceCount, 0); + if (renderer->debugMode && renderer->supportsDebugUtils && SDL_HasProperty(createinfo->props, SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING)) { + VkDebugUtilsObjectNameInfoEXT nameInfo; + nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + nameInfo.pNext = NULL; + nameInfo.pObjectName = SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING, NULL); + nameInfo.objectType = VK_OBJECT_TYPE_PIPELINE; + nameInfo.objectHandle = (uint64_t)vulkanComputePipeline->pipeline; + + renderer->vkSetDebugUtilsObjectNameEXT( + renderer->logicalDevice, + &nameInfo); + } + return (SDL_GPUComputePipeline *)vulkanComputePipeline; } @@ -6599,6 +6656,19 @@ static SDL_GPUSampler *VULKAN_CreateSampler( SDL_SetAtomicInt(&vulkanSampler->referenceCount, 0); + if (renderer->debugMode && renderer->supportsDebugUtils && SDL_HasProperty(createinfo->props, SDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING)) { + VkDebugUtilsObjectNameInfoEXT nameInfo; + nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + nameInfo.pNext = NULL; + nameInfo.pObjectName = SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING, NULL); + nameInfo.objectType = VK_OBJECT_TYPE_SAMPLER; + nameInfo.objectHandle = (uint64_t)vulkanSampler->sampler; + + renderer->vkSetDebugUtilsObjectNameEXT( + renderer->logicalDevice, + &nameInfo); + } + return (SDL_GPUSampler *)vulkanSampler; } @@ -6634,6 +6704,7 @@ static SDL_GPUShader *VULKAN_CreateShader( vulkanShader->entrypointName = SDL_malloc(entryPointNameLength); SDL_utf8strlcpy((char *)vulkanShader->entrypointName, createinfo->entrypoint, entryPointNameLength); + vulkanShader->stage = createinfo->stage; vulkanShader->numSamplers = createinfo->num_samplers; vulkanShader->numStorageTextures = createinfo->num_storage_textures; vulkanShader->numStorageBuffers = createinfo->num_storage_buffers; @@ -6641,6 +6712,19 @@ static SDL_GPUShader *VULKAN_CreateShader( SDL_SetAtomicInt(&vulkanShader->referenceCount, 0); + if (renderer->debugMode && SDL_HasProperty(createinfo->props, SDL_PROP_GPU_SHADER_CREATE_NAME_STRING)) { + VkDebugUtilsObjectNameInfoEXT nameInfo; + nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + nameInfo.pNext = NULL; + nameInfo.pObjectName = SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_SHADER_CREATE_NAME_STRING, NULL); + nameInfo.objectType = VK_OBJECT_TYPE_SHADER_MODULE; + nameInfo.objectHandle = (uint64_t)vulkanShader->shaderModule; + + renderer->vkSetDebugUtilsObjectNameEXT( + renderer->logicalDevice, + &nameInfo); + } + return (SDL_GPUShader *)vulkanShader; } @@ -6672,7 +6756,12 @@ static SDL_GPUTexture *VULKAN_CreateTexture( } container = SDL_malloc(sizeof(VulkanTextureContainer)); + + // Copy properties so we don't lose information when the client destroys them container->header.info = *createinfo; + container->header.info.props = SDL_CreateProperties(); + SDL_CopyProperties(createinfo->props, container->header.info.props); + container->canBeCycled = true; container->activeTexture = texture; container->textureCapacity = 1; @@ -6682,6 +6771,10 @@ static SDL_GPUTexture *VULKAN_CreateTexture( container->textures[0] = container->activeTexture; container->debugName = NULL; + if (SDL_HasProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING)) { + container->debugName = SDL_strdup(SDL_GetStringProperty(createinfo->props, SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING, NULL)); + } + texture->container = container; texture->containerIndex = 0; @@ -6691,32 +6784,35 @@ static SDL_GPUTexture *VULKAN_CreateTexture( static SDL_GPUBuffer *VULKAN_CreateBuffer( SDL_GPURenderer *driverData, SDL_GPUBufferUsageFlags usageFlags, - Uint32 size) + Uint32 size, + const char *debugName) { return (SDL_GPUBuffer *)VULKAN_INTERNAL_CreateBufferContainer( (VulkanRenderer *)driverData, (VkDeviceSize)size, usageFlags, VULKAN_BUFFER_TYPE_GPU, - false); + false, + debugName); } static VulkanUniformBuffer *VULKAN_INTERNAL_CreateUniformBuffer( VulkanRenderer *renderer, Uint32 size) { - VulkanUniformBuffer *uniformBuffer = SDL_malloc(sizeof(VulkanUniformBuffer)); + VulkanUniformBuffer *uniformBuffer = SDL_calloc(1, sizeof(VulkanUniformBuffer)); uniformBuffer->buffer = VULKAN_INTERNAL_CreateBuffer( renderer, (VkDeviceSize)size, 0, VULKAN_BUFFER_TYPE_UNIFORM, - false); + false, + NULL); uniformBuffer->drawOffset = 0; uniformBuffer->writeOffset = 0; - uniformBuffer->buffer->container = (VulkanBufferContainer *)uniformBuffer; // little hack for defrag + uniformBuffer->buffer->uniformBufferForDefrag = uniformBuffer; return uniformBuffer; } @@ -6724,7 +6820,8 @@ static VulkanUniformBuffer *VULKAN_INTERNAL_CreateUniformBuffer( static SDL_GPUTransferBuffer *VULKAN_CreateTransferBuffer( SDL_GPURenderer *driverData, SDL_GPUTransferBufferUsage usage, - Uint32 size) + Uint32 size, + const char *debugName) { // We use dedicated allocations for download buffers to avoid an issue // where a defrag is triggered after submitting a download but before @@ -6734,7 +6831,8 @@ static SDL_GPUTransferBuffer *VULKAN_CreateTransferBuffer( (VkDeviceSize)size, 0, VULKAN_BUFFER_TYPE_TRANSFER, - usage == SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD); + usage == SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD, + debugName); } static void VULKAN_INTERNAL_ReleaseTexture( @@ -6829,6 +6927,7 @@ static void VULKAN_INTERNAL_ReleaseBuffer( renderer->buffersToDestroyCount += 1; vulkanBuffer->markedForDestroy = 1; + vulkanBuffer->container = NULL; SDL_UnlockMutex(renderer->disposeLock); } @@ -6848,6 +6947,7 @@ static void VULKAN_INTERNAL_ReleaseBufferContainer( // Containers are just client handles, so we can free immediately if (bufferContainer->debugName != NULL) { SDL_free(bufferContainer->debugName); + bufferContainer->debugName = NULL; } SDL_free(bufferContainer->buffers); SDL_free(bufferContainer); @@ -6993,15 +7093,11 @@ static VkRenderPass VULKAN_INTERNAL_FetchRenderPass( key.depthStencilTargetDescription.stencilStoreOp = depthStencilTargetInfo->stencil_store_op; } - SDL_LockMutex(renderer->renderPassFetchLock); - bool result = SDL_FindInHashTable( renderer->renderPassHashTable, (const void *)&key, (const void **)&renderPassWrapper); - SDL_UnlockMutex(renderer->renderPassFetchLock); - if (result) { return renderPassWrapper->handle; } @@ -7024,14 +7120,11 @@ static VkRenderPass VULKAN_INTERNAL_FetchRenderPass( renderPassWrapper = SDL_malloc(sizeof(VulkanRenderPassHashTableValue)); renderPassWrapper->handle = renderPassHandle; - SDL_LockMutex(renderer->renderPassFetchLock); - SDL_InsertIntoHashTable( renderer->renderPassHashTable, (const void *)allocedKey, (const void *)renderPassWrapper); - SDL_UnlockMutex(renderer->renderPassFetchLock); return renderPassHandle; } @@ -9471,6 +9564,9 @@ static bool VULKAN_SupportsSwapchainComposition( } surface = windowData->surface; + if (!surface) { + SET_STRING_ERROR_AND_RETURN("Window has no Vulkan surface", false); + } if (VULKAN_INTERNAL_QuerySwapchainSupport( renderer, @@ -9516,6 +9612,9 @@ static bool VULKAN_SupportsPresentMode( } surface = windowData->surface; + if (!surface) { + SET_STRING_ERROR_AND_RETURN("Window has no Vulkan surface", false); + } if (VULKAN_INTERNAL_QuerySwapchainSupport( renderer, @@ -9760,24 +9859,7 @@ static bool VULKAN_INTERNAL_AcquireSwapchainTexture( } // Finally, try to acquire! - acquireResult = renderer->vkAcquireNextImageKHR( - renderer->logicalDevice, - windowData->swapchain, - SDL_MAX_UINT64, - windowData->imageAvailableSemaphore[windowData->frameCounter], - VK_NULL_HANDLE, - &swapchainImageIndex); - - // Acquisition is invalid, let's try to recreate - if (acquireResult != VK_SUCCESS && acquireResult != VK_SUBOPTIMAL_KHR) { - Uint32 recreateSwapchainResult = VULKAN_INTERNAL_RecreateSwapchain(renderer, windowData); - if (!recreateSwapchainResult) { - return false; - } else if (recreateSwapchainResult == VULKAN_INTERNAL_TRY_AGAIN) { - // Edge case, texture is filled in with NULL but not an error - return true; - } - + while (true) { acquireResult = renderer->vkAcquireNextImageKHR( renderer->logicalDevice, windowData->swapchain, @@ -9786,8 +9868,19 @@ static bool VULKAN_INTERNAL_AcquireSwapchainTexture( VK_NULL_HANDLE, &swapchainImageIndex); - if (acquireResult != VK_SUCCESS && acquireResult != VK_SUBOPTIMAL_KHR) { + //if (acquireResult == VK_ERROR_OUT_OF_DATE_KHR) { SDL_Log("VULKAN SWAPCHAIN OUT OF DATE"); } + + if (acquireResult == VK_SUCCESS || acquireResult == VK_SUBOPTIMAL_KHR) { + break; // we got the next image! + } + + // If acquisition is invalid, let's try to recreate + Uint32 recreateSwapchainResult = VULKAN_INTERNAL_RecreateSwapchain(renderer, windowData); + if (!recreateSwapchainResult) { return false; + } else if (recreateSwapchainResult == VULKAN_INTERNAL_TRY_AGAIN) { + // Edge case, texture is filled in with NULL but not an error + return true; } } @@ -9890,9 +9983,9 @@ static bool VULKAN_WaitAndAcquireSwapchainTexture( Uint32 *swapchain_texture_height ) { return VULKAN_INTERNAL_AcquireSwapchainTexture( - true, - command_buffer, - window, + true, + command_buffer, + window, swapchain_texture, swapchain_texture_width, swapchain_texture_height); @@ -10547,24 +10640,14 @@ static bool VULKAN_INTERNAL_DefragmentMemory( currentRegion->vulkanBuffer->size, currentRegion->vulkanBuffer->usage, currentRegion->vulkanBuffer->type, - false); + false, + currentRegion->vulkanBuffer->container != NULL ? currentRegion->vulkanBuffer->container->debugName : NULL); if (newBuffer == NULL) { SDL_UnlockMutex(renderer->allocatorLock); return false; } - if ( - renderer->debugMode && - renderer->supportsDebugUtils && - currentRegion->vulkanBuffer->container != NULL && - currentRegion->vulkanBuffer->container->debugName != NULL) { - VULKAN_INTERNAL_SetBufferName( - renderer, - newBuffer, - currentRegion->vulkanBuffer->container->debugName); - } - // Copy buffer contents if necessary if ( currentRegion->vulkanBuffer->type == VULKAN_BUFFER_TYPE_GPU && currentRegion->vulkanBuffer->transitioned) { @@ -10605,7 +10688,7 @@ static bool VULKAN_INTERNAL_DefragmentMemory( newBuffer->container = currentRegion->vulkanBuffer->container; newBuffer->containerIndex = currentRegion->vulkanBuffer->containerIndex; if (newBuffer->type == VULKAN_BUFFER_TYPE_UNIFORM) { - ((VulkanUniformBuffer *)newBuffer->container)->buffer = newBuffer; + currentRegion->vulkanBuffer->uniformBufferForDefrag->buffer = newBuffer; } else { newBuffer->container->buffers[newBuffer->containerIndex] = newBuffer; if (newBuffer->container->activeBuffer == currentRegion->vulkanBuffer) { @@ -10613,6 +10696,10 @@ static bool VULKAN_INTERNAL_DefragmentMemory( } } + if (currentRegion->vulkanBuffer->uniformBufferForDefrag) { + newBuffer->uniformBufferForDefrag = currentRegion->vulkanBuffer->uniformBufferForDefrag; + } + VULKAN_INTERNAL_ReleaseBuffer(renderer, currentRegion->vulkanBuffer); } else if (!currentRegion->isBuffer && !currentRegion->vulkanTexture->markedForDestroy) { newTexture = VULKAN_INTERNAL_CreateTexture( @@ -10630,18 +10717,6 @@ static bool VULKAN_INTERNAL_DefragmentMemory( srcSubresource = ¤tRegion->vulkanTexture->subresources[subresourceIndex]; dstSubresource = &newTexture->subresources[subresourceIndex]; - // Set debug name if it exists - if ( - renderer->debugMode && - renderer->supportsDebugUtils && - srcSubresource->parent->container != NULL && - srcSubresource->parent->container->debugName != NULL) { - VULKAN_INTERNAL_SetTextureName( - renderer, - currentRegion->vulkanTexture, - srcSubresource->parent->container->debugName); - } - VULKAN_INTERNAL_TextureSubresourceTransitionFromDefaultUsage( renderer, commandBuffer, @@ -11570,7 +11645,6 @@ static SDL_GPUDevice *VULKAN_CreateDevice(bool debugMode, bool preferLowPower, S renderer->submitLock = SDL_CreateMutex(); renderer->acquireCommandBufferLock = SDL_CreateMutex(); renderer->acquireUniformBufferLock = SDL_CreateMutex(); - renderer->renderPassFetchLock = SDL_CreateMutex(); renderer->framebufferFetchLock = SDL_CreateMutex(); renderer->windowLock = SDL_CreateMutex(); @@ -11622,6 +11696,7 @@ static SDL_GPUDevice *VULKAN_CreateDevice(bool debugMode, bool preferLowPower, S // Initialize caches + // manually synchronized due to submission timing renderer->commandPoolHashTable = SDL_CreateHashTable( (void *)renderer, 64, @@ -11630,14 +11705,16 @@ static SDL_GPUDevice *VULKAN_CreateDevice(bool debugMode, bool preferLowPower, S VULKAN_INTERNAL_CommandPoolHashNuke, false, false); + // thread-safe renderer->renderPassHashTable = SDL_CreateHashTable( (void *)renderer, 64, VULKAN_INTERNAL_RenderPassHashFunction, VULKAN_INTERNAL_RenderPassHashKeyMatch, VULKAN_INTERNAL_RenderPassHashNuke, - false, false); + true, false); + // manually synchronized due to iteration renderer->framebufferHashTable = SDL_CreateHashTable( (void *)renderer, 64, @@ -11646,29 +11723,32 @@ static SDL_GPUDevice *VULKAN_CreateDevice(bool debugMode, bool preferLowPower, S VULKAN_INTERNAL_FramebufferHashNuke, false, false); + // thread-safe renderer->graphicsPipelineResourceLayoutHashTable = SDL_CreateHashTable( (void *)renderer, 64, VULKAN_INTERNAL_GraphicsPipelineResourceLayoutHashFunction, VULKAN_INTERNAL_GraphicsPipelineResourceLayoutHashKeyMatch, VULKAN_INTERNAL_GraphicsPipelineResourceLayoutHashNuke, - false, false); + true, false); + // thread-safe renderer->computePipelineResourceLayoutHashTable = SDL_CreateHashTable( (void *)renderer, 64, VULKAN_INTERNAL_ComputePipelineResourceLayoutHashFunction, VULKAN_INTERNAL_ComputePipelineResourceLayoutHashKeyMatch, VULKAN_INTERNAL_ComputePipelineResourceLayoutHashNuke, - false, false); + true, false); + // thread-safe renderer->descriptorSetLayoutHashTable = SDL_CreateHashTable( (void *)renderer, 64, VULKAN_INTERNAL_DescriptorSetLayoutHashFunction, VULKAN_INTERNAL_DescriptorSetLayoutHashKeyMatch, VULKAN_INTERNAL_DescriptorSetLayoutHashNuke, - false, false); + true, false); // Initialize fence pool diff --git a/libs/SDL3/src/gpu/vulkan/SDL_gpu_vulkan_vkfuncs.h b/libs/SDL3/src/gpu/vulkan/SDL_gpu_vulkan_vkfuncs.h index 3f2f5da5..7316eb91 100644 --- a/libs/SDL3/src/gpu/vulkan/SDL_gpu_vulkan_vkfuncs.h +++ b/libs/SDL3/src/gpu/vulkan/SDL_gpu_vulkan_vkfuncs.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/haptic/SDL_haptic.c b/libs/SDL3/src/haptic/SDL_haptic.c index 7ca78cbc..ca1ab381 100644 --- a/libs/SDL3/src/haptic/SDL_haptic.c +++ b/libs/SDL3/src/haptic/SDL_haptic.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/haptic/SDL_haptic_c.h b/libs/SDL3/src/haptic/SDL_haptic_c.h index f6e8872b..3f5ce873 100644 --- a/libs/SDL3/src/haptic/SDL_haptic_c.h +++ b/libs/SDL3/src/haptic/SDL_haptic_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/haptic/SDL_syshaptic.h b/libs/SDL3/src/haptic/SDL_syshaptic.h index a1d86dbe..ec60a71e 100644 --- a/libs/SDL3/src/haptic/SDL_syshaptic.h +++ b/libs/SDL3/src/haptic/SDL_syshaptic.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/haptic/android/SDL_syshaptic.c b/libs/SDL3/src/haptic/android/SDL_syshaptic.c index 9c7b4ce7..d155dbcd 100644 --- a/libs/SDL3/src/haptic/android/SDL_syshaptic.c +++ b/libs/SDL3/src/haptic/android/SDL_syshaptic.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/haptic/android/SDL_syshaptic_c.h b/libs/SDL3/src/haptic/android/SDL_syshaptic_c.h index b0e0ed90..4f58f4f7 100644 --- a/libs/SDL3/src/haptic/android/SDL_syshaptic_c.h +++ b/libs/SDL3/src/haptic/android/SDL_syshaptic_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/haptic/darwin/SDL_syshaptic.c b/libs/SDL3/src/haptic/darwin/SDL_syshaptic.c index 01c37f8b..b48a3feb 100644 --- a/libs/SDL3/src/haptic/darwin/SDL_syshaptic.c +++ b/libs/SDL3/src/haptic/darwin/SDL_syshaptic.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/haptic/darwin/SDL_syshaptic_c.h b/libs/SDL3/src/haptic/darwin/SDL_syshaptic_c.h index fde16ba4..03c67ec7 100644 --- a/libs/SDL3/src/haptic/darwin/SDL_syshaptic_c.h +++ b/libs/SDL3/src/haptic/darwin/SDL_syshaptic_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/haptic/dummy/SDL_syshaptic.c b/libs/SDL3/src/haptic/dummy/SDL_syshaptic.c index 69632d16..81f711f0 100644 --- a/libs/SDL3/src/haptic/dummy/SDL_syshaptic.c +++ b/libs/SDL3/src/haptic/dummy/SDL_syshaptic.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/haptic/linux/SDL_syshaptic.c b/libs/SDL3/src/haptic/linux/SDL_syshaptic.c index 112923f1..842f577c 100644 --- a/libs/SDL3/src/haptic/linux/SDL_syshaptic.c +++ b/libs/SDL3/src/haptic/linux/SDL_syshaptic.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -824,7 +824,9 @@ static bool SDL_SYS_ToFFEffect(struct ff_effect *dest, const SDL_HapticEffect *s dest->type = FF_FRICTION; } - dest->direction = 0; // Handled by the condition-specifics. + if (!SDL_SYS_ToDirection(&dest->direction, &condition->direction)) { + return false; + } // Replay dest->replay.length = (condition->length == SDL_HAPTIC_INFINITY) ? 0 : CLAMP(condition->length); @@ -890,7 +892,7 @@ static bool SDL_SYS_ToFFEffect(struct ff_effect *dest, const SDL_HapticEffect *s // Header dest->type = FF_RUMBLE; - dest->direction = 0; + dest->direction = 0x4000; // Replay dest->replay.length = (leftright->length == SDL_HAPTIC_INFINITY) ? 0 : CLAMP(leftright->length); diff --git a/libs/SDL3/src/haptic/windows/SDL_dinputhaptic.c b/libs/SDL3/src/haptic/windows/SDL_dinputhaptic.c index d22ebff1..255aac01 100644 --- a/libs/SDL3/src/haptic/windows/SDL_dinputhaptic.c +++ b/libs/SDL3/src/haptic/windows/SDL_dinputhaptic.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/haptic/windows/SDL_dinputhaptic_c.h b/libs/SDL3/src/haptic/windows/SDL_dinputhaptic_c.h index 8e23b515..d6265c92 100644 --- a/libs/SDL3/src/haptic/windows/SDL_dinputhaptic_c.h +++ b/libs/SDL3/src/haptic/windows/SDL_dinputhaptic_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/haptic/windows/SDL_windowshaptic.c b/libs/SDL3/src/haptic/windows/SDL_windowshaptic.c index 7fdbd611..e21ab918 100644 --- a/libs/SDL3/src/haptic/windows/SDL_windowshaptic.c +++ b/libs/SDL3/src/haptic/windows/SDL_windowshaptic.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/haptic/windows/SDL_windowshaptic_c.h b/libs/SDL3/src/haptic/windows/SDL_windowshaptic_c.h index 5f4ac85e..c4b69287 100644 --- a/libs/SDL3/src/haptic/windows/SDL_windowshaptic_c.h +++ b/libs/SDL3/src/haptic/windows/SDL_windowshaptic_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/hidapi/SDL_hidapi.c b/libs/SDL3/src/hidapi/SDL_hidapi.c index 6c027f91..b14b75eb 100644 --- a/libs/SDL3/src/hidapi/SDL_hidapi.c +++ b/libs/SDL3/src/hidapi/SDL_hidapi.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/hidapi/SDL_hidapi_android.h b/libs/SDL3/src/hidapi/SDL_hidapi_android.h index 58d80c30..2f3851f8 100644 --- a/libs/SDL3/src/hidapi/SDL_hidapi_android.h +++ b/libs/SDL3/src/hidapi/SDL_hidapi_android.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/hidapi/SDL_hidapi_c.h b/libs/SDL3/src/hidapi/SDL_hidapi_c.h index ab5183ad..6d94f77e 100644 --- a/libs/SDL3/src/hidapi/SDL_hidapi_c.h +++ b/libs/SDL3/src/hidapi/SDL_hidapi_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/hidapi/SDL_hidapi_ios.h b/libs/SDL3/src/hidapi/SDL_hidapi_ios.h index 4b61150a..f58f10d5 100644 --- a/libs/SDL3/src/hidapi/SDL_hidapi_ios.h +++ b/libs/SDL3/src/hidapi/SDL_hidapi_ios.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/hidapi/SDL_hidapi_libusb.h b/libs/SDL3/src/hidapi/SDL_hidapi_libusb.h index b98be80d..ed8b4a35 100644 --- a/libs/SDL3/src/hidapi/SDL_hidapi_libusb.h +++ b/libs/SDL3/src/hidapi/SDL_hidapi_libusb.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/hidapi/SDL_hidapi_linux.h b/libs/SDL3/src/hidapi/SDL_hidapi_linux.h index 388af323..29723d75 100644 --- a/libs/SDL3/src/hidapi/SDL_hidapi_linux.h +++ b/libs/SDL3/src/hidapi/SDL_hidapi_linux.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/hidapi/SDL_hidapi_mac.h b/libs/SDL3/src/hidapi/SDL_hidapi_mac.h index 423a9469..820b67d6 100644 --- a/libs/SDL3/src/hidapi/SDL_hidapi_mac.h +++ b/libs/SDL3/src/hidapi/SDL_hidapi_mac.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/hidapi/SDL_hidapi_netbsd.h b/libs/SDL3/src/hidapi/SDL_hidapi_netbsd.h index fa5cf972..1b39e225 100644 --- a/libs/SDL3/src/hidapi/SDL_hidapi_netbsd.h +++ b/libs/SDL3/src/hidapi/SDL_hidapi_netbsd.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/hidapi/SDL_hidapi_steamxbox.h b/libs/SDL3/src/hidapi/SDL_hidapi_steamxbox.h index cab4ef58..b6294a3b 100644 --- a/libs/SDL3/src/hidapi/SDL_hidapi_steamxbox.h +++ b/libs/SDL3/src/hidapi/SDL_hidapi_steamxbox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/hidapi/SDL_hidapi_windows.h b/libs/SDL3/src/hidapi/SDL_hidapi_windows.h index f96bbd53..c29122ba 100644 --- a/libs/SDL3/src/hidapi/SDL_hidapi_windows.h +++ b/libs/SDL3/src/hidapi/SDL_hidapi_windows.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/hidapi/ios/hid.m b/libs/SDL3/src/hidapi/ios/hid.m index d0a8b54d..29e07820 100644 --- a/libs/SDL3/src/hidapi/ios/hid.m +++ b/libs/SDL3/src/hidapi/ios/hid.m @@ -335,7 +335,7 @@ typedef enum continue; NSLog( @"connected peripheral: %@", peripheral ); - if ( [peripheral.name isEqualToString:@"SteamController"] ) + if ( [peripheral.name hasPrefix:@"Steam"] ) { self.nPendingPairs += 1; HIDBLEDevice *steamController = [[HIDBLEDevice alloc] initWithPeripheral:peripheral]; @@ -398,7 +398,7 @@ typedef enum { switch ( central.state ) { - case CBCentralManagerStatePoweredOn: + case CBManagerStatePoweredOn: { NSLog( @"CoreBluetooth BLE hardware is powered on and ready" ); @@ -418,23 +418,23 @@ typedef enum break; } - case CBCentralManagerStatePoweredOff: + case CBManagerStatePoweredOff: NSLog( @"CoreBluetooth BLE hardware is powered off" ); break; - case CBCentralManagerStateUnauthorized: + case CBManagerStateUnauthorized: NSLog( @"CoreBluetooth BLE state is unauthorized" ); break; - case CBCentralManagerStateUnknown: + case CBManagerStateUnknown: NSLog( @"CoreBluetooth BLE state is unknown" ); break; - case CBCentralManagerStateUnsupported: + case CBManagerStateUnsupported: NSLog( @"CoreBluetooth BLE hardware is unsupported on this platform" ); break; - case CBCentralManagerStateResetting: + case CBManagerStateResetting: NSLog( @"CoreBluetooth BLE manager is resetting" ); break; } @@ -459,7 +459,7 @@ typedef enum NSString *localName = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey]; NSString *log = [NSString stringWithFormat:@"Found '%@'", localName]; - if ( [localName isEqualToString:@"SteamController"] ) + if ( [localName hasPrefix:@"Steam"] ) { NSLog( @"%@ : %@ - %@", log, peripheral, advertisementData ); self.nPendingPairs += 1; diff --git a/libs/SDL3/src/hidapi/libusb/hidapi_thread_sdl.h b/libs/SDL3/src/hidapi/libusb/hidapi_thread_sdl.h index a66b3915..1f5c7db8 100644 --- a/libs/SDL3/src/hidapi/libusb/hidapi_thread_sdl.h +++ b/libs/SDL3/src/hidapi/libusb/hidapi_thread_sdl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/file/SDL_asyncio.c b/libs/SDL3/src/io/SDL_asyncio.c similarity index 99% rename from libs/SDL3/src/file/SDL_asyncio.c rename to libs/SDL3/src/io/SDL_asyncio.c index a18f7b95..3d1658db 100644 --- a/libs/SDL3/src/file/SDL_asyncio.c +++ b/libs/SDL3/src/io/SDL_asyncio.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -205,6 +205,7 @@ static bool GetAsyncIOTaskOutcome(SDL_AsyncIOTask *task, SDL_AsyncIOOutcome *out SDL_zerop(outcome); outcome->asyncio = asyncio->oneshot ? NULL : asyncio; outcome->result = task->result; + outcome->type = task->type; outcome->buffer = task->buffer; outcome->offset = task->offset; outcome->bytes_requested = task->requested_size; diff --git a/libs/SDL3/src/file/SDL_asyncio_c.h b/libs/SDL3/src/io/SDL_asyncio_c.h similarity index 94% rename from libs/SDL3/src/file/SDL_asyncio_c.h rename to libs/SDL3/src/io/SDL_asyncio_c.h index 85b443a9..861ba1a0 100644 --- a/libs/SDL3/src/file/SDL_asyncio_c.h +++ b/libs/SDL3/src/io/SDL_asyncio_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/file/SDL_iostream.c b/libs/SDL3/src/io/SDL_iostream.c similarity index 99% rename from libs/SDL3/src/file/SDL_iostream.c rename to libs/SDL3/src/io/SDL_iostream.c index 7e70f5b9..adaf5e04 100644 --- a/libs/SDL3/src/file/SDL_iostream.c +++ b/libs/SDL3/src/io/SDL_iostream.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/file/SDL_iostream_c.h b/libs/SDL3/src/io/SDL_iostream_c.h similarity index 95% rename from libs/SDL3/src/file/SDL_iostream_c.h rename to libs/SDL3/src/io/SDL_iostream_c.h index a6782d5c..c04fe203 100644 --- a/libs/SDL3/src/file/SDL_iostream_c.h +++ b/libs/SDL3/src/io/SDL_iostream_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/file/SDL_sysasyncio.h b/libs/SDL3/src/io/SDL_sysasyncio.h similarity index 98% rename from libs/SDL3/src/file/SDL_sysasyncio.h rename to libs/SDL3/src/io/SDL_sysasyncio.h index 6955139c..fbe41d19 100644 --- a/libs/SDL3/src/file/SDL_sysasyncio.h +++ b/libs/SDL3/src/io/SDL_sysasyncio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/file/generic/SDL_asyncio_generic.c b/libs/SDL3/src/io/generic/SDL_asyncio_generic.c similarity index 97% rename from libs/SDL3/src/file/generic/SDL_asyncio_generic.c rename to libs/SDL3/src/io/generic/SDL_asyncio_generic.c index 9c1e442d..4c2a5620 100644 --- a/libs/SDL3/src/file/generic/SDL_asyncio_generic.c +++ b/libs/SDL3/src/io/generic/SDL_asyncio_generic.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -64,7 +64,7 @@ static void AsyncIOTaskComplete(SDL_AsyncIOTask *task) // This is called directly, without a threadpool, if !SDL_ASYNCIO_USE_THREADPOOL. static void SynchronousIO(SDL_AsyncIOTask *task) { - SDL_assert(task->result != SDL_ASYNCIO_CANCELLED); // shouldn't have gotten in here if cancelled! + SDL_assert(task->result != SDL_ASYNCIO_CANCELED); // shouldn't have gotten in here if canceled! GenericAsyncIOData *data = (GenericAsyncIOData *) task->asyncio->userdata; SDL_IOStream *io = data->io; @@ -184,7 +184,7 @@ static void QueueAsyncIOTask(SDL_AsyncIOTask *task) SDL_LockMutex(threadpool_lock); if (stop_threadpool) { // just in case. - task->result = SDL_ASYNCIO_CANCELLED; + task->result = SDL_ASYNCIO_CANCELED; AsyncIOTaskComplete(task); } else { LINKED_LIST_PREPEND(task, threadpool_tasks, threadpool); @@ -239,7 +239,7 @@ static void ShutdownThreadpool(void) SDL_AsyncIOTask *task; while ((task = LINKED_LIST_START(threadpool_tasks, threadpool)) != NULL) { LINKED_LIST_UNLINK(task, threadpool); - task->result = SDL_ASYNCIO_CANCELLED; + task->result = SDL_ASYNCIO_CANCELED; AsyncIOTaskComplete(task); } @@ -300,14 +300,14 @@ static bool generic_asyncioqueue_queue_task(void *userdata, SDL_AsyncIOTask *tas static void generic_asyncioqueue_cancel_task(void *userdata, SDL_AsyncIOTask *task) { #if !SDL_ASYNCIO_USE_THREADPOOL // in theory, this was all synchronous and should never call this, but just in case. - task->result = SDL_ASYNCIO_CANCELLED; + task->result = SDL_ASYNCIO_CANCELED; AsyncIOTaskComplete(task); #else // we can't stop i/o that's in-flight, but we _can_ just refuse to start it if the threadpool hadn't picked it up yet. SDL_LockMutex(threadpool_lock); if (LINKED_LIST_PREV(task, threadpool) != NULL) { // still in the queue waiting to be run? Take it out. LINKED_LIST_UNLINK(task, threadpool); - task->result = SDL_ASYNCIO_CANCELLED; + task->result = SDL_ASYNCIO_CANCELED; AsyncIOTaskComplete(task); } SDL_UnlockMutex(threadpool_lock); diff --git a/libs/SDL3/src/file/io_uring/SDL_asyncio_liburing.c b/libs/SDL3/src/io/io_uring/SDL_asyncio_liburing.c similarity index 99% rename from libs/SDL3/src/file/io_uring/SDL_asyncio_liburing.c rename to libs/SDL3/src/io/io_uring/SDL_asyncio_liburing.c index b4544fd0..07e8c241 100644 --- a/libs/SDL3/src/file/io_uring/SDL_asyncio_liburing.c +++ b/libs/SDL3/src/io/io_uring/SDL_asyncio_liburing.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -225,7 +225,7 @@ static SDL_AsyncIOTask *ProcessCQE(LibUringAsyncIOQueueData *queuedata, struct i task = (SDL_AsyncIOTask *) cancel_task->app_userdata; SDL_free(cancel_task); if (cqe->res >= 0) { // cancel was successful? - task->result = SDL_ASYNCIO_CANCELLED; + task->result = SDL_ASYNCIO_CANCELED; } else { task = NULL; // it already finished or was too far along to cancel, so we'll pick up the actual results later. } diff --git a/libs/SDL3/src/file/n3ds/SDL_iostreamromfs.c b/libs/SDL3/src/io/n3ds/SDL_iostreamromfs.c similarity index 97% rename from libs/SDL3/src/file/n3ds/SDL_iostreamromfs.c rename to libs/SDL3/src/io/n3ds/SDL_iostreamromfs.c index 984b093e..b42f5393 100644 --- a/libs/SDL3/src/file/n3ds/SDL_iostreamromfs.c +++ b/libs/SDL3/src/io/n3ds/SDL_iostreamromfs.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/file/n3ds/SDL_iostreamromfs.h b/libs/SDL3/src/io/n3ds/SDL_iostreamromfs.h similarity index 94% rename from libs/SDL3/src/file/n3ds/SDL_iostreamromfs.h rename to libs/SDL3/src/io/n3ds/SDL_iostreamromfs.h index 251d4803..b9313907 100644 --- a/libs/SDL3/src/file/n3ds/SDL_iostreamromfs.h +++ b/libs/SDL3/src/io/n3ds/SDL_iostreamromfs.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/file/windows/SDL_asyncio_windows_ioring.c b/libs/SDL3/src/io/windows/SDL_asyncio_windows_ioring.c similarity index 99% rename from libs/SDL3/src/file/windows/SDL_asyncio_windows_ioring.c rename to libs/SDL3/src/io/windows/SDL_asyncio_windows_ioring.c index 48ff25f1..2d38efc3 100644 --- a/libs/SDL3/src/file/windows/SDL_asyncio_windows_ioring.c +++ b/libs/SDL3/src/io/windows/SDL_asyncio_windows_ioring.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -195,7 +195,7 @@ static SDL_AsyncIOTask *ProcessCQE(WinIoRingAsyncIOQueueData *queuedata, IORING_ task = (SDL_AsyncIOTask *) cancel_task->app_userdata; SDL_free(cancel_task); if (SUCCEEDED(cqe->ResultCode)) { // cancel was successful? - task->result = SDL_ASYNCIO_CANCELLED; + task->result = SDL_ASYNCIO_CANCELED; } else { task = NULL; // it already finished or was too far along to cancel, so we'll pick up the actual results later. } diff --git a/libs/SDL3/src/joystick/SDL_gamepad.c b/libs/SDL3/src/joystick/SDL_gamepad.c index 7d75a5a9..d931ed23 100644 --- a/libs/SDL3/src/joystick/SDL_gamepad.c +++ b/libs/SDL3/src/joystick/SDL_gamepad.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -870,7 +870,7 @@ static GamepadMapping_t *SDL_CreateMappingForWGIGamepad(SDL_GUID guid) /* * Helper function to scan the mappings database for a gamepad with the specified GUID */ -static GamepadMapping_t *SDL_PrivateMatchGamepadMappingForGUID(SDL_GUID guid, bool match_version) +static GamepadMapping_t *SDL_PrivateMatchGamepadMappingForGUID(SDL_GUID guid, bool match_version, bool exact_match_crc) { GamepadMapping_t *mapping, *best_match = NULL; Uint16 crc = 0; @@ -909,6 +909,8 @@ static GamepadMapping_t *SDL_PrivateMatchGamepadMappingForGUID(SDL_GUID guid, bo // An exact match, including CRC return mapping; + } else if (crc && exact_match_crc) { + return NULL; } if (!best_match) { @@ -926,7 +928,7 @@ static GamepadMapping_t *SDL_PrivateGetGamepadMappingForGUID(SDL_GUID guid, bool { GamepadMapping_t *mapping; - mapping = SDL_PrivateMatchGamepadMappingForGUID(guid, true); + mapping = SDL_PrivateMatchGamepadMappingForGUID(guid, true, adding_mapping); if (mapping) { return mapping; } @@ -940,7 +942,7 @@ static GamepadMapping_t *SDL_PrivateGetGamepadMappingForGUID(SDL_GUID guid, bool if (SDL_JoystickGUIDUsesVersion(guid)) { // Try again, ignoring the version - mapping = SDL_PrivateMatchGamepadMappingForGUID(guid, false); + mapping = SDL_PrivateMatchGamepadMappingForGUID(guid, false, false); if (mapping) { return mapping; } diff --git a/libs/SDL3/src/joystick/SDL_gamepad_c.h b/libs/SDL3/src/joystick/SDL_gamepad_c.h index b58dd31a..f1b1d10e 100644 --- a/libs/SDL3/src/joystick/SDL_gamepad_c.h +++ b/libs/SDL3/src/joystick/SDL_gamepad_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/SDL_gamepad_db.h b/libs/SDL3/src/joystick/SDL_gamepad_db.h index 91abb65f..417eb6c4 100644 --- a/libs/SDL3/src/joystick/SDL_gamepad_db.h +++ b/libs/SDL3/src/joystick/SDL_gamepad_db.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -68,6 +68,7 @@ static const char *s_GamepadMappings[] = { "03000000c82d00000160000000000000,8BitDo SN30 Pro,crc:fa59,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,", /* Firmware v1.26, USB */ "03000000c82d00000161000000000000,8BitDo SN30 Pro,crc:190b,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,", /* Bluetooth, firmware v1.26 uses b2 for guide, firmware v2.00 uses b12 for guide */ "030000003512000020ab000000000000,8BitDo SNES30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,", + "03000000c82d00001b30000000000000,8BitDo Ultimate 2C Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a2,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,", /* Bluetooth */ "03000000c82d00001130000000000000,8BitDo Ultimate Wired Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,", "03000000c82d00001330000000000000,8BitDo Ultimate Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,", "03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,", @@ -360,6 +361,7 @@ static const char *s_GamepadMappings[] = { "03000000c82d00000260000001000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,", "03000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,", "03000000c82d00000160000001000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,", + "03000000c82d00001b30000001000000,8BitDo Ultimate 2C Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,", /* Bluetooth */ "03000000c82d00001130000000020000,8BitDo Ultimate Wired Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,", "03000000c82d00001330000000020000,8BitDo Ultimate Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,", "03000000c82d00001890000001000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,", @@ -503,6 +505,7 @@ static const char *s_GamepadMappings[] = { "03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,", "030000003512000020ab000010010000,8BitDo SNES30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,", "05000000202800000900000000010000,8BitDo SNES30 Gamepad,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,", + "05000000c82d00001b30000001000000,8BitDo Ultimate 2C Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,", /* Bluetooth */ "03000000c82d00001130000011010000,8BitDo Ultimate Wired Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,", "03000000c82d00001330000011010000,8BitDo Ultimate Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,", "03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,", @@ -629,7 +632,8 @@ static const char *s_GamepadMappings[] = { "030000006b140000010c000010010000,NACON GC-400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,", "030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b6,start:b9,x:b3,y:b0,", "03000000550900001072000011010000,NVIDIA Controller v01.03,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,", - "03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b17,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,", + "03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,", + "05000000550900001472000001000000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,", "030000004b120000014d000000010000,NYKO AIRFLO EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,", "03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,", "03000000790000004318000010010000,Nintendo GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,", @@ -763,6 +767,8 @@ static const char *s_GamepadMappings[] = { "05000000ac0500003232000001000000,VR-BOX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,", "030000006f0e00000302000011010000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,", "030000006f0e00000702000011010000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,", + "030000000d0f0000ab01000011010000,Wireless HORIPAD For Steam,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc2:b2,misc3:b16,misc4:b17,paddle1:b19,paddle2:b18,paddle3:b15,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,", + "050000000d0f00009601000091000000,Wireless HORIPAD For Steam,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc2:b2,misc3:b16,misc4:b17,paddle1:b19,paddle2:b18,paddle3:b15,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,", "030000005e0400008e02000010010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,", "030000005e0400008e02000014010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,", "030000005e0400001907000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,", diff --git a/libs/SDL3/src/joystick/SDL_joystick.c b/libs/SDL3/src/joystick/SDL_joystick.c index ba56156c..224f07fa 100644 --- a/libs/SDL3/src/joystick/SDL_joystick.c +++ b/libs/SDL3/src/joystick/SDL_joystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/SDL_joystick_c.h b/libs/SDL3/src/joystick/SDL_joystick_c.h index d8b84c0c..d931cf7e 100644 --- a/libs/SDL3/src/joystick/SDL_joystick_c.h +++ b/libs/SDL3/src/joystick/SDL_joystick_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/SDL_steam_virtual_gamepad.c b/libs/SDL3/src/joystick/SDL_steam_virtual_gamepad.c index 4b446b20..6b253de3 100644 --- a/libs/SDL3/src/joystick/SDL_steam_virtual_gamepad.c +++ b/libs/SDL3/src/joystick/SDL_steam_virtual_gamepad.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/SDL_steam_virtual_gamepad.h b/libs/SDL3/src/joystick/SDL_steam_virtual_gamepad.h index ea46dd0f..65696ea2 100644 --- a/libs/SDL3/src/joystick/SDL_steam_virtual_gamepad.h +++ b/libs/SDL3/src/joystick/SDL_steam_virtual_gamepad.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/SDL_sysjoystick.h b/libs/SDL3/src/joystick/SDL_sysjoystick.h index 49e784d0..343d2061 100644 --- a/libs/SDL3/src/joystick/SDL_sysjoystick.h +++ b/libs/SDL3/src/joystick/SDL_sysjoystick.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/android/SDL_sysjoystick.c b/libs/SDL3/src/joystick/android/SDL_sysjoystick.c index aafe27f2..95ad99c0 100644 --- a/libs/SDL3/src/joystick/android/SDL_sysjoystick.c +++ b/libs/SDL3/src/joystick/android/SDL_sysjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/android/SDL_sysjoystick_c.h b/libs/SDL3/src/joystick/android/SDL_sysjoystick_c.h index 4b45ff35..febb2288 100644 --- a/libs/SDL3/src/joystick/android/SDL_sysjoystick_c.h +++ b/libs/SDL3/src/joystick/android/SDL_sysjoystick_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/apple/SDL_mfijoystick.m b/libs/SDL3/src/joystick/apple/SDL_mfijoystick.m index 0e62494f..23d6b23f 100644 --- a/libs/SDL3/src/joystick/apple/SDL_mfijoystick.m +++ b/libs/SDL3/src/joystick/apple/SDL_mfijoystick.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -42,72 +42,24 @@ #endif #endif // SDL_PLATFORM_MACOS -#ifdef SDL_JOYSTICK_MFI #import +#ifdef SDL_JOYSTICK_MFI static id connectObserver = nil; static id disconnectObserver = nil; -#include #include -#ifndef __IPHONE_OS_VERSION_MAX_ALLOWED -#define __IPHONE_OS_VERSION_MAX_ALLOWED 0 -#endif - -#ifndef __APPLETV_OS_VERSION_MAX_ALLOWED -#define __APPLETV_OS_VERSION_MAX_ALLOWED 0 -#endif - -#ifndef __MAC_OS_VERSION_MAX_ALLOWED -#define __MAC_OS_VERSION_MAX_ALLOWED 0 -#endif - /* remove compilation warnings for strict builds by defining these selectors, even though * they are only ever used indirectly through objc_msgSend */ @interface GCController (SDL) -#if defined(SDL_PLATFORM_MACOS) && (__MAC_OS_X_VERSION_MAX_ALLOWED <= 101600) -+ (BOOL)supportsHIDDevice:(IOHIDDeviceRef)device; -#endif -#if !((__IPHONE_OS_VERSION_MAX_ALLOWED >= 130000) || (__APPLETV_OS_VERSION_MAX_ALLOWED >= 130000) || (__MAC_OS_VERSION_MAX_ALLOWED >= 1500000)) -@property(nonatomic, readonly) NSString *productCategory; -#endif #if !((__IPHONE_OS_VERSION_MAX_ALLOWED >= 140500) || (__APPLETV_OS_VERSION_MAX_ALLOWED >= 140500) || (__MAC_OS_X_VERSION_MAX_ALLOWED >= 110300)) @property(class, nonatomic, readwrite) BOOL shouldMonitorBackgroundEvents; #endif @end -@interface GCExtendedGamepad (SDL) -#if !((__IPHONE_OS_VERSION_MAX_ALLOWED >= 121000) || (__APPLETV_OS_VERSION_MAX_ALLOWED >= 121000) || (__MAC_OS_VERSION_MAX_ALLOWED >= 1401000)) -@property(nonatomic, readonly, nullable) GCControllerButtonInput *leftThumbstickButton; -@property(nonatomic, readonly, nullable) GCControllerButtonInput *rightThumbstickButton; -#endif -#if !((__IPHONE_OS_VERSION_MAX_ALLOWED >= 130000) || (__APPLETV_OS_VERSION_MAX_ALLOWED >= 130000) || (__MAC_OS_VERSION_MAX_ALLOWED >= 1500000)) -@property(nonatomic, readonly) GCControllerButtonInput *buttonMenu; -@property(nonatomic, readonly, nullable) GCControllerButtonInput *buttonOptions; -#endif -#if !((__IPHONE_OS_VERSION_MAX_ALLOWED >= 140000) || (__APPLETV_OS_VERSION_MAX_ALLOWED >= 140000) || (__MAC_OS_VERSION_MAX_ALLOWED > 1500000)) -@property(nonatomic, readonly, nullable) GCControllerButtonInput *buttonHome; -#endif -@end -@interface GCMicroGamepad (SDL) -#if !((__IPHONE_OS_VERSION_MAX_ALLOWED >= 130000) || (__APPLETV_OS_VERSION_MAX_ALLOWED >= 130000) || (__MAC_OS_VERSION_MAX_ALLOWED >= 1500000)) -@property(nonatomic, readonly) GCControllerButtonInput *buttonMenu; -#endif -@end -#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 140000) || (__APPLETV_OS_VERSION_MAX_ALLOWED >= 140000) || (__MAC_OS_VERSION_MAX_ALLOWED > 1500000) || (__MAC_OS_X_VERSION_MAX_ALLOWED > 101600) -#define ENABLE_MFI_BATTERY -#define ENABLE_MFI_RUMBLE -#define ENABLE_MFI_LIGHT -#define ENABLE_MFI_SENSORS -#define ENABLE_MFI_SYSTEM_GESTURE_STATE -#define ENABLE_PHYSICAL_INPUT_PROFILE -#endif - -#ifdef ENABLE_MFI_RUMBLE #import -#endif #endif // SDL_JOYSTICK_MFI @@ -234,7 +186,6 @@ static void CheckControllerSiriRemote(GCController *controller, int *is_siri_rem *is_siri_remote = 0; } -#ifdef ENABLE_PHYSICAL_INPUT_PROFILE static bool ElementAlreadyHandled(SDL_JoystickDeviceItem *device, NSString *element, NSDictionary *elements) { if ([element isEqualToString:@"Left Thumbstick Left"] || @@ -333,7 +284,6 @@ static bool ElementAlreadyHandled(SDL_JoystickDeviceItem *device, NSString *elem } return false; } -#endif // ENABLE_PHYSICAL_INPUT_PROFILE static bool IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCController *controller) { @@ -366,7 +316,6 @@ static bool IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCControlle NSLog(@"Product name: %@\n", controller.vendorName); NSLog(@"Product category: %@\n", controller.productCategory); NSLog(@"Elements available:\n"); -#ifdef ENABLE_PHYSICAL_INPUT_PROFILE if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { NSDictionary *elements = controller.physicalInputProfile.elements; for (id key in controller.physicalInputProfile.buttons) { @@ -379,8 +328,7 @@ static bool IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCControlle NSLog(@"\tHat: %@\n", key); } } -#endif -#endif +#endif // DEBUG_CONTROLLER_PROFILE device->is_xbox = IsControllerXbox(controller); device->is_ps4 = IsControllerPS4(controller); @@ -416,7 +364,6 @@ static bool IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCControlle return false; } -#ifdef ENABLE_PHYSICAL_INPUT_PROFILE if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { if (controller.physicalInputProfile.buttons[GCInputDualShockTouchpadButton] != nil) { device->has_dualshock_touchpad = TRUE; @@ -428,7 +375,6 @@ static bool IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCControlle device->has_xbox_share_button = TRUE; } } -#endif // ENABLE_PHYSICAL_INPUT_PROFILE if (device->is_backbone_one) { vendor = USB_VENDOR_BACKBONE; @@ -473,20 +419,14 @@ static bool IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCControlle } else if (device->is_switch_joyconR) { vendor = USB_VENDOR_NINTENDO; product = USB_PRODUCT_NINTENDO_SWITCH_JOYCON_RIGHT; -#ifdef ENABLE_PHYSICAL_INPUT_PROFILE } else if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { vendor = USB_VENDOR_APPLE; product = 4; subtype = 4; -#endif } else if (controller.extendedGamepad) { vendor = USB_VENDOR_APPLE; product = 1; subtype = 1; - } else if (controller.gamepad) { - vendor = USB_VENDOR_APPLE; - product = 2; - subtype = 2; #ifdef SDL_PLATFORM_TVOS } else if (controller.microGamepad) { vendor = USB_VENDOR_APPLE; @@ -502,7 +442,6 @@ static bool IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCControlle return false; } -#ifdef ENABLE_PHYSICAL_INPUT_PROFILE if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { NSDictionary *elements = controller.physicalInputProfile.elements; @@ -558,9 +497,7 @@ static bool IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCControlle device->pause_button_index = (int)[device->buttons indexOfObject:GCInputButtonMenu]; } #endif - } else -#endif - if (controller.extendedGamepad) { + } else if (controller.extendedGamepad) { GCExtendedGamepad *gamepad = controller.extendedGamepad; int nbuttons = 0; BOOL has_direct_menu = FALSE; @@ -612,24 +549,6 @@ static bool IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCControlle device->naxes = 6; // 2 thumbsticks and 2 triggers device->nhats = 1; // d-pad device->nbuttons = nbuttons; - - } else if (controller.gamepad) { - int nbuttons = 0; - - // These buttons are part of the original MFi spec - device->button_mask |= (1 << SDL_GAMEPAD_BUTTON_SOUTH); - device->button_mask |= (1 << SDL_GAMEPAD_BUTTON_EAST); - device->button_mask |= (1 << SDL_GAMEPAD_BUTTON_WEST); - device->button_mask |= (1 << SDL_GAMEPAD_BUTTON_NORTH); - device->button_mask |= (1 << SDL_GAMEPAD_BUTTON_LEFT_SHOULDER); - device->button_mask |= (1 << SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER); - device->button_mask |= (1 << SDL_GAMEPAD_BUTTON_START); - nbuttons += 7; - device->pause_button_index = (nbuttons - 1); - - device->naxes = 0; // no traditional analog inputs - device->nhats = 1; // d-pad - device->nbuttons = nbuttons; } #ifdef SDL_PLATFORM_TVOS else if (controller.microGamepad) { @@ -677,7 +596,7 @@ static bool IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCControlle } #endif // SDL_JOYSTICK_MFI -#if defined(SDL_JOYSTICK_MFI) +#ifdef SDL_JOYSTICK_MFI static void IOS_AddJoystickDevice(GCController *controller) { SDL_JoystickDeviceItem *device = deviceList; @@ -808,16 +727,11 @@ static bool IOS_JoystickInit(void) } #ifdef SDL_PLATFORM_MACOS -#if SDL_HAS_BUILTIN(__builtin_available) if (@available(macOS 10.16, *)) { // Continue with initialization on macOS 11+ } else { return true; } -#else - // No @available, must be an older macOS version - return true; -#endif #endif @autoreleasepool { @@ -975,7 +889,6 @@ static bool IOS_JoystickOpen(SDL_Joystick *joystick, int device_index) }; } -#ifdef ENABLE_MFI_SENSORS if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { GCController *controller = joystick->hwdata->controller; GCMotion *motion = controller.motion; @@ -986,9 +899,7 @@ static bool IOS_JoystickOpen(SDL_Joystick *joystick, int device_index) SDL_PrivateJoystickAddSensor(joystick, SDL_SENSOR_ACCEL, 0.0f); } } -#endif // ENABLE_MFI_SENSORS -#ifdef ENABLE_MFI_SYSTEM_GESTURE_STATE if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { GCController *controller = joystick->hwdata->controller; for (id key in controller.physicalInputProfile.buttons) { @@ -998,17 +909,13 @@ static bool IOS_JoystickOpen(SDL_Joystick *joystick, int device_index) } } } -#endif // ENABLE_MFI_SYSTEM_GESTURE_STATE if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { GCController *controller = device->controller; -#ifdef ENABLE_MFI_LIGHT if (controller.light) { SDL_SetBooleanProperty(SDL_GetJoystickProperties(joystick), SDL_PROP_JOYSTICK_CAP_RGB_LED_BOOLEAN, true); } -#endif -#ifdef ENABLE_MFI_RUMBLE if (controller.haptics) { for (GCHapticsLocality locality in controller.haptics.supportedLocalities) { if ([locality isEqualToString:GCHapticsLocalityHandles]) { @@ -1018,7 +925,6 @@ static bool IOS_JoystickOpen(SDL_Joystick *joystick, int device_index) } } } -#endif } #endif // SDL_JOYSTICK_MFI } @@ -1064,7 +970,7 @@ static void IOS_MFIJoystickUpdate(SDL_Joystick *joystick) int i; Uint64 timestamp = SDL_GetTicksNS(); -#if defined(DEBUG_CONTROLLER_STATE) && defined(ENABLE_PHYSICAL_INPUT_PROFILE) +#ifdef DEBUG_CONTROLLER_STATE if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { if (controller.physicalInputProfile) { for (id key in controller.physicalInputProfile.buttons) { @@ -1091,7 +997,6 @@ static void IOS_MFIJoystickUpdate(SDL_Joystick *joystick) } #endif // DEBUG_CONTROLLER_STATE -#ifdef ENABLE_PHYSICAL_INPUT_PROFILE if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { NSDictionary *elements = controller.physicalInputProfile.elements; NSDictionary *buttons = controller.physicalInputProfile.buttons; @@ -1118,9 +1023,7 @@ static void IOS_MFIJoystickUpdate(SDL_Joystick *joystick) } SDL_SendJoystickButton(timestamp, joystick, button++, down); } - } else -#endif - if (controller.extendedGamepad) { + } else if (controller.extendedGamepad) { bool isstack; GCExtendedGamepad *gamepad = controller.extendedGamepad; @@ -1185,33 +1088,6 @@ static void IOS_MFIJoystickUpdate(SDL_Joystick *joystick) SDL_SendJoystickButton(timestamp, joystick, i, buttons[i]); } - SDL_small_free(buttons, isstack); - } else if (controller.gamepad) { - bool isstack; - GCGamepad *gamepad = controller.gamepad; - - // Button order matches the XInput Windows mappings. - bool *buttons = SDL_small_alloc(bool, joystick->nbuttons, &isstack); - int button_count = 0; - - if (buttons == NULL) { - return; - } - - buttons[button_count++] = gamepad.buttonA.isPressed; - buttons[button_count++] = gamepad.buttonB.isPressed; - buttons[button_count++] = gamepad.buttonX.isPressed; - buttons[button_count++] = gamepad.buttonY.isPressed; - buttons[button_count++] = gamepad.leftShoulder.isPressed; - buttons[button_count++] = gamepad.rightShoulder.isPressed; - buttons[button_count++] = (device->pause_button_pressed > 0); - - hatstate = IOS_MFIJoystickHatStateForDPad(gamepad.dpad); - - for (i = 0; i < button_count; i++) { - SDL_SendJoystickButton(timestamp, joystick, i, buttons[i]); - } - SDL_small_free(buttons, isstack); } #ifdef SDL_PLATFORM_TVOS @@ -1251,7 +1127,6 @@ static void IOS_MFIJoystickUpdate(SDL_Joystick *joystick) } } -#ifdef ENABLE_PHYSICAL_INPUT_PROFILE if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { if (device->has_dualshock_touchpad) { GCControllerDirectionPad *dpad; @@ -1271,33 +1146,29 @@ static void IOS_MFIJoystickUpdate(SDL_Joystick *joystick) } } } -#endif // ENABLE_PHYSICAL_INPUT_PROFILE -#ifdef ENABLE_MFI_SENSORS - if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { - GCMotion *motion = controller.motion; - if (motion && motion.sensorsActive) { - float data[3]; + if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { + GCMotion *motion = controller.motion; + if (motion && motion.sensorsActive) { + float data[3]; - if (motion.hasRotationRate) { - GCRotationRate rate = motion.rotationRate; - data[0] = rate.x; - data[1] = rate.z; - data[2] = -rate.y; - SDL_SendJoystickSensor(timestamp, joystick, SDL_SENSOR_GYRO, timestamp, data, 3); - } - if (motion.hasGravityAndUserAcceleration) { - GCAcceleration accel = motion.acceleration; - data[0] = -accel.x * SDL_STANDARD_GRAVITY; - data[1] = -accel.y * SDL_STANDARD_GRAVITY; - data[2] = -accel.z * SDL_STANDARD_GRAVITY; - SDL_SendJoystickSensor(timestamp, joystick, SDL_SENSOR_ACCEL, timestamp, data, 3); - } + if (motion.hasRotationRate) { + GCRotationRate rate = motion.rotationRate; + data[0] = rate.x; + data[1] = rate.z; + data[2] = -rate.y; + SDL_SendJoystickSensor(timestamp, joystick, SDL_SENSOR_GYRO, timestamp, data, 3); + } + if (motion.hasGravityAndUserAcceleration) { + GCAcceleration accel = motion.acceleration; + data[0] = -accel.x * SDL_STANDARD_GRAVITY; + data[1] = -accel.y * SDL_STANDARD_GRAVITY; + data[2] = -accel.z * SDL_STANDARD_GRAVITY; + SDL_SendJoystickSensor(timestamp, joystick, SDL_SENSOR_ACCEL, timestamp, data, 3); } } -#endif // ENABLE_MFI_SENSORS + } -#ifdef ENABLE_MFI_BATTERY if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { GCDeviceBattery *battery = controller.battery; if (battery) { @@ -1321,13 +1192,11 @@ static void IOS_MFIJoystickUpdate(SDL_Joystick *joystick) SDL_SendJoystickPowerInfo(joystick, state, percent); } } -#endif // ENABLE_MFI_BATTERY } #endif // SDL_JOYSTICK_MFI } -#ifdef ENABLE_MFI_RUMBLE - +#ifdef SDL_JOYSTICK_MFI @interface SDL3_RumbleMotor : NSObject @property(nonatomic, strong) CHHapticEngine *engine API_AVAILABLE(macos(10.16), ios(13.0), tvos(14.0)); @property(nonatomic, strong) id player API_AVAILABLE(macos(10.16), ios(13.0), tvos(14.0)); @@ -1522,11 +1391,11 @@ static SDL3_RumbleContext *IOS_JoystickInitRumble(GCController *controller) return nil; } -#endif // ENABLE_MFI_RUMBLE +#endif // SDL_JOYSTICK_MFI static bool IOS_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble) { -#ifdef ENABLE_MFI_RUMBLE +#ifdef SDL_JOYSTICK_MFI SDL_JoystickDeviceItem *device = joystick->hwdata; if (device == NULL) { @@ -1545,17 +1414,14 @@ static bool IOS_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_rumb if (device->rumble) { SDL3_RumbleContext *rumble = (__bridge SDL3_RumbleContext *)device->rumble; return [rumble rumbleWithLowFrequency:low_frequency_rumble andHighFrequency:high_frequency_rumble]; - } else { - return SDL_Unsupported(); } -#else - return SDL_Unsupported(); #endif + return SDL_Unsupported(); } static bool IOS_JoystickRumbleTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble) { -#ifdef ENABLE_MFI_RUMBLE +#ifdef SDL_JOYSTICK_MFI SDL_JoystickDeviceItem *device = joystick->hwdata; if (device == NULL) { @@ -1574,17 +1440,13 @@ static bool IOS_JoystickRumbleTriggers(SDL_Joystick *joystick, Uint16 left_rumbl if (device->rumble) { SDL3_RumbleContext *rumble = (__bridge SDL3_RumbleContext *)device->rumble; return [rumble rumbleLeftTrigger:left_rumble andRightTrigger:right_rumble]; - } else { - return SDL_Unsupported(); } -#else - return SDL_Unsupported(); #endif + return SDL_Unsupported(); } static bool IOS_JoystickSetLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue) { -#ifdef ENABLE_MFI_LIGHT @autoreleasepool { SDL_JoystickDeviceItem *device = joystick->hwdata; @@ -1603,8 +1465,6 @@ static bool IOS_JoystickSetLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, U } } } -#endif // ENABLE_MFI_LIGHT - return SDL_Unsupported(); } @@ -1615,7 +1475,6 @@ static bool IOS_JoystickSendEffect(SDL_Joystick *joystick, const void *data, int static bool IOS_JoystickSetSensorsEnabled(SDL_Joystick *joystick, bool enabled) { -#ifdef ENABLE_MFI_SENSORS @autoreleasepool { SDL_JoystickDeviceItem *device = joystick->hwdata; @@ -1632,7 +1491,6 @@ static bool IOS_JoystickSetSensorsEnabled(SDL_Joystick *joystick, bool enabled) } } } -#endif // ENABLE_MFI_SENSORS return SDL_Unsupported(); } @@ -1660,8 +1518,8 @@ static void IOS_JoystickClose(SDL_Joystick *joystick) device->joystick = NULL; +#ifdef SDL_JOYSTICK_MFI @autoreleasepool { -#ifdef ENABLE_MFI_RUMBLE if (device->rumble) { SDL3_RumbleContext *rumble = (__bridge SDL3_RumbleContext *)device->rumble; @@ -1669,15 +1527,12 @@ static void IOS_JoystickClose(SDL_Joystick *joystick) CFRelease(device->rumble); device->rumble = NULL; } -#endif // ENABLE_MFI_RUMBLE if (device->controller) { -#ifdef SDL_JOYSTICK_MFI GCController *controller = device->controller; controller.controllerPausedHandler = nil; controller.playerIndex = -1; -#ifdef ENABLE_MFI_SYSTEM_GESTURE_STATE if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { for (id key in controller.physicalInputProfile.buttons) { GCControllerButtonInput *button = controller.physicalInputProfile.buttons[key]; @@ -1686,11 +1541,10 @@ static void IOS_JoystickClose(SDL_Joystick *joystick) } } } -#endif // ENABLE_MFI_SYSTEM_GESTURE_STATE - -#endif // SDL_JOYSTICK_MFI } } +#endif // SDL_JOYSTICK_MFI + if (device->is_siri_remote) { --SDL_AppleTVRemoteOpenedAsJoystick; } @@ -1728,7 +1582,6 @@ static void IOS_JoystickQuit(void) static bool IOS_JoystickGetGamepadMapping(int device_index, SDL_GamepadMapping *out) { -#ifdef ENABLE_PHYSICAL_INPUT_PROFILE SDL_JoystickDeviceItem *device = GetDeviceForIndex(device_index); if (device == NULL) { return false; @@ -1861,8 +1714,6 @@ static bool IOS_JoystickGetGamepadMapping(int device_index, SDL_GamepadMapping * return true; } -#endif // ENABLE_PHYSICAL_INPUT_PROFILE - return false; } @@ -1888,7 +1739,7 @@ bool IOS_SupportedHIDDevice(IOHIDDeviceRef device) } #endif -#if defined(SDL_JOYSTICK_MFI) && defined(ENABLE_PHYSICAL_INPUT_PROFILE) +#ifdef SDL_JOYSTICK_MFI /* NOLINTNEXTLINE(readability-non-const-parameter): getCString takes a non-const char* */ static void GetAppleSFSymbolsNameForElement(GCControllerElement *element, char *name) { @@ -1909,132 +1760,126 @@ static GCControllerDirectionPad *GetDirectionalPadForController(GCController *co return controller.extendedGamepad.dpad; } - if (controller.gamepad) { - return controller.gamepad.dpad; - } - if (controller.microGamepad) { return controller.microGamepad.dpad; } return nil; } -#endif // SDL_JOYSTICK_MFI && ENABLE_PHYSICAL_INPUT_PROFILE +#endif // SDL_JOYSTICK_MFI const char *IOS_GetAppleSFSymbolsNameForButton(SDL_Gamepad *gamepad, SDL_GamepadButton button) { char elementName[256]; elementName[0] = '\0'; -#if defined(SDL_JOYSTICK_MFI) && defined(ENABLE_PHYSICAL_INPUT_PROFILE) +#ifdef SDL_JOYSTICK_MFI if (gamepad && SDL_GetGamepadJoystick(gamepad)->driver == &SDL_IOS_JoystickDriver) { if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { GCController *controller = SDL_GetGamepadJoystick(gamepad)->hwdata->controller; - if ([controller respondsToSelector:@selector(physicalInputProfile)]) { - NSDictionary *elements = controller.physicalInputProfile.elements; - switch (button) { - case SDL_GAMEPAD_BUTTON_SOUTH: - GetAppleSFSymbolsNameForElement(elements[GCInputButtonA], elementName); - break; - case SDL_GAMEPAD_BUTTON_EAST: - GetAppleSFSymbolsNameForElement(elements[GCInputButtonB], elementName); - break; - case SDL_GAMEPAD_BUTTON_WEST: - GetAppleSFSymbolsNameForElement(elements[GCInputButtonX], elementName); - break; - case SDL_GAMEPAD_BUTTON_NORTH: - GetAppleSFSymbolsNameForElement(elements[GCInputButtonY], elementName); - break; - case SDL_GAMEPAD_BUTTON_BACK: - GetAppleSFSymbolsNameForElement(elements[GCInputButtonOptions], elementName); - break; - case SDL_GAMEPAD_BUTTON_GUIDE: - GetAppleSFSymbolsNameForElement(elements[@"Button Home"], elementName); - break; - case SDL_GAMEPAD_BUTTON_START: - GetAppleSFSymbolsNameForElement(elements[GCInputButtonMenu], elementName); - break; - case SDL_GAMEPAD_BUTTON_LEFT_STICK: - GetAppleSFSymbolsNameForElement(elements[GCInputLeftThumbstickButton], elementName); - break; - case SDL_GAMEPAD_BUTTON_RIGHT_STICK: - GetAppleSFSymbolsNameForElement(elements[GCInputRightThumbstickButton], elementName); - break; - case SDL_GAMEPAD_BUTTON_LEFT_SHOULDER: - GetAppleSFSymbolsNameForElement(elements[GCInputLeftShoulder], elementName); - break; - case SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER: - GetAppleSFSymbolsNameForElement(elements[GCInputRightShoulder], elementName); - break; - case SDL_GAMEPAD_BUTTON_DPAD_UP: - { - GCControllerDirectionPad *dpad = GetDirectionalPadForController(controller); - if (dpad) { - GetAppleSFSymbolsNameForElement(dpad.up, elementName); - if (SDL_strlen(elementName) == 0) { - SDL_strlcpy(elementName, "dpad.up.fill", sizeof(elementName)); - } + NSDictionary *elements = controller.physicalInputProfile.elements; + switch (button) { + case SDL_GAMEPAD_BUTTON_SOUTH: + GetAppleSFSymbolsNameForElement(elements[GCInputButtonA], elementName); + break; + case SDL_GAMEPAD_BUTTON_EAST: + GetAppleSFSymbolsNameForElement(elements[GCInputButtonB], elementName); + break; + case SDL_GAMEPAD_BUTTON_WEST: + GetAppleSFSymbolsNameForElement(elements[GCInputButtonX], elementName); + break; + case SDL_GAMEPAD_BUTTON_NORTH: + GetAppleSFSymbolsNameForElement(elements[GCInputButtonY], elementName); + break; + case SDL_GAMEPAD_BUTTON_BACK: + GetAppleSFSymbolsNameForElement(elements[GCInputButtonOptions], elementName); + break; + case SDL_GAMEPAD_BUTTON_GUIDE: + GetAppleSFSymbolsNameForElement(elements[@"Button Home"], elementName); + break; + case SDL_GAMEPAD_BUTTON_START: + GetAppleSFSymbolsNameForElement(elements[GCInputButtonMenu], elementName); + break; + case SDL_GAMEPAD_BUTTON_LEFT_STICK: + GetAppleSFSymbolsNameForElement(elements[GCInputLeftThumbstickButton], elementName); + break; + case SDL_GAMEPAD_BUTTON_RIGHT_STICK: + GetAppleSFSymbolsNameForElement(elements[GCInputRightThumbstickButton], elementName); + break; + case SDL_GAMEPAD_BUTTON_LEFT_SHOULDER: + GetAppleSFSymbolsNameForElement(elements[GCInputLeftShoulder], elementName); + break; + case SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER: + GetAppleSFSymbolsNameForElement(elements[GCInputRightShoulder], elementName); + break; + case SDL_GAMEPAD_BUTTON_DPAD_UP: + { + GCControllerDirectionPad *dpad = GetDirectionalPadForController(controller); + if (dpad) { + GetAppleSFSymbolsNameForElement(dpad.up, elementName); + if (SDL_strlen(elementName) == 0) { + SDL_strlcpy(elementName, "dpad.up.fill", sizeof(elementName)); } - break; } - case SDL_GAMEPAD_BUTTON_DPAD_DOWN: - { - GCControllerDirectionPad *dpad = GetDirectionalPadForController(controller); - if (dpad) { - GetAppleSFSymbolsNameForElement(dpad.down, elementName); - if (SDL_strlen(elementName) == 0) { - SDL_strlcpy(elementName, "dpad.down.fill", sizeof(elementName)); - } + break; + } + case SDL_GAMEPAD_BUTTON_DPAD_DOWN: + { + GCControllerDirectionPad *dpad = GetDirectionalPadForController(controller); + if (dpad) { + GetAppleSFSymbolsNameForElement(dpad.down, elementName); + if (SDL_strlen(elementName) == 0) { + SDL_strlcpy(elementName, "dpad.down.fill", sizeof(elementName)); } - break; } - case SDL_GAMEPAD_BUTTON_DPAD_LEFT: - { - GCControllerDirectionPad *dpad = GetDirectionalPadForController(controller); - if (dpad) { - GetAppleSFSymbolsNameForElement(dpad.left, elementName); - if (SDL_strlen(elementName) == 0) { - SDL_strlcpy(elementName, "dpad.left.fill", sizeof(elementName)); - } + break; + } + case SDL_GAMEPAD_BUTTON_DPAD_LEFT: + { + GCControllerDirectionPad *dpad = GetDirectionalPadForController(controller); + if (dpad) { + GetAppleSFSymbolsNameForElement(dpad.left, elementName); + if (SDL_strlen(elementName) == 0) { + SDL_strlcpy(elementName, "dpad.left.fill", sizeof(elementName)); } - break; } - case SDL_GAMEPAD_BUTTON_DPAD_RIGHT: - { - GCControllerDirectionPad *dpad = GetDirectionalPadForController(controller); - if (dpad) { - GetAppleSFSymbolsNameForElement(dpad.right, elementName); - if (SDL_strlen(elementName) == 0) { - SDL_strlcpy(elementName, "dpad.right.fill", sizeof(elementName)); - } + break; + } + case SDL_GAMEPAD_BUTTON_DPAD_RIGHT: + { + GCControllerDirectionPad *dpad = GetDirectionalPadForController(controller); + if (dpad) { + GetAppleSFSymbolsNameForElement(dpad.right, elementName); + if (SDL_strlen(elementName) == 0) { + SDL_strlcpy(elementName, "dpad.right.fill", sizeof(elementName)); } - break; - } - case SDL_GAMEPAD_BUTTON_MISC1: - GetAppleSFSymbolsNameForElement(elements[GCInputDualShockTouchpadButton], elementName); - break; - case SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1: - GetAppleSFSymbolsNameForElement(elements[GCInputXboxPaddleOne], elementName); - break; - case SDL_GAMEPAD_BUTTON_LEFT_PADDLE1: - GetAppleSFSymbolsNameForElement(elements[GCInputXboxPaddleThree], elementName); - break; - case SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2: - GetAppleSFSymbolsNameForElement(elements[GCInputXboxPaddleTwo], elementName); - break; - case SDL_GAMEPAD_BUTTON_LEFT_PADDLE2: - GetAppleSFSymbolsNameForElement(elements[GCInputXboxPaddleFour], elementName); - break; - case SDL_GAMEPAD_BUTTON_TOUCHPAD: - GetAppleSFSymbolsNameForElement(elements[GCInputDualShockTouchpadButton], elementName); - break; - default: - break; } + break; + } + case SDL_GAMEPAD_BUTTON_MISC1: + GetAppleSFSymbolsNameForElement(elements[GCInputDualShockTouchpadButton], elementName); + break; + case SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1: + GetAppleSFSymbolsNameForElement(elements[GCInputXboxPaddleOne], elementName); + break; + case SDL_GAMEPAD_BUTTON_LEFT_PADDLE1: + GetAppleSFSymbolsNameForElement(elements[GCInputXboxPaddleThree], elementName); + break; + case SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2: + GetAppleSFSymbolsNameForElement(elements[GCInputXboxPaddleTwo], elementName); + break; + case SDL_GAMEPAD_BUTTON_LEFT_PADDLE2: + GetAppleSFSymbolsNameForElement(elements[GCInputXboxPaddleFour], elementName); + break; + case SDL_GAMEPAD_BUTTON_TOUCHPAD: + GetAppleSFSymbolsNameForElement(elements[GCInputDualShockTouchpadButton], elementName); + break; + default: + break; } } } -#endif +#endif // SDL_JOYSTICK_MFI return *elementName ? SDL_GetPersistentString(elementName) : NULL; } @@ -2044,38 +1889,37 @@ const char *IOS_GetAppleSFSymbolsNameForAxis(SDL_Gamepad *gamepad, SDL_GamepadAx char elementName[256]; elementName[0] = '\0'; -#if defined(SDL_JOYSTICK_MFI) && defined(ENABLE_PHYSICAL_INPUT_PROFILE) +#ifdef SDL_JOYSTICK_MFI if (gamepad && SDL_GetGamepadJoystick(gamepad)->driver == &SDL_IOS_JoystickDriver) { if (@available(macOS 10.16, iOS 14.0, tvOS 14.0, *)) { GCController *controller = SDL_GetGamepadJoystick(gamepad)->hwdata->controller; - if ([controller respondsToSelector:@selector(physicalInputProfile)]) { - NSDictionary *elements = controller.physicalInputProfile.elements; - switch (axis) { - case SDL_GAMEPAD_AXIS_LEFTX: - GetAppleSFSymbolsNameForElement(elements[GCInputLeftThumbstick], elementName); - break; - case SDL_GAMEPAD_AXIS_LEFTY: - GetAppleSFSymbolsNameForElement(elements[GCInputLeftThumbstick], elementName); - break; - case SDL_GAMEPAD_AXIS_RIGHTX: - GetAppleSFSymbolsNameForElement(elements[GCInputRightThumbstick], elementName); - break; - case SDL_GAMEPAD_AXIS_RIGHTY: - GetAppleSFSymbolsNameForElement(elements[GCInputRightThumbstick], elementName); - break; - case SDL_GAMEPAD_AXIS_LEFT_TRIGGER: - GetAppleSFSymbolsNameForElement(elements[GCInputLeftTrigger], elementName); - break; - case SDL_GAMEPAD_AXIS_RIGHT_TRIGGER: - GetAppleSFSymbolsNameForElement(elements[GCInputRightTrigger], elementName); - break; - default: - break; - } + NSDictionary *elements = controller.physicalInputProfile.elements; + switch (axis) { + case SDL_GAMEPAD_AXIS_LEFTX: + GetAppleSFSymbolsNameForElement(elements[GCInputLeftThumbstick], elementName); + break; + case SDL_GAMEPAD_AXIS_LEFTY: + GetAppleSFSymbolsNameForElement(elements[GCInputLeftThumbstick], elementName); + break; + case SDL_GAMEPAD_AXIS_RIGHTX: + GetAppleSFSymbolsNameForElement(elements[GCInputRightThumbstick], elementName); + break; + case SDL_GAMEPAD_AXIS_RIGHTY: + GetAppleSFSymbolsNameForElement(elements[GCInputRightThumbstick], elementName); + break; + case SDL_GAMEPAD_AXIS_LEFT_TRIGGER: + GetAppleSFSymbolsNameForElement(elements[GCInputLeftTrigger], elementName); + break; + case SDL_GAMEPAD_AXIS_RIGHT_TRIGGER: + GetAppleSFSymbolsNameForElement(elements[GCInputRightTrigger], elementName); + break; + default: + break; } } } -#endif +#endif // SDL_JOYSTICK_MFI + return *elementName ? SDL_GetPersistentString(elementName) : NULL; } diff --git a/libs/SDL3/src/joystick/apple/SDL_mfijoystick_c.h b/libs/SDL3/src/joystick/apple/SDL_mfijoystick_c.h index 92cc1c0a..783b3f48 100644 --- a/libs/SDL3/src/joystick/apple/SDL_mfijoystick_c.h +++ b/libs/SDL3/src/joystick/apple/SDL_mfijoystick_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/bsd/SDL_bsdjoystick.c b/libs/SDL3/src/joystick/bsd/SDL_bsdjoystick.c index 53376207..b3fd3e9c 100644 --- a/libs/SDL3/src/joystick/bsd/SDL_bsdjoystick.c +++ b/libs/SDL3/src/joystick/bsd/SDL_bsdjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/darwin/SDL_iokitjoystick.c b/libs/SDL3/src/joystick/darwin/SDL_iokitjoystick.c index 19e503ae..9327276a 100644 --- a/libs/SDL3/src/joystick/darwin/SDL_iokitjoystick.c +++ b/libs/SDL3/src/joystick/darwin/SDL_iokitjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/darwin/SDL_iokitjoystick_c.h b/libs/SDL3/src/joystick/darwin/SDL_iokitjoystick_c.h index e57c14ca..91deb240 100644 --- a/libs/SDL3/src/joystick/darwin/SDL_iokitjoystick_c.h +++ b/libs/SDL3/src/joystick/darwin/SDL_iokitjoystick_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/dummy/SDL_sysjoystick.c b/libs/SDL3/src/joystick/dummy/SDL_sysjoystick.c index 439c0db3..8240d452 100644 --- a/libs/SDL3/src/joystick/dummy/SDL_sysjoystick.c +++ b/libs/SDL3/src/joystick/dummy/SDL_sysjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/emscripten/SDL_sysjoystick.c b/libs/SDL3/src/joystick/emscripten/SDL_sysjoystick.c index 7376358e..b481d5da 100644 --- a/libs/SDL3/src/joystick/emscripten/SDL_sysjoystick.c +++ b/libs/SDL3/src/joystick/emscripten/SDL_sysjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -36,17 +36,18 @@ static int numjoysticks = 0; static EM_BOOL Emscripten_JoyStickConnected(int eventType, const EmscriptenGamepadEvent *gamepadEvent, void *userData) { + SDL_joylist_item *item; int i; - SDL_joylist_item *item; + SDL_LockJoysticks(); if (JoystickByIndex(gamepadEvent->index) != NULL) { - return 1; + goto done; } item = (SDL_joylist_item *)SDL_malloc(sizeof(SDL_joylist_item)); if (!item) { - return 1; + goto done; } SDL_zerop(item); @@ -55,14 +56,14 @@ static EM_BOOL Emscripten_JoyStickConnected(int eventType, const EmscriptenGamep item->name = SDL_CreateJoystickName(0, 0, NULL, gamepadEvent->id); if (!item->name) { SDL_free(item); - return 1; + goto done; } item->mapping = SDL_strdup(gamepadEvent->mapping); if (!item->mapping) { SDL_free(item->name); SDL_free(item); - return 1; + goto done; } item->naxes = gamepadEvent->numAxes; @@ -98,6 +99,9 @@ static EM_BOOL Emscripten_JoyStickConnected(int eventType, const EmscriptenGamep SDL_Log("Added joystick with index %d", item->index); #endif +done: + SDL_UnlockJoysticks(); + return 1; } @@ -106,6 +110,8 @@ static EM_BOOL Emscripten_JoyStickDisconnected(int eventType, const EmscriptenGa SDL_joylist_item *item = SDL_joylist; SDL_joylist_item *prev = NULL; + SDL_LockJoysticks(); + while (item) { if (item->index == gamepadEvent->index) { break; @@ -115,7 +121,7 @@ static EM_BOOL Emscripten_JoyStickDisconnected(int eventType, const EmscriptenGa } if (!item) { - return 1; + goto done; } if (item->joystick) { @@ -143,6 +149,10 @@ static EM_BOOL Emscripten_JoyStickDisconnected(int eventType, const EmscriptenGa SDL_free(item->name); SDL_free(item->mapping); SDL_free(item); + +done: + SDL_UnlockJoysticks(); + return 1; } diff --git a/libs/SDL3/src/joystick/emscripten/SDL_sysjoystick_c.h b/libs/SDL3/src/joystick/emscripten/SDL_sysjoystick_c.h index 321bbcc0..e03a27c4 100644 --- a/libs/SDL3/src/joystick/emscripten/SDL_sysjoystick_c.h +++ b/libs/SDL3/src/joystick/emscripten/SDL_sysjoystick_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/gdk/SDL_gameinputjoystick.c b/libs/SDL3/src/joystick/gdk/SDL_gameinputjoystick.c index 13b51082..27e36e00 100644 --- a/libs/SDL3/src/joystick/gdk/SDL_gameinputjoystick.c +++ b/libs/SDL3/src/joystick/gdk/SDL_gameinputjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/haiku/SDL_haikujoystick.cc b/libs/SDL3/src/joystick/haiku/SDL_haikujoystick.cc index 5cf3ddf8..977e4fc2 100644 --- a/libs/SDL3/src/joystick/haiku/SDL_haikujoystick.cc +++ b/libs/SDL3/src/joystick/haiku/SDL_haikujoystick.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_combined.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_combined.c index a224cd09..abfce17e 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_combined.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_combined.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_gamecube.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_gamecube.c index 558588d9..4d45c7a2 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_gamecube.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_gamecube.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_luna.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_luna.c index d108f83f..7c889a66 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_luna.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_luna.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_nintendo.h b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_nintendo.h index cfd308e1..0a5836fb 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_nintendo.h +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_nintendo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_ps3.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_ps3.c index 1b02eeb8..bcb7d5b9 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_ps3.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_ps3.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_ps4.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_ps4.c index b9da3809..4fe7b03d 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_ps4.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_ps4.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -129,18 +129,16 @@ typedef struct } IMUCalibrationData; /* Rumble hint mode: - * default: enhanced features are available if the controller is using enhanced reports * "0": enhanced features are never used * "1": enhanced features are always used * "auto": enhanced features are advertised to the application, but SDL doesn't touch the controller state unless the application explicitly requests it. */ typedef enum { - PS4_RUMBLE_HINT_DEFAULT, - PS4_RUMBLE_HINT_OFF, - PS4_RUMBLE_HINT_ON, - PS4_RUMBLE_HINT_AUTO -} SDL_PS4_RumbleHintMode; + PS4_ENHANCED_REPORT_HINT_OFF, + PS4_ENHANCED_REPORT_HINT_ON, + PS4_ENHANCED_REPORT_HINT_AUTO +} HIDAPI_PS4_EnhancedReportHint; typedef struct { @@ -154,7 +152,7 @@ typedef struct bool vibration_supported; bool touchpad_supported; bool effects_supported; - SDL_PS4_RumbleHintMode rumble_hint; + HIDAPI_PS4_EnhancedReportHint enhanced_report_hint; bool enhanced_reports; bool enhanced_mode; bool enhanced_mode_available; @@ -300,7 +298,7 @@ static bool HIDAPI_DriverPS4_InitDevice(SDL_HIDAPI_Device *device) j = -1; for (i = 0; i < 12; i += 2) { j += 1; - SDL_memcpy(&serial[j], &device->serial[i], 2); + SDL_memmove(&serial[j], &device->serial[i], 2); j += 2; serial[j] = '-'; } @@ -696,7 +694,7 @@ static void HIDAPI_DriverPS4_TickleBluetooth(SDL_HIDAPI_Device *device) SDL_HIDAPI_SendRumbleAndUnlock(device, data, sizeof(data)); } } else { -#if 0 /* The 8BitDo Zero 2 has perfect emulation of a PS4 controllers, except it +#if 0 /* The 8BitDo Zero 2 has perfect emulation of a PS4 controller, except it * only sends reports when the state changes, so we can't disconnect here. */ // We can't even send an invalid effects packet, or it will put the controller in enhanced mode @@ -709,6 +707,9 @@ static void HIDAPI_DriverPS4_TickleBluetooth(SDL_HIDAPI_Device *device) static void HIDAPI_DriverPS4_SetEnhancedModeAvailable(SDL_DriverPS4_Context *ctx) { + if (ctx->enhanced_mode_available) { + return; + } ctx->enhanced_mode_available = true; if (ctx->touchpad_supported) { @@ -730,9 +731,7 @@ static void HIDAPI_DriverPS4_SetEnhancedModeAvailable(SDL_DriverPS4_Context *ctx static void HIDAPI_DriverPS4_SetEnhancedMode(SDL_DriverPS4_Context *ctx) { - if (!ctx->enhanced_mode_available) { - HIDAPI_DriverPS4_SetEnhancedModeAvailable(ctx); - } + HIDAPI_DriverPS4_SetEnhancedModeAvailable(ctx); if (!ctx->enhanced_mode) { ctx->enhanced_mode = true; @@ -742,55 +741,52 @@ static void HIDAPI_DriverPS4_SetEnhancedMode(SDL_DriverPS4_Context *ctx) } } -static void HIDAPI_DriverPS4_SetRumbleHintMode(SDL_DriverPS4_Context *ctx, SDL_PS4_RumbleHintMode rumble_hint) +static void HIDAPI_DriverPS4_SetEnhancedReportHint(SDL_DriverPS4_Context *ctx, HIDAPI_PS4_EnhancedReportHint enhanced_report_hint) { - switch (rumble_hint) { - case PS4_RUMBLE_HINT_DEFAULT: - if (ctx->enhanced_reports) { - HIDAPI_DriverPS4_SetEnhancedMode(ctx); - } - break; - case PS4_RUMBLE_HINT_OFF: + switch (enhanced_report_hint) { + case PS4_ENHANCED_REPORT_HINT_OFF: // Nothing to do, enhanced mode is a one-way ticket break; - case PS4_RUMBLE_HINT_ON: + case PS4_ENHANCED_REPORT_HINT_ON: HIDAPI_DriverPS4_SetEnhancedMode(ctx); break; - case PS4_RUMBLE_HINT_AUTO: + case PS4_ENHANCED_REPORT_HINT_AUTO: HIDAPI_DriverPS4_SetEnhancedModeAvailable(ctx); break; } - ctx->rumble_hint = rumble_hint; + ctx->enhanced_report_hint = enhanced_report_hint; } static void HIDAPI_DriverPS4_UpdateEnhancedModeOnEnhancedReport(SDL_DriverPS4_Context *ctx) { ctx->enhanced_reports = true; - if (ctx->rumble_hint == PS4_RUMBLE_HINT_DEFAULT) { - HIDAPI_DriverPS4_SetRumbleHintMode(ctx, PS4_RUMBLE_HINT_ON); + if (ctx->enhanced_report_hint == PS4_ENHANCED_REPORT_HINT_AUTO) { + HIDAPI_DriverPS4_SetEnhancedReportHint(ctx, PS4_ENHANCED_REPORT_HINT_ON); } } static void HIDAPI_DriverPS4_UpdateEnhancedModeOnApplicationUsage(SDL_DriverPS4_Context *ctx) { - if (ctx->rumble_hint == PS4_RUMBLE_HINT_AUTO) { - HIDAPI_DriverPS4_SetRumbleHintMode(ctx, PS4_RUMBLE_HINT_ON); + if (ctx->enhanced_report_hint == PS4_ENHANCED_REPORT_HINT_AUTO) { + HIDAPI_DriverPS4_SetEnhancedReportHint(ctx, PS4_ENHANCED_REPORT_HINT_ON); } } -static void SDLCALL SDL_PS4RumbleHintChanged(void *userdata, const char *name, const char *oldValue, const char *hint) +static void SDLCALL SDL_PS4EnhancedReportsChanged(void *userdata, const char *name, const char *oldValue, const char *hint) { SDL_DriverPS4_Context *ctx = (SDL_DriverPS4_Context *)userdata; - if (!hint) { - HIDAPI_DriverPS4_SetRumbleHintMode(ctx, PS4_RUMBLE_HINT_DEFAULT); - } else if (SDL_strcasecmp(hint, "auto") == 0) { - HIDAPI_DriverPS4_SetRumbleHintMode(ctx, PS4_RUMBLE_HINT_AUTO); - } else if (SDL_GetStringBoolean(hint, false)) { - HIDAPI_DriverPS4_SetRumbleHintMode(ctx, PS4_RUMBLE_HINT_ON); + if (ctx->device->is_bluetooth) { + if (hint && SDL_strcasecmp(hint, "auto") == 0) { + HIDAPI_DriverPS4_SetEnhancedReportHint(ctx, PS4_ENHANCED_REPORT_HINT_AUTO); + } else if (SDL_GetStringBoolean(hint, true)) { + HIDAPI_DriverPS4_SetEnhancedReportHint(ctx, PS4_ENHANCED_REPORT_HINT_ON); + } else { + HIDAPI_DriverPS4_SetEnhancedReportHint(ctx, PS4_ENHANCED_REPORT_HINT_OFF); + } } else { - HIDAPI_DriverPS4_SetRumbleHintMode(ctx, PS4_RUMBLE_HINT_OFF); + HIDAPI_DriverPS4_SetEnhancedReportHint(ctx, PS4_ENHANCED_REPORT_HINT_ON); } } @@ -868,8 +864,8 @@ static bool HIDAPI_DriverPS4_OpenJoystick(SDL_HIDAPI_Device *device, SDL_Joystic SDL_AddHintCallback(SDL_HINT_JOYSTICK_HIDAPI_PS4_REPORT_INTERVAL, SDL_PS4ReportIntervalHintChanged, ctx); - SDL_AddHintCallback(SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE, - SDL_PS4RumbleHintChanged, ctx); + SDL_AddHintCallback(SDL_HINT_JOYSTICK_ENHANCED_REPORTS, + SDL_PS4EnhancedReportsChanged, ctx); return true; } @@ -1287,7 +1283,7 @@ static bool HIDAPI_DriverPS4_UpdateDevice(SDL_HIDAPI_Device *device) case k_EPS4ReportIdBluetoothState7: case k_EPS4ReportIdBluetoothState8: case k_EPS4ReportIdBluetoothState9: - // This is the extended report, we can enable effects now in default mode + // This is the extended report, we can enable effects now in auto mode HIDAPI_DriverPS4_UpdateEnhancedModeOnEnhancedReport(ctx); // Bluetooth state packets have two additional bytes at the beginning, the first notes if HID is present @@ -1353,10 +1349,14 @@ static void HIDAPI_DriverPS4_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joysti SDL_RemoveHintCallback(SDL_HINT_JOYSTICK_HIDAPI_PS4_REPORT_INTERVAL, SDL_PS4ReportIntervalHintChanged, ctx); - SDL_RemoveHintCallback(SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE, - SDL_PS4RumbleHintChanged, ctx); + SDL_RemoveHintCallback(SDL_HINT_JOYSTICK_ENHANCED_REPORTS, + SDL_PS4EnhancedReportsChanged, ctx); ctx->joystick = NULL; + + ctx->report_sensors = false; + ctx->enhanced_mode = false; + ctx->enhanced_mode_available = false; } static void HIDAPI_DriverPS4_FreeDevice(SDL_HIDAPI_Device *device) diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_ps5.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_ps5.c index b462eabb..7226fa20 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_ps5.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_ps5.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -215,18 +215,16 @@ typedef struct } IMUCalibrationData; /* Rumble hint mode: - * default: enhanced features are available if the controller is using enhanced reports * "0": enhanced features are never used * "1": enhanced features are always used * "auto": enhanced features are advertised to the application, but SDL doesn't touch the controller state unless the application explicitly requests it. */ typedef enum { - PS5_RUMBLE_HINT_DEFAULT, - PS5_RUMBLE_HINT_OFF, - PS5_RUMBLE_HINT_ON, - PS5_RUMBLE_HINT_AUTO -} SDL_PS5_RumbleHintMode; + PS5_ENHANCED_REPORT_HINT_OFF, + PS5_ENHANCED_REPORT_HINT_ON, + PS5_ENHANCED_REPORT_HINT_AUTO +} HIDAPI_PS5_EnhancedReportHint; typedef struct { @@ -240,7 +238,7 @@ typedef struct bool playerled_supported; bool touchpad_supported; bool effects_supported; - SDL_PS5_RumbleHintMode rumble_hint; + HIDAPI_PS5_EnhancedReportHint enhanced_report_hint; bool enhanced_reports; bool enhanced_mode; bool enhanced_mode_available; @@ -389,7 +387,7 @@ static bool HIDAPI_DriverPS5_InitDevice(SDL_HIDAPI_Device *device) j = -1; for (i = 0; i < 12; i += 2) { j += 1; - SDL_memcpy(&serial[j], &device->serial[i], 2); + SDL_memmove(&serial[j], &device->serial[i], 2); j += 2; serial[j] = '-'; } @@ -803,6 +801,9 @@ static void HIDAPI_DriverPS5_TickleBluetooth(SDL_HIDAPI_Device *device) static void HIDAPI_DriverPS5_SetEnhancedModeAvailable(SDL_DriverPS5_Context *ctx) { + if (ctx->enhanced_mode_available) { + return; + } ctx->enhanced_mode_available = true; if (ctx->touchpad_supported) { @@ -828,11 +829,9 @@ static void HIDAPI_DriverPS5_SetEnhancedModeAvailable(SDL_DriverPS5_Context *ctx static void HIDAPI_DriverPS5_SetEnhancedMode(SDL_DriverPS5_Context *ctx) { - if (!ctx->enhanced_mode_available) { - HIDAPI_DriverPS5_SetEnhancedModeAvailable(ctx); - } + HIDAPI_DriverPS5_SetEnhancedModeAvailable(ctx); - if (!ctx->enhanced_mode && ctx->enhanced_mode_available) { + if (!ctx->enhanced_mode) { ctx->enhanced_mode = true; // Switch into enhanced report mode @@ -843,63 +842,52 @@ static void HIDAPI_DriverPS5_SetEnhancedMode(SDL_DriverPS5_Context *ctx) } } -static void HIDAPI_DriverPS5_SetRumbleHintMode(SDL_DriverPS5_Context *ctx, SDL_PS5_RumbleHintMode rumble_hint) +static void HIDAPI_DriverPS5_SetEnhancedReportHint(SDL_DriverPS5_Context *ctx, HIDAPI_PS5_EnhancedReportHint enhanced_report_hint) { - switch (rumble_hint) { - case PS5_RUMBLE_HINT_DEFAULT: - if (ctx->enhanced_reports) { - HIDAPI_DriverPS5_SetEnhancedMode(ctx); - } - break; - case PS5_RUMBLE_HINT_OFF: + switch (enhanced_report_hint) { + case PS5_ENHANCED_REPORT_HINT_OFF: // Nothing to do, enhanced mode is a one-way ticket break; - case PS5_RUMBLE_HINT_ON: + case PS5_ENHANCED_REPORT_HINT_ON: HIDAPI_DriverPS5_SetEnhancedMode(ctx); break; - case PS5_RUMBLE_HINT_AUTO: + case PS5_ENHANCED_REPORT_HINT_AUTO: HIDAPI_DriverPS5_SetEnhancedModeAvailable(ctx); break; } - ctx->rumble_hint = rumble_hint; + ctx->enhanced_report_hint = enhanced_report_hint; } static void HIDAPI_DriverPS5_UpdateEnhancedModeOnEnhancedReport(SDL_DriverPS5_Context *ctx) { ctx->enhanced_reports = true; - if (ctx->rumble_hint == PS5_RUMBLE_HINT_DEFAULT) { - HIDAPI_DriverPS5_SetRumbleHintMode(ctx, PS5_RUMBLE_HINT_ON); + if (ctx->enhanced_report_hint == PS5_ENHANCED_REPORT_HINT_AUTO) { + HIDAPI_DriverPS5_SetEnhancedReportHint(ctx, PS5_ENHANCED_REPORT_HINT_ON); } } static void HIDAPI_DriverPS5_UpdateEnhancedModeOnApplicationUsage(SDL_DriverPS5_Context *ctx) { - if (ctx->rumble_hint == PS5_RUMBLE_HINT_AUTO) { - HIDAPI_DriverPS5_SetRumbleHintMode(ctx, PS5_RUMBLE_HINT_ON); + if (ctx->enhanced_report_hint == PS5_ENHANCED_REPORT_HINT_AUTO) { + HIDAPI_DriverPS5_SetEnhancedReportHint(ctx, PS5_ENHANCED_REPORT_HINT_ON); } } -static void SDLCALL SDL_PS5RumbleHintChanged(void *userdata, const char *name, const char *oldValue, const char *hint) +static void SDLCALL SDL_PS5EnhancedReportsChanged(void *userdata, const char *name, const char *oldValue, const char *hint) { SDL_DriverPS5_Context *ctx = (SDL_DriverPS5_Context *)userdata; - if (!hint) { - /* Games written prior the introduction of PS5 controller support in SDL will not be aware of - SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE, but they did know SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE. - To support apps that only knew about the PS4 hint, we'll use the PS4 hint as the default. - */ - hint = SDL_GetHint(SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE); - } - - if (!hint) { - HIDAPI_DriverPS5_SetRumbleHintMode(ctx, PS5_RUMBLE_HINT_DEFAULT); - } else if (SDL_strcasecmp(hint, "auto") == 0) { - HIDAPI_DriverPS5_SetRumbleHintMode(ctx, PS5_RUMBLE_HINT_AUTO); - } else if (SDL_GetStringBoolean(hint, false)) { - HIDAPI_DriverPS5_SetRumbleHintMode(ctx, PS5_RUMBLE_HINT_ON); + if (ctx->device->is_bluetooth) { + if (hint && SDL_strcasecmp(hint, "auto") == 0) { + HIDAPI_DriverPS5_SetEnhancedReportHint(ctx, PS5_ENHANCED_REPORT_HINT_AUTO); + } else if (SDL_GetStringBoolean(hint, true)) { + HIDAPI_DriverPS5_SetEnhancedReportHint(ctx, PS5_ENHANCED_REPORT_HINT_ON); + } else { + HIDAPI_DriverPS5_SetEnhancedReportHint(ctx, PS5_ENHANCED_REPORT_HINT_OFF); + } } else { - HIDAPI_DriverPS5_SetRumbleHintMode(ctx, PS5_RUMBLE_HINT_OFF); + HIDAPI_DriverPS5_SetEnhancedReportHint(ctx, PS5_ENHANCED_REPORT_HINT_ON); } } @@ -962,9 +950,9 @@ static bool HIDAPI_DriverPS5_OpenJoystick(SDL_HIDAPI_Device *device, SDL_Joystic joystick->nhats = 1; joystick->firmware_version = ctx->firmware_version; - SDL_AddHintCallback(SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE, - SDL_PS5RumbleHintChanged, ctx); - SDL_AddHintCallback(SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED, + SDL_AddHintCallback(SDL_HINT_JOYSTICK_ENHANCED_REPORTS, + SDL_PS5EnhancedReportsChanged, ctx); + SDL_AddHintCallback(SDL_HINT_JOYSTICK_ENHANCED_REPORTS, SDL_PS5PlayerLEDHintChanged, ctx); return true; @@ -1529,7 +1517,7 @@ static bool HIDAPI_DriverPS5_UpdateDevice(SDL_HIDAPI_Device *device) } break; case k_EPS5ReportIdBluetoothState: - // This is the extended report, we can enable effects now in default mode + // This is the extended report, we can enable effects now in auto mode HIDAPI_DriverPS5_UpdateEnhancedModeOnEnhancedReport(ctx); if (ctx->use_alternate_report) { @@ -1592,13 +1580,17 @@ static void HIDAPI_DriverPS5_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joysti { SDL_DriverPS5_Context *ctx = (SDL_DriverPS5_Context *)device->context; - SDL_RemoveHintCallback(SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE, - SDL_PS5RumbleHintChanged, ctx); + SDL_RemoveHintCallback(SDL_HINT_JOYSTICK_ENHANCED_REPORTS, + SDL_PS5EnhancedReportsChanged, ctx); SDL_RemoveHintCallback(SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED, SDL_PS5PlayerLEDHintChanged, ctx); ctx->joystick = NULL; + + ctx->report_sensors = false; + ctx->enhanced_mode = false; + ctx->enhanced_mode_available = false; } static void HIDAPI_DriverPS5_FreeDevice(SDL_HIDAPI_Device *device) diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_rumble.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_rumble.c index f4a17688..5fd93dc0 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_rumble.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_rumble.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_rumble.h b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_rumble.h index aa0646e4..ede061e0 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_rumble.h +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_rumble.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_shield.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_shield.c index 227b00b5..10dcea36 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_shield.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_shield.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -340,9 +340,10 @@ static void HIDAPI_DriverShield_HandleStatePacketV103(SDL_Joystick *joystick, SD SDL_SendJoystickButton(timestamp, joystick, SDL_GAMEPAD_BUTTON_START, ((data[2] & 0x02) != 0)); SDL_SendJoystickButton(timestamp, joystick, SDL_GAMEPAD_BUTTON_SHIELD_V103_PLUS, ((data[2] & 0x08) != 0)); SDL_SendJoystickButton(timestamp, joystick, SDL_GAMEPAD_BUTTON_SHIELD_V103_MINUS, ((data[2] & 0x10) != 0)); - SDL_SendJoystickButton(timestamp, joystick, SDL_GAMEPAD_BUTTON_GUIDE, ((data[2] & 0x20) != 0)); + //SDL_SendJoystickButton(timestamp, joystick, SDL_GAMEPAD_BUTTON_GUIDE, ((data[2] & 0x20) != 0)); SDL_SendJoystickButton(timestamp, joystick, SDL_GAMEPAD_BUTTON_BACK, ((data[2] & 0x40) != 0)); - SDL_SendJoystickButton(timestamp, joystick, SDL_GAMEPAD_BUTTON_SHIELD_SHARE, ((data[2] & 0x80) != 0)); + //SDL_SendJoystickButton(timestamp, joystick, SDL_GAMEPAD_BUTTON_SHIELD_SHARE, ((data[2] & 0x80) != 0)); + SDL_SendJoystickButton(timestamp, joystick, SDL_GAMEPAD_BUTTON_GUIDE, ((data[2] & 0x80) != 0)); } SDL_SendJoystickAxis(timestamp, joystick, SDL_GAMEPAD_AXIS_LEFTX, SDL_Swap16LE(*(Sint16 *)&data[4]) - 0x8000); @@ -443,9 +444,10 @@ static void HIDAPI_DriverShield_HandleStatePacketV104(SDL_Joystick *joystick, SD SDL_SendJoystickAxis(timestamp, joystick, SDL_GAMEPAD_AXIS_RIGHT_TRIGGER, SDL_Swap16LE(*(Sint16 *)&data[21]) - 0x8000); if (ctx->last_state[17] != data[17]) { - SDL_SendJoystickButton(timestamp, joystick, SDL_GAMEPAD_BUTTON_SHIELD_SHARE, ((data[17] & 0x01) != 0)); + //SDL_SendJoystickButton(timestamp, joystick, SDL_GAMEPAD_BUTTON_SHIELD_SHARE, ((data[17] & 0x01) != 0)); SDL_SendJoystickButton(timestamp, joystick, SDL_GAMEPAD_BUTTON_BACK, ((data[17] & 0x02) != 0)); - SDL_SendJoystickButton(timestamp, joystick, SDL_GAMEPAD_BUTTON_GUIDE, ((data[17] & 0x04) != 0)); + //SDL_SendJoystickButton(timestamp, joystick, SDL_GAMEPAD_BUTTON_GUIDE, ((data[17] & 0x04) != 0)); + SDL_SendJoystickButton(timestamp, joystick, SDL_GAMEPAD_BUTTON_GUIDE, ((data[17] & 0x01) != 0)); } SDL_memcpy(ctx->last_state, data, SDL_min(size, sizeof(ctx->last_state))); diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_stadia.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_stadia.c index 8bcfdd4b..487bf41b 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_stadia.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_stadia.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_steam.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_steam.c index 43e95876..b48d3539 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_steam.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_steam.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_steam_hori.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_steam_hori.c index 75d786db..ac547a19 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_steam_hori.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_steam_hori.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_switch.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_switch.c index ea43af30..6d1e0b81 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_switch.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_switch.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -268,6 +268,18 @@ typedef struct } SwitchProprietaryOutputPacket_t; #pragma pack() +/* Enhanced report hint mode: + * "0": enhanced features are never used + * "1": enhanced features are always used + * "auto": enhanced features are advertised to the application, but SDL doesn't touch the controller state unless the application explicitly requests it. + */ +typedef enum +{ + SWITCH_ENHANCED_REPORT_HINT_OFF, + SWITCH_ENHANCED_REPORT_HINT_ON, + SWITCH_ENHANCED_REPORT_HINT_AUTO +} HIDAPI_Switch_EnhancedReportHint; + typedef struct { SDL_HIDAPI_Device *device; @@ -283,6 +295,9 @@ typedef struct Uint8 m_nCurrentInputMode; Uint8 m_rgucMACAddress[6]; Uint8 m_nCommandNumber; + HIDAPI_Switch_EnhancedReportHint m_eEnhancedReportHint; + bool m_bEnhancedMode; + bool m_bEnhancedModeAvailable; SwitchCommonOutputPacket_t m_RumblePacket; Uint8 m_rgucReadBuffer[k_unSwitchMaxOutputPacketLength]; bool m_bRumbleActive; @@ -290,6 +305,7 @@ typedef struct bool m_bRumblePending; bool m_bRumbleZeroPending; Uint32 m_unRumblePending; + bool m_bSensorsSupported; bool m_bReportSensors; bool m_bHasSensorData; Uint64 m_ulLastInput; @@ -777,24 +793,25 @@ static Uint8 GetDefaultInputMode(SDL_DriverSwitch_Context *ctx) } } - /* The official Nintendo Switch Pro Controller supports FullControllerState over Bluetooth - * just fine. We really should use that, or else the epowerlevel code in HandleFullControllerState - * is completely pointless. We need full state if we want battery level and we only care about - * battery level over Bluetooth anyway. - */ - if (ctx->device->vendor_id == USB_VENDOR_NINTENDO) { - // However, switching to full controller state breaks DirectInput, so let's not do that - #if 0 - input_mode = k_eSwitchInputReportIDs_FullControllerState; - #endif - - /* However, Joy-Con controllers switch their thumbsticks into D-pad mode in simple mode, - * so let's enable full controller state for them. - */ - if (ctx->device->product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_LEFT || - ctx->device->product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_RIGHT) { + switch (ctx->m_eEnhancedReportHint) { + case SWITCH_ENHANCED_REPORT_HINT_OFF: + input_mode = k_eSwitchInputReportIDs_SimpleControllerState; + break; + case SWITCH_ENHANCED_REPORT_HINT_ON: + if (input_mode == k_eSwitchInputReportIDs_SimpleControllerState) { input_mode = k_eSwitchInputReportIDs_FullControllerState; } + break; + case SWITCH_ENHANCED_REPORT_HINT_AUTO: + /* Joy-Con controllers switch their thumbsticks into D-pad mode in simple mode, + * so let's enable full controller state for them. + */ + if (ctx->device->vendor_id == USB_VENDOR_NINTENDO && + (ctx->device->product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_LEFT || + ctx->device->product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_RIGHT)) { + input_mode = k_eSwitchInputReportIDs_FullControllerState; + } + break; } return input_mode; } @@ -813,6 +830,103 @@ static Uint8 GetSensorInputMode(SDL_DriverSwitch_Context *ctx) return input_mode; } +static void UpdateInputMode(SDL_DriverSwitch_Context *ctx) +{ + Uint8 input_mode; + + if (ctx->m_bReportSensors) { + input_mode = GetSensorInputMode(ctx); + } else { + input_mode = GetDefaultInputMode(ctx); + } + SetInputMode(ctx, input_mode); +} + +static void SetEnhancedModeAvailable(SDL_DriverSwitch_Context *ctx) +{ + if (ctx->m_bEnhancedModeAvailable) { + return; + } + ctx->m_bEnhancedModeAvailable = true; + + if (ctx->m_bSensorsSupported) { + // Use the right sensor in the combined Joy-Con pair + if (!ctx->device->parent || + ctx->m_eControllerType == k_eSwitchDeviceInfoControllerType_JoyConRight) { + SDL_PrivateJoystickAddSensor(ctx->joystick, SDL_SENSOR_GYRO, 200.0f); + SDL_PrivateJoystickAddSensor(ctx->joystick, SDL_SENSOR_ACCEL, 200.0f); + } + if (ctx->device->parent && + ctx->m_eControllerType == k_eSwitchDeviceInfoControllerType_JoyConLeft) { + SDL_PrivateJoystickAddSensor(ctx->joystick, SDL_SENSOR_GYRO_L, 200.0f); + SDL_PrivateJoystickAddSensor(ctx->joystick, SDL_SENSOR_ACCEL_L, 200.0f); + } + if (ctx->device->parent && + ctx->m_eControllerType == k_eSwitchDeviceInfoControllerType_JoyConRight) { + SDL_PrivateJoystickAddSensor(ctx->joystick, SDL_SENSOR_GYRO_R, 200.0f); + SDL_PrivateJoystickAddSensor(ctx->joystick, SDL_SENSOR_ACCEL_R, 200.0f); + } + } +} + +static void SetEnhancedMode(SDL_DriverSwitch_Context *ctx, bool bEnabled) +{ + if (bEnabled) { + SetEnhancedModeAvailable(ctx); + } + + if (bEnabled != ctx->m_bEnhancedMode) { + ctx->m_bEnhancedMode = bEnabled; + + UpdateInputMode(ctx); + } +} + +static void SetEnhancedReportHint(SDL_DriverSwitch_Context *ctx, HIDAPI_Switch_EnhancedReportHint eEnhancedReportHint) +{ + switch (eEnhancedReportHint) { + case SWITCH_ENHANCED_REPORT_HINT_OFF: + SetEnhancedMode(ctx, false); + break; + case SWITCH_ENHANCED_REPORT_HINT_ON: + SetEnhancedMode(ctx, true); + break; + case SWITCH_ENHANCED_REPORT_HINT_AUTO: + SetEnhancedModeAvailable(ctx); + break; + } + ctx->m_eEnhancedReportHint = eEnhancedReportHint; + + UpdateInputMode(ctx); +} + +static void UpdateEnhancedModeOnEnhancedReport(SDL_DriverSwitch_Context *ctx) +{ + if (ctx->m_eEnhancedReportHint == SWITCH_ENHANCED_REPORT_HINT_AUTO) { + SetEnhancedReportHint(ctx, SWITCH_ENHANCED_REPORT_HINT_ON); + } +} + +static void UpdateEnhancedModeOnApplicationUsage(SDL_DriverSwitch_Context *ctx) +{ + if (ctx->m_eEnhancedReportHint == SWITCH_ENHANCED_REPORT_HINT_AUTO) { + SetEnhancedReportHint(ctx, SWITCH_ENHANCED_REPORT_HINT_ON); + } +} + +static void SDLCALL SDL_EnhancedReportsChanged(void *userdata, const char *name, const char *oldValue, const char *hint) +{ + SDL_DriverSwitch_Context *ctx = (SDL_DriverSwitch_Context *)userdata; + + if (hint && SDL_strcasecmp(hint, "auto") == 0) { + SetEnhancedReportHint(ctx, SWITCH_ENHANCED_REPORT_HINT_AUTO); + } else if (SDL_GetStringBoolean(hint, true)) { + SetEnhancedReportHint(ctx, SWITCH_ENHANCED_REPORT_HINT_ON); + } else { + SetEnhancedReportHint(ctx, SWITCH_ENHANCED_REPORT_HINT_OFF); + } +} + static bool SetIMUEnabled(SDL_DriverSwitch_Context *ctx, bool enabled) { Uint8 imu_data = enabled ? 1 : 0; @@ -1432,35 +1546,16 @@ static bool HIDAPI_DriverSwitch_OpenJoystick(SDL_HIDAPI_Device *device, SDL_Joys ctx->m_eControllerType != k_eSwitchDeviceInfoControllerType_N64 && ctx->m_eControllerType != k_eSwitchDeviceInfoControllerType_SEGA_Genesis) { if (LoadIMUCalibration(ctx)) { - // Use the right sensor in the combined Joy-Con pair - if (!device->parent || - ctx->m_eControllerType == k_eSwitchDeviceInfoControllerType_JoyConRight) { - SDL_PrivateJoystickAddSensor(joystick, SDL_SENSOR_GYRO, 200.0f); - SDL_PrivateJoystickAddSensor(joystick, SDL_SENSOR_ACCEL, 200.0f); - } - if (device->parent && - ctx->m_eControllerType == k_eSwitchDeviceInfoControllerType_JoyConLeft) { - SDL_PrivateJoystickAddSensor(joystick, SDL_SENSOR_GYRO_L, 200.0f); - SDL_PrivateJoystickAddSensor(joystick, SDL_SENSOR_ACCEL_L, 200.0f); - } - if (device->parent && - ctx->m_eControllerType == k_eSwitchDeviceInfoControllerType_JoyConRight) { - SDL_PrivateJoystickAddSensor(joystick, SDL_SENSOR_GYRO_R, 200.0f); - SDL_PrivateJoystickAddSensor(joystick, SDL_SENSOR_ACCEL_R, 200.0f); - } + ctx->m_bSensorsSupported = true; } } - if (!SetVibrationEnabled(ctx, 1)) { - SDL_SetError("Couldn't enable vibration"); - return false; - } + // Enable vibration + SetVibrationEnabled(ctx, 1); // Set desired input mode - if (!SetInputMode(ctx, GetDefaultInputMode(ctx))) { - SDL_SetError("Couldn't set input mode"); - return false; - } + SDL_AddHintCallback(SDL_HINT_JOYSTICK_ENHANCED_REPORTS, + SDL_EnhancedReportsChanged, ctx); // Start sending USB reports if (!device->is_bluetooth) { @@ -1694,20 +1789,20 @@ static bool HIDAPI_DriverSwitch_SendJoystickEffect(SDL_HIDAPI_Device *device, SD static bool HIDAPI_DriverSwitch_SetJoystickSensorsEnabled(SDL_HIDAPI_Device *device, SDL_Joystick *joystick, bool enabled) { SDL_DriverSwitch_Context *ctx = (SDL_DriverSwitch_Context *)device->context; - Uint8 input_mode; - if (enabled) { - input_mode = GetSensorInputMode(ctx); - } else { - input_mode = GetDefaultInputMode(ctx); + UpdateEnhancedModeOnApplicationUsage(ctx); + + if (!ctx->m_bSensorsSupported || (enabled && !ctx->m_bEnhancedMode)) { + return SDL_Unsupported(); } - SetInputMode(ctx, input_mode); - SetIMUEnabled(ctx, enabled); ctx->m_bReportSensors = enabled; ctx->m_unIMUSamples = 0; ctx->m_ulIMUSampleTimestampNS = SDL_GetTicksNS(); + UpdateInputMode(ctx); + SetIMUEnabled(ctx, enabled); + return true; } @@ -2433,7 +2528,7 @@ static void HandleFullControllerState(SDL_Joystick *joystick, SDL_DriverSwitch_C SDL_SendJoystickAxis(timestamp, joystick, SDL_GAMEPAD_AXIS_RIGHTY, ~axis); } - /* High nibble of battery/connection byte is battery level, low nibble is connection status + /* High nibble of battery/connection byte is battery level, low nibble is connection status (always 0 on 8BitDo Pro 2) * LSB of connection nibble is USB/Switch connection status * LSB of the battery nibble is used to report charging. * The battery level is reported from 0(empty)-8(full) @@ -2443,12 +2538,6 @@ static void HandleFullControllerState(SDL_Joystick *joystick, SDL_DriverSwitch_C int level = (packet->controllerState.ucBatteryAndConnection & 0xE0) >> 4; int percent = (int)SDL_roundf((level / 8.0f) * 100.0f); - if (packet->controllerState.ucBatteryAndConnection & 0x01) { - joystick->connection_state = SDL_JOYSTICK_CONNECTION_WIRED; - } else { - joystick->connection_state = SDL_JOYSTICK_CONNECTION_WIRELESS; - } - if (charging) { if (level == 8) { state = SDL_POWERSTATE_CHARGED; @@ -2591,6 +2680,9 @@ static bool HIDAPI_DriverSwitch_UpdateDevice(SDL_HIDAPI_Device *device) break; case k_eSwitchInputReportIDs_FullControllerState: case k_eSwitchInputReportIDs_FullControllerAndMcuState: + // This is the extended report, we can enable sensors now in auto mode + UpdateEnhancedModeOnEnhancedReport(ctx); + HandleFullControllerState(joystick, ctx, (SwitchStatePacket_t *)&ctx->m_rgucReadBuffer[1]); break; default: @@ -2658,6 +2750,9 @@ static void HIDAPI_DriverSwitch_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joy } } + SDL_RemoveHintCallback(SDL_HINT_JOYSTICK_ENHANCED_REPORTS, + SDL_EnhancedReportsChanged, ctx); + if (ctx->m_eControllerType == k_eSwitchDeviceInfoControllerType_JoyConLeft || ctx->m_eControllerType == k_eSwitchDeviceInfoControllerType_JoyConRight) { SDL_RemoveHintCallback(SDL_HINT_JOYSTICK_HIDAPI_JOYCON_HOME_LED, @@ -2671,6 +2766,10 @@ static void HIDAPI_DriverSwitch_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joy SDL_PlayerLEDHintChanged, ctx); ctx->joystick = NULL; + + ctx->m_bReportSensors = false; + ctx->m_bEnhancedMode = false; + ctx->m_bEnhancedModeAvailable = false; } static void HIDAPI_DriverSwitch_FreeDevice(SDL_HIDAPI_Device *device) diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_wii.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_wii.c index 06cfeea8..c442cc5e 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_wii.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_wii.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_xbox360.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_xbox360.c index 838ed145..49be08ab 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_xbox360.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_xbox360.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_xbox360w.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_xbox360w.c index 1d2a1ee9..a0d52627 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_xbox360w.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_xbox360w.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_xboxone.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_xboxone.c index 6f5c4753..5d4742f0 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapi_xboxone.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapi_xboxone.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapijoystick.c b/libs/SDL3/src/joystick/hidapi/SDL_hidapijoystick.c index 1b348f1e..c8ddd3d4 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapijoystick.c +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapijoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/hidapi/SDL_hidapijoystick_c.h b/libs/SDL3/src/joystick/hidapi/SDL_hidapijoystick_c.h index 1e085737..f8d77093 100644 --- a/libs/SDL3/src/joystick/hidapi/SDL_hidapijoystick_c.h +++ b/libs/SDL3/src/joystick/hidapi/SDL_hidapijoystick_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/linux/SDL_sysjoystick.c b/libs/SDL3/src/joystick/linux/SDL_sysjoystick.c index ed7cf8f2..8fbaca99 100644 --- a/libs/SDL3/src/joystick/linux/SDL_sysjoystick.c +++ b/libs/SDL3/src/joystick/linux/SDL_sysjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -1036,6 +1036,10 @@ static bool LINUX_JoystickInit(void) "udev init failed, disabling udev integration"); enumeration_method = ENUMERATION_FALLBACK; } + } else { + if (udev_initialized) { + SDL_UDEV_Quit(); + } } #endif diff --git a/libs/SDL3/src/joystick/linux/SDL_sysjoystick_c.h b/libs/SDL3/src/joystick/linux/SDL_sysjoystick_c.h index 517854d6..ae5384f1 100644 --- a/libs/SDL3/src/joystick/linux/SDL_sysjoystick_c.h +++ b/libs/SDL3/src/joystick/linux/SDL_sysjoystick_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/n3ds/SDL_sysjoystick.c b/libs/SDL3/src/joystick/n3ds/SDL_sysjoystick.c index 662e2468..8396ac5f 100644 --- a/libs/SDL3/src/joystick/n3ds/SDL_sysjoystick.c +++ b/libs/SDL3/src/joystick/n3ds/SDL_sysjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/ps2/SDL_sysjoystick.c b/libs/SDL3/src/joystick/ps2/SDL_sysjoystick.c index 25dc4ebf..b938b1f3 100644 --- a/libs/SDL3/src/joystick/ps2/SDL_sysjoystick.c +++ b/libs/SDL3/src/joystick/ps2/SDL_sysjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/psp/SDL_sysjoystick.c b/libs/SDL3/src/joystick/psp/SDL_sysjoystick.c index 5e0580af..8a0154c0 100644 --- a/libs/SDL3/src/joystick/psp/SDL_sysjoystick.c +++ b/libs/SDL3/src/joystick/psp/SDL_sysjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/usb_ids.h b/libs/SDL3/src/joystick/usb_ids.h index 9c202d97..c978c198 100644 --- a/libs/SDL3/src/joystick/usb_ids.h +++ b/libs/SDL3/src/joystick/usb_ids.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/virtual/SDL_virtualjoystick.c b/libs/SDL3/src/joystick/virtual/SDL_virtualjoystick.c index 2d1b410c..69256627 100644 --- a/libs/SDL3/src/joystick/virtual/SDL_virtualjoystick.c +++ b/libs/SDL3/src/joystick/virtual/SDL_virtualjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/virtual/SDL_virtualjoystick_c.h b/libs/SDL3/src/joystick/virtual/SDL_virtualjoystick_c.h index eee7f868..14fe59eb 100644 --- a/libs/SDL3/src/joystick/virtual/SDL_virtualjoystick_c.h +++ b/libs/SDL3/src/joystick/virtual/SDL_virtualjoystick_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/vita/SDL_sysjoystick.c b/libs/SDL3/src/joystick/vita/SDL_sysjoystick.c index c528ee0b..6a694113 100644 --- a/libs/SDL3/src/joystick/vita/SDL_sysjoystick.c +++ b/libs/SDL3/src/joystick/vita/SDL_sysjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/windows/SDL_dinputjoystick.c b/libs/SDL3/src/joystick/windows/SDL_dinputjoystick.c index 05a123f5..b00218d9 100644 --- a/libs/SDL3/src/joystick/windows/SDL_dinputjoystick.c +++ b/libs/SDL3/src/joystick/windows/SDL_dinputjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/windows/SDL_dinputjoystick_c.h b/libs/SDL3/src/joystick/windows/SDL_dinputjoystick_c.h index fea61301..0643ce10 100644 --- a/libs/SDL3/src/joystick/windows/SDL_dinputjoystick_c.h +++ b/libs/SDL3/src/joystick/windows/SDL_dinputjoystick_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/windows/SDL_rawinputjoystick.c b/libs/SDL3/src/joystick/windows/SDL_rawinputjoystick.c index a32dd7a5..5ef4a302 100644 --- a/libs/SDL3/src/joystick/windows/SDL_rawinputjoystick.c +++ b/libs/SDL3/src/joystick/windows/SDL_rawinputjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 2024 Sam Lantinga + Copyright (C) 2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/windows/SDL_rawinputjoystick_c.h b/libs/SDL3/src/joystick/windows/SDL_rawinputjoystick_c.h index 6d6fa023..b67544bd 100644 --- a/libs/SDL3/src/joystick/windows/SDL_rawinputjoystick_c.h +++ b/libs/SDL3/src/joystick/windows/SDL_rawinputjoystick_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/windows/SDL_windows_gaming_input.c b/libs/SDL3/src/joystick/windows/SDL_windows_gaming_input.c index 72bb2d74..dbc5658e 100644 --- a/libs/SDL3/src/joystick/windows/SDL_windows_gaming_input.c +++ b/libs/SDL3/src/joystick/windows/SDL_windows_gaming_input.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -107,7 +107,7 @@ DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics, 0xeb extern bool SDL_XINPUT_Enabled(void); -static bool SDL_IsXInputDevice(Uint16 vendor, Uint16 product) +static bool SDL_IsXInputDevice(Uint16 vendor, Uint16 product, const char *name) { #if defined(SDL_JOYSTICK_XINPUT) || defined(SDL_JOYSTICK_RAWINPUT) PRAWINPUTDEVICELIST raw_devices = NULL; @@ -123,6 +123,13 @@ static bool SDL_IsXInputDevice(Uint16 vendor, Uint16 product) return false; } + // Sometimes we'll get a Windows.Gaming.Input callback before the raw input device is even in the list, + // so try to do some checks up front to catch these cases. + if (SDL_IsJoystickXboxOne(vendor, product) || + (name && SDL_strncmp(name, "Xbox ", 5) == 0)) { + return true; + } + // Go through RAWINPUT (WinXP and later) to find HID devices. if ((GetRawInputDeviceList(NULL, &raw_device_count, sizeof(RAWINPUTDEVICELIST)) == -1) || (!raw_device_count)) { return false; // oh well. @@ -453,7 +460,7 @@ static HRESULT STDMETHODCALLTYPE IEventHandler_CRawGameControllerVtbl_InvokeAdde ignore_joystick = true; } - if (!ignore_joystick && SDL_IsXInputDevice(vendor, product)) { + if (!ignore_joystick && SDL_IsXInputDevice(vendor, product, name)) { // This hasn't been detected by the RAWINPUT driver yet, but it will be picked up later. ignore_joystick = true; } diff --git a/libs/SDL3/src/joystick/windows/SDL_windowsjoystick.c b/libs/SDL3/src/joystick/windows/SDL_windowsjoystick.c index 20ba28b0..e7fbfcb3 100644 --- a/libs/SDL3/src/joystick/windows/SDL_windowsjoystick.c +++ b/libs/SDL3/src/joystick/windows/SDL_windowsjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -284,7 +284,7 @@ static bool SDL_StartJoystickThread(void) } s_bJoystickThreadQuit = false; - s_joystickThread = SDL_CreateThreadWithStackSize(SDL_JoystickThread, "SDL_joystick", 64 * 1024, NULL); + s_joystickThread = SDL_CreateThread(SDL_JoystickThread, "SDL_joystick", NULL); if (!s_joystickThread) { return false; } @@ -344,7 +344,7 @@ static bool WINDOWS_JoystickInit(void) WIN_InitDeviceNotification(); #if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) - s_bJoystickThread = SDL_GetHintBoolean(SDL_HINT_JOYSTICK_THREAD, false); + s_bJoystickThread = SDL_GetHintBoolean(SDL_HINT_JOYSTICK_THREAD, true); if (s_bJoystickThread) { if (!SDL_StartJoystickThread()) { return false; diff --git a/libs/SDL3/src/joystick/windows/SDL_windowsjoystick_c.h b/libs/SDL3/src/joystick/windows/SDL_windowsjoystick_c.h index 61f5c623..16b91848 100644 --- a/libs/SDL3/src/joystick/windows/SDL_windowsjoystick_c.h +++ b/libs/SDL3/src/joystick/windows/SDL_windowsjoystick_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/windows/SDL_xinputjoystick.c b/libs/SDL3/src/joystick/windows/SDL_xinputjoystick.c index d1328ce5..9f6ce103 100644 --- a/libs/SDL3/src/joystick/windows/SDL_xinputjoystick.c +++ b/libs/SDL3/src/joystick/windows/SDL_xinputjoystick.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/joystick/windows/SDL_xinputjoystick_c.h b/libs/SDL3/src/joystick/windows/SDL_xinputjoystick_c.h index c43293b5..305b0909 100644 --- a/libs/SDL3/src/joystick/windows/SDL_xinputjoystick_c.h +++ b/libs/SDL3/src/joystick/windows/SDL_xinputjoystick_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/libm/math_libm.h b/libs/SDL3/src/libm/math_libm.h index bbe4ce87..b7b16140 100644 --- a/libs/SDL3/src/libm/math_libm.h +++ b/libs/SDL3/src/libm/math_libm.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/loadso/dlopen/SDL_sysloadso.c b/libs/SDL3/src/loadso/dlopen/SDL_sysloadso.c index 58bf3e0b..c84d1a1b 100644 --- a/libs/SDL3/src/loadso/dlopen/SDL_sysloadso.c +++ b/libs/SDL3/src/loadso/dlopen/SDL_sysloadso.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/loadso/dummy/SDL_sysloadso.c b/libs/SDL3/src/loadso/dummy/SDL_sysloadso.c index 9092f277..733386ba 100644 --- a/libs/SDL3/src/loadso/dummy/SDL_sysloadso.c +++ b/libs/SDL3/src/loadso/dummy/SDL_sysloadso.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/loadso/windows/SDL_sysloadso.c b/libs/SDL3/src/loadso/windows/SDL_sysloadso.c index 67fceb0d..89e41456 100644 --- a/libs/SDL3/src/loadso/windows/SDL_sysloadso.c +++ b/libs/SDL3/src/loadso/windows/SDL_sysloadso.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/locale/SDL_locale.c b/libs/SDL3/src/locale/SDL_locale.c index f13c4c5a..09e011b7 100644 --- a/libs/SDL3/src/locale/SDL_locale.c +++ b/libs/SDL3/src/locale/SDL_locale.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -73,7 +73,7 @@ static SDL_Locale **build_locales_from_csv_string(char *csv, int *count) loc->language = ptr++; while (true) { const char ch = *ptr; - if (ch == '_' || ch == '-') { + if (ch == '_') { *(ptr++) = '\0'; loc->country = ptr; } else if (SDL_isspace(ch)) { diff --git a/libs/SDL3/src/locale/SDL_syslocale.h b/libs/SDL3/src/locale/SDL_syslocale.h index 69374fd4..40b805d5 100644 --- a/libs/SDL3/src/locale/SDL_syslocale.h +++ b/libs/SDL3/src/locale/SDL_syslocale.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/locale/android/SDL_syslocale.c b/libs/SDL3/src/locale/android/SDL_syslocale.c index c78a5530..da13ee44 100644 --- a/libs/SDL3/src/locale/android/SDL_syslocale.c +++ b/libs/SDL3/src/locale/android/SDL_syslocale.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/locale/dummy/SDL_syslocale.c b/libs/SDL3/src/locale/dummy/SDL_syslocale.c index 37d676e1..f6cf9d7f 100644 --- a/libs/SDL3/src/locale/dummy/SDL_syslocale.c +++ b/libs/SDL3/src/locale/dummy/SDL_syslocale.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/locale/emscripten/SDL_syslocale.c b/libs/SDL3/src/locale/emscripten/SDL_syslocale.c index a926e654..6983628c 100644 --- a/libs/SDL3/src/locale/emscripten/SDL_syslocale.c +++ b/libs/SDL3/src/locale/emscripten/SDL_syslocale.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/locale/haiku/SDL_syslocale.cc b/libs/SDL3/src/locale/haiku/SDL_syslocale.cc index dae57cb2..045b751a 100644 --- a/libs/SDL3/src/locale/haiku/SDL_syslocale.cc +++ b/libs/SDL3/src/locale/haiku/SDL_syslocale.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/locale/macos/SDL_syslocale.m b/libs/SDL3/src/locale/macos/SDL_syslocale.m index 6832d4e0..6ea1761d 100644 --- a/libs/SDL3/src/locale/macos/SDL_syslocale.m +++ b/libs/SDL3/src/locale/macos/SDL_syslocale.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/locale/n3ds/SDL_syslocale.c b/libs/SDL3/src/locale/n3ds/SDL_syslocale.c index ba2a645e..5d0bbd32 100644 --- a/libs/SDL3/src/locale/n3ds/SDL_syslocale.c +++ b/libs/SDL3/src/locale/n3ds/SDL_syslocale.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/locale/psp/SDL_syslocale.c b/libs/SDL3/src/locale/psp/SDL_syslocale.c index 3b799894..4b5e1b93 100644 --- a/libs/SDL3/src/locale/psp/SDL_syslocale.c +++ b/libs/SDL3/src/locale/psp/SDL_syslocale.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/locale/unix/SDL_syslocale.c b/libs/SDL3/src/locale/unix/SDL_syslocale.c index e945da5c..98c68c39 100644 --- a/libs/SDL3/src/locale/unix/SDL_syslocale.c +++ b/libs/SDL3/src/locale/unix/SDL_syslocale.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/locale/vita/SDL_syslocale.c b/libs/SDL3/src/locale/vita/SDL_syslocale.c index f624f2f4..76a6f6a2 100644 --- a/libs/SDL3/src/locale/vita/SDL_syslocale.c +++ b/libs/SDL3/src/locale/vita/SDL_syslocale.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/locale/windows/SDL_syslocale.c b/libs/SDL3/src/locale/windows/SDL_syslocale.c index d1be3b9c..7f69c569 100644 --- a/libs/SDL3/src/locale/windows/SDL_syslocale.c +++ b/libs/SDL3/src/locale/windows/SDL_syslocale.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/main/SDL_main_callbacks.c b/libs/SDL3/src/main/SDL_main_callbacks.c index 0a6e6854..9f3d9c13 100644 --- a/libs/SDL3/src/main/SDL_main_callbacks.c +++ b/libs/SDL3/src/main/SDL_main_callbacks.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/main/SDL_main_callbacks.h b/libs/SDL3/src/main/SDL_main_callbacks.h index e8ba85eb..1fd3725c 100644 --- a/libs/SDL3/src/main/SDL_main_callbacks.h +++ b/libs/SDL3/src/main/SDL_main_callbacks.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/main/SDL_runapp.c b/libs/SDL3/src/main/SDL_runapp.c index c2321989..ddda4a63 100644 --- a/libs/SDL3/src/main/SDL_runapp.c +++ b/libs/SDL3/src/main/SDL_runapp.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/main/emscripten/SDL_sysmain_callbacks.c b/libs/SDL3/src/main/emscripten/SDL_sysmain_callbacks.c index bee253eb..d3b2f95f 100644 --- a/libs/SDL3/src/main/emscripten/SDL_sysmain_callbacks.c +++ b/libs/SDL3/src/main/emscripten/SDL_sysmain_callbacks.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/main/emscripten/SDL_sysmain_runapp.c b/libs/SDL3/src/main/emscripten/SDL_sysmain_runapp.c index db75e292..20dd6ebe 100644 --- a/libs/SDL3/src/main/emscripten/SDL_sysmain_runapp.c +++ b/libs/SDL3/src/main/emscripten/SDL_sysmain_runapp.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/main/gdk/SDL_sysmain_runapp.cpp b/libs/SDL3/src/main/gdk/SDL_sysmain_runapp.cpp index 78f521d6..d7bdea0a 100644 --- a/libs/SDL3/src/main/gdk/SDL_sysmain_runapp.cpp +++ b/libs/SDL3/src/main/gdk/SDL_sysmain_runapp.cpp @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/main/generic/SDL_sysmain_callbacks.c b/libs/SDL3/src/main/generic/SDL_sysmain_callbacks.c index fb311fbd..716489f1 100644 --- a/libs/SDL3/src/main/generic/SDL_sysmain_callbacks.c +++ b/libs/SDL3/src/main/generic/SDL_sysmain_callbacks.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -26,17 +26,31 @@ #ifndef SDL_PLATFORM_IOS static int callback_rate_increment = 0; +static bool iterate_after_waitevent = false; static void SDLCALL MainCallbackRateHintChanged(void *userdata, const char *name, const char *oldValue, const char *newValue) { - const int callback_rate = newValue ? SDL_atoi(newValue) : 60; - if (callback_rate > 0) { - callback_rate_increment = ((Uint64) 1000000000) / ((Uint64) callback_rate); - } else { + iterate_after_waitevent = newValue && (SDL_strcmp(newValue, "waitevent") == 0); + if (iterate_after_waitevent) { callback_rate_increment = 0; + } else { + const int callback_rate = newValue ? SDL_atoi(newValue) : 0; + if (callback_rate > 0) { + callback_rate_increment = ((Uint64) 1000000000) / ((Uint64) callback_rate); + } else { + callback_rate_increment = 0; + } } } +static SDL_AppResult GenericIterateMainCallbacks(void) +{ + if (iterate_after_waitevent) { + SDL_WaitEvent(NULL); + } + return SDL_IterateMainCallbacks(!iterate_after_waitevent); +} + int SDL_EnterAppMainCallbacks(int argc, char* argv[], SDL_AppInit_func appinit, SDL_AppIterate_func appiter, SDL_AppEvent_func appevent, SDL_AppQuit_func appquit) { SDL_AppResult rc = SDL_InitMainCallbacks(argc, argv, appinit, appiter, appevent, appquit); @@ -45,7 +59,7 @@ int SDL_EnterAppMainCallbacks(int argc, char* argv[], SDL_AppInit_func appinit, Uint64 next_iteration = callback_rate_increment ? (SDL_GetTicksNS() + callback_rate_increment) : 0; - while ((rc = SDL_IterateMainCallbacks(true)) == SDL_APP_CONTINUE) { + while ((rc = GenericIterateMainCallbacks()) == SDL_APP_CONTINUE) { // !!! FIXME: this can be made more complicated if we decide to // !!! FIXME: optionally hand off callback responsibility to the // !!! FIXME: video subsystem (for example, if Wayland has a @@ -53,21 +67,20 @@ int SDL_EnterAppMainCallbacks(int argc, char* argv[], SDL_AppInit_func appinit, // !!! FIXME: off to them here if/when the video subsystem becomes // !!! FIXME: initialized). - // !!! FIXME: maybe respect this hint even if there _is_ a window. - // if there's no window, try to run at about 60fps (or whatever rate - // the hint requested). This makes this not eat all the CPU in - // simple things like loopwave. If there's a window, we run as fast - // as possible, which means we'll clamp to vsync in common cases, - // and won't be restrained to vsync if the app is doing a benchmark - // or doesn't want to be, based on how they've set up that window. - if ((callback_rate_increment == 0) || SDL_HasWindows()) { + // Try to run at whatever rate the hint requested. This makes this + // not eat all the CPU in simple things like loopwave. By + // default, we run as fast as possible, which means we'll clamp to + // vsync in common cases, and won't be restrained to vsync if the + // app is doing a benchmark or doesn't want to be, based on how + // they've set up that window. + if (callback_rate_increment == 0) { next_iteration = 0; // just clear the timer and run at the pace the video subsystem allows. } else { const Uint64 now = SDL_GetTicksNS(); - if (next_iteration > now) { // Running faster than the limit, sleep a little. + if (next_iteration > now) { // Running faster than the limit, sleep a little. SDL_DelayPrecise(next_iteration - now); } else { - next_iteration = now; // running behind (or just lost the window)...reset the timer. + next_iteration = now; // if running behind, reset the timer. If right on time, `next_iteration` already equals `now`. } next_iteration += callback_rate_increment; } diff --git a/libs/SDL3/src/main/ios/SDL_sysmain_callbacks.m b/libs/SDL3/src/main/ios/SDL_sysmain_callbacks.m index 336f3a36..becbda27 100644 --- a/libs/SDL3/src/main/ios/SDL_sysmain_callbacks.m +++ b/libs/SDL3/src/main/ios/SDL_sysmain_callbacks.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/main/n3ds/SDL_sysmain_runapp.c b/libs/SDL3/src/main/n3ds/SDL_sysmain_runapp.c index 12c01437..74ead997 100644 --- a/libs/SDL3/src/main/n3ds/SDL_sysmain_runapp.c +++ b/libs/SDL3/src/main/n3ds/SDL_sysmain_runapp.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/main/ps2/SDL_sysmain_runapp.c b/libs/SDL3/src/main/ps2/SDL_sysmain_runapp.c index 4e6d6a5e..23443c5a 100644 --- a/libs/SDL3/src/main/ps2/SDL_sysmain_runapp.c +++ b/libs/SDL3/src/main/ps2/SDL_sysmain_runapp.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/main/psp/SDL_sysmain_runapp.c b/libs/SDL3/src/main/psp/SDL_sysmain_runapp.c index 9e5675d3..e89f5ffe 100644 --- a/libs/SDL3/src/main/psp/SDL_sysmain_runapp.c +++ b/libs/SDL3/src/main/psp/SDL_sysmain_runapp.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/main/windows/SDL_sysmain_runapp.c b/libs/SDL3/src/main/windows/SDL_sysmain_runapp.c index 3ca4183b..d8c3fac1 100644 --- a/libs/SDL3/src/main/windows/SDL_sysmain_runapp.c +++ b/libs/SDL3/src/main/windows/SDL_sysmain_runapp.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/misc/SDL_sysurl.h b/libs/SDL3/src/misc/SDL_sysurl.h index 1f539315..b5ee7007 100644 --- a/libs/SDL3/src/misc/SDL_sysurl.h +++ b/libs/SDL3/src/misc/SDL_sysurl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/misc/SDL_url.c b/libs/SDL3/src/misc/SDL_url.c index 0e1dd6c7..b3163ab1 100644 --- a/libs/SDL3/src/misc/SDL_url.c +++ b/libs/SDL3/src/misc/SDL_url.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/misc/android/SDL_sysurl.c b/libs/SDL3/src/misc/android/SDL_sysurl.c index c82cc53a..d79f1e01 100644 --- a/libs/SDL3/src/misc/android/SDL_sysurl.c +++ b/libs/SDL3/src/misc/android/SDL_sysurl.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/misc/dummy/SDL_sysurl.c b/libs/SDL3/src/misc/dummy/SDL_sysurl.c index 43527f58..64dcfa91 100644 --- a/libs/SDL3/src/misc/dummy/SDL_sysurl.c +++ b/libs/SDL3/src/misc/dummy/SDL_sysurl.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/misc/emscripten/SDL_sysurl.c b/libs/SDL3/src/misc/emscripten/SDL_sysurl.c index 990794ca..881de012 100644 --- a/libs/SDL3/src/misc/emscripten/SDL_sysurl.c +++ b/libs/SDL3/src/misc/emscripten/SDL_sysurl.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/misc/haiku/SDL_sysurl.cc b/libs/SDL3/src/misc/haiku/SDL_sysurl.cc index 4db022fd..1ce59559 100644 --- a/libs/SDL3/src/misc/haiku/SDL_sysurl.cc +++ b/libs/SDL3/src/misc/haiku/SDL_sysurl.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/misc/ios/SDL_sysurl.m b/libs/SDL3/src/misc/ios/SDL_sysurl.m index 9a504b21..1221edad 100644 --- a/libs/SDL3/src/misc/ios/SDL_sysurl.m +++ b/libs/SDL3/src/misc/ios/SDL_sysurl.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -29,14 +29,13 @@ bool SDL_SYS_OpenURL(const char *url) { @autoreleasepool { - -#ifdef SDL_PLATFORM_VISIONOS - return SDL_Unsupported(); // openURL is not supported on visionOS -#else NSString *nsstr = [NSString stringWithUTF8String:url]; NSURL *nsurl = [NSURL URLWithString:nsstr]; - return [[UIApplication sharedApplication] openURL:nsurl]; -#endif + if (![[UIApplication sharedApplication] canOpenURL:nsurl]) { + return SDL_SetError("No handler registered for this type of URL"); + } + [[UIApplication sharedApplication] openURL:nsurl options:@{} completionHandler:^(BOOL success) {}]; + return true; } } diff --git a/libs/SDL3/src/misc/macos/SDL_sysurl.m b/libs/SDL3/src/misc/macos/SDL_sysurl.m index 26c405bc..d41696a2 100644 --- a/libs/SDL3/src/misc/macos/SDL_sysurl.m +++ b/libs/SDL3/src/misc/macos/SDL_sysurl.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/misc/riscos/SDL_sysurl.c b/libs/SDL3/src/misc/riscos/SDL_sysurl.c index cefc046d..f5a92b27 100644 --- a/libs/SDL3/src/misc/riscos/SDL_sysurl.c +++ b/libs/SDL3/src/misc/riscos/SDL_sysurl.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/misc/unix/SDL_sysurl.c b/libs/SDL3/src/misc/unix/SDL_sysurl.c index 1efab166..e72894be 100644 --- a/libs/SDL3/src/misc/unix/SDL_sysurl.c +++ b/libs/SDL3/src/misc/unix/SDL_sysurl.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/misc/vita/SDL_sysurl.c b/libs/SDL3/src/misc/vita/SDL_sysurl.c index 1ea93c4b..fb901c3f 100644 --- a/libs/SDL3/src/misc/vita/SDL_sysurl.c +++ b/libs/SDL3/src/misc/vita/SDL_sysurl.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/misc/windows/SDL_sysurl.c b/libs/SDL3/src/misc/windows/SDL_sysurl.c index 2821be52..8e7bf0bf 100644 --- a/libs/SDL3/src/misc/windows/SDL_sysurl.c +++ b/libs/SDL3/src/misc/windows/SDL_sysurl.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/power/SDL_power.c b/libs/SDL3/src/power/SDL_power.c index b42e4f7f..5dde3b14 100644 --- a/libs/SDL3/src/power/SDL_power.c +++ b/libs/SDL3/src/power/SDL_power.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/power/SDL_syspower.h b/libs/SDL3/src/power/SDL_syspower.h index 3af0baca..5f8fa533 100644 --- a/libs/SDL3/src/power/SDL_syspower.h +++ b/libs/SDL3/src/power/SDL_syspower.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/power/android/SDL_syspower.c b/libs/SDL3/src/power/android/SDL_syspower.c index 80cfdc7a..7f8d3f93 100644 --- a/libs/SDL3/src/power/android/SDL_syspower.c +++ b/libs/SDL3/src/power/android/SDL_syspower.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/power/emscripten/SDL_syspower.c b/libs/SDL3/src/power/emscripten/SDL_syspower.c index 24965cc7..14928de4 100644 --- a/libs/SDL3/src/power/emscripten/SDL_syspower.c +++ b/libs/SDL3/src/power/emscripten/SDL_syspower.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/power/haiku/SDL_syspower.c b/libs/SDL3/src/power/haiku/SDL_syspower.c index cea4bb32..c334fa6e 100644 --- a/libs/SDL3/src/power/haiku/SDL_syspower.c +++ b/libs/SDL3/src/power/haiku/SDL_syspower.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/power/linux/SDL_syspower.c b/libs/SDL3/src/power/linux/SDL_syspower.c index a3cf1c91..428be4aa 100644 --- a/libs/SDL3/src/power/linux/SDL_syspower.c +++ b/libs/SDL3/src/power/linux/SDL_syspower.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/power/macos/SDL_syspower.c b/libs/SDL3/src/power/macos/SDL_syspower.c index c9a7f9ea..4764da9c 100644 --- a/libs/SDL3/src/power/macos/SDL_syspower.c +++ b/libs/SDL3/src/power/macos/SDL_syspower.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/power/n3ds/SDL_syspower.c b/libs/SDL3/src/power/n3ds/SDL_syspower.c index 94e57f64..822398a4 100644 --- a/libs/SDL3/src/power/n3ds/SDL_syspower.c +++ b/libs/SDL3/src/power/n3ds/SDL_syspower.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/power/psp/SDL_syspower.c b/libs/SDL3/src/power/psp/SDL_syspower.c index 2c3d265e..231411fd 100644 --- a/libs/SDL3/src/power/psp/SDL_syspower.c +++ b/libs/SDL3/src/power/psp/SDL_syspower.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/power/uikit/SDL_syspower.h b/libs/SDL3/src/power/uikit/SDL_syspower.h index 5bc75e0c..41fc43b1 100644 --- a/libs/SDL3/src/power/uikit/SDL_syspower.h +++ b/libs/SDL3/src/power/uikit/SDL_syspower.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/power/uikit/SDL_syspower.m b/libs/SDL3/src/power/uikit/SDL_syspower.m index e29f79a2..561f2de2 100644 --- a/libs/SDL3/src/power/uikit/SDL_syspower.m +++ b/libs/SDL3/src/power/uikit/SDL_syspower.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/power/vita/SDL_syspower.c b/libs/SDL3/src/power/vita/SDL_syspower.c index ab66f18e..5dc8f5e1 100644 --- a/libs/SDL3/src/power/vita/SDL_syspower.c +++ b/libs/SDL3/src/power/vita/SDL_syspower.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/power/windows/SDL_syspower.c b/libs/SDL3/src/power/windows/SDL_syspower.c index b05a6e2f..ab334f3b 100644 --- a/libs/SDL3/src/power/windows/SDL_syspower.c +++ b/libs/SDL3/src/power/windows/SDL_syspower.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/process/SDL_process.c b/libs/SDL3/src/process/SDL_process.c index 5994b30e..3ccf5d58 100644 --- a/libs/SDL3/src/process/SDL_process.c +++ b/libs/SDL3/src/process/SDL_process.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/process/SDL_sysprocess.h b/libs/SDL3/src/process/SDL_sysprocess.h index 4e417d13..839ef9db 100644 --- a/libs/SDL3/src/process/SDL_sysprocess.h +++ b/libs/SDL3/src/process/SDL_sysprocess.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/process/dummy/SDL_dummyprocess.c b/libs/SDL3/src/process/dummy/SDL_dummyprocess.c index 0cd04cc8..ba69e4a0 100644 --- a/libs/SDL3/src/process/dummy/SDL_dummyprocess.c +++ b/libs/SDL3/src/process/dummy/SDL_dummyprocess.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/process/posix/SDL_posixprocess.c b/libs/SDL3/src/process/posix/SDL_posixprocess.c index cfd40f10..98b9f75b 100644 --- a/libs/SDL3/src/process/posix/SDL_posixprocess.c +++ b/libs/SDL3/src/process/posix/SDL_posixprocess.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -34,7 +34,7 @@ #include #include "../SDL_sysprocess.h" -#include "../../file/SDL_iostream_c.h" +#include "../../io/SDL_iostream_c.h" #define READ_END 0 @@ -309,10 +309,16 @@ bool SDL_SYS_CreateProcessWithProperties(SDL_Process *process, SDL_PropertiesID // Spawn the new process if (process->background) { int status = -1; - pid_t pid = vfork(); + #ifdef SDL_PLATFORM_APPLE // Apple has vfork marked as deprecated and (as of macOS 10.12) is almost identical to calling fork() anyhow. + const pid_t pid = fork(); + const char *forkname = "fork"; + #else + const pid_t pid = vfork(); + const char *forkname = "vfork"; + #endif switch (pid) { case -1: - SDL_SetError("vfork() failed: %s", strerror(errno)); + SDL_SetError("%s() failed: %s", forkname, strerror(errno)); goto posix_spawn_fail_all; case 0: diff --git a/libs/SDL3/src/process/windows/SDL_windowsprocess.c b/libs/SDL3/src/process/windows/SDL_windowsprocess.c index dc200143..c1aee5c4 100644 --- a/libs/SDL3/src/process/windows/SDL_windowsprocess.c +++ b/libs/SDL3/src/process/windows/SDL_windowsprocess.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -24,7 +24,7 @@ #include "../../core/windows/SDL_windows.h" #include "../SDL_sysprocess.h" -#include "../../file/SDL_iostream_c.h" +#include "../../io/SDL_iostream_c.h" #define READ_END 0 #define WRITE_END 1 @@ -99,7 +99,7 @@ static bool join_arguments(const char * const *args, LPWSTR *args_out) { size_t len; int i; - int i_out; + size_t i_out; char *result; bool batch_file = is_batch_file_path(args[0]); diff --git a/libs/SDL3/src/render/SDL_d3dmath.c b/libs/SDL3/src/render/SDL_d3dmath.c index 7278e4b1..6a1ab59a 100644 --- a/libs/SDL3/src/render/SDL_d3dmath.c +++ b/libs/SDL3/src/render/SDL_d3dmath.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/SDL_d3dmath.h b/libs/SDL3/src/render/SDL_d3dmath.h index e50aeb1a..84cff9e8 100644 --- a/libs/SDL3/src/render/SDL_d3dmath.h +++ b/libs/SDL3/src/render/SDL_d3dmath.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/SDL_render.c b/libs/SDL3/src/render/SDL_render.c index 6e8c7ad3..45f3686a 100644 --- a/libs/SDL3/src/render/SDL_render.c +++ b/libs/SDL3/src/render/SDL_render.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -958,10 +958,8 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props) #ifndef SDL_RENDER_DISABLED SDL_Window *window = (SDL_Window *)SDL_GetPointerProperty(props, SDL_PROP_RENDERER_CREATE_WINDOW_POINTER, NULL); SDL_Surface *surface = (SDL_Surface *)SDL_GetPointerProperty(props, SDL_PROP_RENDERER_CREATE_SURFACE_POINTER, NULL); - const char *name = SDL_GetStringProperty(props, SDL_PROP_RENDERER_CREATE_NAME_STRING, NULL); - const int n = SDL_GetNumRenderDrivers(); + const char *driver_name = SDL_GetStringProperty(props, SDL_PROP_RENDERER_CREATE_NAME_STRING, NULL); const char *hint; - int i, attempted = 0; SDL_PropertiesID new_props; #ifdef SDL_PLATFORM_ANDROID @@ -1008,28 +1006,34 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props) } } else { bool rc = false; - if (!name) { - name = SDL_GetHint(SDL_HINT_RENDER_DRIVER); + if (!driver_name) { + driver_name = SDL_GetHint(SDL_HINT_RENDER_DRIVER); } - if (name) { - for (i = 0; i < n; i++) { - const SDL_RenderDriver *driver = render_drivers[i]; - if (SDL_strcasecmp(name, driver->name) == 0) { - // Create a new renderer instance - ++attempted; - rc = driver->CreateRenderer(renderer, window, props); - break; + if (driver_name && *driver_name != 0) { + const char *driver_attempt = driver_name; + while (driver_attempt && *driver_attempt != 0 && !rc) { + const char *driver_attempt_end = SDL_strchr(driver_attempt, ','); + const size_t driver_attempt_len = (driver_attempt_end) ? (driver_attempt_end - driver_attempt) : SDL_strlen(driver_attempt); + + for (int i = 0; render_drivers[i]; i++) { + const SDL_RenderDriver *driver = render_drivers[i]; + if ((driver_attempt_len == SDL_strlen(driver->name)) && (SDL_strncasecmp(driver->name, driver_attempt, driver_attempt_len) == 0)) { + rc = driver->CreateRenderer(renderer, window, props); + if (rc) { + break; + } + } } + + driver_attempt = (driver_attempt_end) ? (driver_attempt_end + 1) : NULL; } } else { - for (i = 0; i < n; i++) { + for (int i = 0; render_drivers[i]; i++) { const SDL_RenderDriver *driver = render_drivers[i]; - // Create a new renderer instance - ++attempted; rc = driver->CreateRenderer(renderer, window, props); if (rc) { - break; // Yay, we got one! + break; } SDL_DestroyRendererWithoutFreeing(renderer); SDL_zerop(renderer); // make sure we don't leave function pointers from a previous CreateRenderer() in this struct. @@ -1037,7 +1041,9 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props) } if (!rc) { - if (!name || !attempted) { + if (driver_name) { + SDL_SetError("%s not available", driver_name); + } else { SDL_SetError("Couldn't find matching render driver"); } goto error; @@ -1634,7 +1640,7 @@ SDL_Texture *SDL_CreateTextureFromSurface(SDL_Renderer *renderer, SDL_Surface *s } } - texture_colorspace = SDL_GetSurfaceColorspace(surface); + surface_colorspace = SDL_GetSurfaceColorspace(surface); // Try to have the best pixel format for the texture // No alpha, but a colorkey => promote to alpha @@ -2571,7 +2577,12 @@ static void UpdateLogicalPresentation(SDL_Renderer *renderer) renderer->logical_src_rect.w = logical_w; renderer->logical_src_rect.h = logical_h; - if (renderer->logical_presentation_mode == SDL_LOGICAL_PRESENTATION_INTEGER_SCALE) { + if ((logical_w <= 0.0f) || (logical_h <= 0.0f)) { + renderer->logical_dst_rect.x = 0.0f; + renderer->logical_dst_rect.y = 0.0f; + renderer->logical_dst_rect.w = output_w; + renderer->logical_dst_rect.h = output_h; + } else if (renderer->logical_presentation_mode == SDL_LOGICAL_PRESENTATION_INTEGER_SCALE) { float scale; if (want_aspect > real_aspect) { scale = (float)((int)output_w / (int)logical_w); // This an integer division! @@ -2635,8 +2646,8 @@ static void UpdateLogicalPresentation(SDL_Renderer *renderer) } } - renderer->main_view.logical_scale.x = (logical_w != 0.0f) ? renderer->logical_dst_rect.w / logical_w : 0.0f; - renderer->main_view.logical_scale.y = (logical_h != 0.0f) ? renderer->logical_dst_rect.h / logical_h : 0.0f; + renderer->main_view.logical_scale.x = (logical_w > 0.0f) ? renderer->logical_dst_rect.w / logical_w : 0.0f; + renderer->main_view.logical_scale.y = (logical_h > 0.0f) ? renderer->logical_dst_rect.h / logical_h : 0.0f; renderer->main_view.current_scale.x = renderer->main_view.scale.x * renderer->main_view.logical_scale.x; renderer->main_view.current_scale.y = renderer->main_view.scale.y * renderer->main_view.logical_scale.y; renderer->main_view.logical_offset.x = renderer->logical_dst_rect.x; @@ -2897,6 +2908,7 @@ bool SDL_ConvertEventToRenderCoordinates(SDL_Renderer *renderer, SDL_Event *even } } else if (event->type == SDL_EVENT_FINGER_DOWN || event->type == SDL_EVENT_FINGER_UP || + event->type == SDL_EVENT_FINGER_CANCELED || event->type == SDL_EVENT_FINGER_MOTION) { // FIXME: Are these events guaranteed to be window relative? if (renderer->window) { @@ -2999,20 +3011,20 @@ bool SDL_RenderViewportSet(SDL_Renderer *renderer) static void GetRenderViewportSize(SDL_Renderer *renderer, SDL_FRect *rect) { const SDL_RenderViewState *view = renderer->view; - const float scale_x = view->logical_scale.x; - const float scale_y = view->logical_scale.y; + const float scale_x = view->current_scale.x; + const float scale_y = view->current_scale.y; rect->x = 0.0f; rect->y = 0.0f; if (view->viewport.w >= 0) { - rect->w = (float)view->viewport.w / scale_x; + rect->w = (float)view->viewport.w; } else { rect->w = view->pixel_w / scale_x; } if (view->viewport.h >= 0) { - rect->h = (float)view->viewport.h / scale_y; + rect->h = (float)view->viewport.h; } else { rect->h = view->pixel_h / scale_y; } @@ -3868,9 +3880,6 @@ static bool SDL_RenderTextureInternal(SDL_Renderer *renderer, SDL_Texture *textu bool SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, const SDL_FRect *dstrect) { - SDL_FRect real_srcrect; - SDL_FRect real_dstrect; - CHECK_RENDERER_MAGIC(renderer, false); CHECK_TEXTURE_MAGIC(texture, false); @@ -3885,6 +3894,7 @@ bool SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_F } #endif + SDL_FRect real_srcrect; real_srcrect.x = 0.0f; real_srcrect.y = 0.0f; real_srcrect.w = (float)texture->w; @@ -3895,12 +3905,10 @@ bool SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_F } } - GetRenderViewportSize(renderer, &real_dstrect); - if (dstrect) { - if (!SDL_HasRectIntersectionFloat(dstrect, &real_dstrect)) { - return true; - } - real_dstrect = *dstrect; + SDL_FRect full_dstrect; + if (!dstrect) { + GetRenderViewportSize(renderer, &full_dstrect); + dstrect = &full_dstrect; } if (texture->native) { @@ -3909,7 +3917,7 @@ bool SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_F texture->last_command_generation = renderer->render_command_generation; - return SDL_RenderTextureInternal(renderer, texture, &real_srcrect, &real_dstrect); + return SDL_RenderTextureInternal(renderer, texture, &real_srcrect, dstrect); } bool SDL_RenderTextureAffine(SDL_Renderer *renderer, SDL_Texture *texture, @@ -4034,7 +4042,6 @@ bool SDL_RenderTextureRotated(SDL_Renderer *renderer, SDL_Texture *texture, const double angle, const SDL_FPoint *center, const SDL_FlipMode flip) { SDL_FRect real_srcrect; - SDL_FRect real_dstrect; SDL_FPoint real_center; bool result; @@ -4070,10 +4077,10 @@ bool SDL_RenderTextureRotated(SDL_Renderer *renderer, SDL_Texture *texture, } // We don't intersect the dstrect with the viewport as RenderCopy does because of potential rotation clipping issues... TODO: should we? - if (dstrect) { - real_dstrect = *dstrect; - } else { - GetRenderViewportSize(renderer, &real_dstrect); + SDL_FRect full_dstrect; + if (!dstrect) { + GetRenderViewportSize(renderer, &full_dstrect); + dstrect = &full_dstrect; } if (texture->native) { @@ -4083,8 +4090,8 @@ bool SDL_RenderTextureRotated(SDL_Renderer *renderer, SDL_Texture *texture, if (center) { real_center = *center; } else { - real_center.x = real_dstrect.w / 2.0f; - real_center.y = real_dstrect.h / 2.0f; + real_center.x = dstrect->w / 2.0f; + real_center.y = dstrect->h / 2.0f; } texture->last_command_generation = renderer->render_command_generation; @@ -4118,23 +4125,23 @@ bool SDL_RenderTextureRotated(SDL_Renderer *renderer, SDL_Texture *texture, maxu = (real_srcrect.x + real_srcrect.w) / texture->w; maxv = (real_srcrect.y + real_srcrect.h) / texture->h; - centerx = real_center.x + real_dstrect.x; - centery = real_center.y + real_dstrect.y; + centerx = real_center.x + dstrect->x; + centery = real_center.y + dstrect->y; if (flip & SDL_FLIP_HORIZONTAL) { - minx = real_dstrect.x + real_dstrect.w; - maxx = real_dstrect.x; + minx = dstrect->x + dstrect->w; + maxx = dstrect->x; } else { - minx = real_dstrect.x; - maxx = real_dstrect.x + real_dstrect.w; + minx = dstrect->x; + maxx = dstrect->x + dstrect->w; } if (flip & SDL_FLIP_VERTICAL) { - miny = real_dstrect.y + real_dstrect.h; - maxy = real_dstrect.y; + miny = dstrect->y + dstrect->h; + maxy = dstrect->y; } else { - miny = real_dstrect.y; - maxy = real_dstrect.y + real_dstrect.h; + miny = dstrect->y; + maxy = dstrect->y + dstrect->h; } uv[0] = minu; @@ -4175,7 +4182,7 @@ bool SDL_RenderTextureRotated(SDL_Renderer *renderer, SDL_Texture *texture, num_vertices, indices, num_indices, size_indices, scale_x, scale_y, SDL_TEXTURE_ADDRESS_CLAMP); } else { - result = QueueCmdCopyEx(renderer, texture, &real_srcrect, &real_dstrect, angle, &real_center, flip, scale_x, scale_y); + result = QueueCmdCopyEx(renderer, texture, &real_srcrect, dstrect, angle, &real_center, flip, scale_x, scale_y); } return result; } @@ -4289,7 +4296,6 @@ static bool SDL_RenderTextureTiled_Iterate(SDL_Renderer *renderer, SDL_Texture * bool SDL_RenderTextureTiled(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, float scale, const SDL_FRect *dstrect) { SDL_FRect real_srcrect; - SDL_FRect real_dstrect; CHECK_RENDERER_MAGIC(renderer, false); CHECK_TEXTURE_MAGIC(texture, false); @@ -4319,12 +4325,10 @@ bool SDL_RenderTextureTiled(SDL_Renderer *renderer, SDL_Texture *texture, const } } - GetRenderViewportSize(renderer, &real_dstrect); - if (dstrect) { - if (!SDL_HasRectIntersectionFloat(dstrect, &real_dstrect)) { - return true; - } - real_dstrect = *dstrect; + SDL_FRect full_dstrect; + if (!dstrect) { + GetRenderViewportSize(renderer, &full_dstrect); + dstrect = &full_dstrect; } if (texture->native) { @@ -4338,9 +4342,9 @@ bool SDL_RenderTextureTiled(SDL_Renderer *renderer, SDL_Texture *texture, const (!srcrect || (real_srcrect.x == 0.0f && real_srcrect.y == 0.0f && real_srcrect.w == (float)texture->w && real_srcrect.h == (float)texture->h))) { - return SDL_RenderTextureTiled_Wrap(renderer, texture, &real_srcrect, scale, &real_dstrect); + return SDL_RenderTextureTiled_Wrap(renderer, texture, &real_srcrect, scale, dstrect); } else { - return SDL_RenderTextureTiled_Iterate(renderer, texture, &real_srcrect, scale, &real_dstrect); + return SDL_RenderTextureTiled_Iterate(renderer, texture, &real_srcrect, scale, dstrect); } } @@ -5008,8 +5012,21 @@ SDL_Surface *SDL_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect) SDL_PropertiesID props = SDL_GetSurfaceProperties(surface); if (renderer->target) { - SDL_SetFloatProperty(props, SDL_PROP_SURFACE_SDR_WHITE_POINT_FLOAT, renderer->target->SDR_white_point); - SDL_SetFloatProperty(props, SDL_PROP_SURFACE_HDR_HEADROOM_FLOAT, renderer->target->HDR_headroom); + SDL_Texture *target = renderer->target; + SDL_Texture *parent = SDL_GetPointerProperty(SDL_GetTextureProperties(target), SDL_PROP_TEXTURE_PARENT_POINTER, NULL); + SDL_PixelFormat expected_format = (parent ? parent->format : target->format); + + SDL_SetFloatProperty(props, SDL_PROP_SURFACE_SDR_WHITE_POINT_FLOAT, target->SDR_white_point); + SDL_SetFloatProperty(props, SDL_PROP_SURFACE_HDR_HEADROOM_FLOAT, target->HDR_headroom); + + // Set the expected surface format + if ((surface->format == SDL_PIXELFORMAT_ARGB8888 && expected_format == SDL_PIXELFORMAT_XRGB8888) || + (surface->format == SDL_PIXELFORMAT_RGBA8888 && expected_format == SDL_PIXELFORMAT_RGBX8888) || + (surface->format == SDL_PIXELFORMAT_ABGR8888 && expected_format == SDL_PIXELFORMAT_XBGR8888) || + (surface->format == SDL_PIXELFORMAT_BGRA8888 && expected_format == SDL_PIXELFORMAT_BGRX8888)) { + surface->format = expected_format; + surface->fmt = SDL_GetPixelFormatDetails(expected_format); + } } else { SDL_SetFloatProperty(props, SDL_PROP_SURFACE_SDR_WHITE_POINT_FLOAT, renderer->SDR_white_point); SDL_SetFloatProperty(props, SDL_PROP_SURFACE_HDR_HEADROOM_FLOAT, renderer->HDR_headroom); diff --git a/libs/SDL3/src/render/SDL_render_debug_font.h b/libs/SDL3/src/render/SDL_render_debug_font.h index 7da05738..ca296e8c 100644 --- a/libs/SDL3/src/render/SDL_render_debug_font.h +++ b/libs/SDL3/src/render/SDL_render_debug_font.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/SDL_render_unsupported.c b/libs/SDL3/src/render/SDL_render_unsupported.c index 214b5fff..5369fb44 100644 --- a/libs/SDL3/src/render/SDL_render_unsupported.c +++ b/libs/SDL3/src/render/SDL_render_unsupported.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/SDL_sysrender.h b/libs/SDL3/src/render/SDL_sysrender.h index d3421cb4..9c39bb1d 100644 --- a/libs/SDL3/src/render/SDL_sysrender.h +++ b/libs/SDL3/src/render/SDL_sysrender.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/SDL_yuv_sw.c b/libs/SDL3/src/render/SDL_yuv_sw.c index 251330e0..64250de3 100644 --- a/libs/SDL3/src/render/SDL_yuv_sw.c +++ b/libs/SDL3/src/render/SDL_yuv_sw.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/SDL_yuv_sw_c.h b/libs/SDL3/src/render/SDL_yuv_sw_c.h index 76f2e570..807c44c5 100644 --- a/libs/SDL3/src/render/SDL_yuv_sw_c.h +++ b/libs/SDL3/src/render/SDL_yuv_sw_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/direct3d/SDL_render_d3d.c b/libs/SDL3/src/render/direct3d/SDL_render_d3d.c index 2f2f9c43..ccb5b3c3 100644 --- a/libs/SDL3/src/render/direct3d/SDL_render_d3d.c +++ b/libs/SDL3/src/render/direct3d/SDL_render_d3d.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/direct3d/SDL_shaders_d3d.c b/libs/SDL3/src/render/direct3d/SDL_shaders_d3d.c index 975b68d6..9b1b4b51 100644 --- a/libs/SDL3/src/render/direct3d/SDL_shaders_d3d.c +++ b/libs/SDL3/src/render/direct3d/SDL_shaders_d3d.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/direct3d/SDL_shaders_d3d.h b/libs/SDL3/src/render/direct3d/SDL_shaders_d3d.h index b075730d..90ef7a9b 100644 --- a/libs/SDL3/src/render/direct3d/SDL_shaders_d3d.h +++ b/libs/SDL3/src/render/direct3d/SDL_shaders_d3d.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/direct3d11/SDL_render_d3d11.c b/libs/SDL3/src/render/direct3d11/SDL_render_d3d11.c index 604d7829..f84a5f05 100644 --- a/libs/SDL3/src/render/direct3d11/SDL_render_d3d11.c +++ b/libs/SDL3/src/render/direct3d11/SDL_render_d3d11.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/direct3d11/SDL_shaders_d3d11.c b/libs/SDL3/src/render/direct3d11/SDL_shaders_d3d11.c index 59de2c28..18965e2d 100644 --- a/libs/SDL3/src/render/direct3d11/SDL_shaders_d3d11.c +++ b/libs/SDL3/src/render/direct3d11/SDL_shaders_d3d11.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/direct3d11/SDL_shaders_d3d11.h b/libs/SDL3/src/render/direct3d11/SDL_shaders_d3d11.h index b54581b5..2279fb0c 100644 --- a/libs/SDL3/src/render/direct3d11/SDL_shaders_d3d11.h +++ b/libs/SDL3/src/render/direct3d11/SDL_shaders_d3d11.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/direct3d12/SDL_render_d3d12.c b/libs/SDL3/src/render/direct3d12/SDL_render_d3d12.c index 63017077..3233e194 100644 --- a/libs/SDL3/src/render/direct3d12/SDL_render_d3d12.c +++ b/libs/SDL3/src/render/direct3d12/SDL_render_d3d12.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/direct3d12/SDL_render_d3d12_xbox.cpp b/libs/SDL3/src/render/direct3d12/SDL_render_d3d12_xbox.cpp index f06aa4c1..2ea3cf14 100644 --- a/libs/SDL3/src/render/direct3d12/SDL_render_d3d12_xbox.cpp +++ b/libs/SDL3/src/render/direct3d12/SDL_render_d3d12_xbox.cpp @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/direct3d12/SDL_render_d3d12_xbox.h b/libs/SDL3/src/render/direct3d12/SDL_render_d3d12_xbox.h index e2959c04..947148e5 100644 --- a/libs/SDL3/src/render/direct3d12/SDL_render_d3d12_xbox.h +++ b/libs/SDL3/src/render/direct3d12/SDL_render_d3d12_xbox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12.c b/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12.c index 697599a3..8d06db0e 100644 --- a/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12.c +++ b/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12.h b/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12.h index 9f82a4a4..0250b970 100644 --- a/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12.h +++ b/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12_xboxone.cpp b/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12_xboxone.cpp index 0cda0081..bc6146b2 100644 --- a/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12_xboxone.cpp +++ b/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12_xboxone.cpp @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12_xboxseries.cpp b/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12_xboxseries.cpp index 3b897604..6c1c0378 100644 --- a/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12_xboxseries.cpp +++ b/libs/SDL3/src/render/direct3d12/SDL_shaders_d3d12_xboxseries.cpp @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/gpu/SDL_gpu_util.h b/libs/SDL3/src/render/gpu/SDL_gpu_util.h index acff4817..ca32ce08 100644 --- a/libs/SDL3/src/render/gpu/SDL_gpu_util.h +++ b/libs/SDL3/src/render/gpu/SDL_gpu_util.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/gpu/SDL_pipeline_gpu.c b/libs/SDL3/src/render/gpu/SDL_pipeline_gpu.c index 9795d171..0f7fabfe 100644 --- a/libs/SDL3/src/render/gpu/SDL_pipeline_gpu.c +++ b/libs/SDL3/src/render/gpu/SDL_pipeline_gpu.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/gpu/SDL_pipeline_gpu.h b/libs/SDL3/src/render/gpu/SDL_pipeline_gpu.h index 1e7b32e2..c3fc39bc 100644 --- a/libs/SDL3/src/render/gpu/SDL_pipeline_gpu.h +++ b/libs/SDL3/src/render/gpu/SDL_pipeline_gpu.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/gpu/SDL_render_gpu.c b/libs/SDL3/src/render/gpu/SDL_render_gpu.c index 89d24735..57ec05e8 100644 --- a/libs/SDL3/src/render/gpu/SDL_render_gpu.c +++ b/libs/SDL3/src/render/gpu/SDL_render_gpu.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -41,7 +41,6 @@ typedef struct GPU_RenderData SDL_GPUDevice *device; GPU_Shaders shaders; GPU_PipelineCache pipeline_cache; - SDL_GPUFence *present_fence; struct { @@ -78,7 +77,7 @@ typedef struct GPU_RenderData GPU_ShaderUniformData shader_data; } state; - SDL_GPUSampler *samplers[3][2]; + SDL_GPUSampler *samplers[2][2]; } GPU_RenderData; typedef struct GPU_TextureData @@ -959,51 +958,35 @@ static bool GPU_RenderPresent(SDL_Renderer *renderer) SDL_GPUTexture *swapchain; Uint32 swapchain_texture_width, swapchain_texture_height; - bool result = SDL_AcquireGPUSwapchainTexture(data->state.command_buffer, renderer->window, &swapchain, &swapchain_texture_width, &swapchain_texture_height); + bool result = SDL_WaitAndAcquireGPUSwapchainTexture(data->state.command_buffer, renderer->window, &swapchain, &swapchain_texture_width, &swapchain_texture_height); if (!result) { SDL_LogError(SDL_LOG_CATEGORY_RENDER, "Failed to acquire swapchain texture: %s", SDL_GetError()); } - if (swapchain == NULL) { - goto submit; - } + if (swapchain != NULL) { + SDL_GPUBlitInfo blit_info; + SDL_zero(blit_info); - SDL_GPUBlitInfo blit_info; - SDL_zero(blit_info); + blit_info.source.texture = data->backbuffer.texture; + blit_info.source.w = data->backbuffer.width; + blit_info.source.h = data->backbuffer.height; + blit_info.destination.texture = swapchain; + blit_info.destination.w = swapchain_texture_width; + blit_info.destination.h = swapchain_texture_height; + blit_info.load_op = SDL_GPU_LOADOP_DONT_CARE; + blit_info.filter = SDL_GPU_FILTER_LINEAR; - blit_info.source.texture = data->backbuffer.texture; - blit_info.source.w = data->backbuffer.width; - blit_info.source.h = data->backbuffer.height; - blit_info.destination.texture = swapchain; - blit_info.destination.w = swapchain_texture_width; - blit_info.destination.h = swapchain_texture_height; - blit_info.load_op = SDL_GPU_LOADOP_DONT_CARE; - blit_info.filter = SDL_GPU_FILTER_LINEAR; + SDL_BlitGPUTexture(data->state.command_buffer, &blit_info); - SDL_BlitGPUTexture(data->state.command_buffer, &blit_info); + SDL_SubmitGPUCommandBuffer(data->state.command_buffer); -// *** FIXME *** -// This is going to block if there is ever a frame in flight. -// We should do something similar to FNA3D -// where we keep track of MAX_FRAMES_IN_FLIGHT number of fences -// and only block if we have maxed out the backpressure. -// -cosmonaut -submit: -#if 1 - if (data->present_fence) { - SDL_WaitForGPUFences(data->device, true, &data->present_fence, 1); - SDL_ReleaseGPUFence(data->device, data->present_fence); - } - - data->present_fence = SDL_SubmitGPUCommandBufferAndAcquireFence(data->state.command_buffer); -#else - SDL_SubmitGPUCommandBuffer(data->state.command_buffer); -#endif - - if (swapchain != NULL && (swapchain_texture_width != data->backbuffer.width || swapchain_texture_height != data->backbuffer.height)) { - SDL_ReleaseGPUTexture(data->device, data->backbuffer.texture); - CreateBackbuffer(data, swapchain_texture_width, swapchain_texture_height, SDL_GetGPUSwapchainTextureFormat(data->device, renderer->window)); + if (swapchain_texture_width != data->backbuffer.width || swapchain_texture_height != data->backbuffer.height) { + SDL_ReleaseGPUTexture(data->device, data->backbuffer.texture); + CreateBackbuffer(data, swapchain_texture_width, swapchain_texture_height, SDL_GetGPUSwapchainTextureFormat(data->device, renderer->window)); + } + } else { + SDL_SubmitGPUCommandBuffer(data->state.command_buffer); } data->state.command_buffer = SDL_AcquireGPUCommandBuffer(data->device); @@ -1038,11 +1021,6 @@ static void GPU_DestroyRenderer(SDL_Renderer *renderer) return; } - if (data->present_fence) { - SDL_WaitForGPUFences(data->device, true, &data->present_fence, 1); - SDL_ReleaseGPUFence(data->device, data->present_fence); - } - if (data->state.command_buffer) { SDL_SubmitGPUCommandBuffer(data->state.command_buffer); data->state.command_buffer = NULL; @@ -1262,6 +1240,8 @@ static bool GPU_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P SDL_SetGPUSwapchainParameters(data->device, window, data->swapchain.composition, data->swapchain.present_mode); + SDL_SetGPUAllowedFramesInFlight(data->device, 1); + SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA32); SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRA32); SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBX32); diff --git a/libs/SDL3/src/render/gpu/SDL_shaders_gpu.c b/libs/SDL3/src/render/gpu/SDL_shaders_gpu.c index 80e336b5..a56fb0ca 100644 --- a/libs/SDL3/src/render/gpu/SDL_shaders_gpu.c +++ b/libs/SDL3/src/render/gpu/SDL_shaders_gpu.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/gpu/SDL_shaders_gpu.h b/libs/SDL3/src/render/gpu/SDL_shaders_gpu.h index 3d47a1d6..16b5a11d 100644 --- a/libs/SDL3/src/render/gpu/SDL_shaders_gpu.h +++ b/libs/SDL3/src/render/gpu/SDL_shaders_gpu.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/metal/SDL_render_metal.m b/libs/SDL3/src/render/metal/SDL_render_metal.m index 55c17826..0aac565d 100644 --- a/libs/SDL3/src/render/metal/SDL_render_metal.m +++ b/libs/SDL3/src/render/metal/SDL_render_metal.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -25,7 +25,6 @@ #include "../SDL_sysrender.h" #include "../../video/SDL_pixels_c.h" -#include #import #import #import @@ -101,7 +100,7 @@ typedef enum SDL_MetalFragmentFunction SDL_METAL_FRAGMENT_SOLID = 0, SDL_METAL_FRAGMENT_COPY, SDL_METAL_FRAGMENT_YUV, - SDL_METAL_FRAGMENT_ADVANCED, + SDL_METAL_FRAGMENT_NV12, SDL_METAL_FRAGMENT_COUNT, } SDL_MetalFragmentFunction; @@ -171,18 +170,6 @@ typedef struct METAL_ShaderPipelines @implementation SDL3METAL_TextureData @end -static bool IsMetalAvailable() -{ -#if (defined(SDL_PLATFORM_MACOS) && (MAC_OS_X_VERSION_MIN_REQUIRED < 101100)) - // this checks a weak symbol. - if (MTLCreateSystemDefaultDevice == NULL) { // probably on 10.10 or lower. - SDL_SetError("Metal framework not available on this system"); - return false; - } -#endif - return true; -} - static const MTLBlendOperation invalidBlendOperation = (MTLBlendOperation)0xFFFFFFFF; static const MTLBlendFactor invalidBlendFactor = (MTLBlendFactor)0xFFFFFFFF; @@ -253,8 +240,8 @@ static NSString *GetFragmentFunctionName(SDL_MetalFragmentFunction function) return @"SDL_Copy_fragment"; case SDL_METAL_FRAGMENT_YUV: return @"SDL_YUV_fragment"; - case SDL_METAL_FRAGMENT_ADVANCED: - return @"SDL_Advanced_fragment"; + case SDL_METAL_FRAGMENT_NV12: + return @"SDL_NV12_fragment"; default: return nil; } @@ -392,7 +379,7 @@ void MakeShaderPipelines(SDL3METAL_RenderData *data, METAL_ShaderPipelines *pipe MakePipelineCache(data, &pipelines->caches[SDL_METAL_FRAGMENT_SOLID], "SDL primitives pipeline", rtformat, SDL_METAL_VERTEX_SOLID, SDL_METAL_FRAGMENT_SOLID); MakePipelineCache(data, &pipelines->caches[SDL_METAL_FRAGMENT_COPY], "SDL copy pipeline", rtformat, SDL_METAL_VERTEX_COPY, SDL_METAL_FRAGMENT_COPY); MakePipelineCache(data, &pipelines->caches[SDL_METAL_FRAGMENT_YUV], "SDL YUV pipeline", rtformat, SDL_METAL_VERTEX_COPY, SDL_METAL_FRAGMENT_YUV); - MakePipelineCache(data, &pipelines->caches[SDL_METAL_FRAGMENT_ADVANCED], "SDL advanced pipeline", rtformat, SDL_METAL_VERTEX_COPY, SDL_METAL_FRAGMENT_ADVANCED); + MakePipelineCache(data, &pipelines->caches[SDL_METAL_FRAGMENT_NV12], "SDL NV12 pipeline", rtformat, SDL_METAL_VERTEX_COPY, SDL_METAL_FRAGMENT_NV12); } static METAL_ShaderPipelines *ChooseShaderPipelines(SDL3METAL_RenderData *data, MTLPixelFormat rtformat) @@ -690,19 +677,14 @@ static bool METAL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD height:(NSUInteger)texture->h mipmapped:NO]; - // Not available in iOS 8. - if ([mtltexdesc respondsToSelector:@selector(usage)]) { - if (texture->access == SDL_TEXTUREACCESS_TARGET) { - mtltexdesc.usage = MTLTextureUsageShaderRead | MTLTextureUsageRenderTarget; - } else { - mtltexdesc.usage = MTLTextureUsageShaderRead; - } + if (texture->access == SDL_TEXTUREACCESS_TARGET) { + mtltexdesc.usage = MTLTextureUsageShaderRead | MTLTextureUsageRenderTarget; + } else { + mtltexdesc.usage = MTLTextureUsageShaderRead; } if (surface) { - if (@available(iOS 11.0, tvOS 11.0, *)) { - mtltexture = [data.mtldevice newTextureWithDescriptor:mtltexdesc iosurface:surface plane:0]; - } + mtltexture = [data.mtldevice newTextureWithDescriptor:mtltexdesc iosurface:surface plane:0]; } else { mtltexture = [data.mtldevice newTextureWithDescriptor:mtltexdesc]; } @@ -733,9 +715,7 @@ static bool METAL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD if (yuv || nv12) { if (surface) { - if (@available(iOS 11.0, tvOS 11.0, *)) { - mtltextureUv = [data.mtldevice newTextureWithDescriptor:mtltexdesc iosurface:surface plane:1]; - } + mtltextureUv = [data.mtldevice newTextureWithDescriptor:mtltexdesc iosurface:surface plane:1]; } else { mtltextureUv = [data.mtldevice newTextureWithDescriptor:mtltexdesc]; } @@ -745,14 +725,15 @@ static bool METAL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD } #endif // SDL_HAVE_YUV texturedata = [[SDL3METAL_TextureData alloc] init]; - if (SDL_COLORSPACETRANSFER(texture->colorspace) == SDL_TRANSFER_CHARACTERISTICS_SRGB) { - texturedata.fragmentFunction = SDL_METAL_FRAGMENT_COPY; #ifdef SDL_HAVE_YUV - } else if (yuv) { + if (yuv) { texturedata.fragmentFunction = SDL_METAL_FRAGMENT_YUV; + } else if (nv12) { + texturedata.fragmentFunction = SDL_METAL_FRAGMENT_NV12; + } else #endif - } else { - texturedata.fragmentFunction = SDL_METAL_FRAGMENT_ADVANCED; + { + texturedata.fragmentFunction = SDL_METAL_FRAGMENT_COPY; } texturedata.mtltexture = mtltexture; texturedata.mtltextureUv = mtltextureUv; @@ -786,11 +767,7 @@ static void METAL_UploadTextureData(id texture, SDL_Rect rect, int s static MTLStorageMode METAL_GetStorageMode(id resource) { - // iOS 8 does not have this method. - if ([resource respondsToSelector:@selector(storageMode)]) { - return resource.storageMode; - } - return MTLStorageModeShared; + return resource.storageMode; } static bool METAL_UpdateTextureInternal(SDL_Renderer *renderer, SDL3METAL_TextureData *texturedata, @@ -1844,28 +1821,27 @@ static void *METAL_GetMetalCommandEncoder(SDL_Renderer *renderer) static bool METAL_SetVSync(SDL_Renderer *renderer, const int vsync) { -#if (defined(SDL_PLATFORM_MACOS) && defined(MAC_OS_X_VERSION_10_13)) || TARGET_OS_MACCATALYST - if (@available(macOS 10.13, *)) { - SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal; - switch (vsync) { - case 0: - data.mtllayer.displaySyncEnabled = NO; - break; - case 1: - data.mtllayer.displaySyncEnabled = YES; - break; - default: - return SDL_Unsupported(); - } - return true; +#if defined(SDL_PLATFORM_MACOS) || TARGET_OS_MACCATALYST + SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal; + switch (vsync) { + case 0: + data.mtllayer.displaySyncEnabled = NO; + break; + case 1: + data.mtllayer.displaySyncEnabled = YES; + break; + default: + return SDL_Unsupported(); } -#endif + return true; +#else switch (vsync) { case 1: return true; default: return SDL_Unsupported(); } +#endif } static SDL_MetalView GetWindowView(SDL_Window *window) @@ -1960,10 +1936,6 @@ static bool METAL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL const size_t YCbCr_shader_matrix_size = 4 * 4 * sizeof(float); - if (!IsMetalAvailable()) { - return false; - } - SDL_SetupRendererColorspace(renderer, create_props); #ifndef SDL_PLATFORM_TVOS @@ -2186,10 +2158,8 @@ static bool METAL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21); SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_P010); -#if (defined(SDL_PLATFORM_MACOS) && defined(MAC_OS_X_VERSION_10_13)) || TARGET_OS_MACCATALYST - if (@available(macOS 10.13, *)) { - data.mtllayer.displaySyncEnabled = NO; - } +#if defined(SDL_PLATFORM_MACOS) || TARGET_OS_MACCATALYST + data.mtllayer.displaySyncEnabled = NO; #endif // https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf @@ -2198,28 +2168,15 @@ static bool METAL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL maxtexsize = 16384; #elif defined(SDL_PLATFORM_TVOS) maxtexsize = 8192; -#ifdef __TVOS_11_0 - if (@available(tvOS 11.0, *)) { - if ([mtldevice supportsFeatureSet:MTLFeatureSet_tvOS_GPUFamily2_v1]) { - maxtexsize = 16384; - } + if ([mtldevice supportsFeatureSet:MTLFeatureSet_tvOS_GPUFamily2_v1]) { + maxtexsize = 16384; } -#endif #else -#ifdef __IPHONE_11_0 -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunguarded-availability-new" if ([mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily4_v1]) { maxtexsize = 16384; - } else -#pragma clang diagnostic pop -#endif -#ifdef __IPHONE_10_0 - if ([mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily3_v1]) { + } else if ([mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily3_v1]) { maxtexsize = 16384; - } else -#endif - if ([mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily2_v2] || [mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily1_v2]) { + } else if ([mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily2_v2] || [mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily1_v2]) { maxtexsize = 8192; } else { maxtexsize = 4096; diff --git a/libs/SDL3/src/render/metal/SDL_shaders_metal.metal b/libs/SDL3/src/render/metal/SDL_shaders_metal.metal index 16bd5b2b..c2666703 100644 --- a/libs/SDL3/src/render/metal/SDL_shaders_metal.metal +++ b/libs/SDL3/src/render/metal/SDL_shaders_metal.metal @@ -107,39 +107,7 @@ float3 ApplyTonemap(float3 v, float input_type, float tonemap_method, float tone return v; } -float4 GetInputColor(float2 texcoord, float texture_type, constant YUVDecode &decode, texture2d tex0, texture2d tex1, sampler s) -{ - float4 rgba; - - if (texture_type == TEXTURETYPE_NONE) { - rgba = 1.0; - } else if (texture_type == TEXTURETYPE_RGB) { - rgba = tex0.sample(s, texcoord); - } else if (texture_type == TEXTURETYPE_NV12) { - float3 yuv; - yuv.x = tex0.sample(s, texcoord).r; - yuv.yz = tex1.sample(s, texcoord).rg; - - rgba.rgb = (yuv + decode.offset) * decode.matrix; - rgba.a = 1.0; - } else if (texture_type == TEXTURETYPE_NV21) { - float3 yuv; - yuv.x = tex0.sample(s, texcoord).r; - yuv.yz = tex1.sample(s, texcoord).gr; - - rgba.rgb = (yuv + decode.offset) * decode.matrix; - rgba.a = 1.0; - } else { - // Error! - rgba.r = 1.0; - rgba.g = 0.0; - rgba.b = 0.0; - rgba.a = 1.0; - } - return rgba; -} - -float4 GetOutputColor(float4 rgba, float color_scale) +float4 GetOutputColorSimple(float4 rgba, float color_scale) { float4 output; @@ -174,12 +142,50 @@ float3 GetOutputColorFromLinear(float3 rgb, float scRGB_output, float color_scal output.r = sRGBfromLinear(output.r); output.g = sRGBfromLinear(output.g); output.b = sRGBfromLinear(output.b); - output = clamp(output.rgb, 0.0, 1.0); + output = clamp(output, 0.0, 1.0); } return output; } +float4 GetOutputColor(float4 rgba, constant ShaderConstants &c) +{ + const float3x3 mat2020to709 = { + { 1.660496, -0.587656, -0.072840 }, + { -0.124547, 1.132895, -0.008348 }, + { -0.018154, -0.100597, 1.118751 } + }; + float4 output; + + if (c.input_type == INPUTTYPE_HDR10) { + rgba.rgb = PQtoLinear(rgba.rgb, c.sdr_white_point); + } + + if (c.tonemap_method != TONEMAP_NONE) { + rgba.rgb = ApplyTonemap(rgba.rgb, c.input_type, c.tonemap_method, c.tonemap_factor1, c.tonemap_factor2); + } + + if (c.input_type == INPUTTYPE_SRGB) { + if (c.texture_type == TEXTURETYPE_RGB) { + // The sampler has already converted to linear if necessary + output.rgb = rgba.rgb * c.color_scale; + } else { + output.rgb = GetOutputColorFromSRGB(rgba.rgb, c.scRGB_output, c.color_scale); + } + } else if (c.input_type == INPUTTYPE_SCRGB) { + output.rgb = GetOutputColorFromLinear(rgba.rgb, c.scRGB_output, c.color_scale); + } else if (c.input_type == INPUTTYPE_HDR10) { + rgba.rgb = rgba.rgb * mat2020to709; + output.rgb = GetOutputColorFromLinear(rgba.rgb, c.scRGB_output, c.color_scale); + } else { + // Unexpected input type, use magenta error color + output.rgb = float3(1.0, 0.0, 1.0); + } + output.a = rgba.a; + + return output; +} + struct SolidVertexInput { float2 position [[attribute(0)]]; @@ -207,7 +213,7 @@ vertex SolidVertexOutput SDL_Solid_vertex(SolidVertexInput in [[stage_in]], fragment float4 SDL_Solid_fragment(SolidVertexInput in [[stage_in]], constant ShaderConstants &c [[buffer(0)]]) { - return GetOutputColor(1.0, c.color_scale) * in.color; + return GetOutputColorSimple(1.0, c.color_scale) * in.color; } struct CopyVertexInput @@ -240,47 +246,8 @@ fragment float4 SDL_Copy_fragment(CopyVertexOutput vert [[stage_in]], texture2d tex [[texture(0)]], sampler s [[sampler(0)]]) { - return GetOutputColor(tex.sample(s, vert.texcoord), c.color_scale) * vert.color; -} - -fragment float4 SDL_Advanced_fragment(CopyVertexOutput vert [[stage_in]], - constant ShaderConstants &c [[buffer(0)]], - constant YUVDecode &decode [[buffer(1)]], - texture2d tex0 [[texture(0)]], - texture2d tex1 [[texture(1)]], - sampler s [[sampler(0)]]) -{ - const float3x3 mat2020to709 = { - { 1.660496, -0.587656, -0.072840 }, - { -0.124547, 1.132895, -0.008348 }, - { -0.018154, -0.100597, 1.118751 } - }; - float4 rgba = GetInputColor(vert.texcoord, c.texture_type, decode, tex0, tex1, s); - float4 output; - - if (c.input_type == INPUTTYPE_HDR10) { - rgba.rgb = PQtoLinear(rgba.rgb, c.sdr_white_point); - } - - if (c.tonemap_method != TONEMAP_NONE) { - rgba.rgb = ApplyTonemap(rgba.rgb, c.input_type, c.tonemap_method, c.tonemap_factor1, c.tonemap_factor2); - } - - if (c.input_type == INPUTTYPE_SRGB) { - output.rgb = GetOutputColorFromSRGB(rgba.rgb, c.scRGB_output, c.color_scale); - output.a = rgba.a; - } else if (c.input_type == INPUTTYPE_SCRGB) { - output.rgb = GetOutputColorFromLinear(rgba.rgb, c.scRGB_output, c.color_scale); - output.a = rgba.a; - } else if (c.input_type == INPUTTYPE_HDR10) { - rgba.rgb = rgba.rgb * mat2020to709; - output.rgb = GetOutputColorFromLinear(rgba.rgb, c.scRGB_output, c.color_scale); - output.a = rgba.a; - } else { - output = GetOutputColor(rgba, c.color_scale); - } - - return output * vert.color; + float4 rgba = tex.sample(s, vert.texcoord); + return GetOutputColor(rgba, c) * vert.color; } fragment float4 SDL_YUV_fragment(CopyVertexOutput vert [[stage_in]], @@ -295,12 +262,38 @@ fragment float4 SDL_YUV_fragment(CopyVertexOutput vert [[stage_in]], yuv.y = texUV.sample(s, vert.texcoord, 0).r; yuv.z = texUV.sample(s, vert.texcoord, 1).r; - float3 rgb; - rgb = (yuv + decode.offset) * decode.matrix; + float4 rgba; + rgba.rgb = (yuv + decode.offset) * decode.matrix; + rgba.a = 1.0; - float4 output; - output.rgb = GetOutputColorFromSRGB(rgb, c.scRGB_output, c.color_scale); - output.a = 1.0; - - return output * vert.color; + return GetOutputColor(rgba, c) * vert.color; +} + +fragment float4 SDL_NV12_fragment(CopyVertexOutput vert [[stage_in]], + constant ShaderConstants &c [[buffer(0)]], + constant YUVDecode &decode [[buffer(1)]], + texture2d texY [[texture(0)]], + texture2d texUV [[texture(1)]], + sampler s [[sampler(0)]]) +{ + float4 rgba; + if (c.texture_type == TEXTURETYPE_NV12) { + float3 yuv; + yuv.x = texY.sample(s, vert.texcoord).r; + yuv.yz = texUV.sample(s, vert.texcoord).rg; + + rgba.rgb = (yuv + decode.offset) * decode.matrix; + } else if (c.texture_type == TEXTURETYPE_NV21) { + float3 yuv; + yuv.x = texY.sample(s, vert.texcoord).r; + yuv.yz = texUV.sample(s, vert.texcoord).gr; + + rgba.rgb = (yuv + decode.offset) * decode.matrix; + } else { + // Unexpected texture type, use magenta error color + rgba.rgb = float3(1.0, 0.0, 1.0); + } + rgba.a = 1.0; + + return GetOutputColor(rgba, c) * vert.color; } diff --git a/libs/SDL3/src/render/metal/SDL_shaders_metal_ios.h b/libs/SDL3/src/render/metal/SDL_shaders_metal_ios.h index a8791dd4..5d041188 100644 --- a/libs/SDL3/src/render/metal/SDL_shaders_metal_ios.h +++ b/libs/SDL3/src/render/metal/SDL_shaders_metal_ios.h @@ -1,28 +1,28 @@ const unsigned char sdl_metallib[] = { 0x4d, 0x54, 0x4c, 0x42, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x89, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x45, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe9, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5e, 0x00, 0x00, + 0xe5, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, - 0xa2, 0x58, 0x53, 0x0c, 0xa2, 0xbd, 0xbe, 0x39, 0x59, 0x6d, 0xe1, 0x89, - 0x1b, 0xfd, 0xec, 0x1f, 0xf0, 0xd0, 0x05, 0x05, 0xd7, 0x8c, 0x1a, 0x18, - 0x5d, 0x16, 0x2d, 0xfd, 0xc1, 0xfe, 0xf3, 0x3e, 0x4f, 0x46, 0x46, 0x54, + 0x60, 0x7a, 0x81, 0x65, 0xda, 0xf6, 0x14, 0xc4, 0x56, 0x47, 0x0b, 0x7a, + 0x77, 0x81, 0xf4, 0xc0, 0x01, 0xee, 0xcd, 0x26, 0x7c, 0x2d, 0x8d, 0x7b, + 0x28, 0x66, 0x63, 0x5c, 0x85, 0xe9, 0xdd, 0xb9, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x77, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54, 0x59, - 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0xf3, - 0xed, 0xbb, 0xe2, 0xa1, 0x3c, 0xb5, 0x2d, 0x0d, 0x39, 0x81, 0x8e, 0xd7, - 0xe4, 0x50, 0x35, 0xbf, 0x66, 0xba, 0xd9, 0x56, 0xa7, 0x02, 0xbe, 0x98, - 0x3d, 0xa3, 0x53, 0x01, 0x51, 0xed, 0x87, 0x4f, 0x46, 0x46, 0x54, 0x18, + 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0x6e, + 0xc3, 0x21, 0x35, 0x82, 0x00, 0x01, 0xe8, 0xa4, 0x27, 0xe1, 0xec, 0x73, + 0xf1, 0xe9, 0x58, 0x2e, 0x4a, 0x0d, 0xc0, 0x5a, 0x63, 0x1e, 0x7f, 0x35, + 0xf1, 0x6e, 0x35, 0x4e, 0xbf, 0x18, 0xae, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, @@ -30,9 +30,9 @@ const unsigned char sdl_metallib[] = { 0x41, 0x4d, 0x45, 0x13, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, - 0x00, 0x10, 0x25, 0x8a, 0x79, 0xfe, 0xbb, 0x3e, 0x0b, 0x61, 0x6d, 0x8e, - 0xc4, 0xad, 0xe2, 0x4e, 0xb2, 0x86, 0x8d, 0xdb, 0x4e, 0x58, 0xa3, 0xbf, - 0xc1, 0x08, 0x34, 0x33, 0x64, 0x47, 0x0d, 0x9f, 0x11, 0x4f, 0x46, 0x46, + 0x00, 0x6a, 0x1d, 0x1d, 0x45, 0x2a, 0x6b, 0x07, 0x82, 0x0a, 0x87, 0xce, + 0x97, 0xa1, 0xfe, 0x31, 0x9c, 0x83, 0x91, 0x37, 0x14, 0x18, 0x48, 0x21, + 0x09, 0xd8, 0x88, 0xe6, 0x6a, 0xd7, 0xa1, 0x43, 0x12, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, @@ -40,651 +40,110 @@ const unsigned char sdl_metallib[] = { 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, - 0x20, 0x00, 0x94, 0xc1, 0x60, 0x70, 0xdb, 0xf1, 0xf4, 0x9a, 0xca, 0xaf, - 0x43, 0x1f, 0xe8, 0x1f, 0xb8, 0x88, 0xba, 0xf9, 0x36, 0x17, 0x12, 0x31, - 0x5d, 0x14, 0xe5, 0xb4, 0x2a, 0x16, 0x1b, 0x3d, 0x3d, 0x78, 0x4f, 0x46, + 0x20, 0x00, 0xc3, 0xd6, 0x7b, 0x88, 0x85, 0xf9, 0x2a, 0x82, 0x3a, 0xbd, + 0x11, 0xe6, 0x1e, 0x52, 0xa3, 0x10, 0xbc, 0xf6, 0x87, 0xcf, 0x2b, 0x30, + 0xb1, 0x9a, 0xa7, 0x8c, 0xf0, 0x69, 0xee, 0x5a, 0x25, 0x8c, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, - 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x7d, 0x00, - 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x16, 0x00, 0x53, 0x44, 0x4c, 0x5f, - 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, - 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0x0e, 0xe5, 0x18, 0xdc, 0x79, - 0x00, 0x1d, 0x4a, 0xc4, 0x46, 0x65, 0x48, 0xfc, 0x83, 0x39, 0x79, 0xb7, - 0xcd, 0xc2, 0x06, 0xd2, 0x92, 0x3c, 0x41, 0xd6, 0x17, 0x8d, 0x1b, 0xa5, - 0xc0, 0x50, 0x26, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x76, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, - 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, - 0x4e, 0x44, 0x54, 0x78, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, - 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, - 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0xc7, 0xf3, 0x6a, 0x2a, 0xa1, - 0x13, 0x6b, 0xf5, 0x77, 0xfa, 0xbf, 0xe9, 0x16, 0x2c, 0x61, 0x59, 0x38, - 0x9c, 0x83, 0x65, 0xe0, 0x9d, 0xc3, 0x82, 0x66, 0x2d, 0xce, 0xb1, 0x73, - 0x50, 0x6b, 0x7d, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x7e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xd0, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, - 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, - 0x4e, 0x44, 0x54, 0x29, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x15, - 0x00, 0x02, 0x00, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, - 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x56, 0x41, - 0x54, 0x59, 0x04, 0x00, 0x02, 0x00, 0x04, 0x06, 0x45, 0x4e, 0x44, 0x54, - 0x35, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x20, 0x00, 0x03, 0x00, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, - 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x74, 0x65, 0x78, 0x63, 0x6f, - 0x6f, 0x72, 0x64, 0x00, 0x02, 0x80, 0x56, 0x41, 0x54, 0x59, 0x05, 0x00, - 0x03, 0x00, 0x04, 0x06, 0x04, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, - 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, + 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x78, 0x00, + 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, + 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, + 0x20, 0x00, 0x9f, 0x6c, 0xde, 0x3a, 0x59, 0x77, 0x6a, 0xd2, 0x35, 0x5f, + 0x27, 0x58, 0x9c, 0x4b, 0xdb, 0x9c, 0x88, 0xf7, 0xdf, 0x70, 0x9e, 0x17, + 0x60, 0xc0, 0xe8, 0x92, 0xf3, 0x9d, 0xc8, 0x6a, 0x12, 0x45, 0x4f, 0x46, + 0x46, 0x54, 0x18, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x3e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, + 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x79, 0x00, + 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f, + 0x4e, 0x56, 0x31, 0x32, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, + 0x48, 0x20, 0x00, 0xa0, 0xfa, 0x0c, 0x39, 0x0e, 0x54, 0xa2, 0xb2, 0x34, + 0x03, 0x53, 0x34, 0x18, 0x63, 0x46, 0x2e, 0x1a, 0x02, 0x79, 0x8d, 0x88, + 0x29, 0x32, 0xb9, 0xcc, 0xcd, 0x6b, 0xaa, 0xd8, 0x7a, 0x01, 0xd6, 0x4f, + 0x46, 0x46, 0x54, 0x18, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x5a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x29, + 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x15, 0x00, 0x02, 0x00, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x56, 0x41, 0x54, 0x59, 0x04, 0x00, + 0x02, 0x00, 0x04, 0x06, 0x45, 0x4e, 0x44, 0x54, 0x35, 0x00, 0x00, 0x00, + 0x56, 0x41, 0x54, 0x54, 0x20, 0x00, 0x03, 0x00, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x00, 0x01, 0x80, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x00, + 0x02, 0x80, 0x56, 0x41, 0x54, 0x59, 0x05, 0x00, 0x03, 0x00, 0x04, 0x06, + 0x04, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, - 0x00, 0x45, 0x4e, 0x44, 0x54, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0xac, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x28, 0x03, 0x00, - 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, - 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, - 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, - 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, - 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, - 0x48, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, - 0x00, 0x51, 0x18, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, - 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, - 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, - 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, - 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, - 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, - 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, - 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, - 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, - 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, - 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, - 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, - 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, - 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, - 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, - 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, - 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, - 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, - 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, - 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, - 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, - 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, - 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, - 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, - 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, - 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, - 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, - 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, - 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, - 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, - 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, - 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, - 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c, - 0xc2, 0x00, 0x2c, 0x40, 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, - 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, - 0x43, 0x1b, 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0x61, - 0x1b, 0x08, 0x60, 0x01, 0xaa, 0x21, 0x1c, 0xd2, 0x41, 0x1e, 0xda, 0x40, - 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xdc, 0xe1, - 0x1d, 0xda, 0x20, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x00, 0x00, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, - 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, - 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, - 0x60, 0x87, 0x10, 0xc0, 0x30, 0x82, 0x00, 0x24, 0x41, 0x98, 0xc9, 0x9a, - 0x07, 0x7a, 0x90, 0x87, 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, - 0x07, 0x7a, 0x08, 0x07, 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, - 0x07, 0x79, 0x48, 0x07, 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, - 0x28, 0x84, 0x52, 0x88, 0x11, 0x8c, 0xa1, 0x33, 0x10, 0x30, 0x47, 0x00, - 0x06, 0x29, 0xa0, 0xe6, 0x08, 0x40, 0x61, 0x10, 0x21, 0x10, 0x86, 0x11, - 0x08, 0x65, 0x04, 0x00, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, - 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, - 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, - 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, - 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, - 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, - 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, - 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, - 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, - 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, - 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, - 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, - 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, - 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, - 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, - 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, - 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x43, 0x18, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x2c, 0x10, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, - 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, - 0x52, 0x25, 0x30, 0x02, 0x50, 0x80, 0x01, 0x45, 0x50, 0x20, 0x65, 0x50, - 0x08, 0x05, 0x41, 0x6c, 0x04, 0x80, 0xd6, 0x58, 0x42, 0x24, 0x00, 0x00, - 0x00, 0x79, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, - 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, - 0xb7, 0x21, 0x86, 0x42, 0x24, 0xc0, 0xa2, 0x50, 0xb9, 0x1b, 0x43, 0x0b, - 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, 0x28, 0x41, 0x22, 0x28, - 0x07, 0xdf, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, - 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, - 0x06, 0x46, 0x66, 0xc6, 0x25, 0x07, 0x07, 0x04, 0xa5, 0xad, 0x8c, 0x2e, - 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x25, 0x07, - 0x27, 0x65, 0x88, 0x90, 0x10, 0x43, 0x0c, 0x25, 0x50, 0x10, 0x45, 0x60, - 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36, 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, - 0x45, 0xe0, 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, - 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, - 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36, 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, - 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, - 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x84, 0x64, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, - 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, - 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, - 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, - 0x58, 0x9a, 0x9c, 0x0b, 0xdc, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, - 0xa3, 0xb0, 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, - 0xb2, 0x2f, 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x34, 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, - 0xda, 0xca, 0x88, 0xc0, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, - 0x51, 0x92, 0x27, 0x81, 0x92, 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, - 0x9c, 0x8b, 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, - 0x5c, 0x1d, 0x1d, 0xad, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, - 0x32, 0x94, 0x9a, 0xb1, 0x37, 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, - 0xb3, 0x14, 0x16, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, - 0xac, 0x04, 0x4a, 0xa2, 0x44, 0x4a, 0x2e, 0x3a, 0x61, 0x69, 0x72, 0x2e, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xcc, - 0xd8, 0xde, 0xc2, 0xe8, 0x98, 0xc0, 0xbd, 0xa5, 0xb9, 0xd1, 0x4d, 0xa5, - 0xe9, 0x95, 0x0d, 0x51, 0x92, 0x2c, 0x81, 0x12, 0x2d, 0x91, 0x92, 0x6d, - 0x88, 0x91, 0x50, 0x09, 0x96, 0x70, 0x84, 0xc2, 0xd2, 0xe4, 0x5c, 0xec, - 0xca, 0xe4, 0xe8, 0xca, 0xf0, 0xbe, 0xd2, 0xdc, 0xe0, 0xea, 0xe8, 0x28, - 0x85, 0xa5, 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, 0x85, 0xd1, 0xa5, 0xbd, 0xb9, - 0x7d, 0xa5, 0xb9, 0x91, 0x95, 0xe1, 0xd1, 0x3b, 0x2b, 0x73, 0x2b, 0x93, - 0x0b, 0xa3, 0x2b, 0x23, 0x43, 0xf9, 0xfa, 0x0a, 0x4b, 0x93, 0xfb, 0x82, - 0x63, 0x0b, 0x1b, 0x2b, 0x43, 0x7b, 0x63, 0x23, 0x2b, 0x93, 0xfb, 0xfa, - 0x4a, 0xa1, 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x27, 0x33, 0x84, 0x52, 0x84, - 0xc4, 0x4b, 0x3e, 0x45, 0x50, 0x82, 0x04, 0x0c, 0x12, 0x28, 0x09, 0x83, - 0x44, 0x4a, 0xa6, 0x21, 0x94, 0x12, 0x24, 0x5e, 0xf2, 0x29, 0x81, 0x12, - 0x24, 0x60, 0x90, 0x40, 0x49, 0x94, 0x48, 0xc9, 0x45, 0x25, 0x2c, 0x4d, - 0xce, 0x45, 0xac, 0xce, 0xcc, 0xac, 0x4c, 0x8e, 0x4f, 0x58, 0x9a, 0x9c, - 0x8b, 0x58, 0x9d, 0x99, 0x59, 0x99, 0xdc, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, - 0x91, 0xb0, 0x34, 0x39, 0x17, 0xb9, 0xb2, 0x30, 0x32, 0x46, 0x61, 0x69, - 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0xbc, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, - 0xe8, 0xf2, 0xe0, 0xca, 0xbe, 0xc2, 0xd8, 0xd2, 0xce, 0xdc, 0xbe, 0xe6, - 0xd2, 0xf4, 0xca, 0x88, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xd1, 0xe0, 0xd1, - 0x50, 0x81, 0x93, 0x7b, 0x53, 0x2b, 0x1b, 0xa3, 0x4b, 0x7b, 0x73, 0x1b, - 0x02, 0x06, 0x0a, 0x91, 0x90, 0x41, 0x52, 0x06, 0xca, 0x90, 0x7c, 0x0a, - 0xa1, 0x04, 0x89, 0x19, 0x24, 0x67, 0xa0, 0x0c, 0x09, 0x1a, 0x28, 0x45, - 0x02, 0x25, 0x69, 0x90, 0x48, 0x89, 0x1a, 0x30, 0xa1, 0x93, 0x0b, 0x73, - 0x9b, 0x33, 0x7b, 0x93, 0x6b, 0x1b, 0x02, 0x06, 0x8a, 0x91, 0x90, 0x41, - 0x52, 0x06, 0xca, 0x90, 0x7c, 0x8a, 0xa1, 0x04, 0x89, 0x19, 0x24, 0x67, - 0xa0, 0x0c, 0x09, 0x1a, 0x28, 0x45, 0x02, 0x25, 0x69, 0x90, 0x48, 0x09, - 0x1b, 0x0c, 0x41, 0x12, 0x31, 0x48, 0xc6, 0x20, 0x59, 0x83, 0xa4, 0x0d, - 0x86, 0x18, 0x08, 0x90, 0x74, 0x89, 0x1b, 0xf0, 0x79, 0x6b, 0x73, 0x4b, - 0x83, 0x7b, 0xa3, 0x2b, 0x73, 0xa3, 0x03, 0x19, 0x43, 0x0b, 0x93, 0xe3, - 0x33, 0x95, 0xd6, 0x06, 0xc7, 0x56, 0x06, 0x32, 0xb4, 0xb2, 0x02, 0x42, - 0x25, 0x14, 0x14, 0x34, 0x44, 0x48, 0xe2, 0x60, 0x88, 0x91, 0xc0, 0x41, - 0x22, 0x07, 0x4c, 0x32, 0xc4, 0x48, 0xe6, 0x20, 0x99, 0x03, 0x26, 0xa1, - 0x18, 0x84, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, - 0x8d, 0xbd, 0xc1, 0x95, 0xcd, 0xa1, 0x4c, 0x11, 0x31, 0x7d, 0x4d, 0xbd, - 0xb1, 0xa5, 0x91, 0x7d, 0xd9, 0x95, 0xc9, 0xd1, 0x95, 0xe1, 0xa5, 0x0c, - 0x21, 0x12, 0x3b, 0x48, 0xea, 0x80, 0x56, 0x58, 0x9a, 0x5c, 0x4b, 0x18, - 0x5b, 0x5a, 0xd8, 0x5c, 0xcb, 0xdc, 0xd8, 0x1b, 0x5c, 0x59, 0x4b, 0x98, - 0xdc, 0x19, 0xca, 0x4c, 0xca, 0x10, 0x23, 0xc1, 0x83, 0xc4, 0x0e, 0x92, - 0x3b, 0x18, 0x22, 0x24, 0x78, 0x40, 0x2b, 0x2c, 0x4d, 0xae, 0x25, 0x8c, - 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, 0x25, 0x4c, - 0xee, 0x0c, 0x45, 0x26, 0x65, 0x88, 0x91, 0xec, 0x41, 0x62, 0x07, 0x89, - 0x1e, 0x0c, 0x11, 0x92, 0x3d, 0x18, 0x11, 0xb1, 0x03, 0x3b, 0xd8, 0x43, - 0x3b, 0xb8, 0x41, 0x3b, 0xbc, 0x03, 0x39, 0xd4, 0x03, 0x3b, 0x94, 0x83, - 0x1b, 0x98, 0x03, 0x3b, 0x84, 0xc3, 0x39, 0xcc, 0xc3, 0x14, 0x21, 0x18, - 0x46, 0x28, 0xec, 0xc0, 0x0e, 0xf6, 0xd0, 0x0e, 0x6e, 0x90, 0x0e, 0xe4, - 0x50, 0x0e, 0xee, 0x40, 0x0f, 0x53, 0x82, 0x62, 0xc4, 0x12, 0x0e, 0xe9, - 0x20, 0x0f, 0x6e, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, - 0xe0, 0x0e, 0x53, 0x02, 0x63, 0x04, 0x15, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, - 0xc0, 0x0e, 0xe1, 0xe0, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x70, 0x0e, 0xe5, - 0xf0, 0x0b, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, - 0x30, 0x25, 0x40, 0x46, 0x4c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe3, - 0xf0, 0x0e, 0xed, 0x00, 0x0f, 0xe9, 0xc0, 0x0e, 0xe5, 0xf0, 0x0b, 0xef, - 0x00, 0x0f, 0xf4, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0xf3, 0x30, 0x65, 0x50, - 0x18, 0x67, 0x84, 0x12, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0f, 0xe5, - 0x20, 0x0f, 0xf4, 0x50, 0x0e, 0xf8, 0x30, 0x25, 0x78, 0x03, 0x00, 0x00, - 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, - 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, - 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, - 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, - 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, - 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, - 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, - 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, - 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, - 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, - 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, - 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, - 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, - 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, - 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, - 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, - 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, - 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, - 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, - 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, - 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, - 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, - 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, - 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, - 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, - 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, - 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, - 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, - 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, - 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, - 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, - 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, - 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, - 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, - 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, - 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, - 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, - 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, - 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, - 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, - 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, - 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, - 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, - 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, - 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, - 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, - 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, - 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, - 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, - 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, - 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, - 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, - 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, - 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, - 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb1, 0x5d, 0xf9, 0xb3, 0xce, - 0x82, 0x0c, 0x7f, 0x45, 0x44, 0x13, 0x71, 0x01, 0x00, 0x61, 0x20, 0x00, - 0x00, 0x5c, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, - 0x00, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6, - 0x22, 0x04, 0x41, 0x10, 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88, - 0x15, 0x41, 0x09, 0x94, 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14, - 0x66, 0x00, 0x66, 0x00, 0x08, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0x1f, - 0x00, 0xe3, 0x11, 0x8d, 0x94, 0x49, 0x14, 0x94, 0xf1, 0x08, 0x88, 0xda, - 0x28, 0x0a, 0xca, 0x20, 0xc3, 0x70, 0x34, 0x26, 0x04, 0xf2, 0x19, 0x8f, - 0xa0, 0xb0, 0xaf, 0xa1, 0xa0, 0x0c, 0x32, 0x1c, 0x8a, 0x64, 0x42, 0x20, - 0x1f, 0x0b, 0x0a, 0xf8, 0x8c, 0x47, 0x64, 0x1d, 0x19, 0x4c, 0x14, 0x94, - 0x41, 0x06, 0xe6, 0xc1, 0x4c, 0x08, 0xe4, 0x63, 0x45, 0x00, 0x9f, 0xf1, - 0x08, 0x4f, 0x0c, 0xd2, 0xc0, 0xa2, 0xa0, 0x0c, 0x32, 0x44, 0x94, 0x67, - 0x42, 0x20, 0x1f, 0x2b, 0x02, 0xf8, 0x8c, 0x47, 0x88, 0xc1, 0x19, 0xb8, - 0x01, 0x47, 0x41, 0x19, 0x64, 0x08, 0x34, 0x30, 0xb0, 0xa0, 0x92, 0xcf, - 0x20, 0xc3, 0xb0, 0x8d, 0x81, 0x05, 0x93, 0x7c, 0x6c, 0x08, 0xe0, 0x33, - 0xc8, 0x60, 0x78, 0x67, 0x60, 0x41, 0x24, 0x1f, 0x1b, 0x02, 0xf8, 0x0c, - 0x32, 0x24, 0x61, 0xb0, 0x06, 0x16, 0x3c, 0xf2, 0xb1, 0x21, 0x80, 0xcf, - 0x78, 0xc4, 0x1b, 0xd0, 0xc1, 0x1e, 0xa0, 0x01, 0x05, 0x65, 0x90, 0x21, - 0x38, 0x83, 0x36, 0xb0, 0x40, 0x0c, 0xe4, 0x33, 0xc8, 0x30, 0xa0, 0x01, - 0x1c, 0x58, 0x00, 0x06, 0xf2, 0x19, 0x64, 0x28, 0xd4, 0x60, 0x0e, 0x2c, - 0xe8, 0xe4, 0x33, 0xc8, 0x70, 0xb0, 0x81, 0x1d, 0x58, 0xa0, 0xc9, 0x67, - 0x90, 0x81, 0x0f, 0xe2, 0xa0, 0x0e, 0x2c, 0x0b, 0xe4, 0x33, 0xc8, 0xe0, - 0x07, 0x73, 0x80, 0x07, 0xe6, 0x04, 0xf2, 0xb1, 0x64, 0x80, 0x8f, 0x05, - 0x0c, 0x7c, 0x2c, 0x48, 0xe0, 0x63, 0x01, 0x02, 0x1f, 0x0b, 0x0a, 0xf8, - 0xcc, 0x36, 0xe4, 0x41, 0x00, 0xcc, 0x36, 0x04, 0xa5, 0x10, 0xcc, 0x36, - 0x04, 0x78, 0x20, 0x64, 0x10, 0x10, 0x03, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x5b, 0x8e, 0x20, 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0xd8, 0x72, - 0x0c, 0x01, 0x1d, 0x1c, 0x7c, 0x80, 0xe4, 0xc1, 0x96, 0xe3, 0x08, 0xe8, - 0xe0, 0xe0, 0x03, 0x24, 0x0f, 0xb6, 0x1c, 0x4c, 0x40, 0x07, 0x07, 0x1f, - 0x20, 0x79, 0xb0, 0xe5, 0x88, 0x02, 0x3a, 0x38, 0xf8, 0x00, 0xc9, 0x83, - 0x2d, 0x87, 0x15, 0xd0, 0xc1, 0x91, 0x07, 0x08, 0x1f, 0x6c, 0x39, 0xc6, - 0x20, 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0xbc, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x2c, 0x03, 0x00, - 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, - 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, - 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, - 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, - 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, - 0x48, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, - 0x00, 0x51, 0x18, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, - 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, - 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, - 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, - 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, - 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, - 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, - 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, - 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, - 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, - 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, - 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, - 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, - 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, - 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, - 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, - 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, - 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, - 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, - 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, - 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, - 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, - 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, - 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, - 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, - 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, - 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, - 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, - 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, - 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, - 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, - 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, - 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c, - 0x02, 0x01, 0x2c, 0x40, 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, - 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, - 0x43, 0x1b, 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0x61, - 0x1b, 0x0a, 0x60, 0x01, 0xaa, 0x21, 0x1c, 0xd2, 0x41, 0x1e, 0xda, 0x40, - 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xdc, 0xe1, - 0x1d, 0xda, 0x20, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x00, 0x00, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, - 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, - 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, - 0x30, 0x8c, 0x20, 0x00, 0x76, 0x08, 0x41, 0x24, 0x41, 0x98, 0xc9, 0x9a, - 0x07, 0x7a, 0x90, 0x87, 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, - 0x07, 0x7a, 0x08, 0x07, 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, - 0x07, 0x79, 0x48, 0x07, 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, - 0x28, 0x84, 0x62, 0x0c, 0x11, 0x84, 0x31, 0x74, 0x06, 0x02, 0xe6, 0x08, - 0xc0, 0x20, 0x05, 0xd4, 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x04, 0xc2, 0x30, - 0x02, 0xa1, 0x8c, 0x00, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, - 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, - 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, - 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, - 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, - 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, - 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, - 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, - 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, - 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, - 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, - 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, - 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, - 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, - 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, - 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, - 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x43, 0x18, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x2c, 0x10, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, - 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, - 0x52, 0x25, 0x50, 0x04, 0x23, 0x00, 0x05, 0x18, 0x50, 0x08, 0x65, 0x50, - 0x20, 0x05, 0x41, 0x6c, 0x04, 0x80, 0xd6, 0x58, 0x42, 0x24, 0x00, 0x00, - 0x00, 0x79, 0x18, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, - 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, - 0xb7, 0x21, 0x86, 0x22, 0x24, 0xc0, 0xa2, 0x50, 0xb9, 0x1b, 0x43, 0x0b, - 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, 0x28, 0x41, 0x22, 0x28, - 0x05, 0xdf, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, - 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, - 0x06, 0x46, 0x66, 0xc6, 0x25, 0x07, 0x07, 0x04, 0xa5, 0xad, 0x8c, 0x2e, - 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x25, 0x07, - 0x27, 0x65, 0x88, 0x90, 0x10, 0x43, 0x0c, 0x25, 0x50, 0x10, 0x65, 0x60, - 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36, 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, - 0x65, 0xe0, 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, - 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, - 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36, 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, - 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, - 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x84, 0x64, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, - 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, - 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, - 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, - 0x58, 0x9a, 0x9c, 0x0b, 0xdc, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, - 0xa3, 0xb0, 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, - 0xb2, 0x2f, 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x34, 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, - 0xda, 0xca, 0x88, 0xc0, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, - 0x51, 0x92, 0x27, 0x81, 0x92, 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, - 0x9c, 0x8b, 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, - 0x5c, 0x1d, 0x1d, 0xad, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, - 0x32, 0x94, 0x9a, 0xb1, 0x37, 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, - 0xb3, 0x14, 0x16, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, - 0xac, 0x04, 0x4a, 0xa2, 0x44, 0x4a, 0x2e, 0x66, 0x67, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, - 0x6f, 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x34, 0xcc, 0xd8, - 0xde, 0xc2, 0xe8, 0x64, 0x88, 0xd0, 0x95, 0xe1, 0x8d, 0xbd, 0xbd, 0xc9, - 0x91, 0x0d, 0x61, 0x92, 0x2a, 0xc9, 0x12, 0x28, 0xd1, 0x12, 0x29, 0xd9, - 0x86, 0x18, 0x09, 0x95, 0x60, 0x09, 0x47, 0x28, 0x2c, 0x4d, 0xce, 0xc5, - 0xae, 0x4c, 0x8e, 0xae, 0x0c, 0xef, 0x2b, 0xcd, 0x0d, 0xae, 0x8e, 0x8e, - 0x52, 0x58, 0x9a, 0x9c, 0x0b, 0xdb, 0xdb, 0x58, 0x18, 0x5d, 0xda, 0x9b, - 0xdb, 0x57, 0x9a, 0x1b, 0x59, 0x19, 0x1e, 0xbd, 0xb3, 0x32, 0xb7, 0x32, - 0xb9, 0x30, 0xba, 0x32, 0x32, 0x94, 0xaf, 0xaf, 0xb0, 0x34, 0xb9, 0x2f, - 0x38, 0xb6, 0xb0, 0xb1, 0x32, 0xb4, 0x37, 0x36, 0xb2, 0x32, 0xb9, 0xaf, - 0xaf, 0x94, 0x21, 0x94, 0x32, 0x24, 0x5e, 0xf2, 0x29, 0x83, 0x12, 0x24, - 0x60, 0x90, 0x40, 0x89, 0x96, 0x48, 0xc9, 0x34, 0x84, 0x52, 0x82, 0xc4, - 0x4b, 0x3e, 0x25, 0x50, 0x82, 0x04, 0x0c, 0x12, 0x28, 0x89, 0x12, 0x29, - 0xb9, 0x86, 0x50, 0x8a, 0x90, 0x78, 0xc9, 0xa7, 0x08, 0x4a, 0x90, 0x80, - 0x41, 0x02, 0x25, 0x5a, 0x22, 0x25, 0x1b, 0x95, 0xb0, 0x34, 0x39, 0x17, - 0xb1, 0x3a, 0x33, 0xb3, 0x32, 0x39, 0x3e, 0x61, 0x69, 0x72, 0x2e, 0x62, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x44, 0xc2, - 0xd2, 0xe4, 0x5c, 0xe4, 0xca, 0xc2, 0xc8, 0x18, 0x85, 0xa5, 0xc9, 0xb9, - 0x84, 0xc9, 0x9d, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0xcd, 0xa5, 0xe9, - 0x95, 0xf1, 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, - 0x83, 0x2b, 0xfb, 0x0a, 0x63, 0x4b, 0x3b, 0x73, 0xfb, 0x9a, 0x4b, 0xd3, - 0x2b, 0x23, 0x62, 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x83, 0x47, 0x43, 0x05, - 0x4e, 0xee, 0x4d, 0xad, 0x6c, 0x8c, 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0x18, - 0x28, 0x46, 0x42, 0x06, 0x49, 0x19, 0x28, 0x44, 0xf2, 0x29, 0x82, 0x12, - 0x24, 0x66, 0x90, 0x9c, 0x81, 0x42, 0x24, 0x68, 0xa0, 0x1c, 0x09, 0x94, - 0xa4, 0x41, 0x22, 0x25, 0x6a, 0xc0, 0x84, 0x4e, 0x2e, 0xcc, 0x6d, 0xce, - 0xec, 0x4d, 0xae, 0x6d, 0x08, 0x18, 0x28, 0x45, 0x42, 0x06, 0x49, 0x19, - 0x28, 0x44, 0xf2, 0x29, 0x86, 0x12, 0x24, 0x66, 0x90, 0x9c, 0x81, 0x42, - 0x24, 0x68, 0xa0, 0x1c, 0x09, 0x94, 0xa4, 0x41, 0x22, 0x25, 0x6c, 0x30, - 0x44, 0x49, 0xc2, 0x20, 0x11, 0x83, 0x64, 0x0c, 0x92, 0x35, 0x48, 0xda, - 0x60, 0x88, 0x81, 0x00, 0x49, 0x97, 0xb8, 0x01, 0x9f, 0xb7, 0x36, 0xb7, - 0x34, 0xb8, 0x37, 0xba, 0x32, 0x37, 0x3a, 0x90, 0x31, 0xb4, 0x30, 0x39, - 0x3e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, - 0x54, 0x42, 0x41, 0x41, 0x43, 0x84, 0x24, 0x0e, 0x86, 0x18, 0x09, 0x1c, - 0x24, 0x72, 0xc0, 0x24, 0x43, 0x8c, 0x64, 0x0e, 0x92, 0x39, 0x60, 0x12, - 0x86, 0x41, 0x58, 0x9a, 0x5c, 0x4b, 0x18, 0x5b, 0x5a, 0xd8, 0x5c, 0xcb, - 0xdc, 0xd8, 0x1b, 0x5c, 0xd9, 0x1c, 0xca, 0x14, 0x11, 0xd3, 0xd7, 0xd0, - 0x1b, 0x5c, 0xde, 0x97, 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0x5e, 0xca, 0x10, - 0x22, 0xb1, 0x83, 0xa4, 0x0e, 0x68, 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, - 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0x84, 0xc9, - 0x9d, 0xa1, 0xd0, 0xa4, 0x0c, 0x31, 0x12, 0x3c, 0x48, 0xec, 0x20, 0xb9, - 0x83, 0x21, 0x42, 0x82, 0x07, 0xb4, 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8, - 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a, 0xc2, 0xe4, - 0xce, 0x50, 0x66, 0x52, 0x86, 0x18, 0xc9, 0x1e, 0x24, 0x76, 0x90, 0xe8, - 0xc1, 0x10, 0x21, 0xd9, 0x83, 0x11, 0x11, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, - 0x83, 0x1b, 0xb4, 0xc3, 0x3b, 0x90, 0x43, 0x3d, 0xb0, 0x43, 0x39, 0xb8, - 0x81, 0x39, 0xb0, 0x43, 0x38, 0x9c, 0xc3, 0x3c, 0x4c, 0x11, 0x82, 0x61, - 0x84, 0xc2, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xe9, 0x40, 0x0e, - 0xe5, 0xe0, 0x0e, 0xf4, 0x30, 0x25, 0x28, 0x46, 0x2c, 0xe1, 0x90, 0x0e, - 0xf2, 0xe0, 0x06, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, - 0xee, 0x30, 0x25, 0x30, 0x46, 0x50, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, - 0xec, 0x10, 0x0e, 0xee, 0x70, 0x0e, 0xf5, 0x10, 0x0e, 0xe7, 0x50, 0x0e, - 0xbf, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, - 0x53, 0x02, 0x64, 0xc4, 0x14, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x30, 0x0e, - 0xef, 0xd0, 0x0e, 0xf0, 0x90, 0x0e, 0xec, 0x50, 0x0e, 0xbf, 0xf0, 0x0e, - 0xf0, 0x40, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x0f, 0x53, 0x06, 0x85, - 0x71, 0x46, 0x28, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xf6, 0x50, 0x0e, - 0xf2, 0x40, 0x0f, 0xe5, 0x80, 0x0f, 0x53, 0x82, 0x37, 0x00, 0x00, 0x00, - 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, - 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, - 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, - 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, - 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, - 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, - 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, - 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, - 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, - 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, - 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, - 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, - 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, - 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, - 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, - 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, - 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, - 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, - 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, - 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, - 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, - 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, - 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, - 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, - 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, - 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, - 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, - 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, - 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, - 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, - 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, - 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, - 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, - 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, - 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, - 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, - 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, - 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, - 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, - 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, - 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, - 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, - 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, - 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, - 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, - 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, - 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, - 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, - 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, - 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, - 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, - 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, - 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, - 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, - 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0xf0, 0xb0, 0x5d, 0xf9, 0x73, 0xce, - 0x83, 0xfd, 0x15, 0x11, 0x4d, 0xc4, 0x05, 0x00, 0x00, 0x61, 0x20, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, - 0x00, 0x09, 0x00, 0x00, 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6, - 0x22, 0x04, 0x41, 0x10, 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88, - 0x95, 0x40, 0x19, 0x14, 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14, - 0x66, 0x00, 0x66, 0x00, 0x00, 0xe3, 0x11, 0x8c, 0x84, 0x49, 0x14, 0x94, - 0xf1, 0x88, 0x87, 0xd2, 0x28, 0x0a, 0xca, 0x20, 0xc3, 0x60, 0x30, 0x26, - 0x04, 0xf2, 0x19, 0x8f, 0x98, 0x30, 0xaf, 0xa1, 0xa0, 0x0c, 0x32, 0x1c, - 0x49, 0x64, 0x42, 0x20, 0x1f, 0x0b, 0x0a, 0xf8, 0x8c, 0x47, 0x60, 0xdd, - 0x18, 0x40, 0x14, 0x94, 0x41, 0x06, 0xc6, 0xb9, 0x4c, 0x08, 0xe4, 0x63, - 0x45, 0x00, 0x9f, 0xf1, 0x88, 0x4e, 0x0c, 0xd0, 0xc0, 0xa2, 0xa0, 0x0c, - 0x32, 0x44, 0x53, 0x67, 0x42, 0x20, 0x1f, 0x2b, 0x02, 0xf8, 0x8c, 0x47, - 0x84, 0xc1, 0x19, 0xb4, 0x01, 0x47, 0x41, 0x19, 0x64, 0x08, 0xb2, 0xcf, - 0x82, 0x4a, 0x3e, 0x83, 0x0c, 0x83, 0x26, 0x06, 0x16, 0x4c, 0xf2, 0xb1, - 0x21, 0x80, 0xcf, 0x20, 0x83, 0xd1, 0x99, 0x81, 0x05, 0x91, 0x7c, 0x6c, - 0x08, 0xe0, 0x33, 0xc8, 0x90, 0x80, 0x81, 0x1a, 0x58, 0xf0, 0xc8, 0xc7, - 0x86, 0x00, 0x3e, 0xe3, 0x11, 0x6e, 0x40, 0x07, 0x7a, 0x80, 0x06, 0x14, - 0x94, 0x41, 0x86, 0xc0, 0x0c, 0xd8, 0xc0, 0x02, 0x31, 0x90, 0xcf, 0x20, - 0xc3, 0x70, 0x06, 0x6f, 0x60, 0x01, 0x18, 0xc8, 0x67, 0x90, 0xa1, 0x48, - 0x03, 0x39, 0xb0, 0xa0, 0x93, 0xcf, 0x20, 0xc3, 0xb1, 0x06, 0x75, 0x60, - 0x81, 0x26, 0x9f, 0x41, 0x06, 0x3e, 0x78, 0x03, 0x3a, 0xb0, 0x2c, 0x90, - 0xcf, 0x20, 0x83, 0x1f, 0xc4, 0xc1, 0x1d, 0x98, 0x13, 0xc8, 0xc7, 0x92, - 0x01, 0x3e, 0x16, 0x30, 0xf0, 0xb1, 0x20, 0x81, 0x8f, 0x05, 0x08, 0x7c, - 0x2c, 0x28, 0xe0, 0x33, 0xdb, 0x90, 0x07, 0x01, 0x30, 0xdb, 0x10, 0x94, - 0x42, 0x30, 0xdb, 0x10, 0x94, 0x82, 0x90, 0x41, 0x40, 0x0c, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, 0xa0, 0x83, 0x23, 0x0f, - 0x10, 0x3e, 0xd8, 0x72, 0x0c, 0x01, 0x1d, 0x1c, 0x7c, 0x80, 0xe4, 0xc1, - 0x96, 0xe3, 0x08, 0xe8, 0xe0, 0xe0, 0x03, 0x24, 0x0f, 0xb6, 0x1c, 0x4c, - 0x40, 0x07, 0x07, 0x1f, 0x20, 0x79, 0xb0, 0xe5, 0x88, 0x02, 0x3a, 0x38, - 0xf8, 0x00, 0xc9, 0x83, 0x2d, 0x87, 0x15, 0xd0, 0xc1, 0x91, 0x07, 0x08, - 0x1f, 0x6c, 0x39, 0xc6, 0x20, 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, - 0x00, 0xfd, 0x02, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, - 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, - 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, - 0x42, 0x84, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, - 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, - 0x72, 0x24, 0x07, 0xc8, 0x08, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, - 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, - 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, - 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, - 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, - 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, - 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, - 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, - 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, - 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, - 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, - 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, - 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, - 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, - 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, - 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, - 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, - 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, - 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, - 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, - 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, - 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, - 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, - 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, - 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, - 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, - 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, - 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, - 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, - 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, - 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, - 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, - 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, - 0x72, 0x00, 0x36, 0x6c, 0xc2, 0x00, 0x2c, 0x40, 0x35, 0x84, 0x43, 0x3a, - 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, - 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, - 0xcc, 0x03, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x13, 0x84, 0x40, 0x00, 0x89, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x08, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4, - 0x84, 0x04, 0x13, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x88, - 0x8c, 0x0b, 0x84, 0x84, 0x4c, 0x10, 0x3c, 0x33, 0x00, 0xc3, 0x08, 0x04, - 0x30, 0x8c, 0x20, 0x00, 0x67, 0x49, 0x53, 0x44, 0x09, 0x93, 0xcf, 0x1e, - 0xc0, 0x40, 0x44, 0x9c, 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x12, 0x42, 0x00, - 0x00, 0x00, 0x00, 0x06, 0x11, 0x06, 0xa1, 0x10, 0x21, 0x41, 0x54, 0x03, - 0x01, 0x73, 0x04, 0x60, 0x90, 0x02, 0x38, 0x47, 0x00, 0x0a, 0x83, 0x08, - 0x80, 0x30, 0x8c, 0x30, 0x00, 0xc3, 0x08, 0x04, 0x32, 0x02, 0x00, 0x00, + 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, + 0x54, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0xac, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, + 0xde, 0x21, 0x0c, 0x00, 0x00, 0x28, 0x03, 0x00, 0x00, 0x0b, 0x82, 0x20, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, + 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, + 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, + 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, + 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, + 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x48, 0x11, 0x62, 0xa8, + 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, + 0x00, 0x79, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, + 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, + 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, + 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, + 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, + 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, + 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78, + 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70, + 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, + 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, + 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00, + 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, + 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d, + 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d, + 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d, + 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, + 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68, + 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, + 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, + 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, + 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, + 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70, + 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98, + 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, + 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, + 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d, + 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, + 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58, + 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0, + 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, + 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f, + 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d, + 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, + 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c, 0xc2, 0x00, 0x2c, 0x40, + 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83, + 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, 0x84, 0x03, + 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0x61, 0x1b, 0x08, 0x60, 0x01, + 0xaa, 0x21, 0x1c, 0xd2, 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, + 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xda, 0x20, 0x1c, + 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, + 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x60, 0x87, 0x10, 0xc0, + 0x30, 0x82, 0x00, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87, + 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07, + 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07, + 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x52, 0x88, + 0x11, 0x8c, 0xa1, 0x33, 0x10, 0x30, 0x47, 0x00, 0x06, 0x29, 0xa0, 0xe6, + 0x08, 0x40, 0x61, 0x10, 0x21, 0x10, 0x86, 0x11, 0x08, 0x65, 0x04, 0x00, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51, @@ -715,111 +174,97 @@ const unsigned char sdl_metallib[] = { 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18, - 0x03, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, - 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xc2, 0x11, 0x80, 0x42, - 0x28, 0x81, 0x22, 0x28, 0x88, 0x02, 0x2a, 0x8c, 0x02, 0x29, 0x94, 0x82, - 0x29, 0x1c, 0xd2, 0xc2, 0x19, 0x01, 0x28, 0x8c, 0x42, 0x28, 0x88, 0x02, - 0x29, 0x94, 0x82, 0xa1, 0x1c, 0x4b, 0x88, 0x04, 0x00, 0x79, 0x18, 0x00, - 0x00, 0x27, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, - 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0x42, - 0x1c, 0x40, 0x42, 0x51, 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, - 0xd3, 0x2b, 0x1b, 0x62, 0x20, 0xc3, 0x21, 0x20, 0x02, 0xdf, 0x20, 0x08, + 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00, + 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, + 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x52, 0x25, 0x30, 0x02, + 0x50, 0x80, 0x01, 0x45, 0x50, 0x20, 0x65, 0x50, 0x08, 0x05, 0x41, 0x6c, + 0x04, 0x80, 0xd6, 0x58, 0x82, 0x24, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, + 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x86, 0x42, + 0x24, 0xc0, 0xa2, 0x50, 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, + 0xd3, 0x2b, 0x1b, 0x62, 0x28, 0x41, 0x22, 0x28, 0x07, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, - 0x25, 0x07, 0x07, 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, - 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x25, 0x07, 0x27, 0x65, 0x88, 0x70, - 0x10, 0x43, 0x0c, 0x64, 0x40, 0x0a, 0x24, 0x60, 0xd1, 0x54, 0x46, 0x17, - 0xc6, 0x36, 0x04, 0x39, 0x0e, 0x64, 0x40, 0x06, 0x24, 0xe0, 0x16, 0x96, - 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, 0x42, 0x56, - 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, 0x26, 0xc6, - 0x56, 0x36, 0x44, 0x38, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, - 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, - 0x63, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, - 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, - 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, 0xb9, 0x85, - 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x8e, 0x86, 0x51, 0x58, 0x9a, 0x9c, 0x8b, - 0x5c, 0x99, 0x1b, 0x59, 0x99, 0xdc, 0x17, 0x5d, 0x98, 0xdc, 0x59, 0x19, - 0x1d, 0xa3, 0xb0, 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, - 0xb8, 0xb2, 0x2f, 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, - 0x74, 0x34, 0x43, 0x90, 0xe3, 0x41, 0x82, 0x03, 0x3a, 0xa2, 0x21, 0xc2, - 0x21, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x31, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, - 0x73, 0xa3, 0xfb, 0x4a, 0x73, 0x83, 0xab, 0xa3, 0x63, 0x76, 0x56, 0xe6, - 0x56, 0x26, 0x17, 0x46, 0x57, 0x46, 0x86, 0x82, 0x03, 0xf7, 0x36, 0x97, - 0x46, 0x97, 0xf6, 0xe6, 0x46, 0x64, 0x27, 0xf3, 0x65, 0x96, 0x42, 0x25, - 0x2c, 0x4d, 0xce, 0x65, 0xac, 0xcc, 0x8d, 0xae, 0x4c, 0x8e, 0x4f, 0x58, - 0x9a, 0x9c, 0x0b, 0x5c, 0x99, 0xdc, 0x1c, 0x5c, 0xd9, 0x18, 0x5d, 0x9a, - 0x5d, 0x19, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x32, 0x61, 0x69, - 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0xe0, - 0xde, 0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0x86, 0x48, 0x48, 0x70, 0x50, - 0x47, 0x75, 0x58, 0xc7, 0x75, 0x40, 0x07, 0x76, 0x64, 0x87, 0x46, 0xeb, - 0xac, 0xcc, 0xad, 0x4c, 0x2e, 0x8c, 0xae, 0x8c, 0x0c, 0xa5, 0x66, 0xec, - 0x8d, 0xed, 0x4d, 0x8e, 0xc8, 0x8e, 0xe6, 0xcb, 0x2c, 0x85, 0xc5, 0xd8, - 0x1b, 0xdb, 0x9b, 0xdc, 0x10, 0x09, 0x19, 0x0e, 0xea, 0xe0, 0x0e, 0xeb, - 0xb8, 0x0e, 0xe8, 0x88, 0x8e, 0xec, 0xe8, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, - 0x88, 0xd5, 0x99, 0x99, 0x95, 0xc9, 0xf1, 0x09, 0x4b, 0x93, 0x73, 0x11, - 0xab, 0x33, 0x33, 0x2b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0xa3, 0x14, - 0x96, 0x26, 0xe7, 0xc2, 0xf6, 0x36, 0x16, 0x46, 0x97, 0xf6, 0xe6, 0xf6, - 0x95, 0xe6, 0x46, 0x56, 0x86, 0x47, 0x24, 0x2c, 0x4d, 0xce, 0x45, 0xae, - 0x2c, 0x8c, 0x8c, 0x54, 0x58, 0x9a, 0x9c, 0xcb, 0x1c, 0x9d, 0x5c, 0xdd, - 0x18, 0xdd, 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x9a, 0x9b, 0xd9, 0x1b, - 0x0b, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x32, 0x73, 0x63, 0x52, 0x47, 0x42, - 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x64, 0xe8, 0xca, 0xf0, 0xe8, - 0xea, 0xe4, 0xca, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, 0xa8, 0xa4, 0xb9, 0xc1, - 0xd5, 0xd1, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x71, 0x19, 0x7b, 0x63, 0x7b, - 0x93, 0xfb, 0x9a, 0x1b, 0x0b, 0x63, 0x2b, 0xa3, 0x43, 0xf7, 0xe6, 0x56, - 0xd6, 0x16, 0x06, 0xf7, 0xd5, 0x56, 0x46, 0x87, 0xf6, 0x46, 0xc6, 0x87, - 0xee, 0xcd, 0xad, 0xac, 0x2d, 0x0c, 0xee, 0xcb, 0x2c, 0x6c, 0x8c, 0xee, - 0x4d, 0x2e, 0x86, 0x0f, 0xdd, 0x9b, 0x5b, 0x59, 0x5b, 0x18, 0xdc, 0x97, - 0x59, 0xd8, 0x18, 0xdd, 0x9b, 0x9c, 0x0c, 0x9f, 0x39, 0x32, 0xb9, 0xaf, - 0x3b, 0xb4, 0x34, 0xba, 0xb2, 0x2f, 0xb8, 0xb7, 0x34, 0x37, 0xba, 0x21, - 0xb0, 0x80, 0x04, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x65, 0x80, 0x08, - 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x66, 0x80, 0x14, 0x88, 0x80, 0x04, - 0x07, 0x19, 0x1c, 0x67, 0x80, 0x1c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, - 0x68, 0x80, 0x20, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x69, 0x80, 0x24, - 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x6a, 0x80, 0x28, 0x88, 0x80, 0x04, - 0x07, 0x19, 0x1c, 0x6b, 0x80, 0x2c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, - 0x6c, 0xc0, 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, 0xec, 0x8b, 0x2e, - 0x0f, 0xae, 0xec, 0x6b, 0x2e, 0x4d, 0xaf, 0x8c, 0x57, 0x58, 0x9a, 0x9c, - 0x4b, 0x98, 0xdc, 0xd9, 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x18, 0x5b, - 0xda, 0x99, 0xdb, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x9f, 0x29, 0xb4, 0x30, - 0xb2, 0x32, 0xb9, 0xa1, 0x37, 0xb7, 0x39, 0xba, 0x30, 0x37, 0xba, 0x39, - 0x06, 0x63, 0x43, 0xc8, 0x00, 0x21, 0x8e, 0xef, 0x00, 0x03, 0xc4, 0x38, - 0xc2, 0x00, 0x09, 0x90, 0xe1, 0x10, 0x83, 0x63, 0x0c, 0x8e, 0x36, 0x38, - 0xdc, 0x00, 0x31, 0x8e, 0x37, 0x40, 0x84, 0x03, 0x3a, 0xe0, 0xe0, 0xc8, - 0x8e, 0x38, 0x18, 0x62, 0x1c, 0xdb, 0xe1, 0x1d, 0x72, 0x30, 0xc4, 0x30, - 0x80, 0x63, 0x3a, 0xe6, 0x80, 0xd5, 0x97, 0x16, 0xd5, 0x54, 0x4c, 0xcd, - 0x14, 0x5a, 0x18, 0x59, 0x99, 0xdc, 0xd0, 0x9b, 0xdb, 0x1c, 0x5d, 0x98, - 0x1b, 0xdd, 0x1c, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, 0x37, 0xba, 0x32, - 0x37, 0x3a, 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, 0x69, 0x6d, 0x70, - 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x43, - 0x84, 0xe3, 0x0e, 0x86, 0x18, 0x87, 0x1d, 0x1c, 0x78, 0xa0, 0x34, 0x43, - 0x8c, 0x83, 0x0c, 0x8e, 0x3c, 0x50, 0x9a, 0x21, 0x62, 0x70, 0xd4, 0xc1, - 0xa1, 0x07, 0x4a, 0x73, 0xe8, 0x81, 0xf2, 0x1c, 0x7a, 0xa0, 0x40, 0x87, - 0x1e, 0x28, 0xce, 0xa1, 0x07, 0x4a, 0x74, 0xe8, 0x81, 0x22, 0x1d, 0x7a, - 0xa0, 0x4c, 0x87, 0x1e, 0x28, 0xcc, 0x10, 0xe3, 0xd8, 0x83, 0x43, 0x0f, - 0x14, 0x87, 0x64, 0x10, 0x96, 0x26, 0xd7, 0x12, 0xc6, 0x96, 0x16, 0x36, - 0xd7, 0x32, 0x37, 0xf6, 0x06, 0x57, 0x36, 0x87, 0x32, 0x45, 0xc4, 0xf4, - 0x35, 0xf5, 0xc6, 0x96, 0x46, 0xf6, 0x65, 0x26, 0x17, 0x76, 0xd6, 0x56, - 0xe6, 0x46, 0x97, 0x32, 0x84, 0x38, 0xfc, 0xe0, 0xe8, 0x03, 0x5a, 0x61, - 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x32, 0x29, 0x43, 0x8c, 0x03, - 0x14, 0x0e, 0x3f, 0x38, 0xfe, 0x60, 0x88, 0x70, 0x80, 0xc2, 0x88, 0x88, - 0x1d, 0xd8, 0xc1, 0x1e, 0xda, 0xc1, 0x0d, 0xda, 0xe1, 0x1d, 0xc8, 0xa1, - 0x1e, 0xd8, 0xa1, 0x1c, 0xdc, 0xc0, 0x1c, 0xd8, 0x21, 0x1c, 0xce, 0x61, - 0x1e, 0xa6, 0x08, 0xc1, 0x30, 0x42, 0x61, 0x07, 0x76, 0xb0, 0x87, 0x76, - 0x70, 0x83, 0x74, 0x20, 0x87, 0x72, 0x70, 0x07, 0x7a, 0x98, 0x12, 0x14, - 0x23, 0x96, 0x70, 0x48, 0x07, 0x79, 0x70, 0x03, 0x7b, 0x28, 0x07, 0x79, - 0x98, 0x87, 0x74, 0x78, 0x07, 0x77, 0x98, 0x12, 0x18, 0x23, 0xa8, 0x70, - 0x48, 0x07, 0x79, 0x70, 0x03, 0x76, 0x08, 0x07, 0x77, 0x38, 0x87, 0x7a, - 0x08, 0x87, 0x73, 0x28, 0x87, 0x5f, 0xb0, 0x87, 0x72, 0x90, 0x87, 0x79, - 0x48, 0x87, 0x77, 0x70, 0x87, 0x29, 0x01, 0x32, 0x62, 0x0a, 0x87, 0x74, - 0x90, 0x07, 0x37, 0x18, 0x87, 0x77, 0x68, 0x07, 0x78, 0x48, 0x07, 0x76, - 0x28, 0x87, 0x5f, 0x78, 0x07, 0x78, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, - 0x98, 0x87, 0x29, 0x83, 0xc2, 0x38, 0x23, 0x98, 0x70, 0x48, 0x07, 0x79, - 0x70, 0x03, 0x73, 0x90, 0x87, 0x70, 0x38, 0x87, 0x76, 0x28, 0x07, 0x77, - 0xa0, 0x87, 0x29, 0x01, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, + 0x85, 0x06, 0x86, 0x06, 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, + 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, + 0x88, 0x90, 0x10, 0x43, 0x0c, 0x25, 0x50, 0x10, 0x45, 0x60, 0xd1, 0x54, + 0x46, 0x17, 0xc6, 0x36, 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, 0x45, 0xe0, + 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, + 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, + 0x26, 0xc6, 0x56, 0x36, 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, + 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x84, 0x64, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, + 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, + 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, + 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, 0x58, 0x9a, + 0x9c, 0x0b, 0xdc, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, 0xa3, 0xb0, + 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f, + 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x64, + 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, 0xda, 0xca, + 0x88, 0xc0, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, 0x51, 0x92, + 0x27, 0x81, 0x92, 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, 0x9c, 0x8b, + 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, + 0x1d, 0xad, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32, 0x94, + 0x9a, 0xb1, 0x37, 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, 0xb3, 0x14, + 0x16, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, 0xac, 0x04, + 0x4a, 0xa2, 0x44, 0x4a, 0x2e, 0x3a, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xcc, 0xd8, 0xde, + 0xc2, 0xe8, 0x98, 0xc0, 0xbd, 0xa5, 0xb9, 0xd1, 0x4d, 0xa5, 0xe9, 0x95, + 0x0d, 0x51, 0x92, 0x2c, 0x81, 0x12, 0x2d, 0x91, 0x92, 0x6d, 0x88, 0x91, + 0x50, 0x09, 0x96, 0x70, 0x84, 0xc2, 0xd2, 0xe4, 0x5c, 0xec, 0xca, 0xe4, + 0xe8, 0xca, 0xf0, 0xbe, 0xd2, 0xdc, 0xe0, 0xea, 0xe8, 0x28, 0x85, 0xa5, + 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, 0x85, 0xd1, 0xa5, 0xbd, 0xb9, 0x7d, 0xa5, + 0xb9, 0x91, 0x95, 0xe1, 0xd1, 0x3b, 0x2b, 0x73, 0x2b, 0x93, 0x0b, 0xa3, + 0x2b, 0x23, 0x43, 0xf9, 0xfa, 0x0a, 0x4b, 0x93, 0xfb, 0x82, 0x63, 0x0b, + 0x1b, 0x2b, 0x43, 0x7b, 0x63, 0x23, 0x2b, 0x93, 0xfb, 0xfa, 0x4a, 0xa1, + 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x27, 0x33, 0x84, 0x52, 0x84, 0xc4, 0x4b, + 0x3e, 0x45, 0x50, 0x82, 0x04, 0x0c, 0x12, 0x28, 0x09, 0x83, 0x44, 0x4a, + 0xa6, 0x21, 0x94, 0x12, 0x24, 0x5e, 0xf2, 0x29, 0x81, 0x12, 0x24, 0x60, + 0x90, 0x40, 0x49, 0x94, 0x48, 0xc9, 0x45, 0x25, 0x2c, 0x4d, 0xce, 0x45, + 0xac, 0xce, 0xcc, 0xac, 0x4c, 0x8e, 0x4f, 0x58, 0x9a, 0x9c, 0x8b, 0x58, + 0x9d, 0x99, 0x59, 0x99, 0xdc, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x91, 0xb0, + 0x34, 0x39, 0x17, 0xb9, 0xb2, 0x30, 0x32, 0x46, 0x61, 0x69, 0x72, 0x2e, + 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0xbc, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xe8, 0xf2, + 0xe0, 0xca, 0xbe, 0xc2, 0xd8, 0xd2, 0xce, 0xdc, 0xbe, 0xe6, 0xd2, 0xf4, + 0xca, 0x88, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xd1, 0xe0, 0xd1, 0x50, 0x81, + 0x93, 0x7b, 0x53, 0x2b, 0x1b, 0xa3, 0x4b, 0x7b, 0x73, 0x1b, 0x02, 0x06, + 0x0a, 0x91, 0x90, 0x41, 0x52, 0x06, 0xca, 0x90, 0x7c, 0x0a, 0xa1, 0x04, + 0x89, 0x19, 0x24, 0x67, 0xa0, 0x0c, 0x09, 0x1a, 0x28, 0x45, 0x02, 0x25, + 0x69, 0x90, 0x48, 0x89, 0x1a, 0x30, 0xa1, 0x93, 0x0b, 0x73, 0x9b, 0x33, + 0x7b, 0x93, 0x6b, 0x1b, 0x02, 0x06, 0x8a, 0x91, 0x90, 0x41, 0x52, 0x06, + 0xca, 0x90, 0x7c, 0x8a, 0xa1, 0x04, 0x89, 0x19, 0x24, 0x67, 0xa0, 0x0c, + 0x09, 0x1a, 0x28, 0x45, 0x02, 0x25, 0x69, 0x90, 0x48, 0x09, 0x1b, 0x0c, + 0x41, 0x12, 0x31, 0x48, 0xc6, 0x20, 0x59, 0x83, 0xa4, 0x0d, 0x86, 0x18, + 0x08, 0x90, 0x74, 0x89, 0x1b, 0xf0, 0x79, 0x6b, 0x73, 0x4b, 0x83, 0x7b, + 0xa3, 0x2b, 0x73, 0xa3, 0x03, 0x19, 0x43, 0x0b, 0x93, 0xe3, 0x33, 0x95, + 0xd6, 0x06, 0xc7, 0x56, 0x06, 0x32, 0xb4, 0xb2, 0x02, 0x42, 0x25, 0x14, + 0x14, 0x34, 0x44, 0x48, 0xe2, 0x60, 0x88, 0x91, 0xc0, 0x41, 0x22, 0x07, + 0x4c, 0x32, 0xc4, 0x48, 0xe6, 0x20, 0x99, 0x03, 0x26, 0xa1, 0x18, 0x84, + 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, + 0xc1, 0x95, 0xcd, 0xa1, 0x4c, 0x11, 0x31, 0x7d, 0x4d, 0xbd, 0xb1, 0xa5, + 0x91, 0x7d, 0xd9, 0x95, 0xc9, 0xd1, 0x95, 0xe1, 0xa5, 0x0c, 0x21, 0x12, + 0x3b, 0x48, 0xea, 0x80, 0x56, 0x58, 0x9a, 0x5c, 0x4b, 0x18, 0x5b, 0x5a, + 0xd8, 0x5c, 0xcb, 0xdc, 0xd8, 0x1b, 0x5c, 0x59, 0x4b, 0x98, 0xdc, 0x19, + 0xca, 0x4c, 0xca, 0x10, 0x23, 0xc1, 0x83, 0xc4, 0x0e, 0x92, 0x3b, 0x18, + 0x22, 0x24, 0x78, 0x40, 0x2b, 0x2c, 0x4d, 0xae, 0x25, 0x8c, 0x2d, 0x2d, + 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, 0x25, 0x4c, 0xee, 0x0c, + 0x45, 0x26, 0x65, 0x88, 0x91, 0xec, 0x41, 0x62, 0x07, 0x89, 0x1e, 0x0c, + 0x11, 0x92, 0x3d, 0x18, 0x11, 0xb1, 0x03, 0x3b, 0xd8, 0x43, 0x3b, 0xb8, + 0x41, 0x3b, 0xbc, 0x03, 0x39, 0xd4, 0x03, 0x3b, 0x94, 0x83, 0x1b, 0x98, + 0x03, 0x3b, 0x84, 0xc3, 0x39, 0xcc, 0xc3, 0x14, 0x21, 0x18, 0x46, 0x28, + 0xec, 0xc0, 0x0e, 0xf6, 0xd0, 0x0e, 0x6e, 0x90, 0x0e, 0xe4, 0x50, 0x0e, + 0xee, 0x40, 0x0f, 0x53, 0x82, 0x62, 0xc4, 0x12, 0x0e, 0xe9, 0x20, 0x0f, + 0x6e, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, + 0x53, 0x02, 0x63, 0x04, 0x15, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0xc0, 0x0e, + 0xe1, 0xe0, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x70, 0x0e, 0xe5, 0xf0, 0x0b, + 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x25, + 0x40, 0x46, 0x4c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe3, 0xf0, 0x0e, + 0xed, 0x00, 0x0f, 0xe9, 0xc0, 0x0e, 0xe5, 0xf0, 0x0b, 0xef, 0x00, 0x0f, + 0xf4, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0xf3, 0x30, 0x65, 0x50, 0x18, 0x67, + 0x84, 0x12, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0f, 0xe5, 0x20, 0x0f, + 0xf4, 0x50, 0x0e, 0xf8, 0x30, 0x25, 0x78, 0x03, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, @@ -875,396 +320,102 @@ const unsigned char sdl_metallib[] = { 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x06, 0x20, 0xb1, 0x5d, 0xf9, 0xb3, 0xce, 0x82, 0x0c, 0x7f, 0x11, - 0x01, 0x06, 0x43, 0x34, 0x13, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, - 0x00, 0x06, 0x00, 0x00, 0x00, 0xd4, 0x73, 0x10, 0x41, 0x10, 0x68, 0x84, - 0x65, 0x30, 0x03, 0x40, 0x3c, 0x03, 0x40, 0x30, 0x46, 0x00, 0x82, 0x20, - 0x88, 0x7f, 0x00, 0x00, 0x00, 0xe3, 0x0d, 0x06, 0x44, 0x50, 0x30, 0xe6, - 0x18, 0x88, 0xc0, 0x1b, 0x64, 0x08, 0x0a, 0x64, 0x8e, 0x21, 0x28, 0x10, - 0x0b, 0x18, 0xf9, 0x64, 0x10, 0x10, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x5b, 0x8a, 0x20, 0xe0, 0x83, 0x23, 0x14, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0xd0, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x71, 0x03, 0x00, - 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, - 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, - 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, - 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, - 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, - 0x48, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, - 0x00, 0x51, 0x18, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, - 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, - 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, - 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, - 0x1d, 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, - 0x1d, 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, - 0x0d, 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, - 0xc0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, - 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, - 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, - 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, - 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, - 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, - 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, - 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, - 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, - 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, - 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, - 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, - 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, - 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, - 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, - 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, - 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, - 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, - 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, - 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, - 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, - 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, - 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, - 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, - 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, - 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, - 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, - 0xc3, 0x26, 0x10, 0xc0, 0x02, 0x54, 0x43, 0x38, 0xa4, 0x83, 0x3c, 0xb4, - 0x81, 0x38, 0xd4, 0x83, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0xb8, - 0xc3, 0x3b, 0xb4, 0x41, 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00, - 0x1b, 0x8c, 0xa1, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x10, 0x06, 0xb0, 0x00, - 0xd5, 0x06, 0xa4, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, - 0xa8, 0x36, 0x18, 0x46, 0x00, 0x2c, 0x40, 0xb5, 0xc1, 0x38, 0x04, 0x60, - 0x01, 0xaa, 0x0d, 0x08, 0xf2, 0xff, 0xff, 0xff, 0xff, 0x03, 0xc0, 0x00, - 0x12, 0x50, 0x01, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x43, 0x61, 0x1c, 0x13, 0x06, - 0xc4, 0x38, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x28, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, - 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, - 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x60, 0x33, 0x00, 0xc3, 0x08, 0x04, - 0x30, 0x8c, 0x20, 0x00, 0x67, 0x49, 0x53, 0x44, 0x09, 0x93, 0xcf, 0x1e, - 0xc0, 0x40, 0x44, 0x9c, 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x12, 0x42, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x11, 0x06, 0xe1, 0x28, 0x69, 0x8a, 0x28, - 0x61, 0xf2, 0xff, 0x89, 0xb8, 0x26, 0x2a, 0x22, 0x7e, 0x7b, 0xf8, 0xa7, - 0x31, 0x02, 0x60, 0x10, 0xa1, 0x08, 0x2e, 0x92, 0xa6, 0x88, 0x12, 0x26, - 0xff, 0x97, 0x00, 0xe6, 0x59, 0x88, 0xe8, 0x9f, 0xc6, 0x08, 0x80, 0x41, - 0x84, 0x43, 0x28, 0x47, 0x08, 0x41, 0x10, 0x83, 0x28, 0xcd, 0x11, 0x04, - 0x73, 0x04, 0x60, 0x30, 0x8c, 0x20, 0x30, 0x05, 0x09, 0x06, 0x89, 0xd5, - 0x16, 0x20, 0x37, 0x10, 0x90, 0x02, 0x6c, 0x8e, 0x00, 0x14, 0x06, 0x11, - 0x00, 0x61, 0x18, 0x61, 0x60, 0x86, 0x11, 0x06, 0x60, 0x18, 0x81, 0x60, - 0x46, 0x00, 0x00, 0x00, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, - 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, - 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, - 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, - 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, - 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, - 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, - 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, - 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, - 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, - 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, - 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, - 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, - 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, - 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, - 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, - 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x43, 0x18, 0x05, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x21, 0xcc, 0x03, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x16, 0x08, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, - 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, - 0x62, 0x23, 0x00, 0x85, 0x50, 0x02, 0x45, 0x50, 0x10, 0x05, 0x54, 0x06, - 0x85, 0x51, 0x20, 0x85, 0x52, 0x30, 0x85, 0x53, 0x0a, 0x24, 0x0b, 0x67, - 0x04, 0xa0, 0x30, 0x0a, 0xa1, 0x20, 0x0a, 0xa4, 0x50, 0x0a, 0x86, 0xe2, - 0x58, 0x42, 0x24, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x65, 0x01, 0x00, - 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, - 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0x53, 0x40, 0x40, 0x74, 0x51, - 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, - 0x30, 0x04, 0x24, 0x30, 0x03, 0xdf, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, - 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, - 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x25, 0x07, 0x07, 0x04, - 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, 0x46, - 0x66, 0xc6, 0x25, 0x07, 0x27, 0x65, 0x88, 0x00, 0x11, 0x43, 0x0c, 0x86, - 0x60, 0x0c, 0x46, 0x60, 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36, 0x04, 0x81, - 0x0e, 0x86, 0x60, 0x08, 0x46, 0xe0, 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, - 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, - 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36, 0x44, 0x80, - 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x04, 0x68, 0x21, 0x19, 0x84, - 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, - 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, - 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, - 0x11, 0xa0, 0x86, 0x51, 0x58, 0x9a, 0x9c, 0x8b, 0x5c, 0x99, 0x1b, 0x59, - 0x99, 0xdc, 0x17, 0x5d, 0x98, 0xdc, 0x59, 0x19, 0x1d, 0xa3, 0xb0, 0x34, - 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f, 0xb7, - 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x43, 0x10, - 0xe8, 0x61, 0x04, 0x08, 0x82, 0xa2, 0x21, 0x02, 0x24, 0x91, 0x09, 0x4b, - 0x93, 0x73, 0x81, 0x7b, 0x9b, 0x4b, 0xa3, 0x4b, 0x7b, 0x73, 0xa3, 0x12, - 0x96, 0x26, 0xe7, 0x32, 0x56, 0xe6, 0x46, 0x57, 0x26, 0x47, 0x29, 0x2c, - 0x4d, 0xce, 0xc5, 0xed, 0xed, 0x0b, 0xae, 0x4c, 0x6e, 0x0e, 0xae, 0x6c, - 0x8c, 0x2e, 0xcd, 0xae, 0x8c, 0x4c, 0x58, 0x9a, 0x9c, 0x4b, 0x98, 0xdc, - 0xd9, 0x97, 0x5b, 0x58, 0x5b, 0x19, 0x11, 0xb8, 0xb7, 0xb9, 0x34, 0xba, - 0xb4, 0x37, 0xb7, 0x21, 0x10, 0x23, 0x40, 0x14, 0x54, 0x41, 0x16, 0x04, - 0x41, 0x11, 0x74, 0x41, 0x18, 0xa5, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, - 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, 0xaf, 0x34, 0x37, 0xb8, 0x3a, 0x3a, - 0x5a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x7c, - 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca, 0xc6, 0xe8, - 0xd2, 0xec, 0xca, 0x58, 0x8c, 0xbd, 0xb1, 0xbd, 0xc9, 0x0d, 0x91, 0x18, - 0x02, 0xd2, 0xa0, 0x0d, 0xaa, 0x20, 0x0e, 0x82, 0xa0, 0x08, 0xba, 0xa0, - 0x8e, 0xd9, 0x59, 0x99, 0x5b, 0x99, 0x5c, 0x18, 0x5d, 0x19, 0x19, 0x0a, - 0x0e, 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b, 0x1c, 0x19, 0x91, 0x9d, 0xcc, - 0x97, 0x59, 0x0a, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x22, 0x74, - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x43, 0x24, 0xa6, 0x80, 0x34, - 0xe8, 0x83, 0x2a, 0x88, 0x83, 0x20, 0x08, 0x0c, 0xa0, 0x0b, 0x0a, 0x03, - 0x2a, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x7c, - 0xc2, 0xd2, 0xe4, 0x5c, 0xc4, 0xea, 0xcc, 0xcc, 0xca, 0xe4, 0xbe, 0xe6, - 0xd2, 0xf4, 0xca, 0x28, 0x85, 0xa5, 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, 0x85, - 0xd1, 0xa5, 0xbd, 0xb9, 0x7d, 0xa5, 0xb9, 0x91, 0x95, 0xe1, 0x11, 0x09, - 0x4b, 0x93, 0x73, 0x91, 0x2b, 0x0b, 0x23, 0x23, 0x15, 0x96, 0x26, 0xe7, - 0x32, 0x47, 0x27, 0x57, 0x37, 0x46, 0xf7, 0x45, 0x97, 0x07, 0x57, 0xf6, - 0x95, 0xe6, 0x66, 0xf6, 0xc6, 0xc2, 0x8c, 0xed, 0x2d, 0x8c, 0x8e, 0xcc, - 0xdc, 0x98, 0xd4, 0x91, 0xd0, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, 0x1d, - 0x19, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x2f, 0xba, 0x3c, 0xb8, - 0x32, 0x2a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x5c, 0xc6, 0xde, 0xd8, 0xde, 0xe4, 0xbe, 0xe6, 0xc6, 0xc2, 0xd8, 0xca, - 0xe8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0xb5, 0x95, 0xd1, - 0xa1, 0xbd, 0x91, 0xf1, 0xa1, 0x7b, 0x73, 0x2b, 0x6b, 0x0b, 0x83, 0xfb, - 0x32, 0x0b, 0x1b, 0xa3, 0x7b, 0x93, 0x8b, 0xe1, 0x43, 0xf7, 0xe6, 0x56, - 0xd6, 0x16, 0x06, 0xf7, 0x65, 0x16, 0x36, 0x46, 0xf7, 0x26, 0x27, 0xc3, - 0x67, 0x8e, 0x4c, 0xee, 0xeb, 0x0e, 0x2d, 0x8d, 0xae, 0xec, 0x0b, 0xee, - 0x2d, 0xcd, 0x8d, 0x6e, 0x08, 0x2c, 0x30, 0x02, 0x33, 0x30, 0x02, 0x84, - 0x06, 0x50, 0x1a, 0x30, 0x03, 0x33, 0x30, 0x02, 0x84, 0x06, 0x90, 0x1a, - 0x30, 0x06, 0x33, 0x30, 0x02, 0x84, 0x06, 0xd0, 0x1a, 0x30, 0x09, 0x33, - 0x30, 0x02, 0x84, 0x06, 0x10, 0x1b, 0x30, 0x0a, 0x33, 0x30, 0x02, 0x84, - 0x06, 0x50, 0x1b, 0x30, 0x0b, 0x33, 0x30, 0x02, 0x84, 0x06, 0x90, 0x1b, - 0x30, 0x0c, 0x33, 0x30, 0x02, 0x84, 0x06, 0xd0, 0x1b, 0x30, 0x0d, 0x33, - 0x30, 0x02, 0x84, 0x06, 0x10, 0x1c, 0x30, 0x0a, 0x4b, 0x93, 0x73, 0x09, - 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, - 0xe3, 0x15, 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0x45, 0x97, 0x07, - 0x57, 0xf6, 0x15, 0xc6, 0x96, 0x76, 0xe6, 0xf6, 0x35, 0x97, 0xa6, 0x57, - 0xc6, 0x67, 0x0a, 0x2d, 0x8c, 0xac, 0x4c, 0x6e, 0xe8, 0xcd, 0x6d, 0x8e, - 0x2e, 0xcc, 0x8d, 0x6e, 0x8e, 0xc1, 0xd8, 0x10, 0x32, 0x60, 0x10, 0x68, - 0x0c, 0x20, 0x32, 0x60, 0x0e, 0xa8, 0x0c, 0x18, 0x81, 0x21, 0x20, 0x33, - 0x80, 0xce, 0x00, 0x8a, 0x03, 0x48, 0x0e, 0x98, 0x03, 0x9a, 0x03, 0x66, - 0x80, 0x20, 0x88, 0x0e, 0xa0, 0x0b, 0xaa, 0x03, 0x2e, 0x61, 0x69, 0x72, - 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x54, 0xc2, 0xd2, 0xe4, - 0x5c, 0xe6, 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0x88, 0xd1, 0x95, 0xe1, 0xd1, - 0xd5, 0xc9, 0x95, 0xc9, 0x90, 0xf1, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xb1, - 0x80, 0xcc, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xf9, 0x70, 0xa0, 0x2b, 0xc3, - 0x1b, 0x42, 0x31, 0x03, 0x74, 0x07, 0x50, 0x19, 0x30, 0x02, 0x43, 0x40, - 0x78, 0x00, 0x41, 0x50, 0x1e, 0x40, 0x17, 0xa4, 0x07, 0x5c, 0xc2, 0xd2, - 0xe4, 0x5c, 0xe6, 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0xe4, 0x78, 0xcc, 0x85, - 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0x31, 0x98, 0x1b, 0x22, 0x31, 0x0e, 0xc4, - 0x07, 0x50, 0x19, 0x30, 0x02, 0x43, 0x40, 0x10, 0xd4, 0x07, 0xd0, 0x05, - 0xf9, 0xc1, 0x10, 0x06, 0xca, 0x20, 0x0f, 0x12, 0x03, 0xc8, 0x0e, 0xa0, - 0x3d, 0x80, 0xfe, 0x60, 0x88, 0xa1, 0x00, 0xd0, 0x04, 0x81, 0x02, 0xc7, - 0x20, 0x2c, 0x4d, 0xae, 0x25, 0x8c, 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, - 0xec, 0x0d, 0xae, 0x6c, 0x0e, 0x65, 0x8a, 0x88, 0xe9, 0x6b, 0xe8, 0x0d, - 0x2e, 0xef, 0xcb, 0x4c, 0x2e, 0xec, 0xac, 0xad, 0xcc, 0x8d, 0x2e, 0x65, - 0x08, 0x01, 0x8d, 0x02, 0x24, 0x0a, 0xc4, 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, - 0xd8, 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a, 0xe8, - 0xca, 0xf0, 0xe8, 0xea, 0xe4, 0xca, 0xe6, 0x86, 0x18, 0x50, 0x29, 0x40, - 0xa3, 0x00, 0x91, 0x02, 0xb1, 0xb0, 0x34, 0xb9, 0x96, 0x30, 0xb6, 0xb4, - 0xb0, 0xb9, 0x96, 0xb9, 0xb1, 0x37, 0xb8, 0xb2, 0x96, 0xb9, 0xb0, 0x36, - 0x38, 0xb6, 0x32, 0xb9, 0xb9, 0x21, 0x06, 0x74, 0x0a, 0xd0, 0x28, 0x40, - 0xa6, 0x30, 0x84, 0x80, 0x4a, 0x01, 0x3a, 0x05, 0x5a, 0x61, 0x69, 0x72, - 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x43, 0x0c, 0x48, 0x15, 0xa0, - 0x51, 0x80, 0x52, 0x61, 0x88, 0x00, 0xa9, 0x02, 0xab, 0x2f, 0x2d, 0xaa, - 0xa9, 0x98, 0x9a, 0x29, 0xb4, 0x30, 0xb2, 0x32, 0xb9, 0xa1, 0x37, 0xb7, - 0x39, 0xba, 0x30, 0x37, 0xba, 0x39, 0x3e, 0x6f, 0x6d, 0x6e, 0x69, 0x70, - 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x7c, 0xa6, - 0xd2, 0xda, 0xe0, 0xd8, 0xca, 0x40, 0x86, 0x56, 0x56, 0x40, 0xa8, 0x84, - 0x82, 0x82, 0x86, 0x08, 0x90, 0x2b, 0x0c, 0x31, 0xa0, 0x56, 0x80, 0x5e, - 0x41, 0x82, 0x86, 0x18, 0x10, 0x1a, 0x40, 0xb0, 0x20, 0x41, 0x43, 0xc4, - 0x00, 0x62, 0x05, 0x28, 0x16, 0x24, 0x08, 0x8a, 0x05, 0x49, 0x82, 0x62, - 0x41, 0x9a, 0xa0, 0x58, 0x90, 0x22, 0x28, 0x16, 0x24, 0x0a, 0x8a, 0x05, - 0xa9, 0x82, 0x62, 0x41, 0xb2, 0xa0, 0x58, 0x90, 0x9e, 0x21, 0x06, 0x24, - 0x0b, 0x50, 0x2c, 0x48, 0xd1, 0x88, 0x88, 0x1d, 0xd8, 0xc1, 0x1e, 0xda, - 0xc1, 0x0d, 0xda, 0xe1, 0x1d, 0xc8, 0xa1, 0x1e, 0xd8, 0xa1, 0x1c, 0xdc, - 0xc0, 0x1c, 0xd8, 0x21, 0x1c, 0xce, 0x61, 0x1e, 0xa6, 0x08, 0xc1, 0x30, - 0x42, 0x61, 0x07, 0x76, 0xb0, 0x87, 0x76, 0x70, 0x83, 0x74, 0x20, 0x87, - 0x72, 0x70, 0x07, 0x7a, 0x98, 0x12, 0x14, 0x23, 0x96, 0x70, 0x48, 0x07, - 0x79, 0x70, 0x03, 0x7b, 0x28, 0x07, 0x79, 0x98, 0x87, 0x74, 0x78, 0x07, - 0x77, 0x98, 0x12, 0x18, 0x23, 0xa8, 0x70, 0x48, 0x07, 0x79, 0x70, 0x03, - 0x76, 0x08, 0x07, 0x77, 0x38, 0x87, 0x7a, 0x08, 0x87, 0x73, 0x28, 0x87, - 0x5f, 0xb0, 0x87, 0x72, 0x90, 0x87, 0x79, 0x48, 0x87, 0x77, 0x70, 0x87, - 0x29, 0x01, 0x32, 0x62, 0x0a, 0x87, 0x74, 0x90, 0x07, 0x37, 0x18, 0x87, - 0x77, 0x68, 0x07, 0x78, 0x48, 0x07, 0x76, 0x28, 0x87, 0x5f, 0x78, 0x07, - 0x78, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0x98, 0x87, 0x29, 0x83, 0xc2, - 0x38, 0x23, 0x98, 0x70, 0x48, 0x07, 0x79, 0x70, 0x03, 0x73, 0x90, 0x87, - 0x70, 0x38, 0x87, 0x76, 0x28, 0x07, 0x77, 0xa0, 0x87, 0x29, 0x41, 0x28, - 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, - 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, - 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, - 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, - 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, - 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, - 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, - 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, - 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, - 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, - 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, - 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, - 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, - 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, - 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, - 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, - 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, - 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, - 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, - 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, - 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, - 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, - 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, - 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, - 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, - 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, - 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, - 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, - 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, - 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, - 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, - 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, - 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, - 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, - 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, - 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, - 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, - 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, - 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, - 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, - 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, - 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, - 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, - 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, - 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, - 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, - 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, - 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, - 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, - 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, - 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, - 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, - 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, - 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, - 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x06, 0x10, 0xb1, 0x5d, 0xf9, 0x73, 0xce, - 0x83, 0xfd, 0x45, 0x04, 0x18, 0x0c, 0xd1, 0x4c, 0x16, 0xb0, 0x01, 0x48, - 0xe4, 0x4b, 0x00, 0xf3, 0x2c, 0xc4, 0x3f, 0x11, 0xd7, 0x44, 0x45, 0xc4, - 0x6f, 0x0f, 0x7e, 0x85, 0x17, 0xb7, 0x0d, 0x00, 0x00, 0x61, 0x20, 0x00, - 0x00, 0x21, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x64, 0xc7, 0x22, 0x80, 0x40, 0x38, 0xe6, - 0x20, 0x04, 0xa2, 0x10, 0x03, 0x5a, 0x35, 0x30, 0x02, 0x40, 0x6c, 0x06, - 0x80, 0xda, 0x08, 0x00, 0xd1, 0xb1, 0x06, 0x20, 0x10, 0x46, 0x00, 0xa8, - 0xce, 0x00, 0x50, 0x98, 0x01, 0x20, 0x30, 0x02, 0x00, 0x23, 0x06, 0xca, - 0x10, 0xa0, 0x41, 0xc3, 0x3c, 0x89, 0x81, 0x04, 0xe3, 0x0d, 0x8f, 0x26, - 0x06, 0x14, 0x8c, 0x41, 0x86, 0xa1, 0x40, 0xe6, 0x18, 0x0e, 0x61, 0x0d, - 0x06, 0x19, 0x02, 0x24, 0xb1, 0x60, 0x90, 0xcf, 0x20, 0x43, 0xa0, 0x44, - 0x83, 0x0c, 0x01, 0x32, 0x59, 0x90, 0xc9, 0x27, 0x83, 0x80, 0x18, 0x00, - 0x00, 0x05, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0, 0x40, 0x05, 0x64, 0x15, - 0xb6, 0x1c, 0x42, 0x30, 0x0b, 0xc7, 0x2a, 0x20, 0xa8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x19, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, - 0x00, 0x41, 0x06, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, - 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, - 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, - 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, - 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, - 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, - 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, 0x00, 0x8a, 0x00, 0x00, - 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, - 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, - 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, - 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xa2, 0x1d, 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, - 0xe1, 0x1c, 0xc2, 0x81, 0x1d, 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, - 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0, - 0x01, 0x88, 0x03, 0x39, 0xc0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, - 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, - 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, - 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, - 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, - 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, - 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, - 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, - 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, - 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, - 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, - 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, - 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, - 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, - 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, - 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, - 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, - 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, - 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, - 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, - 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, - 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, - 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, - 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, - 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, - 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, - 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, - 0x7a, 0x28, 0x07, 0x60, 0xc3, 0x26, 0x10, 0xc0, 0x02, 0x54, 0x43, 0x38, - 0xa4, 0x83, 0x3c, 0xb4, 0x81, 0x38, 0xd4, 0x83, 0x39, 0x98, 0x43, 0x39, - 0xc8, 0x43, 0x1b, 0xb8, 0xc3, 0x3b, 0xb4, 0x41, 0x38, 0xb0, 0x43, 0x3a, - 0x84, 0xc3, 0x3c, 0x00, 0x1b, 0xb6, 0xa1, 0x00, 0x16, 0xa0, 0x1a, 0xc2, - 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, 0xcc, 0xc1, 0x1c, 0xca, - 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d, 0xc2, 0x81, 0x1d, 0xd2, - 0x21, 0x1c, 0xe6, 0x01, 0xd8, 0x60, 0x10, 0x08, 0xb0, 0x00, 0xd5, 0x06, - 0xa3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0x03, 0x62, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x80, 0x04, 0x54, 0x1b, 0x8c, - 0x23, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x20, 0x02, 0xb0, 0x00, 0xd5, 0x06, - 0x24, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x36, - 0x18, 0xca, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50, 0x00, 0x00, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40, - 0x18, 0x88, 0x09, 0x41, 0x31, 0x61, 0x30, 0x0e, 0x64, 0xc2, 0x90, 0x1c, - 0xc8, 0x84, 0x40, 0x01, 0x00, 0x89, 0x20, 0x00, 0x00, 0x42, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, - 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, - 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xb0, 0xc1, 0x0c, 0xc0, 0x30, 0x02, - 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, - 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18, - 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6, - 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4, - 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50, - 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21, - 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29, - 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1, - 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0xb8, 0x48, 0x9a, 0x22, 0x4a, - 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00, - 0x06, 0x11, 0x18, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44, 0xb2, 0x2c, 0x0d, - 0x39, 0x85, 0x28, 0x8a, 0xa2, 0x20, 0xa8, 0x0c, 0x00, 0x00, 0x90, 0x54, - 0x04, 0x00, 0x20, 0xaa, 0x0c, 0x40, 0x51, 0x90, 0x55, 0x86, 0xa2, 0x28, - 0x08, 0x2b, 0x42, 0x51, 0x90, 0x36, 0x47, 0x10, 0xcc, 0x11, 0x80, 0xc1, - 0x30, 0x82, 0xd0, 0x15, 0x24, 0x58, 0x1a, 0x81, 0xf3, 0x38, 0x80, 0xbe, - 0x81, 0x80, 0x14, 0xe8, 0xe6, 0x08, 0x40, 0x61, 0x10, 0x01, 0x10, 0xa6, - 0x00, 0x46, 0x00, 0x86, 0x11, 0x86, 0x6e, 0x10, 0x21, 0x10, 0x06, 0x11, - 0x0e, 0x61, 0x10, 0xa1, 0x10, 0x86, 0x11, 0x88, 0x0e, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x06, 0x00, 0xb1, 0x5d, 0xf9, 0xb3, 0xce, 0x82, 0x0c, 0x7f, 0x45, + 0x44, 0x13, 0x71, 0x01, 0x00, 0x61, 0x20, 0x00, 0x00, 0x5c, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6, 0x22, 0x04, 0x41, 0x10, + 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88, 0x15, 0x41, 0x09, 0x94, + 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14, 0x66, 0x00, 0x66, 0x00, + 0x08, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0x1f, 0x00, 0xe3, 0x11, 0x8d, + 0x94, 0x49, 0x14, 0x94, 0xf1, 0x08, 0x88, 0xda, 0x28, 0x0a, 0xca, 0x20, + 0xc3, 0x70, 0x34, 0x26, 0x04, 0xf2, 0x19, 0x8f, 0xa0, 0xb0, 0xaf, 0xa1, + 0xa0, 0x0c, 0x32, 0x1c, 0x8a, 0x64, 0x42, 0x20, 0x1f, 0x0b, 0x0a, 0xf8, + 0x8c, 0x47, 0x64, 0x1d, 0x19, 0x4c, 0x14, 0x94, 0x41, 0x06, 0xe6, 0xc1, + 0x4c, 0x08, 0xe4, 0x63, 0x45, 0x00, 0x9f, 0xf1, 0x08, 0x4f, 0x0c, 0xd2, + 0xc0, 0xa2, 0xa0, 0x0c, 0x32, 0x44, 0x94, 0x67, 0x42, 0x20, 0x1f, 0x2b, + 0x02, 0xf8, 0x8c, 0x47, 0x88, 0xc1, 0x19, 0xb8, 0x01, 0x47, 0x41, 0x19, + 0x64, 0x08, 0x34, 0x30, 0xb0, 0xa0, 0x92, 0xcf, 0x20, 0xc3, 0xb0, 0x8d, + 0x81, 0x05, 0x93, 0x7c, 0x6c, 0x08, 0xe0, 0x33, 0xc8, 0x60, 0x78, 0x67, + 0x60, 0x41, 0x24, 0x1f, 0x1b, 0x02, 0xf8, 0x0c, 0x32, 0x24, 0x61, 0xb0, + 0x06, 0x16, 0x3c, 0xf2, 0xb1, 0x21, 0x80, 0xcf, 0x78, 0xc4, 0x1b, 0xd0, + 0xc1, 0x1e, 0xa0, 0x01, 0x05, 0x65, 0x90, 0x21, 0x38, 0x83, 0x36, 0xb0, + 0x40, 0x0c, 0xe4, 0x33, 0xc8, 0x30, 0xa0, 0x01, 0x1c, 0x58, 0x00, 0x06, + 0xf2, 0x19, 0x64, 0x28, 0xd4, 0x60, 0x0e, 0x2c, 0xe8, 0xe4, 0x33, 0xc8, + 0x70, 0xb0, 0x81, 0x1d, 0x58, 0xa0, 0xc9, 0x67, 0x90, 0x81, 0x0f, 0xe2, + 0xa0, 0x0e, 0x2c, 0x0b, 0xe4, 0x33, 0xc8, 0xe0, 0x07, 0x73, 0x80, 0x07, + 0xe6, 0x04, 0xf2, 0xb1, 0x64, 0x80, 0x8f, 0x05, 0x0c, 0x7c, 0x2c, 0x48, + 0xe0, 0x63, 0x01, 0x02, 0x1f, 0x0b, 0x0a, 0xf8, 0xcc, 0x36, 0xe4, 0x41, + 0x00, 0xcc, 0x36, 0x04, 0xa5, 0x10, 0xcc, 0x36, 0x04, 0x78, 0x20, 0x64, + 0x10, 0x10, 0x03, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, + 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0xd8, 0x72, 0x0c, 0x01, 0x1d, 0x1c, + 0x7c, 0x80, 0xe4, 0xc1, 0x96, 0xe3, 0x08, 0xe8, 0xe0, 0xe0, 0x03, 0x24, + 0x0f, 0xb6, 0x1c, 0x4c, 0x40, 0x07, 0x07, 0x1f, 0x20, 0x79, 0xb0, 0xe5, + 0x88, 0x02, 0x3a, 0x38, 0xf8, 0x00, 0xc9, 0x83, 0x2d, 0x87, 0x15, 0xd0, + 0xc1, 0x91, 0x07, 0x08, 0x1f, 0x6c, 0x39, 0xc6, 0x20, 0xa0, 0x83, 0x23, + 0x0f, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0xbc, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, + 0xde, 0x21, 0x0c, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x00, 0x0b, 0x82, 0x20, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, + 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, + 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, + 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, + 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, + 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x48, 0x11, 0x62, 0xa8, + 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, + 0x00, 0x79, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, + 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, + 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, + 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, + 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, + 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, + 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78, + 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70, + 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, + 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, + 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00, + 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, + 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d, + 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d, + 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d, + 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, + 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68, + 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, + 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, + 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, + 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, + 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70, + 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98, + 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, + 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, + 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d, + 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, + 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58, + 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0, + 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, + 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f, + 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d, + 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, + 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c, 0x02, 0x01, 0x2c, 0x40, + 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83, + 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, 0x84, 0x03, + 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0x61, 0x1b, 0x0a, 0x60, 0x01, + 0xaa, 0x21, 0x1c, 0xd2, 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, + 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xda, 0x20, 0x1c, + 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, + 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, + 0x76, 0x08, 0x41, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87, + 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07, + 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07, + 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x62, 0x0c, + 0x11, 0x84, 0x31, 0x74, 0x06, 0x02, 0xe6, 0x08, 0xc0, 0x20, 0x05, 0xd4, + 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x04, 0xc2, 0x30, 0x02, 0xa1, 0x8c, 0x00, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51, @@ -1294,173 +445,381 @@ const unsigned char sdl_metallib[] = { 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80, - 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x98, - 0x07, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0x4c, 0x04, - 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, 0x66, 0x02, 0x02, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0x53, 0x01, 0x01, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xb9, 0x80, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x4c, 0x40, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0c, 0x61, 0x32, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x86, 0x30, 0x1b, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x43, 0x98, 0x0c, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x21, 0x0c, 0x18, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, - 0x05, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, - 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, - 0xea, 0x46, 0x00, 0x4a, 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80, - 0x0a, 0x30, 0xa0, 0x0c, 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac, - 0x14, 0x8a, 0xa1, 0x1c, 0x68, 0x2c, 0x9c, 0x11, 0x80, 0x42, 0x28, 0x88, - 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x12, 0xc7, 0x12, 0x22, 0x01, 0x00, - 0x00, 0x79, 0x18, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, - 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, - 0xb7, 0x21, 0x46, 0xe7, 0x84, 0x01, 0x20, 0x06, 0x63, 0x40, 0xe5, 0x6e, - 0x0c, 0x2d, 0x4c, 0xee, 0x6b, 0x2e, 0x4d, 0xaf, 0x6c, 0x88, 0xd1, 0x2d, - 0x61, 0x20, 0x74, 0x0c, 0xdf, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, 0xa4, - 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, - 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x25, 0x07, 0x07, 0x04, 0xa5, - 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, - 0xc6, 0x25, 0x07, 0x27, 0x65, 0x88, 0x10, 0x06, 0xc4, 0x10, 0xa3, 0x5b, - 0xba, 0xa7, 0x53, 0x58, 0x34, 0x95, 0xd1, 0x85, 0xb1, 0x0d, 0x41, 0xc2, - 0xe0, 0xe8, 0x96, 0x6e, 0xe9, 0x14, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, - 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, - 0x30, 0x48, 0xc8, 0x85, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, - 0xb1, 0x95, 0xb9, 0x98, 0x85, 0xcd, 0xd1, 0x7d, 0xb5, 0x85, 0xd1, 0xa1, - 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0xc2, 0x60, 0x21, + 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18, + 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00, + 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, + 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x52, 0x25, 0x50, 0x04, + 0x23, 0x00, 0x05, 0x18, 0x50, 0x08, 0x65, 0x50, 0x20, 0x05, 0x41, 0x6c, + 0x04, 0x80, 0xd6, 0x58, 0x82, 0x24, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, + 0x00, 0x06, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, + 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x86, 0x22, + 0x24, 0xc0, 0xa2, 0x50, 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, + 0xd3, 0x2b, 0x1b, 0x62, 0x28, 0x41, 0x22, 0x28, 0x05, 0xe3, 0x20, 0x08, + 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, + 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, + 0x85, 0x06, 0x86, 0x06, 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, + 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, + 0x88, 0x90, 0x10, 0x43, 0x0c, 0x25, 0x50, 0x10, 0x65, 0x60, 0xd1, 0x54, + 0x46, 0x17, 0xc6, 0x36, 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, 0x65, 0xe0, + 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, + 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, + 0x26, 0xc6, 0x56, 0x36, 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, + 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x84, 0x64, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, + 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, + 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, + 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, 0x58, 0x9a, + 0x9c, 0x0b, 0xdc, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, 0xa3, 0xb0, + 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f, + 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x64, + 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, 0xda, 0xca, + 0x88, 0xc0, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, 0x51, 0x92, + 0x27, 0x81, 0x92, 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, 0x9c, 0x8b, + 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, + 0x1d, 0xad, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32, 0x94, + 0x9a, 0xb1, 0x37, 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, 0xb3, 0x14, + 0x16, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, 0xac, 0x04, + 0x4a, 0xa2, 0x44, 0x4a, 0x2e, 0x66, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, + 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x34, 0xcc, 0xd8, 0xde, 0xc2, + 0xe8, 0x64, 0x88, 0xd0, 0x95, 0xe1, 0x8d, 0xbd, 0xbd, 0xc9, 0x91, 0x0d, + 0x61, 0x92, 0x2a, 0xc9, 0x12, 0x28, 0xd1, 0x12, 0x29, 0xd9, 0x86, 0x18, + 0x09, 0x95, 0x60, 0x09, 0x47, 0x28, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, + 0x8e, 0xae, 0x0c, 0xef, 0x2b, 0xcd, 0x0d, 0xae, 0x8e, 0x8e, 0x52, 0x58, + 0x9a, 0x9c, 0x0b, 0xdb, 0xdb, 0x58, 0x18, 0x5d, 0xda, 0x9b, 0xdb, 0x57, + 0x9a, 0x1b, 0x59, 0x19, 0x1e, 0xbd, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, + 0xba, 0x32, 0x32, 0x94, 0xaf, 0xaf, 0xb0, 0x34, 0xb9, 0x2f, 0x38, 0xb6, + 0xb0, 0xb1, 0x32, 0xb4, 0x37, 0x36, 0xb2, 0x32, 0xb9, 0xaf, 0xaf, 0x94, + 0x21, 0x94, 0x32, 0x24, 0x5e, 0xf2, 0x29, 0x83, 0x12, 0x24, 0x60, 0x90, + 0x40, 0x89, 0x96, 0x48, 0xc9, 0x34, 0x84, 0x52, 0x82, 0xc4, 0x4b, 0x3e, + 0x25, 0x50, 0x82, 0x04, 0x0c, 0x12, 0x28, 0x89, 0x12, 0x29, 0xb9, 0x86, + 0x50, 0x8a, 0x90, 0x78, 0xc9, 0xa7, 0x08, 0x4a, 0x90, 0x80, 0x41, 0x02, + 0x25, 0x5a, 0x22, 0x25, 0x1b, 0x95, 0xb0, 0x34, 0x39, 0x17, 0xb1, 0x3a, + 0x33, 0xb3, 0x32, 0x39, 0x3e, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x44, 0xc2, 0xd2, 0xe4, + 0x5c, 0xe4, 0xca, 0xc2, 0xc8, 0x18, 0x85, 0xa5, 0xc9, 0xb9, 0x84, 0xc9, + 0x9d, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0xcd, 0xa5, 0xe9, 0x95, 0xf1, + 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, + 0xfb, 0x0a, 0x63, 0x4b, 0x3b, 0x73, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x23, + 0x62, 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x83, 0x47, 0x43, 0x05, 0x4e, 0xee, + 0x4d, 0xad, 0x6c, 0x8c, 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0x18, 0x28, 0x46, + 0x42, 0x06, 0x49, 0x19, 0x28, 0x44, 0xf2, 0x29, 0x82, 0x12, 0x24, 0x66, + 0x90, 0x9c, 0x81, 0x42, 0x24, 0x68, 0xa0, 0x1c, 0x09, 0x94, 0xa4, 0x41, + 0x22, 0x25, 0x6a, 0xc0, 0x84, 0x4e, 0x2e, 0xcc, 0x6d, 0xce, 0xec, 0x4d, + 0xae, 0x6d, 0x08, 0x18, 0x28, 0x45, 0x42, 0x06, 0x49, 0x19, 0x28, 0x44, + 0xf2, 0x29, 0x86, 0x12, 0x24, 0x66, 0x90, 0x9c, 0x81, 0x42, 0x24, 0x68, + 0xa0, 0x1c, 0x09, 0x94, 0xa4, 0x41, 0x22, 0x25, 0x6c, 0x30, 0x44, 0x49, + 0xc2, 0x20, 0x11, 0x83, 0x64, 0x0c, 0x92, 0x35, 0x48, 0xda, 0x60, 0x88, + 0x81, 0x00, 0x49, 0x97, 0xb8, 0x01, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, + 0x37, 0xba, 0x32, 0x37, 0x3a, 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, + 0x41, 0x41, 0x43, 0x84, 0x24, 0x0e, 0x86, 0x18, 0x09, 0x1c, 0x24, 0x72, + 0xc0, 0x24, 0x43, 0x8c, 0x64, 0x0e, 0x92, 0x39, 0x60, 0x12, 0x86, 0x41, + 0x58, 0x9a, 0x5c, 0x4b, 0x18, 0x5b, 0x5a, 0xd8, 0x5c, 0xcb, 0xdc, 0xd8, + 0x1b, 0x5c, 0xd9, 0x1c, 0xca, 0x14, 0x11, 0xd3, 0xd7, 0xd0, 0x1b, 0x5c, + 0xde, 0x97, 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0x5e, 0xca, 0x10, 0x22, 0xb1, + 0x83, 0xa4, 0x0e, 0x68, 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, + 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0x84, 0xc9, 0x9d, 0xa1, + 0xd0, 0xa4, 0x0c, 0x31, 0x12, 0x3c, 0x48, 0xec, 0x20, 0xb9, 0x83, 0x21, + 0x42, 0x82, 0x07, 0xb4, 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8, 0xd2, 0xc2, + 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a, 0xc2, 0xe4, 0xce, 0x50, + 0x66, 0x52, 0x86, 0x18, 0xc9, 0x1e, 0x24, 0x76, 0x90, 0xe8, 0xc1, 0x10, + 0x21, 0xd9, 0x83, 0x11, 0x11, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, + 0xb4, 0xc3, 0x3b, 0x90, 0x43, 0x3d, 0xb0, 0x43, 0x39, 0xb8, 0x81, 0x39, + 0xb0, 0x43, 0x38, 0x9c, 0xc3, 0x3c, 0x4c, 0x11, 0x82, 0x61, 0x84, 0xc2, + 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xe9, 0x40, 0x0e, 0xe5, 0xe0, + 0x0e, 0xf4, 0x30, 0x25, 0x28, 0x46, 0x2c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, + 0x06, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, + 0x25, 0x30, 0x46, 0x50, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xec, 0x10, + 0x0e, 0xee, 0x70, 0x0e, 0xf5, 0x10, 0x0e, 0xe7, 0x50, 0x0e, 0xbf, 0x60, + 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0x53, 0x02, + 0x64, 0xc4, 0x14, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x30, 0x0e, 0xef, 0xd0, + 0x0e, 0xf0, 0x90, 0x0e, 0xec, 0x50, 0x0e, 0xbf, 0xf0, 0x0e, 0xf0, 0x40, + 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x0f, 0x53, 0x06, 0x85, 0x71, 0x46, + 0x28, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xf6, 0x50, 0x0e, 0xf2, 0x40, + 0x0f, 0xe5, 0x80, 0x0f, 0x53, 0x82, 0x37, 0x00, 0x00, 0x79, 0x18, 0x00, + 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, + 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, + 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, + 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, + 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, + 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, + 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, + 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, + 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, + 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, + 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, + 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, + 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, + 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, + 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, + 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, + 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, + 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, + 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, + 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, + 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, + 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, + 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, + 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, + 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, + 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, + 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, + 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, + 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, + 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, + 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, + 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, + 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, + 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, + 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, + 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, + 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, + 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, + 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, + 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, + 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, + 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, + 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, + 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, + 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, + 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, + 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, + 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, + 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, + 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, + 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, + 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, + 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, + 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, + 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x06, 0xf0, 0xb0, 0x5d, 0xf9, 0x73, 0xce, 0x83, 0xfd, 0x15, 0x11, + 0x4d, 0xc4, 0x05, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x5a, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, + 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6, 0x22, 0x04, 0x41, 0x10, + 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88, 0x95, 0x40, 0x19, 0x14, + 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14, 0x66, 0x00, 0x66, 0x00, + 0x00, 0xe3, 0x11, 0x8c, 0x84, 0x49, 0x14, 0x94, 0xf1, 0x88, 0x87, 0xd2, + 0x28, 0x0a, 0xca, 0x20, 0xc3, 0x60, 0x30, 0x26, 0x04, 0xf2, 0x19, 0x8f, + 0x98, 0x30, 0xaf, 0xa1, 0xa0, 0x0c, 0x32, 0x1c, 0x49, 0x64, 0x42, 0x20, + 0x1f, 0x0b, 0x0a, 0xf8, 0x8c, 0x47, 0x60, 0xdd, 0x18, 0x40, 0x14, 0x94, + 0x41, 0x06, 0xc6, 0xb9, 0x4c, 0x08, 0xe4, 0x63, 0x45, 0x00, 0x9f, 0xf1, + 0x88, 0x4e, 0x0c, 0xd0, 0xc0, 0xa2, 0xa0, 0x0c, 0x32, 0x44, 0x53, 0x67, + 0x42, 0x20, 0x1f, 0x2b, 0x02, 0xf8, 0x8c, 0x47, 0x84, 0xc1, 0x19, 0xb4, + 0x01, 0x47, 0x41, 0x19, 0x64, 0x08, 0xb2, 0xcf, 0x82, 0x4a, 0x3e, 0x83, + 0x0c, 0x83, 0x26, 0x06, 0x16, 0x4c, 0xf2, 0xb1, 0x21, 0x80, 0xcf, 0x20, + 0x83, 0xd1, 0x99, 0x81, 0x05, 0x91, 0x7c, 0x6c, 0x08, 0xe0, 0x33, 0xc8, + 0x90, 0x80, 0x81, 0x1a, 0x58, 0xf0, 0xc8, 0xc7, 0x86, 0x00, 0x3e, 0xe3, + 0x11, 0x6e, 0x40, 0x07, 0x7a, 0x80, 0x06, 0x14, 0x94, 0x41, 0x86, 0xc0, + 0x0c, 0xd8, 0xc0, 0x02, 0x31, 0x90, 0xcf, 0x20, 0xc3, 0x70, 0x06, 0x6f, + 0x60, 0x01, 0x18, 0xc8, 0x67, 0x90, 0xa1, 0x48, 0x03, 0x39, 0xb0, 0xa0, + 0x93, 0xcf, 0x20, 0xc3, 0xb1, 0x06, 0x75, 0x60, 0x81, 0x26, 0x9f, 0x41, + 0x06, 0x3e, 0x78, 0x03, 0x3a, 0xb0, 0x2c, 0x90, 0xcf, 0x20, 0x83, 0x1f, + 0xc4, 0xc1, 0x1d, 0x98, 0x13, 0xc8, 0xc7, 0x92, 0x01, 0x3e, 0x16, 0x30, + 0xf0, 0xb1, 0x20, 0x81, 0x8f, 0x05, 0x08, 0x7c, 0x2c, 0x28, 0xe0, 0x33, + 0xdb, 0x90, 0x07, 0x01, 0x30, 0xdb, 0x10, 0x94, 0x42, 0x30, 0xdb, 0x10, + 0x94, 0x82, 0x90, 0x41, 0x40, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x5b, 0x8e, 0x20, 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0xd8, 0x72, + 0x0c, 0x01, 0x1d, 0x1c, 0x7c, 0x80, 0xe4, 0xc1, 0x96, 0xe3, 0x08, 0xe8, + 0xe0, 0xe0, 0x03, 0x24, 0x0f, 0xb6, 0x1c, 0x4c, 0x40, 0x07, 0x07, 0x1f, + 0x20, 0x79, 0xb0, 0xe5, 0x88, 0x02, 0x3a, 0x38, 0xf8, 0x00, 0xc9, 0x83, + 0x2d, 0x87, 0x15, 0xd0, 0xc1, 0x91, 0x07, 0x08, 0x1f, 0x6c, 0x39, 0xc6, + 0x20, 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xfd, 0x02, 0x00, + 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, + 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, + 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32, + 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, + 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, + 0x08, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, + 0x00, 0x51, 0x18, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x8a, 0x08, 0x07, 0x78, + 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, + 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, + 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, + 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, + 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, + 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, + 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, + 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, + 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, + 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, + 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, + 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, + 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, + 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, + 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, + 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, + 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, + 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, + 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, + 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, + 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, + 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, + 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, + 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, + 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, + 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, + 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, + 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, + 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, + 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, + 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, + 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c, + 0xc2, 0x00, 0x2c, 0x40, 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, + 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, + 0x43, 0x1b, 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0x00, 0x00, + 0x00, 0x49, 0x18, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x84, 0x40, + 0x00, 0x89, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, + 0x4c, 0x10, 0x3c, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, + 0x67, 0x49, 0x53, 0x44, 0x09, 0x93, 0xcf, 0x1e, 0xc0, 0x40, 0x44, 0x9c, + 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x12, 0x42, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x11, 0x06, 0xa1, 0x10, 0x21, 0x41, 0x54, 0x03, 0x01, 0x73, 0x04, 0x60, + 0x90, 0x02, 0x38, 0x47, 0x00, 0x0a, 0x83, 0x08, 0x80, 0x30, 0x8c, 0x30, + 0x00, 0xc3, 0x08, 0x04, 0x32, 0x02, 0x00, 0x00, 0x00, 0x13, 0xa8, 0x70, + 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, + 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, + 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f, + 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, + 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, + 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, + 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, + 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, + 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07, + 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07, + 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, + 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, + 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, + 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07, + 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07, + 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, + 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, + 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, + 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07, + 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, + 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, + 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07, + 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, + 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, + 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, + 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, + 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, + 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, + 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, + 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18, 0x03, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, + 0x47, 0xc6, 0x04, 0x43, 0xc2, 0x11, 0x80, 0x42, 0x28, 0x81, 0x22, 0x28, + 0x88, 0x02, 0x2a, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0xd2, 0xc2, + 0x19, 0x01, 0x28, 0x8c, 0x42, 0x28, 0x88, 0x02, 0x29, 0x94, 0x82, 0xa1, + 0x1c, 0x4b, 0x90, 0x04, 0x00, 0x79, 0x18, 0x00, 0x00, 0x27, 0x01, 0x00, + 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, + 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0x42, 0x1c, 0x40, 0x42, 0x51, + 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, + 0x20, 0xc3, 0x21, 0x20, 0x02, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, + 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, + 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x06, + 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, + 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88, 0x70, 0x10, 0x43, + 0x0c, 0x64, 0x40, 0x0a, 0x24, 0x60, 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36, + 0x04, 0x39, 0x0e, 0x64, 0x40, 0x06, 0x24, 0xe0, 0x16, 0x96, 0x26, 0xe7, + 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6, + 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36, + 0x44, 0x38, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, + 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x63, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1, - 0x95, 0x0d, 0x11, 0xc2, 0xa0, 0x61, 0x14, 0x96, 0x26, 0xe7, 0x22, 0x57, - 0xe6, 0x46, 0x56, 0x26, 0xf7, 0x45, 0x17, 0x26, 0x77, 0x56, 0x46, 0xc7, + 0x95, 0x0d, 0x11, 0x8e, 0x86, 0x51, 0x58, 0x9a, 0x9c, 0x8b, 0x5c, 0x99, + 0x1b, 0x59, 0x99, 0xdc, 0x17, 0x5d, 0x98, 0xdc, 0x59, 0x19, 0x1d, 0xa3, + 0xb0, 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, + 0x2f, 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, + 0x43, 0x90, 0xe3, 0x41, 0x82, 0x03, 0x3a, 0xa2, 0x21, 0xc2, 0x21, 0x51, + 0x0a, 0x4b, 0x93, 0x73, 0x31, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, 0x73, 0xa3, + 0xfb, 0x4a, 0x73, 0x83, 0xab, 0xa3, 0x63, 0x76, 0x56, 0xe6, 0x56, 0x26, + 0x17, 0x46, 0x57, 0x46, 0x86, 0x82, 0x03, 0xf7, 0x36, 0x97, 0x46, 0x97, + 0xf6, 0xe6, 0x46, 0x64, 0x27, 0xf3, 0x65, 0x96, 0x42, 0x25, 0x2c, 0x4d, + 0xce, 0x65, 0xac, 0xcc, 0x8d, 0xae, 0x4c, 0x8e, 0x4f, 0x58, 0x9a, 0x9c, + 0x0b, 0x5c, 0x99, 0xdc, 0x1c, 0x5c, 0xd9, 0x18, 0x5d, 0x9a, 0x5d, 0x19, + 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x32, 0x61, 0x69, 0x72, 0x2e, + 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0xe0, 0xde, 0xe6, + 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0x86, 0x48, 0x48, 0x70, 0x50, 0x47, 0x75, + 0x58, 0xc7, 0x75, 0x40, 0x07, 0x76, 0x64, 0x87, 0x46, 0xeb, 0xac, 0xcc, + 0xad, 0x4c, 0x2e, 0x8c, 0xae, 0x8c, 0x0c, 0xa5, 0x66, 0xec, 0x8d, 0xed, + 0x4d, 0x8e, 0xc8, 0x8e, 0xe6, 0xcb, 0x2c, 0x85, 0xc5, 0xd8, 0x1b, 0xdb, + 0x9b, 0xdc, 0x10, 0x09, 0x19, 0x0e, 0xea, 0xe0, 0x0e, 0xeb, 0xb8, 0x0e, + 0xe8, 0x88, 0x8e, 0xec, 0xe8, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x88, 0xd5, + 0x99, 0x99, 0x95, 0xc9, 0xf1, 0x09, 0x4b, 0x93, 0x73, 0x11, 0xab, 0x33, + 0x33, 0x2b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0xa3, 0x14, 0x96, 0x26, + 0xe7, 0xc2, 0xf6, 0x36, 0x16, 0x46, 0x97, 0xf6, 0xe6, 0xf6, 0x95, 0xe6, + 0x46, 0x56, 0x86, 0x47, 0x24, 0x2c, 0x4d, 0xce, 0x45, 0xae, 0x2c, 0x8c, + 0x8c, 0x54, 0x58, 0x9a, 0x9c, 0xcb, 0x1c, 0x9d, 0x5c, 0xdd, 0x18, 0xdd, + 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x9a, 0x9b, 0xd9, 0x1b, 0x0b, 0x33, + 0xb6, 0xb7, 0x30, 0x3a, 0x32, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x64, 0xe8, 0xca, 0xf0, 0xe8, 0xea, 0xe4, + 0xca, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, 0xa8, 0xa4, 0xb9, 0xc1, 0xd5, 0xd1, + 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x71, 0x19, 0x7b, 0x63, 0x7b, 0x93, 0xfb, + 0x9a, 0x1b, 0x0b, 0x63, 0x2b, 0xa3, 0x43, 0xf7, 0xe6, 0x56, 0xd6, 0x16, + 0x06, 0xf7, 0xd5, 0x56, 0x46, 0x87, 0xf6, 0x46, 0xc6, 0x87, 0xee, 0xcd, + 0xad, 0xac, 0x2d, 0x0c, 0xee, 0xcb, 0x2c, 0x6c, 0x8c, 0xee, 0x4d, 0x2e, + 0x86, 0x0f, 0xdd, 0x9b, 0x5b, 0x59, 0x5b, 0x18, 0xdc, 0x97, 0x59, 0xd8, + 0x18, 0xdd, 0x9b, 0x9c, 0x0c, 0x9f, 0x39, 0x32, 0xb9, 0xaf, 0x3b, 0xb4, + 0x34, 0xba, 0xb2, 0x2f, 0xb8, 0xb7, 0x34, 0x37, 0xba, 0x21, 0xb0, 0x80, + 0x04, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x65, 0x80, 0x08, 0x88, 0x80, + 0x04, 0x07, 0x19, 0x1c, 0x66, 0x80, 0x14, 0x88, 0x80, 0x04, 0x07, 0x19, + 0x1c, 0x67, 0x80, 0x1c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x68, 0x80, + 0x20, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x69, 0x80, 0x24, 0x88, 0x80, + 0x04, 0x07, 0x19, 0x1c, 0x6a, 0x80, 0x28, 0x88, 0x80, 0x04, 0x07, 0x19, + 0x1c, 0x6b, 0x80, 0x2c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x6c, 0xc0, 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, 0xec, 0x8b, 0x2e, 0x0f, 0xae, - 0xec, 0xcb, 0x2d, 0xac, 0xad, 0x8c, 0x86, 0x19, 0xdb, 0x5b, 0x18, 0x1d, - 0xcd, 0x10, 0x24, 0x0c, 0x9e, 0x4e, 0x09, 0x03, 0x28, 0x0c, 0xa2, 0x21, - 0x42, 0x18, 0x48, 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xde, 0xe6, 0xd2, - 0xe8, 0xd2, 0xde, 0xdc, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0x95, 0xb9, - 0xd1, 0x95, 0xc9, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x71, 0x7b, 0xfb, 0x82, - 0x2b, 0x93, 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3, 0x2b, 0x23, 0x13, - 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0xe5, 0x16, 0xd6, 0x56, 0x46, - 0x04, 0xee, 0x6d, 0x2e, 0x8d, 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0xd4, 0x29, - 0x61, 0x40, 0x85, 0x41, 0x15, 0x06, 0x56, 0x18, 0x40, 0x61, 0x10, 0x85, - 0xc1, 0x15, 0x06, 0x18, 0xa5, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, - 0xb3, 0xb6, 0x32, 0x37, 0xba, 0xaf, 0x34, 0x37, 0xb8, 0x3a, 0x3a, 0x5a, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, - 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x7c, 0xc2, - 0xd2, 0xe4, 0x5c, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca, 0xc6, 0xe8, 0xd2, - 0xec, 0xca, 0x58, 0x8c, 0xbd, 0xb1, 0xbd, 0xc9, 0x0d, 0x91, 0xba, 0x25, - 0x0c, 0xb4, 0x30, 0xd8, 0xc2, 0xa0, 0x0a, 0x03, 0x2e, 0x0c, 0xa0, 0x30, - 0x88, 0xc2, 0xe0, 0x0a, 0x83, 0x8e, 0xd9, 0x59, 0x99, 0x5b, 0x99, 0x5c, - 0x18, 0x5d, 0x19, 0x19, 0x0a, 0x0e, 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b, - 0x1c, 0x19, 0x91, 0x9d, 0xcc, 0x97, 0x59, 0x0a, 0x0d, 0x33, 0xb6, 0xb7, - 0x30, 0x3a, 0x19, 0x22, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, - 0x43, 0xa4, 0xce, 0x09, 0x03, 0x2d, 0x0c, 0xbe, 0x30, 0xa8, 0xc2, 0x80, - 0x0b, 0x03, 0x28, 0x0c, 0xc0, 0x20, 0x0c, 0xae, 0x30, 0x08, 0x03, 0x2a, - 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x7c, 0xc2, - 0xd2, 0xe4, 0x5c, 0xc4, 0xea, 0xcc, 0xcc, 0xca, 0xe4, 0xbe, 0xe6, 0xd2, - 0xf4, 0xca, 0x28, 0x85, 0xa5, 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, 0x85, 0xd1, - 0xa5, 0xbd, 0xb9, 0x7d, 0xa5, 0xb9, 0x91, 0x95, 0xe1, 0x11, 0x09, 0x4b, - 0x93, 0x73, 0x91, 0x2b, 0x0b, 0x23, 0x23, 0x15, 0x96, 0x26, 0xe7, 0x32, - 0x47, 0x27, 0x57, 0x37, 0x46, 0xf7, 0x45, 0x97, 0x07, 0x57, 0xf6, 0x95, - 0xe6, 0x66, 0xf6, 0xc6, 0xc2, 0x8c, 0xed, 0x2d, 0x8c, 0x8e, 0xcc, 0xdc, - 0x98, 0xd4, 0x91, 0xd0, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, 0x1d, 0x19, - 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x2f, 0xba, 0x3c, 0xb8, 0x32, - 0x2a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5c, - 0xc6, 0xde, 0xd8, 0xde, 0xe4, 0xbe, 0xe6, 0xc6, 0xc2, 0xd8, 0xca, 0xe8, - 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0xb5, 0x95, 0xd1, 0xa1, - 0xbd, 0x91, 0xf1, 0xa1, 0x7b, 0x73, 0x2b, 0x6b, 0x0b, 0x83, 0xfb, 0x32, - 0x0b, 0x1b, 0xa3, 0x7b, 0x93, 0x8b, 0xe1, 0x43, 0xf7, 0xe6, 0x56, 0xd6, - 0x16, 0x06, 0xf7, 0x65, 0x16, 0x36, 0x46, 0xf7, 0x26, 0x27, 0xc3, 0x67, - 0x8e, 0x4c, 0xee, 0xeb, 0x0e, 0x2d, 0x8d, 0xae, 0xec, 0x0b, 0xee, 0x2d, - 0xcd, 0x8d, 0x6e, 0x08, 0x2c, 0x74, 0x4a, 0xc7, 0x74, 0x4a, 0x18, 0xa0, - 0x41, 0x18, 0xa4, 0x41, 0xc7, 0x74, 0x4c, 0xa7, 0x84, 0x01, 0x1a, 0x84, - 0x81, 0x1a, 0x74, 0x4f, 0xc7, 0x74, 0x4a, 0x18, 0xa0, 0x41, 0x18, 0xac, - 0x41, 0x37, 0x75, 0x4c, 0xa7, 0x84, 0x01, 0x1a, 0x84, 0x01, 0x1b, 0x74, - 0x4d, 0xc7, 0x74, 0x4a, 0x18, 0xa0, 0x41, 0x18, 0xb4, 0x41, 0x47, 0x75, - 0x4c, 0xa7, 0x84, 0x01, 0x1a, 0x84, 0x81, 0x1b, 0x74, 0x55, 0xc7, 0x74, - 0x4a, 0x18, 0xa0, 0x41, 0x18, 0xbc, 0x41, 0x67, 0x75, 0x4c, 0xa7, 0x84, - 0x01, 0x1a, 0x84, 0x01, 0x1c, 0x30, 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, - 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0xe3, - 0x15, 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0x45, 0x97, 0x07, 0x57, - 0xf6, 0x15, 0xc6, 0x96, 0x76, 0xe6, 0xf6, 0x35, 0x97, 0xa6, 0x57, 0xc6, - 0x67, 0x0a, 0x2d, 0x8c, 0xac, 0x4c, 0x6e, 0xe8, 0xcd, 0x6d, 0x8e, 0x2e, - 0xcc, 0x8d, 0x6e, 0x8e, 0xc1, 0xd8, 0x10, 0x32, 0xe8, 0xa4, 0x30, 0x18, - 0x83, 0x30, 0x20, 0x83, 0x0e, 0x0a, 0x83, 0x32, 0xe8, 0x94, 0x6e, 0x09, - 0x03, 0x33, 0x08, 0x83, 0x33, 0x08, 0x83, 0x38, 0x08, 0x03, 0x39, 0xe8, - 0xa0, 0x30, 0x98, 0x83, 0x8e, 0x09, 0x03, 0x28, 0x0c, 0xe8, 0x20, 0x0c, - 0xae, 0x30, 0xa8, 0x03, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x34, - 0xde, 0xcc, 0xcc, 0xe6, 0xca, 0xe8, 0x88, 0x98, 0xb1, 0xbd, 0x85, 0xd1, - 0xcd, 0xe0, 0xcd, 0xd0, 0x68, 0x0b, 0xa3, 0x93, 0x4b, 0xc3, 0x1b, 0x42, - 0x75, 0x4a, 0xd7, 0x74, 0x4a, 0x18, 0xdc, 0x41, 0x18, 0xe0, 0x41, 0xd7, - 0x74, 0x57, 0xa7, 0x84, 0x41, 0x1e, 0x84, 0x81, 0x1e, 0x30, 0xc9, 0xaa, - 0xb2, 0x22, 0x2a, 0x1b, 0x7b, 0x23, 0x2b, 0xa3, 0x41, 0x56, 0x36, 0xf6, - 0x46, 0x56, 0x36, 0x84, 0x0c, 0x3a, 0x26, 0x0c, 0xc6, 0x20, 0x0c, 0xc8, - 0xa0, 0x8b, 0xc2, 0xa0, 0x0c, 0xba, 0xa5, 0x5b, 0xc2, 0xc0, 0x0c, 0xc2, - 0xe0, 0x0c, 0xc2, 0x60, 0x0f, 0xc2, 0x40, 0x0e, 0xba, 0x28, 0x0c, 0xe6, - 0xa0, 0x6b, 0xc2, 0x00, 0x0a, 0x03, 0x3e, 0x08, 0x83, 0x2b, 0x0c, 0xfa, - 0x80, 0x4b, 0x58, 0x9a, 0x9c, 0x0b, 0x5d, 0x19, 0x1e, 0x5d, 0x9d, 0x5c, - 0x19, 0x95, 0xb0, 0x34, 0x39, 0x97, 0xb9, 0xb0, 0x36, 0x38, 0xb6, 0x32, - 0x62, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, - 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x3e, 0x24, 0xe8, 0xca, 0xf0, 0x60, 0x86, 0x50, 0x1d, 0x16, 0x06, 0x7f, - 0x10, 0x06, 0x65, 0xd0, 0x29, 0xdd, 0x12, 0x06, 0xa0, 0x10, 0x06, 0x50, - 0x18, 0x84, 0x42, 0x18, 0x5c, 0x61, 0x20, 0x0a, 0x24, 0xe8, 0xca, 0xf0, - 0x62, 0x86, 0x50, 0x5d, 0x16, 0x06, 0x7f, 0x10, 0x06, 0x65, 0xd0, 0x2d, - 0xdd, 0x12, 0x06, 0xa0, 0x10, 0x06, 0x50, 0x18, 0x84, 0x42, 0x18, 0x5c, - 0x61, 0x40, 0x0a, 0x5c, 0xc2, 0xd2, 0xe4, 0x5c, 0xe6, 0xc2, 0xda, 0xe0, - 0xd8, 0xca, 0xe4, 0x78, 0xcc, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0x31, - 0x98, 0x1b, 0x22, 0x75, 0x5a, 0x18, 0x98, 0x42, 0x18, 0x94, 0x41, 0xa7, - 0x74, 0x4b, 0x18, 0x40, 0x61, 0x70, 0x0a, 0x61, 0x70, 0x85, 0x01, 0x2a, - 0x0c, 0x81, 0xc2, 0x20, 0x0b, 0x03, 0x2f, 0x0c, 0xc4, 0x20, 0x0c, 0xec, - 0x20, 0x0c, 0xfc, 0x20, 0x0c, 0x46, 0x21, 0x0c, 0x4a, 0x21, 0x0c, 0x52, - 0x61, 0x88, 0xf1, 0x00, 0x61, 0x30, 0x85, 0x81, 0x2a, 0xb0, 0xfa, 0xd2, - 0xa2, 0x9a, 0x8a, 0xa9, 0x99, 0x42, 0x0b, 0x23, 0x2b, 0x93, 0x1b, 0x7a, - 0x73, 0x9b, 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0xe3, 0xf3, 0xd6, 0xe6, 0x96, - 0x06, 0xf7, 0x46, 0x57, 0xe6, 0x46, 0x07, 0x32, 0x86, 0x16, 0x26, 0xc7, - 0x67, 0x2a, 0xad, 0x0d, 0x8e, 0xad, 0x0c, 0x64, 0x68, 0x65, 0x05, 0x84, - 0x4a, 0x28, 0x28, 0x68, 0x88, 0x10, 0x06, 0xae, 0x30, 0xc4, 0x08, 0x83, - 0x56, 0x08, 0x83, 0x57, 0x18, 0x03, 0x6e, 0x88, 0x11, 0x06, 0x68, 0x10, - 0x06, 0xb0, 0x30, 0x06, 0xdc, 0x10, 0x31, 0x08, 0x03, 0x56, 0x08, 0x83, - 0x58, 0x18, 0x03, 0x2e, 0x0c, 0x62, 0x61, 0x0c, 0xba, 0x30, 0x88, 0x85, - 0x31, 0xf0, 0xc2, 0x20, 0x16, 0xc6, 0xe0, 0x0b, 0x83, 0x58, 0x18, 0x03, - 0x30, 0x08, 0x83, 0x58, 0x18, 0x83, 0x30, 0x08, 0x83, 0x58, 0x18, 0x03, - 0x31, 0x08, 0x83, 0x58, 0x18, 0x83, 0x6d, 0x88, 0x11, 0x06, 0xb2, 0x10, - 0x06, 0xb1, 0x30, 0x06, 0x1d, 0xcf, 0x20, 0x2c, 0x4d, 0xae, 0x25, 0x8c, - 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0x6c, 0x0e, 0x65, - 0x8a, 0x88, 0xe9, 0x2b, 0x88, 0xcc, 0x2e, 0xcc, 0x6d, 0xac, 0x8c, 0xec, - 0xcb, 0x4c, 0x2e, 0xec, 0xac, 0xad, 0xcc, 0x8d, 0x2e, 0x65, 0x08, 0x11, - 0x06, 0xb5, 0x10, 0x06, 0xb4, 0x40, 0x2b, 0x2c, 0x4d, 0xae, 0x25, 0x8c, - 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, 0x25, 0x4c, - 0xee, 0x0c, 0x65, 0x26, 0x65, 0x88, 0x11, 0x06, 0xb7, 0x10, 0x06, 0xb5, - 0x10, 0x06, 0xb6, 0x30, 0x44, 0x08, 0x83, 0x5b, 0xa0, 0x15, 0x96, 0x26, - 0xd7, 0x12, 0xc6, 0x96, 0x16, 0x36, 0xd7, 0x32, 0x37, 0xf6, 0x06, 0x57, - 0xd6, 0x12, 0x26, 0x77, 0x86, 0x42, 0x93, 0x32, 0xc4, 0x08, 0x03, 0x5d, - 0x08, 0x83, 0x5a, 0x08, 0x83, 0x5c, 0x20, 0x16, 0x96, 0x26, 0xd7, 0x12, - 0xc6, 0x96, 0x16, 0x36, 0xd7, 0x32, 0x37, 0xf6, 0x06, 0x57, 0xd6, 0x42, - 0x57, 0x86, 0x47, 0x57, 0x27, 0x57, 0x36, 0x37, 0xc4, 0x08, 0x03, 0x5e, - 0x08, 0x83, 0x5a, 0x08, 0x83, 0x5d, 0x20, 0x16, 0x96, 0x26, 0xd7, 0x12, - 0xc6, 0x96, 0x16, 0x36, 0xd7, 0x32, 0x37, 0xf6, 0x06, 0x57, 0xd6, 0x32, - 0x17, 0xd6, 0x06, 0xc7, 0x56, 0x26, 0x37, 0x37, 0xc4, 0x08, 0x03, 0x5f, - 0x08, 0x83, 0x5a, 0x08, 0x83, 0x5e, 0x18, 0x62, 0x84, 0x81, 0x2e, 0x84, - 0x01, 0x2f, 0x84, 0x81, 0x2f, 0x0c, 0x31, 0xc2, 0x40, 0x16, 0xc2, 0x20, - 0x16, 0xc6, 0xc0, 0x1b, 0x62, 0x84, 0x81, 0x2c, 0x84, 0x41, 0x2c, 0x8c, - 0xc1, 0x36, 0xc4, 0x08, 0x03, 0x59, 0x08, 0x83, 0x58, 0x18, 0x03, 0x30, - 0x18, 0x62, 0x84, 0x81, 0x2c, 0x84, 0x41, 0x2c, 0x8c, 0x41, 0x18, 0x0c, - 0x31, 0xc2, 0x40, 0x16, 0xc2, 0x20, 0x16, 0xc6, 0x40, 0x0c, 0x86, 0x18, - 0x61, 0x20, 0x0b, 0x61, 0x10, 0x0b, 0x63, 0xc0, 0x0d, 0x31, 0xc2, 0x40, - 0x16, 0xc2, 0x20, 0x16, 0xc6, 0xe0, 0x1b, 0x11, 0xb1, 0x03, 0x3b, 0xd8, - 0x43, 0x3b, 0xb8, 0x41, 0x3b, 0xbc, 0x03, 0x39, 0xd4, 0x03, 0x3b, 0x94, - 0x83, 0x1b, 0x98, 0x03, 0x3b, 0x84, 0xc3, 0x39, 0xcc, 0xc3, 0x14, 0x21, - 0x18, 0x46, 0x28, 0xec, 0xc0, 0x0e, 0xf6, 0xd0, 0x0e, 0x6e, 0x90, 0x0e, - 0xe4, 0x50, 0x0e, 0xee, 0x40, 0x0f, 0x53, 0x82, 0x62, 0xc4, 0x12, 0x0e, - 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, - 0xef, 0xe0, 0x0e, 0x53, 0x02, 0x63, 0x04, 0x15, 0x0e, 0xe9, 0x20, 0x0f, - 0x6e, 0xc0, 0x0e, 0xe1, 0xe0, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x70, 0x0e, - 0xe5, 0xf0, 0x0b, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, - 0xee, 0x30, 0x25, 0x40, 0x46, 0x4c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, - 0xe3, 0xf0, 0x0e, 0xed, 0x00, 0x0f, 0xe9, 0xc0, 0x0e, 0xe5, 0xf0, 0x0b, - 0xef, 0x00, 0x0f, 0xf4, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0xf3, 0x30, 0x65, - 0x50, 0x18, 0x67, 0x04, 0x13, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0e, - 0xf2, 0x10, 0x0e, 0xe7, 0xd0, 0x0e, 0xe5, 0xe0, 0x0e, 0xf4, 0x30, 0x25, - 0x58, 0x05, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, + 0xec, 0x6b, 0x2e, 0x4d, 0xaf, 0x8c, 0x57, 0x58, 0x9a, 0x9c, 0x4b, 0x98, + 0xdc, 0xd9, 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x18, 0x5b, 0xda, 0x99, + 0xdb, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x9f, 0x29, 0xb4, 0x30, 0xb2, 0x32, + 0xb9, 0xa1, 0x37, 0xb7, 0x39, 0xba, 0x30, 0x37, 0xba, 0x39, 0x06, 0x63, + 0x43, 0xc8, 0x00, 0x21, 0x8e, 0xef, 0x00, 0x03, 0xc4, 0x38, 0xc2, 0x00, + 0x09, 0x90, 0xe1, 0x10, 0x83, 0x63, 0x0c, 0x8e, 0x36, 0x38, 0xdc, 0x00, + 0x31, 0x8e, 0x37, 0x40, 0x84, 0x03, 0x3a, 0xe0, 0xe0, 0xc8, 0x8e, 0x38, + 0x18, 0x62, 0x1c, 0xdb, 0xe1, 0x1d, 0x72, 0x30, 0xc4, 0x30, 0x80, 0x63, + 0x3a, 0xe6, 0x80, 0xd5, 0x97, 0x16, 0xd5, 0x54, 0x4c, 0xcd, 0x14, 0x5a, + 0x18, 0x59, 0x99, 0xdc, 0xd0, 0x9b, 0xdb, 0x1c, 0x5d, 0x98, 0x1b, 0xdd, + 0x1c, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, 0x37, 0xba, 0x32, 0x37, 0x3a, + 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, + 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x43, 0x84, 0xe3, + 0x0e, 0x86, 0x18, 0x87, 0x1d, 0x1c, 0x78, 0xa0, 0x34, 0x43, 0x8c, 0x83, + 0x0c, 0x8e, 0x3c, 0x50, 0x9a, 0x21, 0x62, 0x70, 0xd4, 0xc1, 0xa1, 0x07, + 0x4a, 0x73, 0xe8, 0x81, 0xf2, 0x1c, 0x7a, 0xa0, 0x40, 0x87, 0x1e, 0x28, + 0xce, 0xa1, 0x07, 0x4a, 0x74, 0xe8, 0x81, 0x22, 0x1d, 0x7a, 0xa0, 0x4c, + 0x87, 0x1e, 0x28, 0xcc, 0x10, 0xe3, 0xd8, 0x83, 0x43, 0x0f, 0x14, 0x87, + 0x64, 0x10, 0x96, 0x26, 0xd7, 0x12, 0xc6, 0x96, 0x16, 0x36, 0xd7, 0x32, + 0x37, 0xf6, 0x06, 0x57, 0x36, 0x87, 0x32, 0x45, 0xc4, 0xf4, 0x35, 0xf5, + 0xc6, 0x96, 0x46, 0xf6, 0x65, 0x26, 0x17, 0x76, 0xd6, 0x56, 0xe6, 0x46, + 0x97, 0x32, 0x84, 0x38, 0xfc, 0xe0, 0xe8, 0x03, 0x5a, 0x61, 0x69, 0x72, + 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2d, 0x61, 0x72, 0x67, 0x28, 0x32, 0x29, 0x43, 0x8c, 0x03, 0x14, 0x0e, + 0x3f, 0x38, 0xfe, 0x60, 0x88, 0x70, 0x80, 0xc2, 0x88, 0x88, 0x1d, 0xd8, + 0xc1, 0x1e, 0xda, 0xc1, 0x0d, 0xda, 0xe1, 0x1d, 0xc8, 0xa1, 0x1e, 0xd8, + 0xa1, 0x1c, 0xdc, 0xc0, 0x1c, 0xd8, 0x21, 0x1c, 0xce, 0x61, 0x1e, 0xa6, + 0x08, 0xc1, 0x30, 0x42, 0x61, 0x07, 0x76, 0xb0, 0x87, 0x76, 0x70, 0x83, + 0x74, 0x20, 0x87, 0x72, 0x70, 0x07, 0x7a, 0x98, 0x12, 0x14, 0x23, 0x96, + 0x70, 0x48, 0x07, 0x79, 0x70, 0x03, 0x7b, 0x28, 0x07, 0x79, 0x98, 0x87, + 0x74, 0x78, 0x07, 0x77, 0x98, 0x12, 0x18, 0x23, 0xa8, 0x70, 0x48, 0x07, + 0x79, 0x70, 0x03, 0x76, 0x08, 0x07, 0x77, 0x38, 0x87, 0x7a, 0x08, 0x87, + 0x73, 0x28, 0x87, 0x5f, 0xb0, 0x87, 0x72, 0x90, 0x87, 0x79, 0x48, 0x87, + 0x77, 0x70, 0x87, 0x29, 0x01, 0x32, 0x62, 0x0a, 0x87, 0x74, 0x90, 0x07, + 0x37, 0x18, 0x87, 0x77, 0x68, 0x07, 0x78, 0x48, 0x07, 0x76, 0x28, 0x87, + 0x5f, 0x78, 0x07, 0x78, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0x98, 0x87, + 0x29, 0x83, 0xc2, 0x38, 0x23, 0x98, 0x70, 0x48, 0x07, 0x79, 0x70, 0x03, + 0x73, 0x90, 0x87, 0x70, 0x38, 0x87, 0x76, 0x28, 0x07, 0x77, 0xa0, 0x87, + 0x29, 0x01, 0x1d, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, @@ -1516,214 +875,20 @@ const unsigned char sdl_metallib[] = { 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x71, 0x20, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x46, 0xd0, 0x00, - 0x48, 0xe4, 0x0f, 0xce, 0xe4, 0x57, 0x77, 0x71, 0xdb, 0x96, 0xb0, 0x01, - 0x48, 0xe4, 0x4b, 0x00, 0xf3, 0x2c, 0xc4, 0x3f, 0x11, 0xd7, 0x44, 0x45, - 0xc4, 0x6f, 0x0f, 0x7e, 0x85, 0x17, 0xb7, 0x6d, 0x07, 0x13, 0x80, 0x44, - 0x7e, 0x01, 0x48, 0xd3, 0x5f, 0x00, 0x81, 0xe4, 0x57, 0x77, 0x71, 0xdb, - 0x16, 0x40, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0xc2, 0x02, 0x30, - 0x8f, 0x5f, 0xdd, 0xc5, 0x6d, 0x9b, 0x00, 0x04, 0x20, 0x91, 0x5f, 0x00, - 0xd2, 0xf4, 0x3f, 0x8e, 0xe5, 0x17, 0xb7, 0x6d, 0x08, 0x13, 0x80, 0x44, - 0x7e, 0x01, 0x48, 0xd3, 0x5f, 0x30, 0xc0, 0xe5, 0x57, 0x77, 0x71, 0xdb, - 0x06, 0x50, 0xb1, 0x5d, 0xf9, 0x6b, 0x43, 0x05, 0x34, 0x02, 0x31, 0xfc, - 0x45, 0x04, 0x18, 0x0c, 0xd1, 0x4c, 0x36, 0x10, 0x01, 0x48, 0xe4, 0x17, - 0x80, 0x34, 0xfd, 0x05, 0x10, 0x48, 0x7e, 0x71, 0xdb, 0x56, 0x10, 0x01, - 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, 0x03, 0x5c, 0x7e, 0x71, 0xdb, - 0x66, 0x20, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x8f, 0x63, 0xf9, - 0xd5, 0x5d, 0xdc, 0x36, 0x00, 0x61, 0x20, 0x00, 0x00, 0x36, 0x02, 0x00, - 0x00, 0x13, 0x04, 0x79, 0x10, 0x0b, 0x04, 0x00, 0x00, 0x5e, 0x00, 0x00, - 0x00, 0xb4, 0x8e, 0x45, 0x00, 0x81, 0x70, 0xcc, 0x41, 0x28, 0x8b, 0x73, - 0x07, 0x74, 0x8e, 0x35, 0x00, 0x03, 0x31, 0xc7, 0xa0, 0x2c, 0x77, 0x30, - 0xc7, 0xa0, 0xdc, 0xc1, 0x1d, 0x8c, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, - 0x63, 0x11, 0x94, 0x00, 0x79, 0x63, 0x09, 0x01, 0x30, 0x02, 0x40, 0xdd, - 0x0c, 0x00, 0x71, 0x23, 0x00, 0x35, 0x40, 0xc0, 0x18, 0x01, 0x08, 0x82, - 0x20, 0x09, 0x06, 0x14, 0xcc, 0x00, 0xcc, 0x00, 0xcc, 0x41, 0xcc, 0xc2, - 0x2c, 0xcc, 0x82, 0x2e, 0x8c, 0x45, 0x80, 0x20, 0x08, 0xe2, 0x1f, 0x08, - 0x82, 0x20, 0xfe, 0x81, 0x20, 0x08, 0xe2, 0x1f, 0x08, 0x82, 0x20, 0xfe, - 0x8d, 0x45, 0x80, 0x20, 0x08, 0xe2, 0x1f, 0x00, 0x80, 0x20, 0x08, 0xe2, - 0x1f, 0x09, 0x33, 0x00, 0x54, 0xcc, 0x00, 0x8c, 0x00, 0xcc, 0x00, 0x8c, - 0x35, 0x80, 0x20, 0x08, 0xe2, 0x1f, 0x08, 0x82, 0x20, 0xfe, 0x81, 0x20, - 0x08, 0xe2, 0xdf, 0x58, 0x03, 0xdb, 0xce, 0x3f, 0xe9, 0xb1, 0xed, 0xfc, - 0x93, 0x1e, 0xdb, 0xce, 0x3f, 0xe9, 0x8d, 0x35, 0x80, 0x20, 0xc8, 0xd6, - 0xbf, 0x00, 0x82, 0x20, 0x5b, 0xff, 0x02, 0x08, 0x82, 0x6c, 0xfd, 0x0b, - 0x63, 0x0d, 0x20, 0x08, 0xae, 0x39, 0x18, 0x80, 0x20, 0xb8, 0xe6, 0x60, - 0x00, 0x82, 0xe0, 0x9a, 0x83, 0xc1, 0x58, 0x03, 0x08, 0xd2, 0x6d, 0x0e, - 0x06, 0x20, 0x48, 0xb7, 0x39, 0x18, 0x80, 0x20, 0xdd, 0xe6, 0x60, 0x30, - 0xd6, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x3a, 0xe2, 0x31, 0x0b, 0x06, - 0xeb, 0x88, 0xc7, 0x2c, 0x18, 0x8c, 0x35, 0x80, 0x20, 0x8c, 0x87, 0x63, - 0x00, 0x82, 0x30, 0x1e, 0x8e, 0x01, 0x08, 0xc2, 0x78, 0x38, 0x06, 0x63, - 0x0d, 0x62, 0x2e, 0xa6, 0xfd, 0x07, 0x96, 0x3c, 0x1b, 0xff, 0xc2, 0x98, - 0xae, 0x6a, 0xee, 0x0b, 0x63, 0x0d, 0xff, 0x4c, 0xfa, 0xbf, 0x2f, 0xd0, - 0x35, 0x28, 0xe6, 0x5f, 0x0b, 0xc7, 0x31, 0xe8, 0x0b, 0x63, 0x0d, 0x73, - 0xdf, 0xa6, 0xa9, 0x2f, 0xb4, 0x6e, 0xc8, 0xf3, 0xbe, 0xc0, 0xe7, 0xac, - 0x8f, 0x7f, 0x04, 0x8c, 0x11, 0xe8, 0xac, 0x39, 0x87, 0x60, 0x30, 0x46, - 0xf0, 0xee, 0x69, 0x79, 0x7f, 0x63, 0x04, 0x6e, 0x1f, 0x8b, 0xb6, 0x37, - 0x46, 0x10, 0xf3, 0x60, 0x9f, 0x7b, 0x63, 0x04, 0xe6, 0xbd, 0xae, 0xb2, - 0x37, 0x03, 0x30, 0x46, 0x00, 0x82, 0x20, 0x08, 0x82, 0xc1, 0x18, 0x81, - 0xdb, 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba, 0xf8, 0x37, - 0x46, 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8, 0xf6, 0x34, - 0x18, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x18, 0x01, 0x08, 0x82, - 0x20, 0xfe, 0x8d, 0x00, 0x00, 0xe3, 0x0d, 0x75, 0x00, 0x0a, 0xb1, 0x40, - 0xc1, 0x18, 0x6e, 0x08, 0x86, 0x60, 0x96, 0xe1, 0x08, 0x82, 0xe1, 0x06, - 0xa1, 0x08, 0x66, 0x19, 0x84, 0x21, 0x18, 0x31, 0x50, 0x88, 0xe0, 0x16, - 0xee, 0xa0, 0x0e, 0xf4, 0xe0, 0x0c, 0xd4, 0x00, 0x0d, 0x8a, 0x59, 0x82, - 0x63, 0xb8, 0x81, 0x68, 0x82, 0x59, 0x06, 0xa2, 0x08, 0x46, 0x0c, 0x14, - 0x22, 0xc8, 0x85, 0x3c, 0xb8, 0x03, 0x3e, 0x48, 0x03, 0x36, 0x50, 0x83, - 0x63, 0xc4, 0x40, 0x21, 0x02, 0x5d, 0xc8, 0x03, 0x3c, 0xe8, 0x03, 0x35, - 0x68, 0x83, 0x35, 0x40, 0x06, 0x19, 0x04, 0x34, 0xa0, 0x83, 0x41, 0x06, - 0x41, 0x0d, 0xec, 0x60, 0x90, 0x41, 0x08, 0xf0, 0xe0, 0xfe, 0x00, 0x5d, - 0x0a, 0xca, 0x20, 0x43, 0xe0, 0x06, 0x77, 0x60, 0x44, 0x00, 0x9f, 0xf1, - 0x86, 0x51, 0x78, 0x05, 0x70, 0xb8, 0x00, 0x5d, 0x0a, 0xca, 0x20, 0x43, - 0x30, 0x07, 0x7c, 0x30, 0x62, 0x50, 0x14, 0xc1, 0x3a, 0x14, 0xc1, 0x78, - 0x05, 0x2a, 0xd0, 0x42, 0x39, 0x98, 0x03, 0x1f, 0x5c, 0x80, 0x2e, 0x05, - 0x65, 0x90, 0x21, 0xc0, 0x83, 0x50, 0x18, 0x31, 0x28, 0x8a, 0x00, 0x1e, - 0x94, 0x60, 0xbc, 0xa2, 0x15, 0x72, 0x41, 0x1d, 0xd6, 0x41, 0x14, 0x2e, - 0x40, 0x97, 0x82, 0x32, 0xc8, 0x10, 0xf4, 0x81, 0x29, 0x8c, 0x18, 0x14, - 0x45, 0x50, 0x0f, 0x4f, 0x30, 0xc7, 0xd0, 0x07, 0x0b, 0x3c, 0xcc, 0x31, - 0x04, 0x07, 0x3c, 0xcc, 0x31, 0x04, 0x83, 0x3b, 0xcc, 0x12, 0x1c, 0xc3, - 0x0d, 0x60, 0x30, 0x0a, 0xc1, 0x2c, 0x83, 0x71, 0x04, 0x23, 0x06, 0x0a, - 0x11, 0xd4, 0x43, 0x2d, 0xcc, 0x02, 0x2e, 0x94, 0x02, 0x2a, 0x98, 0xc2, - 0x18, 0x8c, 0x18, 0x28, 0x44, 0x60, 0x0f, 0xb5, 0x40, 0x0b, 0xb9, 0x60, - 0x0a, 0xa9, 0x70, 0x0a, 0x64, 0x30, 0xc8, 0x10, 0x94, 0xc2, 0x2a, 0x0c, - 0x32, 0x0c, 0xa5, 0x10, 0x0b, 0x83, 0x0c, 0x82, 0x28, 0xcc, 0xc2, 0x20, - 0x83, 0x10, 0xd4, 0xc2, 0xf1, 0x02, 0xba, 0x14, 0x94, 0x41, 0x86, 0x60, - 0x15, 0x68, 0xc1, 0x88, 0x00, 0x3e, 0xe3, 0x0d, 0xe0, 0xc0, 0x0e, 0xfd, - 0x70, 0x01, 0xba, 0x14, 0x94, 0x41, 0x86, 0x00, 0x16, 0x72, 0x61, 0xc4, - 0xa0, 0x28, 0x02, 0x94, 0x28, 0x82, 0xf1, 0x8a, 0x72, 0x88, 0x07, 0x91, - 0x18, 0x89, 0x5c, 0xb8, 0x00, 0x5d, 0x0a, 0xca, 0x20, 0x43, 0x50, 0x0b, - 0xbe, 0x30, 0x62, 0x50, 0x14, 0x41, 0x4b, 0x28, 0xc1, 0x78, 0x85, 0x3a, - 0xd8, 0xc3, 0x49, 0xa0, 0xc4, 0x2f, 0x5c, 0x80, 0x2e, 0x05, 0x65, 0x90, - 0x21, 0xd0, 0x85, 0x71, 0x18, 0x31, 0x28, 0x8a, 0x40, 0x26, 0x9e, 0x60, - 0x8e, 0x41, 0x17, 0x96, 0x96, 0x98, 0x63, 0x08, 0x8e, 0x96, 0x98, 0x63, - 0x08, 0x86, 0x95, 0x98, 0x25, 0x38, 0x06, 0x5a, 0x02, 0x7a, 0x10, 0xf8, - 0x80, 0x10, 0x0c, 0xbc, 0x00, 0xec, 0xa2, 0x18, 0x6f, 0xa0, 0x87, 0x7f, - 0x68, 0x09, 0x0a, 0xc6, 0x70, 0x43, 0x30, 0x0e, 0xc1, 0x2c, 0x03, 0x92, - 0x04, 0x83, 0x0c, 0xc4, 0x38, 0xb0, 0xc3, 0x78, 0x03, 0x3e, 0x8c, 0x44, - 0x49, 0x50, 0x30, 0x46, 0x0c, 0x88, 0x22, 0xd0, 0x89, 0x61, 0xc4, 0xa0, - 0x28, 0x02, 0x9e, 0x08, 0x7a, 0xc1, 0x82, 0x5e, 0x80, 0xcf, 0x88, 0x41, - 0x51, 0x04, 0x3c, 0x11, 0x88, 0x83, 0x0d, 0xbe, 0x20, 0x1f, 0xf3, 0x85, - 0x20, 0x3e, 0x36, 0x04, 0xf4, 0x19, 0x31, 0x20, 0x8a, 0x20, 0x2c, 0x82, - 0x11, 0x83, 0xa2, 0x08, 0xc6, 0x22, 0x00, 0x07, 0x0b, 0xc0, 0x41, 0x3e, - 0x73, 0x0c, 0xea, 0xb0, 0x84, 0xc5, 0x20, 0x43, 0xb0, 0x0e, 0xfb, 0x60, - 0x43, 0x40, 0x9f, 0x41, 0x86, 0xa0, 0x1d, 0x42, 0x62, 0x90, 0x21, 0xa8, - 0x46, 0x62, 0x96, 0x20, 0x19, 0xa8, 0x08, 0x04, 0x84, 0x0d, 0x8e, 0xf1, - 0x06, 0x95, 0xa8, 0x89, 0xb2, 0xa0, 0x60, 0x0c, 0x37, 0x04, 0xb8, 0xe0, - 0xcc, 0x32, 0x28, 0x50, 0x30, 0xc8, 0x40, 0xe4, 0x83, 0x48, 0x8c, 0x37, - 0xb8, 0x44, 0x4e, 0xf4, 0x04, 0x05, 0x63, 0xbc, 0x01, 0x26, 0x76, 0xc2, - 0x27, 0x28, 0x18, 0x83, 0x0c, 0x89, 0x3f, 0xb0, 0xc4, 0x70, 0x03, 0x02, - 0x0e, 0xc1, 0x2c, 0xc3, 0xc2, 0x04, 0x73, 0x0c, 0xfa, 0x50, 0xc4, 0xc5, - 0x20, 0x43, 0xb0, 0x0f, 0x2b, 0x61, 0x41, 0x22, 0x9f, 0x41, 0x86, 0xa0, - 0x1f, 0x62, 0x62, 0x96, 0xe0, 0x19, 0x6e, 0x68, 0xd6, 0x21, 0x98, 0x65, - 0x68, 0x9e, 0x60, 0x0c, 0x01, 0xb2, 0x8b, 0x31, 0x84, 0xc8, 0x2e, 0xc6, - 0x10, 0x24, 0xba, 0x18, 0x31, 0x28, 0x8a, 0xc0, 0x2f, 0x84, 0x60, 0xc4, - 0xa0, 0x28, 0x82, 0xbf, 0x20, 0x82, 0xe1, 0x86, 0x40, 0x1d, 0x84, 0x59, - 0x06, 0xe7, 0x09, 0x4c, 0x80, 0xe4, 0x63, 0x41, 0x3b, 0xc0, 0xc7, 0x08, - 0x48, 0x3e, 0x16, 0xbc, 0x03, 0x7c, 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0xa0, - 0x12, 0x41, 0x68, 0x0c, 0x32, 0x04, 0x2b, 0xb1, 0x13, 0x16, 0x64, 0xf2, - 0x19, 0x64, 0x08, 0x5a, 0x22, 0x2c, 0x66, 0x09, 0x9e, 0x81, 0x92, 0x40, - 0x0c, 0x16, 0x36, 0x60, 0x04, 0x87, 0x0d, 0x9a, 0x41, 0x86, 0x00, 0x0c, - 0xc8, 0x62, 0x96, 0x00, 0x1a, 0xa8, 0x08, 0x84, 0x47, 0x14, 0x92, 0xe1, - 0x06, 0x3b, 0xc0, 0x87, 0x60, 0x96, 0x21, 0xea, 0x82, 0xf1, 0x06, 0xb6, - 0xb8, 0x8b, 0xd4, 0xa0, 0x60, 0x8c, 0x37, 0xb8, 0x45, 0x5e, 0x8c, 0x06, - 0x05, 0x63, 0x90, 0xc1, 0xe0, 0x09, 0xb5, 0x18, 0x6e, 0x20, 0xfa, 0xc1, - 0x99, 0x65, 0x90, 0xb8, 0x60, 0x0c, 0x01, 0x79, 0x8d, 0xe1, 0x86, 0x00, - 0x25, 0x94, 0x59, 0x06, 0x6a, 0x0a, 0x4c, 0x50, 0x09, 0xf9, 0xcc, 0x12, - 0x54, 0x36, 0xb0, 0x04, 0x7c, 0x46, 0x0c, 0x88, 0x22, 0xd0, 0x8d, 0xc0, - 0x82, 0x97, 0x90, 0xcf, 0x88, 0x41, 0x51, 0x04, 0xbd, 0x11, 0xc4, 0xc4, - 0x2c, 0x41, 0x35, 0x50, 0x01, 0x28, 0x93, 0x40, 0xcd, 0x31, 0x94, 0x45, - 0x70, 0x1b, 0x63, 0x08, 0xd1, 0x6d, 0x0c, 0x37, 0x04, 0x31, 0xa1, 0xcc, - 0x32, 0x5c, 0x56, 0x60, 0xc2, 0x4c, 0xc8, 0x67, 0x96, 0x00, 0xb3, 0xa1, - 0x26, 0xe0, 0x33, 0x62, 0x40, 0x14, 0xc1, 0x78, 0x04, 0x16, 0xe0, 0x84, - 0x7c, 0x46, 0x0c, 0x8a, 0x22, 0x30, 0x8f, 0x40, 0x27, 0x66, 0x09, 0xb0, - 0x81, 0x0a, 0x40, 0xb1, 0x84, 0x6b, 0x8e, 0x21, 0x09, 0x7e, 0x63, 0x0c, - 0x41, 0xeb, 0x8d, 0xe1, 0x86, 0x40, 0x27, 0x94, 0x59, 0x06, 0x2d, 0x0b, - 0x4c, 0xe0, 0x09, 0xf9, 0xcc, 0x12, 0x6c, 0x36, 0xf8, 0x04, 0x7c, 0x46, - 0x0c, 0x88, 0x22, 0x60, 0x8f, 0xc0, 0x82, 0xb0, 0x90, 0xcf, 0x88, 0x41, - 0x51, 0x04, 0xef, 0x11, 0x8c, 0xc5, 0x2c, 0xc1, 0x36, 0x50, 0x01, 0x28, - 0x99, 0xa0, 0xcd, 0x31, 0x24, 0x41, 0x79, 0xcc, 0x12, 0x70, 0x03, 0x15, - 0x81, 0xb0, 0xe9, 0x41, 0x34, 0xc8, 0x10, 0xe8, 0xc5, 0x68, 0xcc, 0x31, - 0xd4, 0x05, 0x18, 0xb0, 0xc7, 0x20, 0x43, 0x60, 0x17, 0xa6, 0x61, 0x43, - 0x20, 0x9f, 0x41, 0x86, 0x00, 0x2f, 0x58, 0x63, 0x90, 0x21, 0x48, 0x03, - 0xd7, 0x98, 0x25, 0xc0, 0x83, 0xe1, 0x86, 0x5f, 0x38, 0x8b, 0x60, 0x96, - 0xc1, 0x53, 0x83, 0x60, 0x90, 0x61, 0x0d, 0x42, 0x43, 0x35, 0xc6, 0x1b, - 0x6c, 0x23, 0x3c, 0xe6, 0x83, 0x82, 0x31, 0xde, 0x80, 0x1b, 0xe3, 0xd1, - 0x1e, 0x14, 0x8c, 0x39, 0x06, 0xd0, 0x08, 0xee, 0x63, 0x90, 0x21, 0x08, - 0x8d, 0xd8, 0xb0, 0xe0, 0x90, 0xcf, 0x20, 0x43, 0x30, 0x1a, 0xb7, 0x31, - 0xdc, 0x70, 0xa8, 0x85, 0x33, 0xcb, 0x90, 0x06, 0x5f, 0x30, 0x86, 0x30, - 0xf0, 0xc7, 0x70, 0x43, 0xe0, 0x16, 0xca, 0x2c, 0x43, 0x18, 0x80, 0x41, - 0x60, 0x02, 0x5c, 0xc8, 0x67, 0x96, 0x40, 0x0c, 0x46, 0x0c, 0x88, 0x22, - 0x30, 0x91, 0x61, 0xc4, 0xa0, 0x28, 0x02, 0x14, 0x09, 0xe6, 0xc2, 0x82, - 0xba, 0x90, 0x8f, 0x05, 0x77, 0x01, 0x9f, 0x59, 0x02, 0x31, 0x18, 0xa8, - 0x00, 0x14, 0x30, 0x10, 0xc2, 0x60, 0x8e, 0x61, 0x35, 0x02, 0x12, 0x19, - 0x43, 0x60, 0x48, 0x64, 0xb8, 0x21, 0xb8, 0x0b, 0x65, 0x96, 0x81, 0x0c, - 0xc6, 0x20, 0x30, 0x21, 0x2f, 0xe4, 0x33, 0x4b, 0x50, 0x06, 0x23, 0x06, - 0x44, 0x11, 0xbc, 0xc8, 0x30, 0x62, 0x50, 0x14, 0x41, 0x8c, 0x04, 0x7c, - 0x61, 0x81, 0x5f, 0xc8, 0xc7, 0x02, 0xd0, 0x80, 0xcf, 0x2c, 0x41, 0x19, - 0x0c, 0x54, 0x00, 0xca, 0x18, 0x08, 0x64, 0x30, 0xc7, 0x90, 0x04, 0x2c, - 0x32, 0x86, 0x50, 0xa9, 0xc8, 0x70, 0x43, 0x00, 0x1a, 0xca, 0x2c, 0xc3, - 0x19, 0x98, 0x41, 0x60, 0x82, 0x68, 0xc8, 0x67, 0x96, 0x00, 0x0d, 0x46, - 0x0c, 0x88, 0x22, 0xc0, 0x91, 0x61, 0xc4, 0xa0, 0x28, 0x02, 0x1d, 0x09, - 0x4a, 0xc3, 0x82, 0xd3, 0x90, 0x8f, 0x05, 0xa9, 0x01, 0x9f, 0x59, 0x02, - 0x34, 0x18, 0xa8, 0x00, 0x14, 0x33, 0x10, 0xce, 0x60, 0x8e, 0x21, 0x09, - 0x64, 0x64, 0xc4, 0xc0, 0x28, 0x02, 0x30, 0x09, 0x7e, 0xa3, 0x37, 0x06, - 0x19, 0x82, 0xf0, 0xa8, 0x8f, 0x59, 0x82, 0x34, 0x18, 0xa8, 0x08, 0xfc, - 0xc0, 0x13, 0xd0, 0x60, 0x90, 0x21, 0x98, 0x05, 0xfc, 0x98, 0x25, 0xc0, - 0x83, 0x59, 0x86, 0x35, 0xb8, 0x03, 0x94, 0x18, 0x64, 0xa0, 0x05, 0xf5, - 0x98, 0x8f, 0x11, 0x83, 0xa2, 0x08, 0xc4, 0x24, 0xd8, 0x8d, 0x39, 0x06, - 0xf2, 0x08, 0x7a, 0x64, 0xc4, 0xa0, 0x28, 0x02, 0x32, 0x19, 0x78, 0x63, - 0x8e, 0x41, 0x08, 0x7c, 0x64, 0xc4, 0xa0, 0x28, 0x02, 0x33, 0x29, 0x7a, - 0x63, 0x8e, 0x41, 0x08, 0x7a, 0x64, 0xbc, 0xa1, 0x44, 0x60, 0x44, 0x4c, - 0x28, 0x18, 0xe3, 0x0d, 0x27, 0x22, 0x23, 0x3c, 0x42, 0xc1, 0x98, 0x63, - 0x78, 0x8f, 0xc0, 0x4c, 0x06, 0x19, 0x02, 0xf8, 0x00, 0x11, 0x0b, 0x0e, - 0xf9, 0x0c, 0x32, 0x04, 0xf2, 0x61, 0x22, 0xc3, 0x0d, 0x47, 0x6e, 0x38, - 0xb3, 0x0c, 0x76, 0xc0, 0x06, 0xc1, 0x18, 0xc2, 0xb0, 0x26, 0xc3, 0x0d, - 0x41, 0x6f, 0x28, 0xb3, 0x0c, 0x6e, 0xd0, 0x06, 0x81, 0x09, 0xbf, 0x21, - 0x9f, 0x59, 0x82, 0x37, 0x18, 0x31, 0x20, 0x8a, 0xa0, 0x4e, 0x86, 0x11, - 0x83, 0xa2, 0x08, 0xee, 0x24, 0x10, 0x0f, 0x0b, 0xc8, 0x43, 0x3e, 0x16, - 0x98, 0x07, 0x7c, 0x66, 0x09, 0xde, 0x60, 0xa0, 0x02, 0x50, 0xda, 0x40, - 0x70, 0x83, 0x39, 0x06, 0xfd, 0x08, 0xe6, 0x64, 0x0c, 0x81, 0x99, 0x93, - 0xe1, 0x86, 0xc0, 0x3c, 0x94, 0x59, 0x86, 0x38, 0x80, 0x83, 0xc0, 0x04, - 0xf4, 0x90, 0xcf, 0x2c, 0x81, 0x1c, 0x8c, 0x18, 0x10, 0x45, 0xe0, 0x27, - 0xc3, 0x88, 0x41, 0x51, 0x04, 0xa0, 0x12, 0xac, 0x87, 0x05, 0xed, 0x21, - 0x1f, 0x0b, 0xde, 0x03, 0x3e, 0xb3, 0x04, 0x72, 0x30, 0x50, 0x01, 0x28, - 0x70, 0x20, 0xc4, 0xc1, 0x1c, 0x43, 0x12, 0xec, 0xc9, 0x18, 0x42, 0x95, - 0x27, 0xc3, 0x0d, 0xc1, 0x7b, 0x28, 0xb3, 0x0c, 0x74, 0x30, 0x07, 0x81, - 0x09, 0xf1, 0x21, 0x9f, 0x59, 0x82, 0x3a, 0x18, 0x31, 0x20, 0x8a, 0xe0, - 0x54, 0x86, 0x11, 0x83, 0xa2, 0x08, 0x52, 0x25, 0xa0, 0x0f, 0x0b, 0xec, - 0x43, 0x3e, 0x16, 0xe0, 0x07, 0x7c, 0x66, 0x09, 0xea, 0x60, 0xa0, 0x02, - 0x50, 0xe6, 0x40, 0xa0, 0x83, 0x39, 0x86, 0x24, 0x08, 0x95, 0x11, 0x03, - 0xa3, 0x08, 0x5e, 0x25, 0x70, 0x11, 0x16, 0x19, 0x64, 0x08, 0x60, 0x84, - 0x4c, 0x66, 0x09, 0xec, 0x60, 0xa0, 0x22, 0xf0, 0x83, 0x35, 0x10, 0xea, - 0x60, 0x90, 0x21, 0x10, 0x89, 0x33, 0x99, 0x25, 0xc0, 0x83, 0xf1, 0x86, - 0x36, 0xc1, 0x13, 0x51, 0xa1, 0x60, 0x0c, 0x32, 0x94, 0xc4, 0x8e, 0x90, - 0xc9, 0x1c, 0x83, 0x8d, 0x08, 0xad, 0x32, 0xc8, 0x10, 0xdc, 0xc8, 0x99, - 0x58, 0x30, 0xc8, 0x67, 0x90, 0x21, 0xc8, 0x91, 0x36, 0x19, 0x64, 0x08, - 0x54, 0xe2, 0x4d, 0x66, 0x09, 0xf0, 0x60, 0xa0, 0x24, 0x20, 0x0d, 0x0e, - 0x1e, 0xd2, 0x40, 0xb2, 0x03, 0xe1, 0x0e, 0x2c, 0xc0, 0x13, 0xf9, 0x64, - 0x10, 0x0e, 0x04, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x77, 0xb0, 0x0e, - 0xff, 0x5c, 0xdf, 0x20, 0x31, 0x89, 0xcd, 0x43, 0x4d, 0x9c, 0xb3, 0x38, - 0x51, 0x57, 0xd9, 0x7f, 0x51, 0xac, 0x6e, 0x5d, 0x9b, 0x6d, 0x29, 0x38, - 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xf6, 0xb2, 0xfb, 0x76, 0x84, 0xe0, 0x0c, - 0xc4, 0x99, 0x33, 0xc4, 0x04, 0x2c, 0xfd, 0x44, 0x5c, 0x13, 0x15, 0x11, - 0xf6, 0x20, 0x16, 0xe5, 0xc9, 0xde, 0xbf, 0x0e, 0x08, 0x02, 0x21, 0x49, - 0x1e, 0xed, 0x55, 0x9e, 0xc7, 0xea, 0xff, 0xc9, 0xde, 0xff, 0x2e, 0x01, - 0xcc, 0xb3, 0x10, 0x91, 0xe7, 0x13, 0x17, 0x32, 0x01, 0x01, 0x31, 0x00, - 0x00, 0x21, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, 0x98, 0x85, 0x03, 0x17, - 0x90, 0x5f, 0xd8, 0x72, 0x9c, 0x42, 0x00, 0x0e, 0x07, 0x2e, 0x20, 0xbf, - 0xb0, 0xe5, 0x60, 0x85, 0x20, 0x1c, 0x0e, 0x5c, 0x40, 0x7e, 0x61, 0xcb, - 0xf1, 0x0b, 0x81, 0x38, 0x1c, 0xb8, 0x80, 0xfc, 0xc2, 0x96, 0x83, 0x1c, - 0x82, 0x71, 0x38, 0x70, 0x01, 0xf9, 0x85, 0x2d, 0x87, 0x39, 0x04, 0xe4, - 0x70, 0xe0, 0x02, 0xf2, 0x0b, 0x5b, 0x8e, 0x94, 0x08, 0xca, 0xe1, 0xc0, - 0x05, 0xe4, 0x17, 0xb6, 0x1c, 0x2b, 0x11, 0x98, 0xc3, 0x81, 0x0b, 0xc8, - 0x2f, 0x6c, 0x39, 0x40, 0x23, 0x28, 0x87, 0x03, 0x17, 0x90, 0x5f, 0xd8, - 0x72, 0x88, 0x46, 0x60, 0x0e, 0x07, 0x2e, 0x20, 0xbf, 0xb0, 0xe5, 0xe0, - 0x8f, 0xa0, 0x1c, 0x0e, 0x5c, 0x40, 0x7e, 0x61, 0xcb, 0xe1, 0x1f, 0x81, - 0x39, 0x1c, 0xb8, 0x80, 0xfc, 0xc2, 0x96, 0x03, 0x4e, 0x02, 0x73, 0x38, - 0x70, 0x01, 0xf9, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x71, 0x20, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x20, 0xb1, + 0x5d, 0xf9, 0xb3, 0xce, 0x82, 0x0c, 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34, + 0x13, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x00, 0xd4, 0x73, 0x10, 0x41, 0x10, 0x68, 0x84, 0x65, 0x30, 0x03, 0x40, + 0x3c, 0x03, 0x40, 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x00, 0x00, + 0x00, 0xe3, 0x0d, 0x06, 0x44, 0x50, 0x30, 0xe6, 0x18, 0x88, 0xc0, 0x1b, + 0x64, 0x08, 0x0a, 0x64, 0x8e, 0x21, 0x28, 0x10, 0x0b, 0x18, 0xf9, 0x64, + 0x10, 0x10, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5b, 0x8a, 0x20, + 0xe0, 0x83, 0x23, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0xb0, 0x11, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, - 0xde, 0x21, 0x0c, 0x00, 0x00, 0x69, 0x04, 0x00, 0x00, 0x0b, 0x82, 0x20, + 0x00, 0x88, 0x18, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, + 0xde, 0x21, 0x0c, 0x00, 0x00, 0x1f, 0x06, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, @@ -1731,7 +896,7 @@ const unsigned char sdl_metallib[] = { 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, - 0x00, 0x8b, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, + 0x00, 0xef, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, @@ -1768,224 +933,240 @@ const unsigned char sdl_metallib[] = { 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0xc3, 0x26, 0x10, 0xc0, 0x02, 0x54, 0x43, 0x38, 0xa4, 0x83, 0x3c, 0xb4, 0x81, 0x38, 0xd4, 0x83, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0xb8, 0xc3, 0x3b, 0xb4, 0x41, - 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00, 0x1b, 0xb6, 0xa1, 0x00, - 0x16, 0xa0, 0x1a, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, - 0xcc, 0xc1, 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d, - 0xc2, 0x81, 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0xd8, 0x60, 0x10, 0x06, - 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0x40, 0x80, 0x05, 0xa8, 0x36, 0x18, 0xc6, - 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50, 0x1b, 0x90, 0xe3, 0xff, - 0xff, 0xff, 0xff, 0x07, 0x80, 0x01, 0x24, 0xa0, 0xda, 0x60, 0x20, 0x01, - 0xb0, 0x00, 0xd5, 0x06, 0x23, 0x11, 0x80, 0x05, 0xa8, 0x36, 0x20, 0xca, - 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x03, 0x48, 0x40, 0xb5, 0xc1, 0x58, - 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x24, 0x80, 0x02, 0x49, 0x18, 0x00, - 0x00, 0x05, 0x00, 0x00, 0x00, 0x13, 0x8a, 0x40, 0x18, 0x88, 0x62, 0x42, - 0x60, 0x4c, 0x18, 0x0e, 0x24, 0x99, 0x30, 0x28, 0x48, 0x32, 0x21, 0x58, - 0x00, 0x89, 0x20, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, - 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, - 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, - 0x4c, 0x10, 0xa8, 0xc1, 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, - 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, - 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18, 0x80, 0x1c, 0x28, 0x66, - 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6, 0x81, 0x1e, 0xdc, 0xa0, - 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4, 0x40, 0x0f, 0xda, 0x21, - 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50, 0x60, 0x1c, 0x24, 0x4d, - 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21, 0x38, 0x03, 0x81, 0x84, - 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, - 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80, - 0x41, 0x04, 0x25, 0x38, 0x4d, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x7f, 0x22, - 0xae, 0x89, 0x8a, 0x88, 0xdf, 0x1e, 0x7e, 0x20, 0x8a, 0x00, 0xec, 0x9f, - 0xc6, 0x08, 0x80, 0x41, 0x04, 0x26, 0xb8, 0x48, 0x9a, 0x22, 0x4a, 0x98, - 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00, 0x06, - 0x11, 0x1c, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44, 0xb2, 0x34, 0x0f, 0x41, - 0x65, 0x00, 0x00, 0x80, 0xa4, 0x22, 0x00, 0x00, 0x51, 0x65, 0x00, 0x8a, - 0x82, 0xac, 0x39, 0x02, 0x30, 0x98, 0x23, 0x08, 0x86, 0x11, 0x04, 0xac, - 0x24, 0x41, 0xf3, 0x08, 0x58, 0xa6, 0x65, 0x00, 0x6d, 0x05, 0x09, 0x96, - 0x47, 0xc8, 0xb4, 0x0c, 0xa0, 0x6e, 0x20, 0x20, 0x05, 0xb0, 0x61, 0x84, - 0x01, 0x1b, 0x44, 0x08, 0x84, 0x39, 0x02, 0x50, 0x18, 0x44, 0x38, 0x84, - 0x41, 0x84, 0x42, 0x18, 0x44, 0x00, 0x84, 0x29, 0x80, 0x11, 0x80, 0x61, - 0x04, 0x02, 0x03, 0x00, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, - 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, - 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, - 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, - 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, - 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, - 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, - 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, - 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, - 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, - 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, - 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, - 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, - 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, - 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, - 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, - 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x43, 0x98, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x21, 0xcc, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x10, 0xa6, 0x02, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, - 0x73, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xe1, - 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x78, 0x40, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x81, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, - 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xc2, 0x46, 0x00, 0x4a, - 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80, 0x0a, 0x30, 0xa0, 0x0c, - 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, - 0x68, 0x2c, 0x9c, 0x11, 0x80, 0xc2, 0x28, 0x84, 0x82, 0x28, 0x90, 0x42, - 0x29, 0x18, 0x02, 0xc7, 0x12, 0x22, 0x01, 0x00, 0x00, 0x79, 0x18, 0x00, - 0x00, 0xa2, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, - 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0xa6, - 0x7c, 0x00, 0x18, 0x7c, 0x54, 0xee, 0xc6, 0xd0, 0xc2, 0xe4, 0xbe, 0xe6, - 0xd2, 0xf4, 0xca, 0x86, 0x18, 0xd8, 0xf1, 0x09, 0x18, 0xc2, 0x37, 0x08, - 0x82, 0x83, 0x63, 0x2b, 0x03, 0x69, 0x2b, 0xa3, 0x0b, 0x63, 0x03, 0xb1, - 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x03, 0x99, 0x91, 0x81, 0x91, 0x99, - 0x71, 0xc9, 0xc1, 0x01, 0x41, 0x69, 0x2b, 0xa3, 0x0b, 0x63, 0x33, 0x2b, - 0x6b, 0x99, 0x91, 0x81, 0x91, 0x99, 0x71, 0xc9, 0xc1, 0x49, 0x19, 0x22, - 0x7c, 0xc4, 0x10, 0x03, 0x3b, 0xb0, 0x05, 0x33, 0x58, 0x34, 0x95, 0xd1, - 0x85, 0xb1, 0x0d, 0x41, 0xbe, 0x03, 0x3b, 0xb0, 0x03, 0x33, 0xb8, 0x85, - 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x90, - 0x95, 0xb9, 0xbd, 0xc9, 0xb5, 0xcd, 0x7d, 0x91, 0xa5, 0xcd, 0x85, 0x89, - 0xb1, 0x95, 0x0d, 0x11, 0xbe, 0x84, 0x5c, 0x58, 0x9a, 0x9c, 0xcb, 0xd8, - 0x5b, 0x1b, 0x5c, 0x1a, 0x5b, 0x99, 0x8b, 0x59, 0xd8, 0x1c, 0xdd, 0x57, - 0x5b, 0x18, 0x1d, 0xda, 0x57, 0x99, 0x5b, 0x98, 0x18, 0x5b, 0xd9, 0x10, - 0xe1, 0x5b, 0x48, 0x06, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, - 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0xaf, 0x61, 0x14, 0x96, 0x26, 0xe7, - 0x22, 0x57, 0xe6, 0x46, 0x56, 0x26, 0xf7, 0x45, 0x17, 0x26, 0x77, 0x56, - 0x46, 0xc7, 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, 0xec, 0x8b, 0x2e, - 0x0f, 0xae, 0xec, 0xcb, 0x2d, 0xac, 0xad, 0x8c, 0x86, 0x19, 0xdb, 0x5b, - 0x18, 0x1d, 0xcd, 0x10, 0xe4, 0x7b, 0x30, 0xe3, 0x83, 0xbe, 0x68, 0x88, - 0xf0, 0x49, 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xde, 0xe6, 0xd2, 0xe8, - 0xd2, 0xde, 0xdc, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0x95, 0xb9, 0xd1, - 0x95, 0xc9, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x71, 0x7b, 0xfb, 0x82, 0x2b, - 0x93, 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3, 0x2b, 0x23, 0x13, 0x96, - 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0xe5, 0x16, 0xd6, 0x56, 0x46, 0x04, - 0xee, 0x6d, 0x2e, 0x8d, 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0x84, 0x19, 0x1f, - 0xf5, 0x55, 0x9f, 0xf5, 0x41, 0x5f, 0xf4, 0x5d, 0x1f, 0x46, 0x29, 0x2c, - 0x4d, 0xce, 0xc5, 0x4c, 0x2e, 0xec, 0xac, 0xad, 0xcc, 0x8d, 0xee, 0x2b, - 0xcd, 0x0d, 0xae, 0x8e, 0x8e, 0xd6, 0x59, 0x99, 0x5b, 0x99, 0x5c, 0x18, - 0x5d, 0x19, 0x19, 0x4a, 0xcd, 0xd8, 0x1b, 0xdb, 0x9b, 0x1c, 0x91, 0x1d, - 0xcd, 0x97, 0x59, 0x0a, 0x9f, 0xb0, 0x34, 0x39, 0x17, 0xb8, 0x32, 0xb9, - 0x39, 0xb8, 0xb2, 0x31, 0xba, 0x34, 0xbb, 0x32, 0x16, 0x63, 0x6f, 0x6c, - 0x6f, 0x72, 0x43, 0x24, 0xec, 0xf8, 0xb4, 0x6f, 0xfb, 0xaa, 0x8f, 0xfb, - 0xa0, 0x2f, 0xfa, 0xae, 0xaf, 0x63, 0x76, 0x56, 0xe6, 0x56, 0x26, 0x17, - 0x46, 0x57, 0x46, 0x86, 0x82, 0x43, 0x57, 0x86, 0x37, 0xf6, 0xf6, 0x26, - 0x47, 0x46, 0x64, 0x27, 0xf3, 0x65, 0x96, 0x42, 0xc3, 0x8c, 0xed, 0x2d, - 0x8c, 0x4e, 0x86, 0x08, 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b, 0x1c, 0xd9, - 0x10, 0x09, 0x53, 0x3e, 0xed, 0xfb, 0xbe, 0xea, 0xe3, 0x3e, 0xe8, 0x03, - 0x83, 0xef, 0xfa, 0xc2, 0x80, 0x4a, 0x58, 0x9a, 0x9c, 0x8b, 0x58, 0x9d, - 0x99, 0x59, 0x99, 0x1c, 0x9f, 0xb0, 0x34, 0x39, 0x17, 0xb1, 0x3a, 0x33, - 0xb3, 0x32, 0xb9, 0xaf, 0xb9, 0x34, 0xbd, 0x32, 0x4a, 0x61, 0x69, 0x72, - 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x44, 0xc2, 0xd2, 0xe4, 0x5c, 0xe4, 0xca, 0xc2, 0xc8, - 0x48, 0x85, 0xa5, 0xc9, 0xb9, 0xcc, 0xd1, 0xc9, 0xd5, 0x8d, 0xd1, 0x7d, - 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0xa5, 0xb9, 0x99, 0xbd, 0xb1, 0x30, 0x63, - 0x7b, 0x0b, 0xa3, 0x23, 0x33, 0x37, 0x26, 0x75, 0x24, 0xf4, 0xf5, 0x56, - 0x47, 0x07, 0x57, 0x47, 0x47, 0x86, 0xae, 0x0c, 0x8f, 0xae, 0x4e, 0xae, - 0xec, 0x8b, 0x2e, 0x0f, 0xae, 0x8c, 0x4a, 0x9a, 0x1b, 0x5c, 0x1d, 0xdd, - 0x17, 0x5d, 0x1e, 0x5c, 0x19, 0x97, 0xb1, 0x37, 0xb6, 0x37, 0xb9, 0xaf, - 0xb9, 0xb1, 0x30, 0xb6, 0x32, 0x3a, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, - 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x7c, 0xe8, 0xde, 0xdc, - 0xca, 0xda, 0xc2, 0xe0, 0xbe, 0xcc, 0xc2, 0xc6, 0xe8, 0xde, 0xe4, 0x62, - 0xf8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0x99, 0x85, 0x8d, - 0xd1, 0xbd, 0xc9, 0xc9, 0xf0, 0x99, 0x23, 0x93, 0xfb, 0xba, 0x43, 0x4b, - 0xa3, 0x2b, 0xfb, 0x82, 0x7b, 0x4b, 0x73, 0xa3, 0x1b, 0x02, 0x0b, 0x98, - 0x81, 0x21, 0x98, 0xf1, 0xa1, 0xc1, 0x97, 0x06, 0x18, 0x82, 0x21, 0x98, - 0xf1, 0xa1, 0xc1, 0xa7, 0x06, 0xd8, 0x82, 0x21, 0x98, 0xf1, 0xa1, 0xc1, - 0xb7, 0x06, 0xd8, 0x83, 0x21, 0x98, 0xf1, 0xa1, 0xc1, 0xc7, 0x06, 0x58, - 0x82, 0x21, 0x98, 0xf1, 0xa1, 0xc1, 0xd7, 0x06, 0x18, 0x84, 0x21, 0x98, - 0xf1, 0xa1, 0xc1, 0xe7, 0x06, 0x58, 0x84, 0x21, 0x98, 0xf1, 0xa1, 0xc1, - 0xf7, 0x06, 0x98, 0x84, 0x21, 0x98, 0xf1, 0xa1, 0xc1, 0x07, 0x07, 0x8c, - 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, - 0xbe, 0xe6, 0xd2, 0xf4, 0xca, 0x78, 0x85, 0xa5, 0xc9, 0xb9, 0x84, 0xc9, - 0x9d, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0x85, 0xb1, 0xa5, 0x9d, 0xb9, - 0x7d, 0xcd, 0xa5, 0xe9, 0x95, 0xf1, 0x99, 0x42, 0x0b, 0x23, 0x2b, 0x93, - 0x1b, 0x7a, 0x73, 0x9b, 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0x63, 0x30, 0x36, - 0x84, 0x0c, 0x30, 0xe7, 0x1b, 0x83, 0x8f, 0x0c, 0x30, 0xe6, 0x2b, 0x03, - 0xcc, 0xc0, 0x8e, 0xcf, 0x0c, 0xbe, 0x33, 0xf8, 0xe2, 0xe0, 0x93, 0x03, - 0x8c, 0xf9, 0xe6, 0x00, 0x43, 0x3e, 0xe8, 0xa3, 0x83, 0xef, 0xfa, 0xea, - 0x80, 0x86, 0x19, 0xdb, 0x5b, 0x18, 0xdd, 0x0c, 0x8d, 0x37, 0x33, 0xb3, - 0xb9, 0x32, 0x3a, 0x22, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, - 0x34, 0xda, 0xc2, 0xe8, 0xe4, 0xd2, 0xf0, 0x86, 0x50, 0x98, 0x81, 0x25, - 0x98, 0xf1, 0xdd, 0xc1, 0x87, 0x07, 0x58, 0x82, 0x4d, 0x98, 0xf1, 0xe5, - 0xc1, 0xa7, 0x07, 0x4c, 0xb2, 0xaa, 0xac, 0x88, 0xca, 0xc6, 0xde, 0xc8, - 0xca, 0x68, 0x90, 0x95, 0x8d, 0xbd, 0x91, 0x95, 0x0d, 0x21, 0x03, 0x0c, - 0xf9, 0xc6, 0xe0, 0x23, 0x03, 0xac, 0xf9, 0xca, 0x00, 0x3b, 0xb0, 0xe3, - 0x33, 0x83, 0xef, 0x0c, 0xbe, 0x3d, 0xf8, 0xe4, 0x00, 0x6b, 0xbe, 0x39, - 0xc0, 0x92, 0x0f, 0xfa, 0xf8, 0xe0, 0xbb, 0xbe, 0x3e, 0xe0, 0x12, 0x96, - 0x26, 0xe7, 0x42, 0x57, 0x86, 0x47, 0x57, 0x27, 0x57, 0x46, 0x25, 0x2c, - 0x4d, 0xce, 0x65, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x8c, 0x18, 0x5d, 0x19, - 0x1e, 0x5d, 0x9d, 0x5c, 0x99, 0x0c, 0x19, 0x8f, 0x19, 0xdb, 0x5b, 0x18, - 0x1d, 0x0b, 0xc8, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0x0f, 0x09, 0xba, - 0x32, 0xbc, 0xac, 0x21, 0x14, 0x46, 0x7d, 0x7f, 0xf0, 0x95, 0x01, 0x66, - 0x60, 0xc7, 0x07, 0x0a, 0x1f, 0xf4, 0x85, 0xc2, 0x77, 0x7d, 0xa2, 0x40, - 0x8f, 0xae, 0x0c, 0x8f, 0xae, 0x4e, 0xae, 0x4c, 0x86, 0xec, 0x2b, 0x4c, - 0x4e, 0x2e, 0x2c, 0x8f, 0xc7, 0x8c, 0xed, 0x2d, 0x8c, 0x8e, 0x05, 0x64, - 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0xcc, 0x87, 0x05, 0x5d, 0x19, 0x5e, 0x95, - 0xd5, 0x10, 0x0a, 0xab, 0xbe, 0x3f, 0xf8, 0xca, 0x00, 0x3b, 0xb0, 0xe3, - 0x03, 0x85, 0x0f, 0xfa, 0x48, 0xe1, 0xbb, 0xbe, 0x52, 0xe0, 0x12, 0x96, - 0x26, 0xe7, 0x32, 0x17, 0xd6, 0x06, 0xc7, 0x56, 0x26, 0xc7, 0x63, 0x2e, - 0xac, 0x0d, 0x8e, 0xad, 0x4c, 0x8e, 0xc1, 0xdc, 0x10, 0x09, 0xb3, 0xbe, - 0x53, 0xf8, 0xca, 0x00, 0x33, 0xb0, 0xe3, 0x83, 0x3e, 0x54, 0xf8, 0xae, - 0x2f, 0x15, 0x86, 0x40, 0x5f, 0xf6, 0x79, 0x9f, 0x18, 0x7c, 0x76, 0xf0, - 0xf9, 0xc1, 0x37, 0x0a, 0x9f, 0x29, 0x7c, 0xaa, 0x30, 0xc4, 0x88, 0x80, - 0x6f, 0xfa, 0x56, 0x81, 0x62, 0x10, 0x96, 0x26, 0xd7, 0x12, 0xc6, 0x96, - 0x16, 0x36, 0xd7, 0x32, 0x37, 0xf6, 0x06, 0x57, 0x36, 0x87, 0x32, 0x45, - 0xc4, 0xf4, 0x95, 0x55, 0x65, 0xf5, 0x65, 0x26, 0x17, 0x76, 0xd6, 0x56, - 0xe6, 0x46, 0x97, 0x32, 0x84, 0xf8, 0x5c, 0xe1, 0x6b, 0x05, 0x62, 0x61, - 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x43, - 0x8c, 0x0f, 0x16, 0x3e, 0x57, 0xf8, 0x5e, 0x81, 0x58, 0x58, 0x9a, 0x5c, - 0x4b, 0x18, 0x5b, 0x5a, 0xd8, 0x5c, 0xcb, 0xdc, 0xd8, 0x1b, 0x5c, 0x59, - 0xcb, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0xdc, 0xdc, 0x10, 0xe3, 0x93, - 0x85, 0xcf, 0x15, 0xbe, 0x58, 0x18, 0x42, 0x7c, 0xb0, 0xf0, 0xc9, 0x02, - 0xad, 0xb0, 0x34, 0xb9, 0x96, 0x30, 0xb6, 0xb4, 0xb0, 0xb9, 0x96, 0xb9, - 0xb1, 0x37, 0xb8, 0xb2, 0x96, 0x30, 0xb9, 0x33, 0x94, 0x99, 0x94, 0x21, - 0xc6, 0x57, 0x0b, 0x9f, 0x2b, 0x7c, 0xb4, 0x40, 0x2b, 0x2c, 0x4d, 0xae, - 0x25, 0x8c, 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, - 0x25, 0x4c, 0xee, 0x0c, 0x85, 0x26, 0x65, 0x88, 0xf1, 0xdd, 0xc2, 0xe7, - 0x0a, 0x9f, 0x2d, 0x0c, 0x21, 0xbe, 0x5a, 0xf8, 0x6e, 0x61, 0x88, 0xf0, - 0xdd, 0xc2, 0x10, 0xe3, 0xab, 0x85, 0x0f, 0x16, 0x3e, 0x59, 0x60, 0xf5, - 0xa5, 0x45, 0x35, 0x15, 0x53, 0x33, 0x85, 0x16, 0x46, 0x56, 0x26, 0x37, - 0xf4, 0xe6, 0x36, 0x47, 0x17, 0xe6, 0x46, 0x37, 0xc7, 0xe7, 0xad, 0xcd, - 0x2d, 0x0d, 0xee, 0x8d, 0xae, 0xcc, 0x8d, 0x0e, 0x64, 0x0c, 0x2d, 0x4c, - 0x8e, 0xcf, 0x54, 0x5a, 0x1b, 0x1c, 0x5b, 0x19, 0xc8, 0xd0, 0xca, 0x0a, - 0x08, 0x95, 0x50, 0x50, 0xd0, 0x10, 0xe1, 0xeb, 0x85, 0x21, 0xc6, 0xc7, - 0x0b, 0x9f, 0x2f, 0x8c, 0x01, 0x36, 0xc4, 0xf8, 0xd0, 0xe0, 0xfb, 0x85, - 0x31, 0xc0, 0x86, 0x88, 0xc1, 0xb7, 0x0b, 0x1f, 0x38, 0x8c, 0x01, 0xf6, - 0x81, 0xc3, 0x18, 0x68, 0x1f, 0x38, 0x8c, 0xc1, 0xf6, 0x81, 0xc3, 0x18, - 0x64, 0x1f, 0x38, 0x8c, 0x01, 0xf7, 0x81, 0xc3, 0x18, 0x74, 0x1f, 0x38, - 0x8c, 0x81, 0xf7, 0x81, 0xc3, 0x18, 0x5c, 0x43, 0x8c, 0x2f, 0x1c, 0x3e, - 0x70, 0x18, 0x03, 0x6c, 0x88, 0xf0, 0xd5, 0xc2, 0x10, 0xe3, 0xbb, 0x85, - 0x0f, 0x16, 0x3e, 0x59, 0x18, 0x62, 0x7c, 0xe1, 0xf0, 0x81, 0xc3, 0x18, - 0x64, 0x23, 0x22, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, - 0x77, 0x20, 0x87, 0x7a, 0x60, 0x87, 0x72, 0x70, 0x03, 0x73, 0x60, 0x87, - 0x70, 0x38, 0x87, 0x79, 0x98, 0x22, 0x04, 0xc3, 0x08, 0x85, 0x1d, 0xd8, - 0xc1, 0x1e, 0xda, 0xc1, 0x0d, 0xd2, 0x81, 0x1c, 0xca, 0xc1, 0x1d, 0xe8, - 0x61, 0x4a, 0x50, 0x8c, 0x58, 0xc2, 0x21, 0x1d, 0xe4, 0xc1, 0x0d, 0xec, - 0xa1, 0x1c, 0xe4, 0x61, 0x1e, 0xd2, 0xe1, 0x1d, 0xdc, 0x61, 0x4a, 0x60, - 0x8c, 0xa0, 0xc2, 0x21, 0x1d, 0xe4, 0xc1, 0x0d, 0xd8, 0x21, 0x1c, 0xdc, - 0xe1, 0x1c, 0xea, 0x21, 0x1c, 0xce, 0xa1, 0x1c, 0x7e, 0xc1, 0x1e, 0xca, - 0x41, 0x1e, 0xe6, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0xa6, 0x04, 0xc8, 0x88, - 0x29, 0x1c, 0xd2, 0x41, 0x1e, 0xdc, 0x60, 0x1c, 0xde, 0xa1, 0x1d, 0xe0, - 0x21, 0x1d, 0xd8, 0xa1, 0x1c, 0x7e, 0xe1, 0x1d, 0xe0, 0x81, 0x1e, 0xd2, - 0xe1, 0x1d, 0xdc, 0x61, 0x1e, 0xa6, 0x0c, 0x0a, 0xe3, 0x8c, 0x60, 0xc2, - 0x21, 0x1d, 0xe4, 0xc1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xe1, 0x1c, 0xda, - 0xa1, 0x1c, 0xdc, 0x81, 0x1e, 0xa6, 0x04, 0xac, 0x00, 0x79, 0x18, 0x00, + 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00, 0x1b, 0x8c, 0xa1, 0x00, + 0x16, 0xa0, 0xda, 0x60, 0x10, 0x06, 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0x83, 0x8f, 0x18, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00, 0x0f, 0xf0, + 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0, 0x0e, 0xe3, + 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, + 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b, 0xa4, 0x83, + 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b, 0xb4, 0x81, + 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b, 0xdc, 0x43, + 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03, 0x90, 0x07, 0x76, 0x00, 0x0c, 0xee, + 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5, 0x90, 0x0e, 0xec, 0x40, 0x0f, 0xe9, + 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x60, 0x0e, 0xf2, + 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0xef, 0x90, 0x0e, 0xee, + 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d, 0x50, 0x0e, 0xec, 0x90, 0x0e, 0xed, + 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, + 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94, 0x43, 0x1b, 0xc0, 0xc3, + 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0x94, 0x03, + 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81, 0x3b, 0xbc, 0x83, 0x3b, 0xb4, 0x01, + 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, + 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x90, 0x0e, 0xee, 0x60, 0x0e, 0xf3, + 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, + 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, + 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3, 0x3c, 0xb4, 0x81, 0x39, 0xc0, 0x43, + 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f, 0xf5, + 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xe7, + 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d, 0xa0, 0x0f, 0xe5, 0x20, 0x0f, 0xef, + 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, 0x0e, 0xf4, + 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3, + 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43, 0x38, 0xc0, 0x03, 0x3c, 0xa4, 0x83, + 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, + 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0x31, 0x0f, 0xf4, 0x10, 0x0e, 0xe3, + 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2, 0xf0, 0x0e, 0xf4, 0x50, 0x0e, 0xe3, + 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d, 0x20, 0x0e, 0xf5, 0x60, 0x0e, 0xe6, + 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xfa, 0x50, 0x0e, 0x00, + 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3, 0x3c, 0x84, 0x83, 0x39, 0x94, 0x43, + 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, + 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x6c, 0x40, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0x00, 0x06, 0x90, 0x80, 0x6a, 0x83, 0x81, 0x04, 0xc0, + 0x02, 0x54, 0x1b, 0x8c, 0x44, 0x00, 0x16, 0xa0, 0xda, 0x80, 0x28, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x0c, 0x20, 0x01, 0xd5, 0x06, 0x63, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0xc3, 0xc4, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x28, 0x80, 0x34, 0xb8, 0xc3, 0x3b, 0xb4, 0x81, + 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03, 0x3d, 0xa4, 0x83, 0x3b, 0xcc, 0x03, + 0x00, 0x49, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40, + 0x18, 0x88, 0x09, 0x41, 0x31, 0x21, 0x30, 0x26, 0x0c, 0x07, 0x92, 0x4c, + 0x18, 0x14, 0x24, 0x99, 0x10, 0x2c, 0x13, 0x02, 0x06, 0x89, 0x20, 0x00, + 0x00, 0x32, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, + 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, + 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0x9c, 0xc1, + 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, + 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, + 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, + 0x41, 0x38, 0x4a, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89, + 0x8a, 0x88, 0xdf, 0x1e, 0xfe, 0x69, 0x8c, 0x00, 0x18, 0x44, 0x28, 0x82, + 0x8b, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x25, 0x80, 0x79, 0x16, 0x22, + 0xfa, 0xa7, 0x31, 0x02, 0x60, 0x10, 0xe1, 0x10, 0xca, 0x11, 0x04, 0x81, + 0x40, 0x18, 0x08, 0x25, 0xc3, 0x08, 0x03, 0x50, 0x88, 0x65, 0x59, 0x16, + 0x62, 0xca, 0x00, 0x00, 0x00, 0x39, 0x45, 0x00, 0x00, 0x82, 0xca, 0x00, + 0x2c, 0x0b, 0x49, 0xc5, 0x58, 0x16, 0x00, 0x00, 0x00, 0xa2, 0xca, 0xb0, + 0x2c, 0x0b, 0x59, 0x45, 0x58, 0x16, 0xc2, 0xe6, 0x08, 0x82, 0x39, 0x02, + 0x30, 0x18, 0x46, 0x10, 0xb6, 0x82, 0x04, 0x06, 0x22, 0x68, 0x9c, 0x06, + 0x50, 0x37, 0x10, 0x90, 0x02, 0xdb, 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x00, + 0xc2, 0x14, 0xc0, 0x08, 0xc0, 0x30, 0xc2, 0xb0, 0x0d, 0x23, 0x10, 0x1b, + 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, + 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, + 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51, + 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80, + 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0, + 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, + 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60, + 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, + 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0, + 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, + 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, + 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90, + 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, + 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, + 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, + 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, + 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60, + 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, + 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, + 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10, + 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, + 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80, + 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18, + 0x05, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0x4c, 0x03, + 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, 0xe6, 0x01, 0x02, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0x13, 0x01, 0x01, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0x99, 0x80, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x54, 0x08, 0x30, 0x0c, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0c, 0x61, 0x1e, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x86, 0x30, 0x17, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x43, 0x98, 0x0c, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x21, 0xcc, 0x05, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, + 0xc6, 0x03, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0b, 0x04, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, + 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xda, 0x46, 0x00, 0x0a, + 0xa1, 0x04, 0x8a, 0xa0, 0x20, 0x0a, 0xa8, 0x0c, 0x0a, 0xa3, 0x40, 0x0a, + 0xa5, 0x60, 0x0a, 0xa7, 0x14, 0x28, 0x2c, 0x9c, 0x11, 0x80, 0x42, 0x28, + 0x88, 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x02, 0xc7, 0x12, 0x24, 0x01, + 0x00, 0x79, 0x18, 0x00, 0x00, 0x77, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, + 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, + 0xb7, 0x21, 0xc6, 0xe6, 0x7c, 0x00, 0x18, 0x80, 0x01, 0x95, 0xbb, 0x31, + 0xb4, 0x30, 0xb9, 0xaf, 0xb9, 0x34, 0xbd, 0xb2, 0x21, 0xc6, 0xd6, 0x7c, + 0xc2, 0xc6, 0x30, 0x0e, 0x82, 0xe0, 0xe0, 0xd8, 0xca, 0x40, 0xda, 0xca, + 0xe8, 0xc2, 0xd8, 0x40, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0x40, + 0x66, 0x64, 0x60, 0x64, 0x66, 0x5c, 0x68, 0x60, 0x68, 0x40, 0x50, 0xda, + 0xca, 0xe8, 0xc2, 0xd8, 0xcc, 0xca, 0x5a, 0x66, 0x64, 0x60, 0x64, 0x66, + 0x5c, 0x68, 0x60, 0x68, 0x52, 0x86, 0x08, 0x1f, 0x31, 0xc4, 0xd8, 0x9a, + 0xed, 0xd9, 0x16, 0x16, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x43, 0x90, 0xef, + 0xd8, 0x9a, 0xad, 0xd9, 0x16, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, + 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x2f, + 0x21, 0x17, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, + 0xe6, 0x62, 0x16, 0x36, 0x47, 0xf7, 0xd5, 0x16, 0x46, 0x87, 0xf6, 0x55, + 0xe6, 0x16, 0x26, 0xc6, 0x56, 0x36, 0x44, 0xf8, 0x16, 0x92, 0x41, 0x58, + 0x9a, 0x9c, 0xcb, 0xd8, 0x5b, 0x1b, 0x5c, 0x1a, 0x5b, 0x99, 0x8b, 0x99, + 0x5c, 0x58, 0x5b, 0x99, 0x58, 0x9d, 0x99, 0x59, 0x99, 0xdc, 0x97, 0x59, + 0x19, 0xdd, 0x18, 0xda, 0x57, 0x99, 0x5b, 0x98, 0x18, 0x5b, 0xd9, 0x10, + 0xe1, 0x6b, 0x18, 0x85, 0xa5, 0xc9, 0xb9, 0xc8, 0x95, 0xb9, 0x91, 0x95, + 0xc9, 0x7d, 0xd1, 0x85, 0xc9, 0x9d, 0x95, 0xd1, 0x31, 0x0a, 0x4b, 0x93, + 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x72, 0x0b, + 0x6b, 0x2b, 0xa3, 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x33, 0x04, 0xf9, + 0x9e, 0x6d, 0xf9, 0xa0, 0x2f, 0x1a, 0x22, 0x7c, 0x12, 0x99, 0xb0, 0x34, + 0x39, 0x17, 0xb8, 0xb7, 0xb9, 0x34, 0xba, 0xb4, 0x37, 0x37, 0x2a, 0x61, + 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x94, 0xc2, 0xd2, + 0xe4, 0x5c, 0xdc, 0xde, 0xbe, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca, 0xc6, + 0xe8, 0xd2, 0xec, 0xca, 0xc8, 0x84, 0xa5, 0xc9, 0xb9, 0x84, 0xc9, 0x9d, + 0x7d, 0xb9, 0x85, 0xb5, 0x95, 0x11, 0x81, 0x7b, 0x9b, 0x4b, 0xa3, 0x4b, + 0x7b, 0x73, 0x1b, 0x02, 0x6d, 0xcb, 0x47, 0x7d, 0xd5, 0x67, 0x7d, 0xd0, + 0x17, 0x7d, 0xd7, 0x87, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x31, 0x93, 0x0b, + 0x3b, 0x6b, 0x2b, 0x73, 0xa3, 0xfb, 0x4a, 0x73, 0x83, 0xab, 0xa3, 0xa3, + 0x75, 0x56, 0xe6, 0x56, 0x26, 0x17, 0x46, 0x57, 0x46, 0x86, 0x52, 0x33, + 0xf6, 0xc6, 0xf6, 0x26, 0x47, 0x64, 0x47, 0xf3, 0x65, 0x96, 0xc2, 0x27, + 0x2c, 0x4d, 0xce, 0x05, 0xae, 0x4c, 0x6e, 0x0e, 0xae, 0x6c, 0x8c, 0x2e, + 0xcd, 0xae, 0x8c, 0xc5, 0xd8, 0x1b, 0xdb, 0x9b, 0xdc, 0x10, 0x69, 0x6b, + 0x3e, 0xed, 0xdb, 0xbe, 0xea, 0xe3, 0x3e, 0xe8, 0x8b, 0xbe, 0xeb, 0xeb, + 0x98, 0x9d, 0x95, 0xb9, 0x95, 0xc9, 0x85, 0xd1, 0x95, 0x91, 0xa1, 0xe0, + 0xd0, 0x95, 0xe1, 0x8d, 0xbd, 0xbd, 0xc9, 0x91, 0x11, 0xd9, 0xc9, 0x7c, + 0x99, 0xa5, 0xd0, 0x30, 0x63, 0x7b, 0x0b, 0xa3, 0x93, 0x21, 0x42, 0x57, + 0x86, 0x37, 0xf6, 0xf6, 0x26, 0x47, 0x36, 0x44, 0xda, 0x9c, 0x4f, 0xfb, + 0xbe, 0xaf, 0xfa, 0xb8, 0x0f, 0xfa, 0xc0, 0xe0, 0xbb, 0xbe, 0x30, 0xa0, + 0x12, 0x96, 0x26, 0xe7, 0x22, 0x56, 0x67, 0x66, 0x56, 0x26, 0xc7, 0x27, + 0x2c, 0x4d, 0xce, 0x45, 0xac, 0xce, 0xcc, 0xac, 0x4c, 0xee, 0x6b, 0x2e, + 0x4d, 0xaf, 0x8c, 0x52, 0x58, 0x9a, 0x9c, 0x0b, 0xdb, 0xdb, 0x58, 0x18, + 0x5d, 0xda, 0x9b, 0xdb, 0x57, 0x9a, 0x1b, 0x59, 0x19, 0x1e, 0x91, 0xb0, + 0x34, 0x39, 0x17, 0xb9, 0xb2, 0x30, 0x32, 0x52, 0x61, 0x69, 0x72, 0x2e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0xcc, 0xd8, 0xde, 0xc2, 0xe8, 0xc8, 0xcc, + 0x8d, 0x49, 0x1d, 0x09, 0x7d, 0xbd, 0xd5, 0xd1, 0xc1, 0xd5, 0xd1, 0x91, + 0xa1, 0x2b, 0xc3, 0xa3, 0xab, 0x93, 0x2b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, + 0xa3, 0x92, 0xe6, 0x06, 0x57, 0x47, 0xf7, 0x45, 0x97, 0x07, 0x57, 0xc6, + 0x65, 0xec, 0x8d, 0xed, 0x4d, 0xee, 0x6b, 0x6e, 0x2c, 0x8c, 0xad, 0x8c, + 0x0e, 0xdd, 0x9b, 0x5b, 0x59, 0x5b, 0x18, 0xdc, 0x57, 0x5b, 0x19, 0x1d, + 0xda, 0x1b, 0x19, 0x1f, 0xba, 0x37, 0xb7, 0xb2, 0xb6, 0x30, 0xb8, 0x2f, + 0xb3, 0xb0, 0x31, 0xba, 0x37, 0xb9, 0x18, 0x3e, 0x74, 0x6f, 0x6e, 0x65, + 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x7c, + 0xe6, 0xc8, 0xe4, 0xbe, 0xee, 0xd0, 0xd2, 0xe8, 0xca, 0xbe, 0xe0, 0xde, + 0xd2, 0xdc, 0xe8, 0x86, 0xc0, 0xc2, 0xb6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68, + 0xf0, 0xa5, 0xc1, 0xc6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xa9, 0xc1, + 0xf6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xad, 0xc1, 0x26, 0x6d, 0xcc, + 0xb6, 0x7c, 0x68, 0xf0, 0xb1, 0xc1, 0x36, 0x6d, 0xcc, 0xb6, 0x7c, 0x68, + 0xf0, 0xb5, 0xc1, 0x46, 0x6d, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xb9, 0xc1, + 0x56, 0x6d, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xbd, 0xc1, 0x66, 0x6d, 0xcc, + 0xb6, 0x7c, 0x68, 0xf0, 0xc1, 0x01, 0xa3, 0xb0, 0x34, 0x39, 0x97, 0x30, + 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0xaf, 0xb9, 0x34, 0xbd, 0x32, + 0x5e, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x7c, 0xa6, 0xd0, 0xc2, 0xc8, 0xca, 0xe4, 0x86, 0xde, 0xdc, 0xe6, 0xe8, + 0xc2, 0xdc, 0xe8, 0xe6, 0x18, 0x8c, 0x0d, 0x21, 0x83, 0x2d, 0xfa, 0xc6, + 0xe0, 0x23, 0x83, 0x0d, 0xfa, 0xca, 0x60, 0x5b, 0xb6, 0xe6, 0x33, 0x83, + 0xef, 0x0c, 0xbe, 0x38, 0xf8, 0xe4, 0x60, 0x83, 0xbe, 0x39, 0xd8, 0x98, + 0x0f, 0xfa, 0xe8, 0xe0, 0xbb, 0xbe, 0x3a, 0xe0, 0x12, 0x96, 0x26, 0xe7, + 0x42, 0x57, 0x86, 0x47, 0x57, 0x27, 0x57, 0x46, 0x25, 0x2c, 0x4d, 0xce, + 0x65, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x8c, 0x18, 0x5d, 0x19, 0x1e, 0x5d, + 0x9d, 0x5c, 0x99, 0x0c, 0x19, 0x8f, 0x19, 0xdb, 0x5b, 0x18, 0x1d, 0x0b, + 0xc8, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0x0f, 0x07, 0xba, 0x32, 0xbc, + 0x21, 0xd4, 0xc6, 0x7c, 0x77, 0xf0, 0x95, 0xc1, 0xb6, 0x6c, 0xcd, 0x87, + 0x07, 0x1f, 0xf4, 0xe5, 0xc1, 0x77, 0x7d, 0x7a, 0xc0, 0x25, 0x2c, 0x4d, + 0xce, 0x65, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x4c, 0x8e, 0xc7, 0x5c, 0x58, + 0x1b, 0x1c, 0x5b, 0x99, 0x1c, 0x83, 0xb9, 0x21, 0xd2, 0x76, 0x7d, 0x7c, + 0xf0, 0x95, 0xc1, 0xb6, 0x6c, 0xcd, 0x07, 0x7d, 0x7d, 0xf0, 0x5d, 0x9f, + 0x1f, 0x0c, 0x61, 0xbe, 0xec, 0xf3, 0x3e, 0x31, 0xf8, 0xec, 0xe0, 0xdb, + 0x83, 0xef, 0x0f, 0x86, 0x18, 0x0a, 0xf0, 0x4d, 0x1f, 0x28, 0x70, 0x0c, + 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8, 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6, + 0xde, 0xe0, 0xca, 0xe6, 0x50, 0xa6, 0x88, 0x98, 0xbe, 0x86, 0xde, 0xe0, + 0xf2, 0xbe, 0xcc, 0xe4, 0xc2, 0xce, 0xda, 0xca, 0xdc, 0xe8, 0x52, 0x86, + 0x10, 0xdf, 0x28, 0x7c, 0xa2, 0x40, 0x2c, 0x2c, 0x4d, 0xae, 0x25, 0x8c, + 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, 0x85, 0xae, + 0x0c, 0x8f, 0xae, 0x4e, 0xae, 0x6c, 0x6e, 0x88, 0xf1, 0x95, 0xc2, 0x37, + 0x0a, 0x1f, 0x29, 0x10, 0x0b, 0x4b, 0x93, 0x6b, 0x09, 0x63, 0x4b, 0x0b, + 0x9b, 0x6b, 0x99, 0x1b, 0x7b, 0x83, 0x2b, 0x6b, 0x99, 0x0b, 0x6b, 0x83, + 0x63, 0x2b, 0x93, 0x9b, 0x1b, 0x62, 0x7c, 0xa7, 0xf0, 0x8d, 0xc2, 0x67, + 0x0a, 0x43, 0x88, 0xaf, 0x14, 0xbe, 0x53, 0xa0, 0x15, 0x96, 0x26, 0xd7, + 0x12, 0xc6, 0x96, 0x16, 0x36, 0xd7, 0x32, 0x37, 0xf6, 0x06, 0x57, 0xd6, + 0x12, 0x26, 0x77, 0x86, 0x32, 0x93, 0x32, 0xc4, 0xf8, 0x54, 0xe1, 0x1b, + 0x85, 0x2f, 0x15, 0x86, 0x08, 0x9f, 0x2a, 0xb0, 0xfa, 0xd2, 0xa2, 0x9a, + 0x8a, 0xa9, 0x99, 0x42, 0x0b, 0x23, 0x2b, 0x93, 0x1b, 0x7a, 0x73, 0x9b, + 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0xe3, 0xf3, 0xd6, 0xe6, 0x96, 0x06, 0xf7, + 0x46, 0x57, 0xe6, 0x46, 0x07, 0x32, 0x86, 0x16, 0x26, 0xc7, 0x67, 0x2a, + 0xad, 0x0d, 0x8e, 0xad, 0x0c, 0x64, 0x68, 0x65, 0x05, 0x84, 0x4a, 0x28, + 0x28, 0x68, 0x88, 0xf0, 0xb9, 0xc2, 0x10, 0xe3, 0x6b, 0x85, 0xef, 0x15, + 0xc2, 0x20, 0x1b, 0x62, 0x7c, 0x68, 0xf0, 0xc1, 0x42, 0x18, 0x64, 0x43, + 0xc4, 0xe0, 0x63, 0x85, 0x2f, 0x16, 0xc2, 0x20, 0xfb, 0x62, 0x21, 0x0c, + 0xb4, 0x2f, 0x16, 0xc2, 0x60, 0xfb, 0x62, 0x21, 0x0c, 0xb8, 0x2f, 0x16, + 0xc2, 0xa0, 0xfb, 0x62, 0x21, 0x0c, 0xbc, 0x2f, 0x16, 0xc2, 0xe0, 0xfb, + 0x62, 0x21, 0x0c, 0xb0, 0x21, 0xc6, 0x27, 0x0b, 0x5f, 0x2c, 0x84, 0xc1, + 0x36, 0xc4, 0xf8, 0x64, 0xe1, 0x8b, 0x85, 0x30, 0xc0, 0x86, 0x18, 0x9f, + 0x2c, 0x7c, 0xb1, 0x10, 0x06, 0xdd, 0x10, 0xe3, 0x93, 0x85, 0x2f, 0x16, + 0xc2, 0xc0, 0x1b, 0x62, 0x7c, 0xb2, 0xf0, 0xc5, 0x42, 0x18, 0x7c, 0x43, + 0x8c, 0x4f, 0x16, 0xbe, 0x58, 0x08, 0x03, 0x6d, 0x88, 0xf1, 0xc9, 0xc2, + 0x17, 0x0b, 0x61, 0xc0, 0x0d, 0x31, 0x3e, 0x59, 0xf8, 0x62, 0x21, 0x0c, + 0xb2, 0x11, 0x11, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0xb4, 0xc3, + 0x3b, 0x90, 0x43, 0x3d, 0xb0, 0x43, 0x39, 0xb8, 0x81, 0x39, 0xb0, 0x43, + 0x38, 0x9c, 0xc3, 0x3c, 0x4c, 0x11, 0x82, 0x61, 0x84, 0xc2, 0x0e, 0xec, + 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xe9, 0x40, 0x0e, 0xe5, 0xe0, 0x0e, 0xf4, + 0x30, 0x25, 0x28, 0x46, 0x2c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xf6, + 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x25, 0x30, + 0x46, 0x50, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xec, 0x10, 0x0e, 0xee, + 0x70, 0x0e, 0xf5, 0x10, 0x0e, 0xe7, 0x50, 0x0e, 0xbf, 0x60, 0x0f, 0xe5, + 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0x53, 0x02, 0x64, 0xc4, + 0x14, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x30, 0x0e, 0xef, 0xd0, 0x0e, 0xf0, + 0x90, 0x0e, 0xec, 0x50, 0x0e, 0xbf, 0xf0, 0x0e, 0xf0, 0x40, 0x0f, 0xe9, + 0xf0, 0x0e, 0xee, 0x30, 0x0f, 0x53, 0x06, 0x85, 0x71, 0x46, 0x30, 0xe1, + 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe6, 0x20, 0x0f, 0xe1, 0x70, 0x0e, 0xed, + 0x50, 0x0e, 0xee, 0x40, 0x0f, 0x53, 0x82, 0x50, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, @@ -2041,66 +1222,1391 @@ const unsigned char sdl_metallib[] = { 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x1b, 0x00, 0x00, - 0x00, 0x46, 0x10, 0x06, 0x00, 0x12, 0xf9, 0x12, 0xc0, 0x3c, 0x0b, 0xf1, - 0x4f, 0xc4, 0x35, 0x51, 0x11, 0xf1, 0xdb, 0xc3, 0x0f, 0x44, 0x11, 0x80, - 0xf9, 0x15, 0x5e, 0xdc, 0xb6, 0x0d, 0x34, 0x00, 0x12, 0xf9, 0x83, 0x33, - 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x15, 0x6c, 0x00, 0x12, 0xf9, 0x12, 0xc0, - 0x3c, 0x0b, 0xf1, 0x4f, 0xc4, 0x35, 0x51, 0x11, 0xf1, 0xdb, 0x83, 0x5f, - 0xe1, 0xc5, 0x6d, 0x5b, 0x00, 0x04, 0x20, 0x91, 0x5f, 0x00, 0xd2, 0xf4, - 0x3f, 0x8e, 0xe5, 0x17, 0xb7, 0x6d, 0x00, 0x10, 0xdb, 0x95, 0xbf, 0xec, - 0xbe, 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34, 0x93, 0x09, 0x44, 0x00, 0x12, - 0xf9, 0x05, 0x20, 0x4d, 0x7f, 0x01, 0x04, 0x92, 0x5f, 0xdc, 0x36, 0x00, - 0x00, 0x61, 0x20, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4c, - 0x2c, 0x10, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x94, 0xce, 0x41, - 0x18, 0x87, 0x12, 0x07, 0x34, 0x16, 0x41, 0x09, 0x50, 0x38, 0x02, 0x30, - 0xc7, 0x60, 0xc4, 0x41, 0x1c, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xda, 0x08, - 0x00, 0x65, 0x23, 0x00, 0x35, 0x40, 0xd8, 0x0c, 0x00, 0x15, 0x33, 0x00, - 0x14, 0xcc, 0x00, 0xcc, 0x00, 0x10, 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, - 0x7f, 0x63, 0x04, 0x3a, 0x6b, 0xce, 0x21, 0x18, 0x8c, 0x11, 0xbc, 0x7b, - 0x5a, 0xde, 0xdf, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xc4, - 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x00, - 0x00, 0x23, 0x06, 0x0a, 0x11, 0xdc, 0xc1, 0x55, 0x69, 0x8c, 0xd3, 0x04, - 0x23, 0x06, 0x0b, 0x11, 0xe4, 0xc1, 0x65, 0x6d, 0x77, 0xd0, 0x3c, 0x8e, - 0x30, 0x86, 0x10, 0xe0, 0xc1, 0x20, 0xc3, 0xc0, 0x4c, 0x73, 0x0c, 0x81, - 0x90, 0x07, 0x23, 0x06, 0x0b, 0x11, 0xf4, 0xc1, 0xa6, 0x7d, 0x7a, 0x10, - 0x4d, 0x92, 0x31, 0x86, 0x10, 0xf0, 0xc1, 0x1c, 0xc3, 0x10, 0xe4, 0xc1, - 0x81, 0x81, 0xb8, 0x14, 0x94, 0x41, 0x86, 0x40, 0xca, 0x8c, 0x08, 0xe0, - 0x33, 0xde, 0x40, 0x06, 0x70, 0x10, 0x0a, 0x17, 0x88, 0x4b, 0x41, 0x19, - 0x64, 0x08, 0x2e, 0x6f, 0xc4, 0xa0, 0x28, 0x82, 0x54, 0x28, 0x82, 0x39, - 0x06, 0x2d, 0x38, 0x85, 0xf1, 0x0a, 0x35, 0xb0, 0x83, 0x53, 0x40, 0x05, - 0x32, 0xb8, 0x40, 0x5c, 0x0a, 0xca, 0x20, 0x43, 0xd0, 0x91, 0xc1, 0x88, - 0x41, 0x51, 0x04, 0xaf, 0xb0, 0x04, 0x73, 0x0c, 0x46, 0xc0, 0x0a, 0xe3, - 0x15, 0x70, 0xc0, 0x07, 0xad, 0xe0, 0x0a, 0x6b, 0x70, 0x81, 0xb8, 0x14, - 0x94, 0x41, 0x86, 0x60, 0x0c, 0xd4, 0x60, 0xc4, 0xa0, 0x28, 0x82, 0x5a, - 0x88, 0x82, 0x39, 0x06, 0x23, 0x78, 0x85, 0xf1, 0x86, 0x3b, 0x10, 0x05, - 0x5a, 0xa0, 0x60, 0x8c, 0x37, 0xe4, 0x01, 0x29, 0xb8, 0x02, 0x05, 0x63, - 0xb8, 0x61, 0x18, 0x03, 0x67, 0x96, 0x21, 0x58, 0x82, 0xe1, 0x86, 0xa9, - 0x0c, 0x94, 0x59, 0x86, 0x41, 0x08, 0x8c, 0x3a, 0x03, 0xf9, 0xcc, 0x12, - 0x10, 0x56, 0xa5, 0x01, 0x7c, 0x46, 0x0c, 0x88, 0x22, 0x00, 0x87, 0xc0, - 0x02, 0x36, 0x90, 0xcf, 0x88, 0x41, 0x51, 0x04, 0xe3, 0x10, 0xb8, 0xc1, - 0x2c, 0x01, 0x31, 0x50, 0x01, 0x28, 0x82, 0x30, 0xcc, 0x31, 0xcc, 0x41, - 0x00, 0x0e, 0xc3, 0x0d, 0x55, 0x1b, 0x28, 0xb3, 0x0c, 0x46, 0x11, 0x98, - 0xf5, 0x06, 0xf2, 0x99, 0x25, 0x38, 0xec, 0x8a, 0x03, 0xf8, 0x8c, 0x18, - 0x10, 0x45, 0x80, 0x0e, 0x81, 0x05, 0x74, 0x20, 0x9f, 0x11, 0x83, 0xa2, - 0x08, 0xd6, 0x21, 0xb0, 0x83, 0x59, 0x82, 0x63, 0xa0, 0x02, 0x50, 0x0a, - 0xc1, 0x98, 0x63, 0x40, 0x82, 0x73, 0x18, 0x6e, 0xb8, 0xea, 0x40, 0x99, - 0x65, 0x48, 0x90, 0xc0, 0xb0, 0x3b, 0x90, 0xcf, 0x2c, 0x81, 0x62, 0x59, - 0x1e, 0xc0, 0x67, 0xc4, 0x80, 0x28, 0x02, 0x78, 0x08, 0x2c, 0xe0, 0x03, - 0xf9, 0x8c, 0x18, 0x14, 0x45, 0x30, 0x0f, 0x81, 0x1f, 0xcc, 0x12, 0x28, - 0x03, 0x15, 0x80, 0x82, 0x08, 0xc9, 0x1c, 0x03, 0x12, 0xb0, 0xc3, 0x2c, - 0xc1, 0x32, 0x50, 0x11, 0x08, 0x0a, 0x1f, 0x00, 0x83, 0x0c, 0x01, 0x29, - 0xac, 0xc2, 0x1c, 0xc3, 0x29, 0x70, 0xf3, 0x30, 0xc8, 0x10, 0xa0, 0xc2, - 0x2b, 0xd8, 0x10, 0xc8, 0x67, 0x90, 0x21, 0x50, 0x05, 0x5a, 0x98, 0x63, - 0x08, 0x50, 0xe1, 0x1d, 0x2c, 0xe8, 0x05, 0xf9, 0x64, 0x10, 0x10, 0x03, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0, 0x98, 0x05, 0x04, 0x17, - 0xb6, 0x14, 0xc1, 0x31, 0x0b, 0x08, 0x2e, 0x6c, 0x29, 0x8a, 0x63, 0x16, - 0x10, 0x5c, 0xd8, 0x52, 0x24, 0x47, 0x2e, 0x20, 0xba, 0xb0, 0xa5, 0x70, - 0x8e, 0x5c, 0x40, 0x74, 0x61, 0x4b, 0x41, 0x1d, 0xb9, 0x80, 0xe8, 0xc2, - 0x96, 0x42, 0x3b, 0x72, 0x01, 0xd1, 0x85, 0x2d, 0xc7, 0x17, 0x88, 0xc3, - 0x31, 0x0e, 0x08, 0x39, 0x6c, 0x39, 0xc2, 0x20, 0x28, 0x87, 0x63, 0x1c, - 0x10, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x2e, 0x00, 0x00, + 0x00, 0x06, 0x10, 0xb1, 0x5d, 0xf9, 0x73, 0xce, 0x83, 0xfd, 0x45, 0x04, + 0x18, 0x0c, 0xd1, 0x4c, 0x56, 0x90, 0xfd, 0x73, 0x6d, 0x6b, 0xcf, 0xb3, + 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74, 0xd5, 0xfd, 0x17, 0x45, 0x51, + 0x14, 0x46, 0xd0, 0x00, 0x48, 0xe4, 0x0f, 0xce, 0xe4, 0x57, 0x77, 0x71, + 0xdb, 0xa6, 0xb0, 0x01, 0x48, 0xe4, 0x4b, 0x00, 0xf3, 0x2c, 0xc4, 0x3f, + 0x11, 0xd7, 0x44, 0x45, 0xc4, 0x6f, 0x0f, 0x7e, 0x85, 0x17, 0xb7, 0x6d, + 0x08, 0x13, 0x80, 0x44, 0x7e, 0x01, 0x48, 0xd3, 0x5f, 0x00, 0x81, 0xe4, + 0x57, 0x77, 0x71, 0xdb, 0x16, 0x40, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, + 0xfd, 0xc2, 0x02, 0x30, 0x8f, 0x5f, 0xdd, 0xc5, 0x6d, 0x5b, 0xc2, 0x04, + 0x20, 0x91, 0x5f, 0x00, 0xd2, 0xf4, 0x17, 0x0c, 0x70, 0xf9, 0xd5, 0x5d, + 0xdc, 0xb6, 0x09, 0x40, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0xff, 0xe3, + 0x58, 0x7e, 0x71, 0xdb, 0x36, 0x10, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, + 0xfd, 0x05, 0x10, 0x48, 0x7e, 0x71, 0xdb, 0x66, 0x10, 0x01, 0x48, 0xe4, + 0x17, 0x80, 0x34, 0xfd, 0x05, 0x03, 0x5c, 0x7e, 0x71, 0xdb, 0x76, 0x20, + 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x8f, 0x63, 0xf9, 0xd5, 0x5d, + 0xdc, 0x36, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x9a, 0x01, 0x00, + 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00, 0x00, 0x51, 0x00, 0x00, + 0x00, 0x64, 0x8e, 0x45, 0x00, 0x81, 0x70, 0xcc, 0x41, 0x2c, 0x8d, 0xd3, + 0x06, 0x54, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xdc, 0x08, 0x00, + 0x6d, 0xc5, 0x30, 0x03, 0x50, 0x0e, 0xa4, 0x8d, 0x00, 0xd4, 0x00, 0x01, + 0x63, 0x04, 0xef, 0x9e, 0x96, 0xf7, 0x37, 0x46, 0xa0, 0xb3, 0xe6, 0x1c, + 0x82, 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x09, 0x06, 0x63, 0x04, 0x20, + 0x08, 0x82, 0x20, 0x18, 0xcc, 0x00, 0x50, 0x30, 0x03, 0x30, 0x03, 0x30, + 0x07, 0x91, 0x0a, 0xaf, 0x90, 0x0a, 0x75, 0x40, 0xcb, 0x0c, 0xc0, 0x08, + 0xc0, 0x0c, 0xc0, 0x58, 0x03, 0x08, 0x82, 0x20, 0xfe, 0x81, 0x20, 0x08, + 0xe2, 0x1f, 0x08, 0x82, 0x20, 0xfe, 0x8d, 0x35, 0xb0, 0xed, 0xfc, 0x93, + 0x1e, 0xdb, 0xce, 0x3f, 0xe9, 0xb1, 0xed, 0xfc, 0x93, 0xde, 0x58, 0x03, + 0x08, 0x82, 0x6c, 0xfd, 0x0b, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, + 0xc8, 0xd6, 0xbf, 0x30, 0xd6, 0x00, 0x82, 0xe0, 0x9a, 0x83, 0x01, 0x08, + 0x82, 0x6b, 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x8c, 0x35, 0x80, + 0x20, 0xdd, 0xe6, 0x60, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, + 0x6d, 0x0e, 0x06, 0x63, 0x0d, 0xeb, 0x88, 0xc7, 0x2c, 0x18, 0xac, 0x23, + 0x1e, 0xb3, 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x58, 0x03, 0x08, + 0xc2, 0x78, 0x38, 0x06, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, + 0x87, 0x63, 0x30, 0xd6, 0x20, 0xe6, 0x62, 0xda, 0x7f, 0x60, 0xc9, 0xb3, + 0xf1, 0x2f, 0x8c, 0xe9, 0xaa, 0xe6, 0xbe, 0x30, 0xd6, 0xf0, 0xcf, 0xa4, + 0xff, 0xfb, 0x02, 0x5d, 0x83, 0x62, 0xfe, 0xb5, 0x70, 0x1c, 0x83, 0xbe, + 0x30, 0xd6, 0x30, 0xf7, 0x6d, 0x9a, 0xfa, 0x42, 0xeb, 0x86, 0x3c, 0xef, + 0x0b, 0x7c, 0xce, 0xfa, 0xf8, 0x47, 0xc0, 0x18, 0x81, 0xdb, 0xc7, 0xa2, + 0xed, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0x79, 0xaf, + 0xab, 0xec, 0x8d, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, 0xdb, + 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba, 0xf8, 0x37, 0x46, + 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8, 0xf6, 0x34, 0x18, + 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x23, 0x06, 0x4a, 0x11, 0x98, 0xc2, 0x1a, 0xa8, 0x41, 0x1b, 0x80, + 0x41, 0x19, 0x84, 0x41, 0x30, 0xde, 0xd0, 0x06, 0x78, 0x30, 0x0a, 0x14, + 0x8c, 0xe1, 0x86, 0x00, 0x0c, 0x82, 0x59, 0x86, 0x40, 0x08, 0x06, 0x19, + 0x08, 0x4f, 0x0d, 0xc6, 0x1b, 0xe2, 0x80, 0x0f, 0xce, 0x80, 0x82, 0x31, + 0x62, 0x40, 0x18, 0xc1, 0x2b, 0x0c, 0x23, 0x06, 0x85, 0x11, 0xc4, 0x42, + 0xb0, 0x59, 0xb0, 0xc1, 0x67, 0xc4, 0xa0, 0x30, 0x82, 0x58, 0x08, 0xc0, + 0xc0, 0x06, 0x4e, 0x3e, 0xc6, 0x05, 0xf1, 0xb1, 0x21, 0xa0, 0xcf, 0x88, + 0x01, 0x61, 0x04, 0xb6, 0x10, 0x8c, 0x18, 0x14, 0x46, 0x80, 0x0b, 0x81, + 0x67, 0x81, 0x27, 0x9f, 0x39, 0x06, 0x34, 0x58, 0x6c, 0x61, 0x90, 0x21, + 0x48, 0x83, 0x3c, 0xb0, 0x21, 0xa0, 0xcf, 0x20, 0x43, 0xb0, 0x06, 0x7c, + 0x30, 0xc8, 0x10, 0x54, 0x7e, 0x30, 0x4b, 0x20, 0x0c, 0x54, 0x04, 0x42, + 0xc0, 0x06, 0xc0, 0x78, 0xc3, 0x28, 0xb8, 0xc2, 0x2e, 0x50, 0x30, 0x86, + 0x1b, 0x02, 0xcd, 0x99, 0x65, 0x18, 0x88, 0x60, 0x90, 0x81, 0xa0, 0x03, + 0x50, 0x18, 0x6f, 0x38, 0x05, 0x59, 0xa0, 0x05, 0x0a, 0xc6, 0x78, 0x43, + 0x2a, 0xd0, 0x42, 0x28, 0x50, 0x30, 0x46, 0x0c, 0x90, 0x23, 0x52, 0x87, + 0xa2, 0x3b, 0x86, 0x60, 0x90, 0x21, 0xb8, 0x03, 0x54, 0x18, 0x64, 0x08, + 0x16, 0x55, 0x98, 0x25, 0x20, 0x06, 0x2a, 0x02, 0x61, 0xc0, 0x84, 0xe1, + 0x86, 0x30, 0x50, 0x83, 0x60, 0x96, 0xa1, 0x98, 0x82, 0xf1, 0x06, 0x58, + 0xd8, 0x85, 0x73, 0xa0, 0x60, 0x0c, 0x37, 0x04, 0x6d, 0x10, 0xcc, 0x32, + 0x18, 0x47, 0x30, 0xc8, 0x50, 0x84, 0x42, 0x2b, 0x8c, 0x37, 0xd0, 0xc2, + 0x2f, 0x9c, 0x03, 0x05, 0x63, 0x8e, 0x21, 0x14, 0x82, 0x77, 0x18, 0x64, + 0x08, 0x44, 0x41, 0x16, 0x2c, 0x28, 0xe4, 0x33, 0xc8, 0x10, 0x90, 0x42, + 0x2d, 0xcc, 0x12, 0xb4, 0xc1, 0x78, 0x83, 0x2e, 0x94, 0xc3, 0x3c, 0x50, + 0x30, 0xc6, 0x1b, 0x78, 0xe1, 0x1c, 0xde, 0x81, 0x82, 0x31, 0xc8, 0x00, + 0xb1, 0x82, 0x2e, 0x0c, 0x37, 0x10, 0x74, 0xe0, 0xcc, 0x32, 0x20, 0x52, + 0x30, 0x86, 0x20, 0xe5, 0xc3, 0x70, 0x43, 0xd0, 0x07, 0xca, 0x2c, 0x83, + 0x92, 0x04, 0x26, 0xfc, 0x81, 0x7c, 0x66, 0x09, 0x16, 0x1b, 0x42, 0x01, + 0x3e, 0x23, 0x06, 0x84, 0x11, 0x94, 0x44, 0x60, 0x01, 0x2e, 0xc8, 0x67, + 0xc4, 0xa0, 0x30, 0x02, 0x94, 0x08, 0x70, 0x61, 0x96, 0x60, 0x19, 0xa8, + 0x00, 0x94, 0x44, 0x50, 0xe6, 0x18, 0x6a, 0x21, 0x08, 0x89, 0x31, 0x84, + 0x0d, 0x24, 0x86, 0x1b, 0x02, 0x53, 0x50, 0x66, 0x19, 0x1a, 0x26, 0x30, + 0x01, 0x15, 0xe4, 0x33, 0x4b, 0xe0, 0xd8, 0xa0, 0x0a, 0xf0, 0x19, 0x31, + 0x20, 0x8c, 0xc0, 0x25, 0x02, 0x0b, 0xc2, 0x41, 0x3e, 0x23, 0x06, 0x85, + 0x11, 0xc4, 0x44, 0x10, 0x0e, 0xb3, 0x04, 0xce, 0x40, 0x05, 0xa0, 0x30, + 0x42, 0x33, 0xc7, 0x90, 0x04, 0x28, 0x31, 0x86, 0x40, 0x06, 0x28, 0x31, + 0xdc, 0x10, 0xbc, 0x82, 0x32, 0xcb, 0x00, 0x3d, 0x81, 0x09, 0xb1, 0x20, + 0x9f, 0x59, 0x82, 0xc8, 0x86, 0x59, 0x80, 0xcf, 0x88, 0x01, 0x61, 0x04, + 0x37, 0x11, 0x58, 0xa0, 0x0e, 0xf2, 0x19, 0x31, 0x28, 0x8c, 0x40, 0x27, + 0x02, 0x75, 0x98, 0x25, 0x88, 0x06, 0x2a, 0x00, 0xe5, 0x11, 0xa0, 0x39, + 0x86, 0x24, 0x80, 0x89, 0x59, 0x02, 0x69, 0xa0, 0x22, 0x10, 0x22, 0x3d, + 0x38, 0x06, 0x19, 0x02, 0x75, 0xb0, 0x87, 0x39, 0x06, 0x74, 0x00, 0x03, + 0x9b, 0x18, 0x64, 0x08, 0xd2, 0x21, 0x1f, 0x6c, 0x08, 0xe4, 0x33, 0xc8, + 0x10, 0xac, 0x03, 0x3f, 0xcc, 0x12, 0xb4, 0xc1, 0x70, 0xc3, 0x2c, 0xc4, + 0x43, 0x30, 0xcb, 0x40, 0x81, 0x41, 0x30, 0xc8, 0x40, 0x07, 0xf0, 0xc0, + 0x0f, 0xe3, 0x0d, 0x23, 0xe1, 0x12, 0x3c, 0x41, 0xc1, 0x18, 0x6f, 0x28, + 0x09, 0x98, 0xc0, 0x09, 0x0a, 0xc6, 0x1c, 0x83, 0x3c, 0x04, 0x60, 0x31, + 0xc8, 0x10, 0xcc, 0xc3, 0x48, 0x58, 0x70, 0xc8, 0x67, 0x90, 0x21, 0xa8, + 0x07, 0x93, 0x18, 0x6e, 0x38, 0xc0, 0xc1, 0x99, 0x65, 0xf8, 0xaa, 0x60, + 0x0c, 0x61, 0x28, 0x8b, 0xe1, 0x86, 0x60, 0x1c, 0x94, 0x59, 0x86, 0xcb, + 0x0a, 0x4c, 0x28, 0x07, 0xf9, 0xcc, 0x12, 0x60, 0x23, 0x06, 0x84, 0x11, + 0xc0, 0xc5, 0x30, 0x62, 0x50, 0x18, 0x81, 0x5c, 0x04, 0xe8, 0x60, 0x81, + 0x3a, 0xc8, 0xc7, 0x02, 0x76, 0x80, 0xcf, 0x2c, 0x01, 0x36, 0x50, 0x01, + 0x28, 0x96, 0x70, 0xcd, 0x31, 0xf4, 0x43, 0xd0, 0x16, 0x63, 0x08, 0x0c, + 0x5b, 0x0c, 0x37, 0x04, 0xec, 0xa0, 0xcc, 0x32, 0x68, 0x59, 0x60, 0x82, + 0x3b, 0xc8, 0x67, 0x96, 0x60, 0x1b, 0x31, 0x20, 0x8c, 0x20, 0x2f, 0x86, + 0x11, 0x83, 0xc2, 0x08, 0xf6, 0x22, 0x88, 0x07, 0x0b, 0xe6, 0x41, 0x3e, + 0x16, 0xd4, 0x03, 0x7c, 0x66, 0x09, 0xb6, 0x81, 0x0a, 0x40, 0xc9, 0x04, + 0x6d, 0x8e, 0x21, 0x09, 0xe8, 0x62, 0x0c, 0xa1, 0xa2, 0x8b, 0xe1, 0x86, + 0xa0, 0x1e, 0x94, 0x59, 0x86, 0x8e, 0x0b, 0x4c, 0xb8, 0x07, 0xf9, 0xcc, + 0x12, 0x78, 0x23, 0x06, 0x84, 0x11, 0x88, 0xc6, 0x30, 0x62, 0x50, 0x18, + 0x01, 0x69, 0x04, 0xfa, 0x60, 0x01, 0x3f, 0xc8, 0xc7, 0x02, 0x7f, 0x80, + 0xcf, 0x2c, 0x81, 0x37, 0x50, 0x01, 0x28, 0x9c, 0xd0, 0xcd, 0x31, 0x24, + 0x01, 0x5f, 0x8c, 0x18, 0x18, 0x46, 0xa0, 0x1a, 0x41, 0x4c, 0xbc, 0xc4, + 0x20, 0x43, 0x30, 0x13, 0x64, 0x31, 0x4b, 0xf0, 0x0d, 0x54, 0x04, 0x7e, + 0x40, 0x09, 0xde, 0x20, 0x43, 0x80, 0x13, 0x66, 0x31, 0x4b, 0xd0, 0x06, + 0xb3, 0x0c, 0x61, 0xd0, 0x06, 0xfc, 0x30, 0xc8, 0xd0, 0x0b, 0x39, 0x51, + 0x16, 0x23, 0x06, 0x85, 0x11, 0xb0, 0x46, 0xd0, 0x12, 0x73, 0x0c, 0x36, + 0x11, 0x98, 0xc6, 0x88, 0x41, 0x61, 0x04, 0xae, 0x31, 0xb8, 0xc4, 0x1c, + 0x83, 0x10, 0x98, 0xc6, 0x88, 0x41, 0x61, 0x04, 0xb0, 0x51, 0xbc, 0xc4, + 0x1c, 0x83, 0x10, 0x9c, 0xc6, 0x20, 0x43, 0xd0, 0x13, 0x6e, 0x31, 0xc8, + 0x10, 0x94, 0x03, 0x5c, 0x8c, 0x37, 0xd0, 0xc5, 0x5f, 0xb4, 0x06, 0x05, + 0x63, 0xbc, 0xc1, 0x2e, 0x42, 0x23, 0x35, 0x28, 0x18, 0x73, 0x0c, 0x63, + 0x11, 0xc4, 0xc6, 0x20, 0x43, 0x40, 0x16, 0x74, 0x61, 0x41, 0x22, 0x9f, + 0x41, 0x86, 0xc0, 0x2c, 0xee, 0x62, 0xb8, 0xe1, 0x88, 0x09, 0x67, 0x96, + 0x81, 0x0d, 0xc4, 0x20, 0x18, 0x43, 0x18, 0x6c, 0x63, 0xb8, 0x21, 0xa0, + 0x09, 0x65, 0x96, 0x81, 0x0c, 0xc6, 0x20, 0x30, 0xc1, 0x26, 0xe4, 0x33, + 0x4b, 0x50, 0x06, 0x23, 0x06, 0x84, 0x11, 0x84, 0xc7, 0x30, 0x62, 0x50, + 0x18, 0xc1, 0x78, 0x04, 0x39, 0x61, 0xc1, 0x4e, 0xc8, 0xc7, 0x82, 0x9e, + 0x80, 0xcf, 0x2c, 0x41, 0x19, 0x0c, 0x54, 0x00, 0xca, 0x18, 0x08, 0x64, + 0x30, 0xc7, 0xe0, 0x16, 0x81, 0x6f, 0x8c, 0x21, 0x30, 0xbd, 0x31, 0xdc, + 0x10, 0xf4, 0x84, 0x32, 0xcb, 0x70, 0x06, 0x66, 0x10, 0x98, 0xf0, 0x13, + 0xf2, 0x99, 0x25, 0x40, 0x83, 0x11, 0x03, 0xc2, 0x08, 0xd4, 0x63, 0x18, + 0x31, 0x28, 0x8c, 0x80, 0x3d, 0x02, 0xb1, 0xb0, 0x80, 0x2c, 0xe4, 0x63, + 0x81, 0x59, 0xc0, 0x67, 0x96, 0x00, 0x0d, 0x06, 0x2a, 0x00, 0xc5, 0x0c, + 0x84, 0x33, 0x98, 0x63, 0x48, 0x82, 0xf2, 0x18, 0x43, 0xa8, 0xca, 0x63, + 0xb8, 0x21, 0x30, 0x0b, 0x65, 0x96, 0x41, 0x0d, 0xd2, 0x20, 0x30, 0x01, + 0x2d, 0xe4, 0x33, 0x4b, 0xb0, 0x06, 0x23, 0x06, 0x84, 0x11, 0xcc, 0xc7, + 0x30, 0x62, 0x50, 0x18, 0x41, 0x7d, 0x04, 0x6b, 0x61, 0x41, 0x5b, 0xc8, + 0xc7, 0x82, 0xb7, 0x80, 0xcf, 0x2c, 0xc1, 0x1a, 0x0c, 0x54, 0x00, 0x4a, + 0x1a, 0x08, 0x6a, 0x30, 0xc7, 0x90, 0x04, 0xed, 0x31, 0x62, 0x60, 0x18, + 0xc1, 0x7e, 0x04, 0xa2, 0x01, 0x1a, 0x83, 0x0c, 0x01, 0x69, 0xd4, 0xc6, + 0x2c, 0x01, 0x1b, 0x0c, 0x54, 0x04, 0x7e, 0x10, 0x06, 0xc2, 0x1a, 0x0c, + 0x32, 0x04, 0xa9, 0x71, 0x1b, 0xb3, 0x04, 0x6d, 0x30, 0xd0, 0x12, 0xf0, + 0x88, 0xc1, 0x23, 0x12, 0x8f, 0x7c, 0xb2, 0xc0, 0x06, 0x3c, 0x02, 0x06, + 0x03, 0x2d, 0x01, 0x8a, 0x18, 0x7a, 0x21, 0x99, 0xc3, 0x47, 0xb0, 0x81, + 0xcc, 0x80, 0xc1, 0x20, 0x43, 0x20, 0xec, 0x86, 0x05, 0xe1, 0x21, 0x9f, + 0x0c, 0xc2, 0x81, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xd7, 0xd2, 0x07, + 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4, 0x50, 0x13, 0xe7, 0x2c, + 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d, 0x9b, 0x6d, 0x29, 0x38, + 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b, 0x00, 0x03, 0x11, 0x71, + 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71, 0x21, 0x13, 0x00, 0x00, + 0x00, 0x01, 0x31, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0, + 0x40, 0x05, 0x64, 0x15, 0xb6, 0x0c, 0x42, 0x30, 0x0b, 0x5b, 0x86, 0x23, + 0xa0, 0x85, 0x2d, 0x83, 0x16, 0xd4, 0xc2, 0x96, 0xe1, 0x0b, 0x6c, 0x61, + 0xcb, 0x10, 0x06, 0xc1, 0x2d, 0x6c, 0x19, 0xd4, 0x20, 0xc0, 0x85, 0x2d, + 0xc3, 0x1b, 0x04, 0xb9, 0xb0, 0x65, 0xb0, 0x83, 0x40, 0x17, 0xb6, 0x0c, + 0x78, 0x10, 0xe4, 0xc2, 0x96, 0x81, 0x1d, 0x02, 0x5d, 0xd8, 0x32, 0xb8, + 0x43, 0x90, 0x0b, 0x5b, 0x06, 0xb5, 0x08, 0x74, 0x61, 0xcb, 0xc0, 0x16, + 0x41, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x64, 0xce, 0x41, 0x2c, 0x8d, 0x93, 0x06, + 0x54, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xdb, 0x0c, 0x00, 0x05, + 0x33, 0x00, 0xb4, 0xcc, 0x00, 0x8c, 0x35, 0xb0, 0xec, 0x19, 0xca, 0x1f, + 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce, 0xde, 0x58, 0x83, 0x5e, + 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf, 0xdb, 0xa7, 0xf4, 0xe8, + 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a, 0xc2, 0xe8, 0xee, 0xdd, + 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25, + 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f, + 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c, + 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2, + 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05, 0x33, 0x00, 0x04, 0x8c, + 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82, + 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5, 0x02, 0x0d, 0x37, 0x50, + 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43, 0x43, 0xb5, 0xc1, 0x20, + 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64, 0x08, 0xa0, 0x6a, 0x96, + 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61, 0x48, 0x82, 0xe1, 0x86, + 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31, 0x28, 0x8c, 0x40, 0x0f, + 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xe8, 0x60, 0xc4, 0xa0, 0x30, 0x02, 0x3e, + 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xa0, 0x83, 0x11, 0x83, 0xc2, 0x08, 0xfc, + 0x20, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xa8, 0x83, 0x59, 0x82, 0x62, 0xa0, + 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xf4, 0x60, 0x0c, 0x41, 0xc8, + 0x83, 0x31, 0x84, 0x21, 0x0f, 0x46, 0x0c, 0x0a, 0x23, 0x10, 0x05, 0x21, + 0x18, 0x31, 0x28, 0x8c, 0x60, 0x14, 0x88, 0x60, 0xb8, 0x21, 0xb8, 0x84, + 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c, 0x0c, 0x6c, 0x40, 0x03, + 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90, 0x8f, 0x05, 0x1a, 0x7c, + 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81, 0x29, 0x0c, 0x32, 0x04, + 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64, 0x08, 0xd2, 0xc0, 0x0d, + 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4, 0xa0, 0x98, 0x65, 0x40, + 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18, 0x31, 0x28, 0x8c, 0x60, + 0x16, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0xa0, 0x15, 0x46, 0x0c, 0x0a, + 0x23, 0xa8, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84, 0xa0, 0x15, 0x46, 0x0c, + 0x0a, 0x23, 0xb8, 0x85, 0x42, 0x0d, 0xe6, 0x18, 0x84, 0xc0, 0x15, 0x66, + 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57, 0x10, 0x04, 0x04, 0x3a, + 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0xc0, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xed, 0x06, 0x00, + 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, + 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, + 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, + 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, + 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, + 0x88, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, + 0x00, 0x51, 0x18, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, + 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, + 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, + 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, + 0x1d, 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, + 0x1d, 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, + 0x0d, 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, + 0xc0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, + 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, + 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, + 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, + 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, + 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, + 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, + 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, + 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, + 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, + 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, + 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, + 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, + 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, + 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, + 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, + 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, + 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, + 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, + 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, + 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, + 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, + 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, + 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, + 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, + 0xc3, 0x26, 0x10, 0xc0, 0x02, 0x54, 0x43, 0x38, 0xa4, 0x83, 0x3c, 0xb4, + 0x81, 0x38, 0xd4, 0x83, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0xb8, + 0xc3, 0x3b, 0xb4, 0x41, 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00, + 0x1b, 0xb6, 0xa1, 0x00, 0x16, 0xa0, 0x1a, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, + 0x0d, 0xc4, 0xa1, 0x1e, 0xcc, 0xc1, 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, + 0x1d, 0xde, 0xa1, 0x0d, 0xc2, 0x81, 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, + 0xd8, 0x60, 0x10, 0x06, 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0x40, 0x80, 0x05, + 0xa8, 0x36, 0x18, 0xc6, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50, + 0x1b, 0x7c, 0xe4, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, + 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, + 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, + 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, + 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, + 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x3c, + 0xb0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, + 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, + 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, + 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, + 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, + 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, + 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, + 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, + 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, + 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, + 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, + 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, + 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, + 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, + 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, + 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, + 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, + 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, + 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, + 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, + 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, + 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, + 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, + 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, + 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, + 0x03, 0x82, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x80, 0x04, 0x54, + 0x1b, 0x8c, 0x24, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x28, 0x02, 0xb0, 0x00, + 0xd5, 0x06, 0x64, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, + 0xa8, 0x36, 0x18, 0xcc, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50, + 0x1b, 0xa6, 0xe6, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x01, 0xa4, 0xc1, + 0x1d, 0xde, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, 0xd2, 0x81, 0x1d, 0xe8, 0x21, + 0x1d, 0xdc, 0x61, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, 0x8a, 0x40, 0x18, 0x88, 0x62, 0x42, + 0x60, 0x4c, 0x08, 0x8e, 0x09, 0x03, 0x92, 0x28, 0x13, 0x86, 0x25, 0x51, + 0x26, 0x04, 0xcc, 0x84, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, + 0x00, 0x4d, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, + 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, + 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xc8, 0xc1, + 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, + 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, + 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, + 0x41, 0x18, 0x46, 0x18, 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, + 0xe4, 0xa1, 0x1e, 0xc6, 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, + 0xc2, 0x81, 0x1d, 0xf4, 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, + 0xd2, 0x01, 0x1f, 0x50, 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, + 0xec, 0xbe, 0x1d, 0x21, 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, + 0x84, 0xa3, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, + 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0x38, + 0x4d, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, + 0xdf, 0x1e, 0x7e, 0x20, 0x8a, 0x00, 0xec, 0x9f, 0xc6, 0x08, 0x80, 0x41, + 0x04, 0x26, 0xb8, 0x48, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, + 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00, 0x06, 0x11, 0x1c, 0xa1, 0x24, + 0x41, 0x10, 0x08, 0x44, 0xb2, 0x34, 0x0f, 0x41, 0x85, 0x28, 0x8a, 0xa2, + 0x20, 0xa9, 0x0c, 0x00, 0x00, 0x10, 0x55, 0x04, 0x00, 0x20, 0xab, 0x0c, + 0x40, 0x51, 0x10, 0x56, 0x8c, 0xa2, 0x00, 0x00, 0x00, 0x20, 0xad, 0x0c, + 0x45, 0x51, 0x10, 0x57, 0x84, 0xa2, 0x20, 0x6f, 0x8e, 0x00, 0x0c, 0xe6, + 0x08, 0x82, 0x61, 0x04, 0x01, 0x0c, 0x4a, 0x12, 0x34, 0x8f, 0x00, 0x86, + 0x62, 0x08, 0xd0, 0x58, 0x90, 0x60, 0x79, 0x84, 0x50, 0x0c, 0x01, 0x2a, + 0x07, 0x02, 0x52, 0x00, 0x1c, 0x46, 0x18, 0xc0, 0x60, 0x10, 0x21, 0x10, + 0xe6, 0x08, 0x40, 0x61, 0x10, 0xe1, 0x10, 0x06, 0x11, 0x0a, 0x61, 0x10, + 0x01, 0x10, 0xa6, 0x00, 0x46, 0x00, 0x86, 0x11, 0x08, 0x30, 0x00, 0x00, + 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, + 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, + 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51, + 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80, + 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0, + 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, + 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60, + 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, + 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0, + 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, + 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, + 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90, + 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, + 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, + 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, + 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, + 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60, + 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, + 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, + 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10, + 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, + 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80, + 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x98, + 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0xcc, 0x04, + 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, 0xa6, 0x02, 0x02, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0x73, 0x01, 0x01, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xc9, 0x80, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x6c, 0x08, 0x30, 0x0c, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0c, 0x61, 0x2a, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x86, 0x30, 0x1d, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x43, 0x98, 0x0f, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x21, 0x4c, 0x07, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, + 0x86, 0x0c, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, + 0x98, 0x01, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x20, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, + 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x02, 0x47, 0x00, 0x4a, + 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80, 0x0a, 0x30, 0xa0, 0x0c, + 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, + 0x68, 0x2d, 0x9c, 0x11, 0x80, 0x42, 0x28, 0x88, 0xc2, 0x28, 0x90, 0x42, + 0x29, 0x18, 0x42, 0xc7, 0x12, 0x24, 0x01, 0x00, 0x00, 0x79, 0x18, 0x00, + 0x00, 0xd9, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, + 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0x18, + 0x40, 0x67, 0x00, 0xa0, 0x41, 0x19, 0x50, 0xb9, 0x1b, 0x43, 0x0b, 0x93, + 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, 0x80, 0x41, 0x73, 0x06, 0x02, + 0x18, 0x38, 0x8c, 0x83, 0x20, 0x38, 0x38, 0xb6, 0x32, 0x90, 0xb6, 0x32, + 0xba, 0x30, 0x36, 0x10, 0xbb, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0x37, 0x90, + 0x19, 0x19, 0x18, 0x99, 0x19, 0x17, 0x1a, 0x18, 0x1a, 0x10, 0x94, 0xb6, + 0x32, 0xba, 0x30, 0x36, 0xb3, 0xb2, 0x96, 0x19, 0x19, 0x18, 0x99, 0x19, + 0x17, 0x1a, 0x18, 0x9a, 0x94, 0x21, 0xc2, 0x19, 0x10, 0x43, 0x0c, 0x30, + 0x68, 0xc0, 0x20, 0x02, 0x03, 0x86, 0x45, 0x53, 0x19, 0x5d, 0x18, 0xdb, + 0x10, 0xe4, 0x0c, 0x0e, 0x30, 0x68, 0xc0, 0xa0, 0x01, 0x03, 0x86, 0x5b, + 0x58, 0x9a, 0x9c, 0xcb, 0xd8, 0x5b, 0x1b, 0x5c, 0x1a, 0x5b, 0x99, 0x0b, + 0x59, 0x99, 0xdb, 0x9b, 0x5c, 0xdb, 0xdc, 0x17, 0x59, 0xda, 0x5c, 0x98, + 0x18, 0x5b, 0xd9, 0x10, 0xe1, 0x0c, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, + 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x84, 0x33, 0x58, 0x48, 0x06, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x33, 0x68, 0x18, 0x85, + 0xa5, 0xc9, 0xb9, 0xc8, 0x95, 0xb9, 0x91, 0x95, 0xc9, 0x7d, 0xd1, 0x85, + 0xc9, 0x9d, 0x95, 0xd1, 0x31, 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, 0x3b, + 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x72, 0x0b, 0x6b, 0x2b, 0xa3, 0x61, + 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x33, 0x04, 0x39, 0x83, 0x07, 0x0c, 0x98, + 0x33, 0x80, 0xce, 0x20, 0x1a, 0x22, 0x9c, 0x81, 0x44, 0x26, 0x2c, 0x4d, + 0xce, 0x05, 0xee, 0x6d, 0x2e, 0x8d, 0x2e, 0xed, 0xcd, 0x8d, 0x4a, 0x58, + 0x9a, 0x9c, 0xcb, 0x58, 0x99, 0x1b, 0x5d, 0x99, 0x1c, 0xa5, 0xb0, 0x34, + 0x39, 0x17, 0xb7, 0xb7, 0x2f, 0xb8, 0x32, 0xb9, 0x39, 0xb8, 0xb2, 0x31, + 0xba, 0x34, 0xbb, 0x32, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0xe0, 0xde, 0xe6, 0xd2, 0xe8, 0xd2, + 0xde, 0xdc, 0x86, 0x40, 0x60, 0xc0, 0x9c, 0x01, 0x75, 0x06, 0xd5, 0x19, + 0x58, 0x67, 0x00, 0x9d, 0x41, 0x74, 0x06, 0xd7, 0x19, 0x60, 0x94, 0xc2, + 0xd2, 0xe4, 0x5c, 0xcc, 0xe4, 0xc2, 0xce, 0xda, 0xca, 0xdc, 0xe8, 0xbe, + 0xd2, 0xdc, 0xe0, 0xea, 0xe8, 0x68, 0x9d, 0x95, 0xb9, 0x95, 0xc9, 0x85, + 0xd1, 0x95, 0x91, 0xa1, 0xd4, 0x8c, 0xbd, 0xb1, 0xbd, 0xc9, 0x11, 0xd9, + 0xd1, 0x7c, 0x99, 0xa5, 0xf0, 0x09, 0x4b, 0x93, 0x73, 0x81, 0x2b, 0x93, + 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3, 0x2b, 0x63, 0x31, 0xf6, 0xc6, + 0xf6, 0x26, 0x37, 0x44, 0x02, 0x83, 0xe6, 0x0c, 0xb4, 0x33, 0xd8, 0xce, + 0xa0, 0x3a, 0x03, 0xee, 0x0c, 0xa0, 0x33, 0x88, 0xce, 0xe0, 0x3a, 0x83, + 0x8e, 0xd9, 0x59, 0x99, 0x5b, 0x99, 0x5c, 0x18, 0x5d, 0x19, 0x19, 0x0a, + 0x0e, 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b, 0x1c, 0x19, 0x91, 0x9d, 0xcc, + 0x97, 0x59, 0x0a, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x22, 0x74, + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x43, 0x24, 0x30, 0x80, 0xce, + 0x40, 0x3b, 0x83, 0xef, 0x0c, 0xaa, 0x33, 0xe0, 0xce, 0x00, 0x3a, 0x03, + 0x30, 0x38, 0x83, 0xeb, 0x0c, 0xc2, 0x80, 0x4a, 0x58, 0x9a, 0x9c, 0x8b, + 0x58, 0x9d, 0x99, 0x59, 0x99, 0x1c, 0x9f, 0xb0, 0x34, 0x39, 0x17, 0xb1, + 0x3a, 0x33, 0xb3, 0x32, 0xb9, 0xaf, 0xb9, 0x34, 0xbd, 0x32, 0x4a, 0x61, + 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x44, 0xc2, 0xd2, 0xe4, 0x5c, 0xe4, 0xca, + 0xc2, 0xc8, 0x48, 0x85, 0xa5, 0xc9, 0xb9, 0xcc, 0xd1, 0xc9, 0xd5, 0x8d, + 0xd1, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0xa5, 0xb9, 0x99, 0xbd, 0xb1, + 0x30, 0x63, 0x7b, 0x0b, 0xa3, 0x23, 0x33, 0x37, 0x26, 0x75, 0x24, 0xf4, + 0xf5, 0x56, 0x47, 0x07, 0x57, 0x47, 0x47, 0x86, 0xae, 0x0c, 0x8f, 0xae, + 0x4e, 0xae, 0xec, 0x8b, 0x2e, 0x0f, 0xae, 0x8c, 0x4a, 0x9a, 0x1b, 0x5c, + 0x1d, 0xdd, 0x17, 0x5d, 0x1e, 0x5c, 0x19, 0x97, 0xb1, 0x37, 0xb6, 0x37, + 0xb9, 0xaf, 0xb9, 0xb1, 0x30, 0xb6, 0x32, 0x3a, 0x74, 0x6f, 0x6e, 0x65, + 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x7c, 0xe8, + 0xde, 0xdc, 0xca, 0xda, 0xc2, 0xe0, 0xbe, 0xcc, 0xc2, 0xc6, 0xe8, 0xde, + 0xe4, 0x62, 0xf8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0x99, + 0x85, 0x8d, 0xd1, 0xbd, 0xc9, 0xc9, 0xf0, 0x99, 0x23, 0x93, 0xfb, 0xba, + 0x43, 0x4b, 0xa3, 0x2b, 0xfb, 0x82, 0x7b, 0x4b, 0x73, 0xa3, 0x1b, 0x02, + 0x0b, 0x60, 0xc0, 0x80, 0x81, 0x03, 0x06, 0xcc, 0x19, 0xa0, 0xc1, 0x19, + 0xa4, 0x01, 0x18, 0x38, 0x60, 0xe0, 0x80, 0x01, 0x73, 0x06, 0x68, 0x70, + 0x06, 0x6a, 0x00, 0x06, 0x11, 0x18, 0x38, 0x60, 0xc0, 0x9c, 0x01, 0x1a, + 0x9c, 0xc1, 0x1a, 0x80, 0x41, 0x05, 0x06, 0x0e, 0x18, 0x30, 0x67, 0x80, + 0x06, 0x67, 0xc0, 0x06, 0x60, 0xf0, 0x80, 0x81, 0x03, 0x06, 0xcc, 0x19, + 0xa0, 0xc1, 0x19, 0xb4, 0x01, 0x18, 0x58, 0x60, 0xe0, 0x80, 0x01, 0x73, + 0x06, 0x68, 0x70, 0x06, 0x6e, 0x00, 0x06, 0x17, 0x18, 0x38, 0x60, 0xc0, + 0x9c, 0x01, 0x1a, 0x9c, 0xc1, 0x1b, 0x80, 0x01, 0x06, 0x06, 0x0e, 0x18, + 0x30, 0x67, 0x80, 0x06, 0x67, 0x00, 0x07, 0x8c, 0xc2, 0xd2, 0xe4, 0x5c, + 0xc2, 0xe4, 0xce, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, 0xbe, 0xe6, 0xd2, 0xf4, + 0xca, 0x78, 0x85, 0xa5, 0xc9, 0xb9, 0x84, 0xc9, 0x9d, 0x7d, 0xd1, 0xe5, + 0xc1, 0x95, 0x7d, 0x85, 0xb1, 0xa5, 0x9d, 0xb9, 0x7d, 0xcd, 0xa5, 0xe9, + 0x95, 0xf1, 0x99, 0x42, 0x0b, 0x23, 0x2b, 0x93, 0x1b, 0x7a, 0x73, 0x9b, + 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0x63, 0x30, 0x36, 0x84, 0x0c, 0xc0, 0x80, + 0x3a, 0x83, 0x31, 0x38, 0x03, 0x32, 0x00, 0x03, 0xe9, 0x0c, 0xca, 0x00, + 0x0c, 0x18, 0x30, 0x68, 0xce, 0xc0, 0x0c, 0xce, 0xe0, 0x0c, 0xce, 0x20, + 0x0e, 0xce, 0x40, 0x0e, 0xc0, 0x40, 0x3a, 0x83, 0x39, 0x00, 0x03, 0xe7, + 0x0c, 0xa0, 0x33, 0xa0, 0x83, 0x33, 0xb8, 0xce, 0xa0, 0x0e, 0x68, 0x98, + 0xb1, 0xbd, 0x85, 0xd1, 0xcd, 0xd0, 0x78, 0x33, 0x33, 0x9b, 0x2b, 0xa3, + 0x23, 0x62, 0xc6, 0xf6, 0x16, 0x46, 0x37, 0x83, 0x37, 0x43, 0xa3, 0x2d, + 0x8c, 0x4e, 0x2e, 0x0d, 0x6f, 0x08, 0x05, 0x06, 0x0c, 0x18, 0x3c, 0x60, + 0xc0, 0x9c, 0xc1, 0x1d, 0x9c, 0x01, 0x1e, 0x80, 0xc1, 0x03, 0x06, 0x19, + 0x18, 0x30, 0x67, 0x90, 0x07, 0x67, 0xa0, 0x07, 0x4c, 0xb2, 0xaa, 0xac, + 0x88, 0xca, 0xc6, 0xde, 0xc8, 0xca, 0x68, 0x90, 0x95, 0x8d, 0xbd, 0x91, + 0x95, 0x0d, 0x21, 0x03, 0x30, 0x70, 0xce, 0x60, 0x0c, 0xce, 0x80, 0x0c, + 0xc0, 0x60, 0x3a, 0x83, 0x32, 0x00, 0x83, 0x06, 0x0c, 0x9a, 0x33, 0x30, + 0x83, 0x33, 0x38, 0x83, 0x33, 0xd8, 0x83, 0x33, 0x90, 0x03, 0x30, 0x98, + 0xce, 0x60, 0x0e, 0xc0, 0xe0, 0x39, 0x03, 0xe8, 0x0c, 0xf8, 0xe0, 0x0c, + 0xae, 0x33, 0xe8, 0x03, 0x2e, 0x61, 0x69, 0x72, 0x2e, 0x74, 0x65, 0x78, + 0x74, 0x75, 0x72, 0x65, 0x54, 0xc2, 0xd2, 0xe4, 0x5c, 0xe6, 0xc2, 0xda, + 0xe0, 0xd8, 0xca, 0x88, 0xd1, 0x95, 0xe1, 0xd1, 0xd5, 0xc9, 0x95, 0xc9, + 0x90, 0xf1, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xb1, 0x80, 0xcc, 0x85, 0xb5, + 0xc1, 0xb1, 0x95, 0xf9, 0x90, 0xa0, 0x2b, 0xc3, 0xcb, 0x1a, 0x42, 0x81, + 0x81, 0x76, 0x06, 0x7f, 0x70, 0x06, 0x65, 0x00, 0x06, 0x0c, 0x18, 0x34, + 0x67, 0x00, 0x0a, 0x67, 0x00, 0x9d, 0x41, 0x28, 0x9c, 0xc1, 0x75, 0x06, + 0xa2, 0x40, 0x8f, 0xae, 0x0c, 0x8f, 0xae, 0x4e, 0xae, 0x4c, 0x86, 0xec, + 0x2b, 0x4c, 0x4e, 0x2e, 0x2c, 0x8f, 0xc7, 0x8c, 0xed, 0x2d, 0x8c, 0x8e, + 0x05, 0x64, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0xcc, 0x87, 0x05, 0x5d, 0x19, + 0x5e, 0x95, 0xd5, 0x10, 0x0a, 0x0c, 0xb6, 0x33, 0xf8, 0x83, 0x33, 0x28, + 0x03, 0x30, 0x68, 0xc0, 0xa0, 0x39, 0x03, 0x50, 0x38, 0x03, 0xe8, 0x0c, + 0x48, 0xe1, 0x0c, 0xae, 0x33, 0x28, 0x05, 0x2e, 0x61, 0x69, 0x72, 0x2e, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x3c, 0xe6, 0xc2, 0xda, 0xe0, + 0xd8, 0xca, 0xe4, 0x18, 0xcc, 0x0d, 0x91, 0xc0, 0x80, 0x3b, 0x83, 0x53, + 0x38, 0x83, 0x32, 0x00, 0x03, 0x06, 0x0c, 0x9a, 0x33, 0x80, 0xce, 0x00, + 0x15, 0xce, 0xe0, 0x3a, 0x83, 0x54, 0x18, 0x02, 0x9d, 0x41, 0x76, 0x06, + 0xde, 0x19, 0x88, 0xc1, 0x19, 0xd8, 0xc1, 0x19, 0xf8, 0xc1, 0x19, 0x8c, + 0xc2, 0x19, 0x98, 0xc2, 0x19, 0xa8, 0xc2, 0x10, 0x23, 0x02, 0xce, 0x60, + 0x3a, 0x83, 0x55, 0xa0, 0x18, 0x84, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, + 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xcd, 0xa1, 0x4c, 0x11, + 0x31, 0x7d, 0x65, 0x55, 0x59, 0x7d, 0x99, 0xc9, 0x85, 0x9d, 0xb5, 0x95, + 0xb9, 0xd1, 0xa5, 0x0c, 0x21, 0xce, 0xc0, 0x15, 0xce, 0xa0, 0x15, 0x88, + 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, + 0xbd, 0xc1, 0x95, 0xb5, 0xd0, 0x95, 0xe1, 0xd1, 0xd5, 0xc9, 0x95, 0xcd, + 0x0d, 0x31, 0xce, 0x00, 0x16, 0xce, 0xc0, 0x15, 0xce, 0xe0, 0x15, 0x88, + 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, + 0xbd, 0xc1, 0x95, 0xb5, 0xcc, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0xcd, + 0x0d, 0x31, 0xce, 0x40, 0x16, 0xce, 0xc0, 0x15, 0xce, 0x20, 0x16, 0x86, + 0x10, 0x67, 0x00, 0x0b, 0x67, 0x20, 0x0b, 0xb4, 0xc2, 0xd2, 0xe4, 0x5a, + 0xc2, 0xd8, 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a, + 0xc2, 0xe4, 0xce, 0x50, 0x66, 0x52, 0x86, 0x18, 0x67, 0x50, 0x0b, 0x67, + 0xe0, 0x0a, 0x67, 0x40, 0x0b, 0xb4, 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8, + 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a, 0xc2, 0xe4, + 0xce, 0x50, 0x68, 0x52, 0x86, 0x18, 0x67, 0x70, 0x0b, 0x67, 0xe0, 0x0a, + 0x67, 0x60, 0x0b, 0x43, 0x88, 0x33, 0xa8, 0x85, 0x33, 0xb8, 0x85, 0x21, + 0xc2, 0x19, 0xdc, 0xc2, 0x10, 0xe3, 0x0c, 0x6a, 0xe1, 0x0c, 0x60, 0xe1, + 0x0c, 0x64, 0x81, 0xd5, 0x97, 0x16, 0xd5, 0x54, 0x4c, 0xcd, 0x14, 0x5a, + 0x18, 0x59, 0x99, 0xdc, 0xd0, 0x9b, 0xdb, 0x1c, 0x5d, 0x98, 0x1b, 0xdd, + 0x1c, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, 0x37, 0xba, 0x32, 0x37, 0x3a, + 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, + 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x43, 0x84, 0x33, + 0xe8, 0x85, 0x21, 0xc6, 0x19, 0xf0, 0xc2, 0x19, 0xf8, 0xc2, 0x1a, 0x78, + 0x43, 0x8c, 0x33, 0x40, 0x83, 0x33, 0xf8, 0x85, 0x35, 0xf0, 0x86, 0x88, + 0xc1, 0x19, 0xec, 0xc2, 0x19, 0x80, 0xc3, 0x1a, 0x78, 0x67, 0x00, 0x0e, + 0x6b, 0xf0, 0x9d, 0x01, 0x38, 0xac, 0x01, 0x18, 0x9c, 0x01, 0x38, 0xac, + 0x41, 0x18, 0x9c, 0x01, 0x38, 0xac, 0x81, 0x18, 0x9c, 0x01, 0x38, 0xac, + 0xc1, 0x18, 0x9c, 0x01, 0x38, 0xac, 0x01, 0x19, 0x9c, 0x01, 0x38, 0xac, + 0x41, 0x37, 0xc4, 0x38, 0x83, 0x70, 0x38, 0x03, 0x70, 0x58, 0x03, 0x30, + 0x18, 0x62, 0x9c, 0x41, 0x38, 0x9c, 0x01, 0x38, 0xac, 0x41, 0x37, 0xc4, + 0x38, 0x83, 0x70, 0x38, 0x03, 0x70, 0x58, 0x03, 0x31, 0x18, 0x62, 0x9c, + 0x41, 0x38, 0x9c, 0x01, 0x38, 0xac, 0xc1, 0x18, 0x0c, 0x31, 0xce, 0x20, + 0x1c, 0xce, 0x00, 0x1c, 0xd6, 0x80, 0x0c, 0x86, 0x18, 0x67, 0x10, 0x0e, + 0x67, 0x00, 0x0e, 0x6b, 0xf0, 0x0d, 0x31, 0xce, 0x20, 0x1c, 0xce, 0x00, + 0x1c, 0xd6, 0x20, 0x0c, 0x86, 0x18, 0x67, 0x10, 0x0e, 0x67, 0x00, 0x0e, + 0x6b, 0xe0, 0x8d, 0x88, 0xd8, 0x81, 0x1d, 0xec, 0xa1, 0x1d, 0xdc, 0xa0, + 0x1d, 0xde, 0x81, 0x1c, 0xea, 0x81, 0x1d, 0xca, 0xc1, 0x0d, 0xcc, 0x81, + 0x1d, 0xc2, 0xe1, 0x1c, 0xe6, 0x61, 0x8a, 0x10, 0x0c, 0x23, 0x14, 0x76, + 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x48, 0x07, 0x72, 0x28, 0x07, 0x77, + 0xa0, 0x87, 0x29, 0x41, 0x31, 0x62, 0x09, 0x87, 0x74, 0x90, 0x07, 0x37, + 0xb0, 0x87, 0x72, 0x90, 0x87, 0x79, 0x48, 0x87, 0x77, 0x70, 0x87, 0x29, + 0x81, 0x31, 0x82, 0x0a, 0x87, 0x74, 0x90, 0x07, 0x37, 0x60, 0x87, 0x70, + 0x70, 0x87, 0x73, 0xa8, 0x87, 0x70, 0x38, 0x87, 0x72, 0xf8, 0x05, 0x7b, + 0x28, 0x07, 0x79, 0x98, 0x87, 0x74, 0x78, 0x07, 0x77, 0x98, 0x12, 0x20, + 0x23, 0xa6, 0x70, 0x48, 0x07, 0x79, 0x70, 0x83, 0x71, 0x78, 0x87, 0x76, + 0x80, 0x87, 0x74, 0x60, 0x87, 0x72, 0xf8, 0x85, 0x77, 0x80, 0x07, 0x7a, + 0x48, 0x87, 0x77, 0x70, 0x87, 0x79, 0x98, 0x32, 0x28, 0x8c, 0x33, 0x82, + 0x09, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x07, 0x79, 0x08, 0x87, 0x73, + 0x68, 0x87, 0x72, 0x70, 0x07, 0x7a, 0x98, 0x12, 0xb0, 0x02, 0x00, 0x00, + 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, + 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, + 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, + 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, + 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, + 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, + 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, + 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, + 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, + 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, + 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, + 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, + 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, + 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, + 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, + 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, + 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, + 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, + 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, + 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, + 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, + 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, + 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, + 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, + 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, + 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, + 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, + 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, + 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, + 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, + 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, + 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, + 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, + 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, + 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, + 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, + 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, + 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, + 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, + 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, + 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, + 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, + 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, + 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, + 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, + 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, + 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, + 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, + 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, + 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, + 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, + 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, + 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, + 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, + 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, + 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, + 0x00, 0x35, 0x00, 0x00, 0x00, 0x56, 0x90, 0xfd, 0x73, 0x6d, 0x6b, 0xcf, + 0xb3, 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74, 0xd5, 0xfd, 0x17, 0x45, + 0x51, 0x14, 0x96, 0x30, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, + 0x03, 0x5c, 0x7e, 0x75, 0x17, 0xb7, 0x6d, 0x01, 0x14, 0x80, 0x44, 0x7e, + 0x01, 0x48, 0xd3, 0x2f, 0x2c, 0x00, 0xf3, 0xf8, 0xd5, 0x5d, 0xdc, 0xb6, + 0x09, 0x40, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0xff, 0xe3, 0x58, 0x7e, + 0x71, 0xdb, 0x36, 0x10, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, + 0x10, 0x48, 0x7e, 0x71, 0xdb, 0x76, 0x20, 0x01, 0x48, 0xe4, 0x17, 0x80, + 0x34, 0xfd, 0x8f, 0x63, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x29, 0x84, 0x01, + 0x80, 0x44, 0xbe, 0x04, 0x30, 0xcf, 0x42, 0xfc, 0x13, 0x71, 0x4d, 0x54, + 0x44, 0xfc, 0xf6, 0xf0, 0x03, 0x51, 0x04, 0x60, 0x7e, 0x85, 0x17, 0xb7, + 0x6d, 0x04, 0x0d, 0x80, 0x44, 0xfe, 0xe0, 0x4c, 0x7e, 0x75, 0x17, 0xb7, + 0x6d, 0x0b, 0x1b, 0x80, 0x44, 0xbe, 0x04, 0x30, 0xcf, 0x42, 0xfc, 0x13, + 0x71, 0x4d, 0x54, 0x44, 0xfc, 0xf6, 0xe0, 0x57, 0x78, 0x71, 0xdb, 0x86, + 0x30, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, 0x10, 0x48, 0x7e, + 0x75, 0x17, 0xb7, 0x6d, 0x00, 0x10, 0xdb, 0x95, 0xbf, 0xec, 0xbe, 0x7f, + 0x11, 0x01, 0x06, 0x43, 0x34, 0x93, 0x19, 0x44, 0x00, 0x12, 0xf9, 0x05, + 0x20, 0x4d, 0x7f, 0xc1, 0x00, 0x97, 0x5f, 0xdc, 0x36, 0x00, 0x00, 0x00, + 0x00, 0x61, 0x20, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e, + 0x10, 0x0b, 0x04, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x14, 0x8f, 0x45, + 0x00, 0x81, 0x70, 0xcc, 0x41, 0x30, 0x0d, 0x84, 0x07, 0xb4, 0x16, 0x41, + 0x09, 0x50, 0x3a, 0xc7, 0xc0, 0xe0, 0x01, 0x1e, 0x8c, 0x00, 0x8c, 0x35, + 0x00, 0x81, 0x40, 0xe2, 0x08, 0x00, 0x85, 0x23, 0x00, 0x35, 0x40, 0xe0, + 0x0c, 0x00, 0x01, 0x63, 0x04, 0xef, 0x9e, 0x96, 0xf7, 0x37, 0x46, 0xa0, + 0xb3, 0xe6, 0x1c, 0x82, 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x09, 0x06, + 0x63, 0x04, 0x20, 0x08, 0x82, 0x20, 0x18, 0xcc, 0x00, 0x50, 0x30, 0x03, + 0x30, 0x03, 0x30, 0x07, 0x21, 0x0b, 0xb2, 0x20, 0x0b, 0xb3, 0x30, 0x07, + 0x31, 0x0b, 0xb9, 0x30, 0x0b, 0x7d, 0x40, 0xc5, 0x0c, 0xc0, 0x08, 0xc0, + 0x0c, 0xc0, 0x58, 0x03, 0x08, 0x82, 0x20, 0xfe, 0x81, 0x20, 0x08, 0xe2, + 0x1f, 0x08, 0x82, 0x20, 0xfe, 0x8d, 0x35, 0xb0, 0xed, 0xfc, 0x93, 0x1e, + 0xdb, 0xce, 0x3f, 0xe9, 0xb1, 0xed, 0xfc, 0x93, 0xde, 0x58, 0x03, 0x08, + 0x82, 0x6c, 0xfd, 0x0b, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, 0xc8, + 0xd6, 0xbf, 0x30, 0xd6, 0x00, 0x82, 0xe0, 0x9a, 0x83, 0x01, 0x08, 0x82, + 0x6b, 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x8c, 0x35, 0x80, 0x20, + 0xdd, 0xe6, 0x60, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, 0x6d, + 0x0e, 0x06, 0x63, 0x0d, 0xeb, 0x88, 0xc7, 0x2c, 0x18, 0xac, 0x23, 0x1e, + 0xb3, 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x58, 0x03, 0x08, 0xc2, + 0x78, 0x38, 0x06, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, 0x87, + 0x63, 0x30, 0xd6, 0x20, 0xe6, 0x62, 0xda, 0x7f, 0x60, 0xc9, 0xb3, 0xf1, + 0x2f, 0x8c, 0xe9, 0xaa, 0xe6, 0xbe, 0x30, 0xd6, 0xf0, 0xcf, 0xa4, 0xff, + 0xfb, 0x02, 0x5d, 0x83, 0x62, 0xfe, 0xb5, 0x70, 0x1c, 0x83, 0xbe, 0x30, + 0xd6, 0x30, 0xf7, 0x6d, 0x9a, 0xfa, 0x42, 0xeb, 0x86, 0x3c, 0xef, 0x0b, + 0x7c, 0xce, 0xfa, 0xf8, 0x47, 0xc0, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, + 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0x79, 0xaf, 0xab, + 0xec, 0xcd, 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, + 0xdb, 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba, 0xf8, 0x37, + 0x46, 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8, 0xf6, 0x34, + 0x18, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x23, 0x06, 0x4a, 0x11, 0xbc, 0xc2, 0x1b, 0xb4, 0x81, 0x1c, 0x8c, + 0x41, 0x19, 0x90, 0x41, 0x30, 0x62, 0xb0, 0x14, 0x41, 0x2c, 0xbc, 0x81, + 0x1b, 0xcc, 0xc1, 0x2b, 0x90, 0x81, 0x19, 0x94, 0x81, 0x30, 0x86, 0x10, + 0xc0, 0xc2, 0x20, 0xc3, 0xe0, 0xad, 0xc1, 0x1c, 0x43, 0x20, 0xc4, 0xc2, + 0x88, 0xc1, 0x52, 0x04, 0xb5, 0x30, 0x07, 0x72, 0x70, 0x07, 0xb2, 0x80, + 0x06, 0x6a, 0x90, 0x06, 0xc6, 0x18, 0x42, 0x40, 0x0b, 0x73, 0x0c, 0x43, + 0x10, 0x0b, 0x87, 0x07, 0xea, 0x52, 0x50, 0x06, 0x19, 0x02, 0x33, 0x80, + 0x03, 0x23, 0x02, 0xf8, 0x8c, 0x37, 0xf0, 0x01, 0x2a, 0xe4, 0xc2, 0x05, + 0xea, 0x52, 0x50, 0x06, 0x19, 0x82, 0x35, 0xa8, 0x83, 0x11, 0x83, 0xc2, + 0x08, 0xcc, 0xa1, 0x08, 0xc6, 0x2b, 0x42, 0xa1, 0x15, 0x7c, 0xe1, 0x17, + 0xf4, 0xe0, 0x02, 0x75, 0x29, 0x28, 0x83, 0x0c, 0x01, 0x1c, 0xe8, 0xc1, + 0x88, 0x41, 0x61, 0x04, 0xeb, 0xa0, 0x04, 0xe3, 0x15, 0xa6, 0x20, 0x0b, + 0xe3, 0x40, 0x0e, 0xa0, 0x70, 0x81, 0xba, 0x14, 0x94, 0x41, 0x86, 0xa0, + 0x0e, 0xfe, 0x60, 0xc4, 0xa0, 0x30, 0x02, 0x78, 0x78, 0x82, 0x39, 0x86, + 0x3a, 0x58, 0xd2, 0x61, 0x8e, 0x21, 0x38, 0xd2, 0x61, 0x8e, 0x21, 0x18, + 0xce, 0x61, 0xbc, 0xe1, 0x15, 0x74, 0x01, 0x1d, 0x28, 0x18, 0xc3, 0x0d, + 0xc1, 0x1f, 0x04, 0xb3, 0x0c, 0x81, 0x10, 0x0c, 0x32, 0x10, 0x7d, 0x70, + 0x0a, 0xe3, 0x0d, 0xb3, 0xe0, 0x0b, 0xe0, 0x40, 0xc1, 0x18, 0x31, 0x20, + 0x8c, 0xc0, 0x1e, 0x86, 0x11, 0x83, 0xc2, 0x08, 0xf0, 0x21, 0xc8, 0x03, + 0x0b, 0xf2, 0x00, 0x3e, 0x23, 0x06, 0x85, 0x11, 0xe0, 0x43, 0xe0, 0x07, + 0x36, 0xe8, 0x81, 0x7c, 0x4c, 0x0f, 0x82, 0xf8, 0xd8, 0x10, 0xd0, 0x67, + 0xc4, 0x80, 0x30, 0x82, 0x7e, 0x08, 0x46, 0x0c, 0x0a, 0x23, 0xf8, 0x87, + 0x80, 0x0f, 0x2c, 0xe0, 0x03, 0xf9, 0xcc, 0x31, 0x98, 0xc2, 0xc2, 0x0f, + 0x83, 0x0c, 0xc1, 0x29, 0xd8, 0x82, 0x0d, 0x01, 0x7d, 0x06, 0x19, 0x82, + 0x54, 0xe0, 0x85, 0x41, 0x86, 0xa0, 0xf2, 0x85, 0x59, 0x02, 0x61, 0xa0, + 0x22, 0x10, 0x02, 0x36, 0x00, 0xc6, 0x1b, 0xca, 0x01, 0x1e, 0x40, 0x82, + 0x82, 0x31, 0xdc, 0x10, 0xdc, 0x81, 0x33, 0xcb, 0x30, 0x10, 0xc1, 0x20, + 0x03, 0x31, 0x0b, 0xbd, 0x30, 0xde, 0x90, 0x0e, 0xf4, 0x80, 0x0f, 0x14, + 0x8c, 0xf1, 0x86, 0x75, 0xb0, 0x87, 0x7c, 0xa0, 0x60, 0x8c, 0x18, 0x20, + 0x47, 0x14, 0x13, 0x45, 0x77, 0x0c, 0xc1, 0x20, 0x43, 0x50, 0x0b, 0xe8, + 0x30, 0xc8, 0x10, 0x2c, 0xea, 0x30, 0x4b, 0x40, 0x0c, 0x54, 0x04, 0xc2, + 0x80, 0x09, 0xc3, 0x0d, 0x61, 0x70, 0x0a, 0xc1, 0x2c, 0x43, 0x31, 0x05, + 0xe3, 0x0d, 0xf2, 0xd0, 0x0f, 0x2e, 0x41, 0xc1, 0x18, 0x6e, 0x08, 0x54, + 0x21, 0x98, 0x65, 0x30, 0x8e, 0x60, 0x90, 0xa1, 0x00, 0x07, 0x75, 0x18, + 0x6f, 0xb0, 0x87, 0x90, 0x58, 0x09, 0x0a, 0xc6, 0x1c, 0xc3, 0x2f, 0x04, + 0x35, 0x31, 0xc8, 0x10, 0x80, 0xc3, 0x3b, 0x58, 0x50, 0xc8, 0x67, 0x90, + 0x21, 0x10, 0x87, 0x7a, 0x98, 0x25, 0x68, 0x83, 0xf1, 0x06, 0x7e, 0x38, + 0x89, 0x9c, 0xa0, 0x60, 0x8c, 0x37, 0xf8, 0x43, 0x4a, 0xcc, 0x04, 0x05, + 0x63, 0x90, 0x01, 0x5a, 0x07, 0x7d, 0x18, 0x6e, 0x20, 0x62, 0xc1, 0x99, + 0x65, 0x40, 0xa4, 0x60, 0x0c, 0x41, 0xfa, 0x89, 0xe1, 0x86, 0x60, 0x17, + 0x94, 0x59, 0x06, 0x25, 0x09, 0x4c, 0xe8, 0x05, 0xf9, 0xcc, 0x12, 0x2c, + 0x36, 0xfc, 0x02, 0x7c, 0x46, 0x0c, 0x08, 0x23, 0x60, 0x8b, 0xc0, 0x82, + 0x7b, 0x90, 0xcf, 0x88, 0x41, 0x61, 0x04, 0x6f, 0x11, 0xdc, 0xc3, 0x2c, + 0xc1, 0x32, 0x50, 0x01, 0x28, 0x89, 0xa0, 0xcc, 0x31, 0xd0, 0x43, 0x70, + 0x16, 0x63, 0x08, 0xdb, 0x59, 0x0c, 0x37, 0x04, 0xe4, 0xa0, 0xcc, 0x32, + 0x34, 0x4c, 0x60, 0x82, 0x39, 0xc8, 0x67, 0x96, 0xc0, 0xb1, 0x01, 0x1d, + 0xe0, 0x33, 0x62, 0x40, 0x18, 0x41, 0x5d, 0x04, 0x16, 0x80, 0x84, 0x7c, + 0x46, 0x0c, 0x0a, 0x23, 0xc0, 0x8b, 0x00, 0x24, 0x66, 0x09, 0x9c, 0x81, + 0x0a, 0x40, 0x61, 0x84, 0x66, 0x8e, 0x21, 0x09, 0xde, 0x62, 0x0c, 0x81, + 0x0c, 0xda, 0x62, 0xb8, 0x21, 0x68, 0x07, 0x65, 0x96, 0x01, 0x7a, 0x02, + 0x13, 0xde, 0x41, 0x3e, 0xb3, 0x04, 0x91, 0x0d, 0xf1, 0x00, 0x9f, 0x11, + 0x03, 0xc2, 0x08, 0xfc, 0x22, 0xb0, 0x20, 0x25, 0xe4, 0x33, 0x62, 0x50, + 0x18, 0x41, 0x68, 0x04, 0x29, 0x31, 0x4b, 0x10, 0x0d, 0x54, 0x00, 0xca, + 0x23, 0x40, 0x73, 0x0c, 0x49, 0x50, 0x17, 0xb3, 0x04, 0xd2, 0x40, 0x45, + 0x20, 0x44, 0x7a, 0x70, 0x0c, 0x32, 0x04, 0x29, 0x31, 0x13, 0x73, 0x0c, + 0x26, 0x01, 0x06, 0x7c, 0x31, 0xc8, 0x10, 0x9c, 0x84, 0x4d, 0xd8, 0x10, + 0xc8, 0x67, 0x90, 0x21, 0x48, 0x09, 0x9e, 0x98, 0x25, 0x68, 0x83, 0xe1, + 0x86, 0x59, 0x80, 0x89, 0x60, 0x96, 0x81, 0x02, 0x83, 0x60, 0x90, 0x81, + 0x0e, 0x5e, 0x22, 0x27, 0xc6, 0x1b, 0xca, 0x02, 0x2e, 0x44, 0x83, 0x82, + 0x31, 0xde, 0x70, 0x16, 0x72, 0xc1, 0x17, 0x14, 0x8c, 0x39, 0x06, 0x98, + 0x08, 0x4c, 0x63, 0x90, 0x21, 0x88, 0x09, 0xb0, 0xb0, 0xe0, 0x90, 0xcf, + 0x20, 0x43, 0x30, 0x13, 0x66, 0x31, 0xdc, 0x70, 0xf4, 0x83, 0x33, 0xcb, + 0xf0, 0x55, 0xc1, 0x18, 0xc2, 0xb0, 0x1a, 0xc3, 0x0d, 0x01, 0x48, 0x28, + 0xb3, 0x0c, 0x97, 0x15, 0x98, 0x20, 0x12, 0xf2, 0x99, 0x25, 0xc0, 0x46, + 0x0c, 0x08, 0x23, 0xb8, 0x8d, 0x61, 0xc4, 0xa0, 0x30, 0x82, 0xdc, 0x08, + 0x4a, 0xc2, 0x82, 0x93, 0x90, 0x8f, 0x05, 0x29, 0x01, 0x9f, 0x59, 0x02, + 0x6c, 0xa0, 0x02, 0x50, 0x2c, 0xe1, 0x9a, 0x63, 0xd8, 0x89, 0x60, 0x36, + 0xc6, 0x10, 0x98, 0xd9, 0x18, 0x6e, 0x08, 0x52, 0x42, 0x99, 0x65, 0xd0, + 0xb2, 0xc0, 0x84, 0x95, 0x90, 0xcf, 0x2c, 0xc1, 0x36, 0x62, 0x40, 0x18, + 0x01, 0x78, 0x0c, 0x23, 0x06, 0x85, 0x11, 0x88, 0x47, 0xe0, 0x12, 0x16, + 0xc0, 0x84, 0x7c, 0x2c, 0x90, 0x09, 0xf8, 0xcc, 0x12, 0x6c, 0x03, 0x15, + 0x80, 0x92, 0x09, 0xda, 0x1c, 0x43, 0x12, 0xec, 0xc6, 0x18, 0x42, 0x95, + 0x1b, 0xc3, 0x0d, 0x81, 0x4c, 0x28, 0xb3, 0x0c, 0x1d, 0x17, 0x98, 0x40, + 0x13, 0xf2, 0x99, 0x25, 0xf0, 0x46, 0x0c, 0x08, 0x23, 0x48, 0x8f, 0x61, + 0xc4, 0xa0, 0x30, 0x82, 0xf5, 0x08, 0x6e, 0xc2, 0x82, 0x9c, 0x90, 0x8f, + 0x05, 0x3b, 0x01, 0x9f, 0x59, 0x02, 0x6f, 0xa0, 0x02, 0x50, 0x38, 0xa1, + 0x9b, 0x63, 0x48, 0x82, 0xf0, 0x18, 0x31, 0x30, 0x8c, 0x20, 0x3e, 0x82, + 0xb7, 0x68, 0x8b, 0x41, 0x86, 0x20, 0x2e, 0x48, 0x63, 0x96, 0xe0, 0x1b, + 0xa8, 0x08, 0xfc, 0x80, 0x12, 0xbc, 0x41, 0x86, 0xe0, 0x2e, 0x4c, 0x63, + 0x96, 0xa0, 0x0d, 0x66, 0x19, 0xc2, 0xa0, 0x0d, 0xf8, 0x61, 0x90, 0xa1, + 0x17, 0xf0, 0x42, 0x34, 0x46, 0x0c, 0x0a, 0x23, 0x98, 0x8f, 0x60, 0x2d, + 0xe6, 0x18, 0xe8, 0x22, 0x60, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0xea, 0x63, + 0x60, 0x8b, 0x39, 0x06, 0x21, 0x68, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0xee, + 0xa3, 0x68, 0x8b, 0x39, 0x06, 0x21, 0x60, 0x8f, 0x41, 0x86, 0x60, 0x2f, + 0x5c, 0x63, 0x90, 0x21, 0x28, 0x07, 0xd8, 0x18, 0x6f, 0xb0, 0x8d, 0xf0, + 0x98, 0x0f, 0x0a, 0xc6, 0x78, 0x03, 0x6e, 0x8c, 0x47, 0x7b, 0x50, 0x30, + 0xe6, 0x18, 0x42, 0x23, 0xb8, 0x8f, 0x41, 0x86, 0x40, 0x34, 0x62, 0xc3, + 0x82, 0x44, 0x3e, 0x83, 0x0c, 0x01, 0x69, 0xdc, 0xc6, 0x70, 0xc3, 0xe1, + 0x16, 0xce, 0x2c, 0x03, 0x1b, 0x88, 0x41, 0x30, 0x86, 0x30, 0xf0, 0xc7, + 0x70, 0x43, 0x10, 0x17, 0xca, 0x2c, 0x03, 0x19, 0x8c, 0x41, 0x60, 0xc2, + 0x5c, 0xc8, 0x67, 0x96, 0xa0, 0x0c, 0x46, 0x0c, 0x08, 0x23, 0x40, 0x91, + 0x61, 0xc4, 0xa0, 0x30, 0x02, 0x15, 0x09, 0xec, 0xc2, 0x02, 0xbc, 0x90, + 0x8f, 0x05, 0x7a, 0x01, 0x9f, 0x59, 0x82, 0x32, 0x18, 0xa8, 0x00, 0x94, + 0x31, 0x10, 0xc8, 0x60, 0x8e, 0x81, 0x35, 0x02, 0x12, 0x19, 0x43, 0x60, + 0x48, 0x64, 0xb8, 0x21, 0xd0, 0x0b, 0x65, 0x96, 0xe1, 0x0c, 0xcc, 0x20, + 0x30, 0x81, 0x2f, 0xe4, 0x33, 0x4b, 0x80, 0x06, 0x23, 0x06, 0x84, 0x11, + 0xc4, 0xc8, 0x30, 0x62, 0x50, 0x18, 0xc1, 0x8c, 0x04, 0x7f, 0x61, 0x41, + 0x68, 0xc8, 0xc7, 0x82, 0xd1, 0x80, 0xcf, 0x2c, 0x01, 0x1a, 0x0c, 0x54, + 0x00, 0x8a, 0x19, 0x08, 0x67, 0x30, 0xc7, 0x90, 0x04, 0x2c, 0x32, 0x86, + 0x50, 0xa9, 0xc8, 0x70, 0x43, 0x30, 0x1a, 0xca, 0x2c, 0x83, 0x1a, 0xa4, + 0x41, 0x60, 0x42, 0x69, 0xc8, 0x67, 0x96, 0x60, 0x0d, 0x46, 0x0c, 0x08, + 0x23, 0xd0, 0x91, 0x61, 0xc4, 0xa0, 0x30, 0x02, 0x1e, 0x09, 0x50, 0xc3, + 0x02, 0xd5, 0x90, 0x8f, 0x05, 0xac, 0x01, 0x9f, 0x59, 0x82, 0x35, 0x18, + 0xa8, 0x00, 0x94, 0x34, 0x10, 0xd4, 0x60, 0x8e, 0x21, 0x09, 0x64, 0x64, + 0xc4, 0xc0, 0x30, 0x02, 0x31, 0x09, 0xc0, 0xc3, 0x37, 0x06, 0x19, 0x02, + 0xf1, 0xa8, 0x8f, 0x59, 0x02, 0x36, 0x18, 0xa8, 0x08, 0xfc, 0x20, 0x0c, + 0x84, 0x35, 0x18, 0x64, 0x08, 0xd0, 0xe3, 0x3e, 0x66, 0x09, 0xda, 0x60, + 0xa0, 0x25, 0xe0, 0x11, 0x83, 0x47, 0x24, 0x1e, 0xf9, 0x64, 0x81, 0x0d, + 0x78, 0x04, 0x0c, 0x06, 0x5a, 0x02, 0x14, 0x31, 0xf4, 0x42, 0x32, 0x87, + 0x8f, 0x60, 0x03, 0xd7, 0x01, 0x83, 0x41, 0x86, 0x40, 0xd8, 0x0f, 0x0b, + 0x46, 0x44, 0x3e, 0x19, 0x84, 0x03, 0x01, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0xd7, 0xd2, 0x07, 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4, + 0x50, 0x13, 0xe7, 0x2c, 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d, + 0x9b, 0x6d, 0x29, 0x38, 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b, + 0x00, 0x03, 0x11, 0x71, 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71, + 0x21, 0x13, 0x00, 0x00, 0x00, 0x01, 0x31, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x5b, 0x0a, 0xe0, 0x98, 0x05, 0x04, 0x17, 0xb6, 0x14, 0xc1, 0x31, + 0x0b, 0x08, 0x2e, 0x6c, 0x29, 0x8a, 0x63, 0x16, 0x10, 0x5c, 0xd8, 0x52, + 0x24, 0x47, 0x2e, 0x20, 0xba, 0xb0, 0xa5, 0x70, 0x8e, 0x5c, 0x40, 0x74, + 0x61, 0x4b, 0x31, 0x1d, 0xb9, 0x80, 0xe8, 0xc2, 0x96, 0x02, 0x3b, 0x72, + 0x01, 0xd1, 0x85, 0x2d, 0xc3, 0x17, 0x88, 0xc3, 0x96, 0x81, 0x0c, 0x82, + 0x71, 0xd8, 0x32, 0xdc, 0x41, 0x40, 0x0e, 0x5b, 0x06, 0x3e, 0x08, 0xca, + 0x61, 0xcb, 0xe0, 0x07, 0x81, 0x39, 0x6c, 0x19, 0x4e, 0x21, 0x38, 0x87, + 0x2d, 0x03, 0x2b, 0x04, 0xe8, 0xb0, 0x65, 0x98, 0x85, 0x20, 0x1d, 0xb6, + 0x0c, 0xb5, 0x10, 0xa0, 0xc3, 0x96, 0x21, 0x25, 0x82, 0x74, 0xd8, 0x32, + 0xac, 0x44, 0x80, 0x0e, 0x5b, 0x86, 0xd3, 0x08, 0xd2, 0x61, 0xcb, 0x90, + 0x1a, 0x01, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x14, 0xcf, 0x41, 0x30, 0x0d, 0xe4, 0x06, + 0x94, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xe0, 0x0c, 0x00, 0x05, + 0x33, 0x00, 0x54, 0xcc, 0x00, 0x8c, 0x35, 0xb0, 0xec, 0x19, 0xca, 0x1f, + 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce, 0xde, 0x58, 0x83, 0x5e, + 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf, 0xdb, 0xa7, 0xf4, 0xe8, + 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a, 0xc2, 0xe8, 0xee, 0xdd, + 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25, + 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f, + 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c, + 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2, + 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05, 0x33, 0x00, 0x04, 0x8c, + 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82, + 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5, 0x02, 0x0d, 0x37, 0x50, + 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43, 0x43, 0xc5, 0xc1, 0x20, + 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64, 0x08, 0xa0, 0x6a, 0x96, + 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61, 0x48, 0x82, 0xe1, 0x86, + 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31, 0x28, 0x8c, 0xe0, 0x0f, + 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xf0, 0x60, 0xc4, 0xa0, 0x30, 0x82, 0x50, + 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xc8, 0x83, 0x11, 0x83, 0xc2, 0x08, 0x46, + 0x21, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xc0, 0x83, 0x59, 0x82, 0x62, 0xa0, + 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xfc, 0x60, 0x0c, 0x41, 0xf0, + 0x83, 0x31, 0x84, 0x81, 0x0f, 0x46, 0x0c, 0x0a, 0x23, 0x38, 0x05, 0x21, + 0x18, 0x31, 0x28, 0x8c, 0x00, 0x15, 0x88, 0x60, 0xb8, 0x21, 0xb8, 0x84, + 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c, 0x0c, 0x6c, 0x40, 0x03, + 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90, 0x8f, 0x05, 0x1a, 0x7c, + 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81, 0x2a, 0x0c, 0x32, 0x04, + 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64, 0x08, 0xd2, 0xc0, 0x0d, + 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4, 0xa0, 0x98, 0x65, 0x40, + 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18, 0x31, 0x28, 0x8c, 0x00, + 0x17, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0x20, 0x16, 0x46, 0x0c, 0x0a, + 0x23, 0xd0, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84, 0x40, 0x16, 0x46, 0x0c, + 0x0a, 0x23, 0xe0, 0x85, 0x42, 0x0d, 0xe6, 0x18, 0x84, 0x20, 0x16, 0x66, + 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57, 0x10, 0x04, 0x04, 0x3a, + 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00 + 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x1c, 0x1c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, + 0xde, 0x21, 0x0c, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x0b, 0x82, 0x20, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, + 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, + 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, + 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, + 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, + 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8, + 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, + 0x00, 0xf7, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90, + 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68, + 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, + 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, 0x1d, 0xd2, 0xc1, 0x1d, + 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, 0x1d, 0xda, 0xc0, 0x1e, + 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, 0xee, 0x21, 0x1d, + 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, 0xc0, 0x03, 0x60, 0x70, + 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48, + 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90, + 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70, + 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68, + 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, + 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, + 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, + 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d, + 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, + 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98, + 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, + 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, + 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, + 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, + 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38, + 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78, + 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, + 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, + 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d, + 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, + 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18, + 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18, + 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30, + 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00, + 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c, + 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, + 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0xc3, 0x26, 0x10, 0xc0, + 0x02, 0x54, 0x43, 0x38, 0xa4, 0x83, 0x3c, 0xb4, 0x81, 0x38, 0xd4, 0x83, + 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0xb8, 0xc3, 0x3b, 0xb4, 0x41, + 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00, 0x1b, 0xb6, 0xa1, 0x00, + 0x16, 0xa0, 0x1a, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, + 0xcc, 0xc1, 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d, + 0xc2, 0x81, 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0xd8, 0x60, 0x10, 0x08, + 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, + 0x00, 0x6a, 0x83, 0x8f, 0x18, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, + 0x50, 0x11, 0xe1, 0x00, 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d, + 0x60, 0x0e, 0xf5, 0xe0, 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, + 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, + 0x39, 0x00, 0x44, 0x3b, 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3, + 0x39, 0x84, 0x03, 0x3b, 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, + 0x3b, 0xc8, 0x43, 0x1b, 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03, + 0x90, 0x07, 0x76, 0x00, 0x0c, 0xee, 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5, + 0x90, 0x0e, 0xec, 0x40, 0x0f, 0xe9, 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee, + 0xf0, 0x0e, 0x6d, 0x60, 0x0e, 0xf2, 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d, + 0x00, 0x0f, 0xef, 0x90, 0x0e, 0xee, 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d, + 0x50, 0x0e, 0xec, 0x90, 0x0e, 0xed, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, + 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, + 0x3b, 0x94, 0x43, 0x1b, 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, + 0x39, 0xc8, 0x43, 0x1b, 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81, + 0x3b, 0xbc, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03, + 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, + 0x90, 0x0e, 0xee, 0x60, 0x0e, 0xf3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, + 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, + 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3, + 0x3c, 0xb4, 0x81, 0x39, 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, + 0x3a, 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, + 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xe7, 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d, + 0xa0, 0x0f, 0xe5, 0x20, 0x0f, 0xef, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, + 0xd0, 0x06, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, + 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3, 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43, + 0x38, 0xc0, 0x03, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43, + 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, + 0x31, 0x0f, 0xf4, 0x10, 0x0e, 0xe3, 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2, + 0xf0, 0x0e, 0xf4, 0x50, 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d, + 0x20, 0x0e, 0xf5, 0x60, 0x0e, 0xe6, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3, + 0x90, 0x0e, 0xfa, 0x50, 0x0e, 0x00, 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3, + 0x3c, 0x84, 0x83, 0x39, 0x94, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, + 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, + 0x00, 0x6c, 0x40, 0x8e, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x06, 0x90, + 0x80, 0x6a, 0x83, 0x81, 0x04, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x44, 0x00, + 0x16, 0xa0, 0xda, 0x80, 0x28, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x0c, + 0x20, 0x01, 0xd5, 0x06, 0x63, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, + 0x00, 0x6a, 0xc3, 0xc4, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x28, 0x80, + 0x34, 0xb8, 0xc3, 0x3b, 0xb4, 0x81, 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03, + 0x3d, 0xa4, 0x83, 0x3b, 0xcc, 0x03, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x41, + 0x31, 0x21, 0x30, 0x26, 0x0c, 0x07, 0x92, 0x4c, 0x18, 0x14, 0x24, 0x99, + 0x10, 0x2c, 0x13, 0x02, 0x06, 0x89, 0x20, 0x00, 0x00, 0x43, 0x00, 0x00, + 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, + 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, + 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xb8, 0xc1, 0x0c, 0xc0, 0x30, 0x02, + 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, + 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18, + 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6, + 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4, + 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50, + 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21, + 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29, + 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1, + 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0xb8, 0x48, 0x9a, 0x22, 0x4a, + 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00, + 0x06, 0x11, 0x18, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44, 0xb2, 0x2c, 0x0d, + 0x39, 0x85, 0x28, 0x8a, 0xa2, 0x20, 0xa8, 0x0c, 0x00, 0x00, 0x90, 0x54, + 0x04, 0x00, 0x20, 0xaa, 0x0c, 0x40, 0x51, 0x90, 0x55, 0x8c, 0xa2, 0x00, + 0x00, 0x00, 0x20, 0xac, 0x0c, 0x45, 0x51, 0x90, 0x56, 0x84, 0xa2, 0x20, + 0x6e, 0x8e, 0x20, 0x98, 0x23, 0x00, 0x83, 0x61, 0x04, 0xe1, 0x2b, 0x48, + 0xb0, 0x34, 0x82, 0x07, 0x7a, 0x00, 0x85, 0x03, 0x01, 0x29, 0xf0, 0xcd, + 0x11, 0x80, 0xc2, 0x20, 0x02, 0x20, 0x4c, 0x01, 0x8c, 0x00, 0x0c, 0x23, + 0x0c, 0xdf, 0x20, 0x42, 0x20, 0x0c, 0x22, 0x1c, 0xc2, 0x20, 0x42, 0x21, + 0x0c, 0x23, 0x10, 0x1f, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, + 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, + 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, + 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, + 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, + 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, + 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, + 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, + 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, + 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, + 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, + 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, + 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, + 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, + 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, + 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, + 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, + 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, + 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, + 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, + 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, + 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, + 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, + 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, + 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, + 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, + 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, + 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, + 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, + 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, + 0x20, 0x07, 0x43, 0x98, 0x07, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x21, 0x4c, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x10, 0x66, 0x02, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, + 0x53, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xb9, + 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x64, 0x08, + 0x30, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x61, 0x26, 0x20, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x30, 0x1b, 0x10, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x98, 0x0e, 0x08, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x21, 0xcc, 0x06, 0x04, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x10, 0x46, 0x0c, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc8, 0x02, 0x01, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, + 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, + 0xfa, 0x46, 0x00, 0x4a, 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80, + 0x0a, 0x30, 0xa0, 0x0c, 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac, + 0x14, 0x8a, 0xa1, 0x1c, 0xa8, 0x2c, 0x9c, 0x11, 0x80, 0x42, 0x28, 0x88, + 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x22, 0xc7, 0x12, 0x24, 0x01, 0x00, + 0x00, 0x79, 0x18, 0x00, 0x00, 0xc9, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, + 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, + 0xb7, 0x21, 0xc6, 0xf7, 0x8c, 0x01, 0x40, 0x06, 0x64, 0x40, 0xe5, 0x6e, + 0x0c, 0x2d, 0x4c, 0xee, 0x6b, 0x2e, 0x4d, 0xaf, 0x6c, 0x88, 0xf1, 0x31, + 0x63, 0x20, 0x7c, 0x0d, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, 0xa4, + 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, + 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x06, 0x04, + 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, 0x46, + 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88, 0x30, 0x06, 0xc4, 0x10, + 0xe3, 0x63, 0x3e, 0xe8, 0x5b, 0x58, 0x34, 0x95, 0xd1, 0x85, 0xb1, 0x0d, + 0x41, 0xc6, 0xe0, 0xf8, 0x98, 0x8f, 0xf9, 0x16, 0x6e, 0x61, 0x69, 0x72, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, + 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x84, 0x31, 0x48, 0xc8, 0x85, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, + 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0x85, 0xcd, 0xd1, 0x7d, 0xb5, 0x85, + 0xd1, 0xa1, 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0xc6, + 0x60, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, + 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, + 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, 0xb9, 0x85, + 0x89, 0xb1, 0x95, 0x0d, 0x11, 0xc6, 0xa0, 0x61, 0x14, 0x96, 0x26, 0xe7, + 0x22, 0x57, 0xe6, 0x46, 0x56, 0x26, 0xf7, 0x45, 0x17, 0x26, 0x77, 0x56, + 0x46, 0xc7, 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, 0xec, 0x8b, 0x2e, + 0x0f, 0xae, 0xec, 0xcb, 0x2d, 0xac, 0xad, 0x8c, 0x86, 0x19, 0xdb, 0x5b, + 0x18, 0x1d, 0xcd, 0x10, 0x64, 0x0c, 0x9e, 0x6f, 0x19, 0x03, 0x68, 0x0c, + 0xa2, 0x21, 0xc2, 0x18, 0x48, 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xde, + 0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, + 0x95, 0xb9, 0xd1, 0x95, 0xc9, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x71, 0x7b, + 0xfb, 0x82, 0x2b, 0x93, 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3, 0x2b, + 0x23, 0x13, 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0xe5, 0x16, 0xd6, + 0x56, 0x46, 0x04, 0xee, 0x6d, 0x2e, 0x8d, 0x2e, 0xed, 0xcd, 0x6d, 0x08, + 0xf4, 0x2d, 0x63, 0x40, 0x8d, 0x41, 0x35, 0x06, 0xd6, 0x18, 0x40, 0x63, + 0x10, 0x8d, 0xc1, 0x35, 0x06, 0x18, 0xa5, 0xb0, 0x34, 0x39, 0x17, 0x33, + 0xb9, 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, 0xaf, 0x34, 0x37, 0xb8, 0x3a, + 0x3a, 0x5a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, + 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, + 0x7c, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca, 0xc6, + 0xe8, 0xd2, 0xec, 0xca, 0x58, 0x8c, 0xbd, 0xb1, 0xbd, 0xc9, 0x0d, 0x91, + 0x3e, 0x66, 0x0c, 0xb4, 0x31, 0xd8, 0xc6, 0xa0, 0x1a, 0x03, 0x6e, 0x0c, + 0xa0, 0x31, 0x88, 0xc6, 0xe0, 0x1a, 0x83, 0x8e, 0xd9, 0x59, 0x99, 0x5b, + 0x99, 0x5c, 0x18, 0x5d, 0x19, 0x19, 0x0a, 0x0e, 0x5d, 0x19, 0xde, 0xd8, + 0xdb, 0x9b, 0x1c, 0x19, 0x91, 0x9d, 0xcc, 0x97, 0x59, 0x0a, 0x0d, 0x33, + 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x22, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, + 0x72, 0x64, 0x43, 0xa4, 0xef, 0x19, 0x03, 0x6d, 0x0c, 0xbe, 0x31, 0xa8, + 0xc6, 0x80, 0x1b, 0x03, 0x68, 0x0c, 0xc0, 0x60, 0x0c, 0xae, 0x31, 0x08, + 0x03, 0x2a, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x7c, 0xc2, 0xd2, 0xe4, 0x5c, 0xc4, 0xea, 0xcc, 0xcc, 0xca, 0xe4, 0xbe, + 0xe6, 0xd2, 0xf4, 0xca, 0x28, 0x85, 0xa5, 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, + 0x85, 0xd1, 0xa5, 0xbd, 0xb9, 0x7d, 0xa5, 0xb9, 0x91, 0x95, 0xe1, 0x11, + 0x09, 0x4b, 0x93, 0x73, 0x91, 0x2b, 0x0b, 0x23, 0x23, 0x15, 0x96, 0x26, + 0xe7, 0x32, 0x47, 0x27, 0x57, 0x37, 0x46, 0xf7, 0x45, 0x97, 0x07, 0x57, + 0xf6, 0x95, 0xe6, 0x66, 0xf6, 0xc6, 0xc2, 0x8c, 0xed, 0x2d, 0x8c, 0x8e, + 0xcc, 0xdc, 0x98, 0xd4, 0x91, 0xd0, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, + 0x1d, 0x19, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x2f, 0xba, 0x3c, + 0xb8, 0x32, 0x2a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x5c, 0xc6, 0xde, 0xd8, 0xde, 0xe4, 0xbe, 0xe6, 0xc6, 0xc2, 0xd8, + 0xca, 0xe8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0xb5, 0x95, + 0xd1, 0xa1, 0xbd, 0x91, 0xf1, 0xa1, 0x7b, 0x73, 0x2b, 0x6b, 0x0b, 0x83, + 0xfb, 0x32, 0x0b, 0x1b, 0xa3, 0x7b, 0x93, 0x8b, 0xe1, 0x43, 0xf7, 0xe6, + 0x56, 0xd6, 0x16, 0x06, 0xf7, 0x65, 0x16, 0x36, 0x46, 0xf7, 0x26, 0x27, + 0xc3, 0x67, 0x8e, 0x4c, 0xee, 0xeb, 0x0e, 0x2d, 0x8d, 0xae, 0xec, 0x0b, + 0xee, 0x2d, 0xcd, 0x8d, 0x6e, 0x08, 0x2c, 0x7c, 0xcb, 0xd7, 0x7c, 0xcb, + 0x18, 0xa0, 0xc1, 0x18, 0xa4, 0xc1, 0xd7, 0x7c, 0xcd, 0xb7, 0x8c, 0x01, + 0x1a, 0x8c, 0x81, 0x1a, 0x7c, 0xd0, 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1, + 0x18, 0xac, 0xc1, 0x47, 0x7d, 0xcd, 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x01, + 0x1b, 0x7c, 0xce, 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1, 0x18, 0xb4, 0xc1, + 0x57, 0x7d, 0xcd, 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x81, 0x1b, 0x7c, 0xd6, + 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1, 0x18, 0xbc, 0xc1, 0x77, 0x7d, 0xcd, + 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x01, 0x1c, 0x30, 0x0a, 0x4b, 0x93, 0x73, + 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x9a, 0x4b, 0xd3, + 0x2b, 0xe3, 0x15, 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0x45, 0x97, + 0x07, 0x57, 0xf6, 0x15, 0xc6, 0x96, 0x76, 0xe6, 0xf6, 0x35, 0x97, 0xa6, + 0x57, 0xc6, 0x67, 0x0a, 0x2d, 0x8c, 0xac, 0x4c, 0x6e, 0xe8, 0xcd, 0x6d, + 0x8e, 0x2e, 0xcc, 0x8d, 0x6e, 0x8e, 0xc1, 0xd8, 0x10, 0x32, 0xf8, 0xa6, + 0x31, 0x18, 0x83, 0x31, 0x20, 0x83, 0x2f, 0x1a, 0x83, 0x32, 0xf8, 0x96, + 0x8f, 0x19, 0x03, 0x33, 0x18, 0x83, 0x33, 0x18, 0x83, 0x38, 0x18, 0x03, + 0x39, 0xf8, 0xa2, 0x31, 0x98, 0x83, 0xaf, 0x19, 0x03, 0x68, 0x0c, 0xe8, + 0x60, 0x0c, 0xae, 0x31, 0xa8, 0x03, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x33, 0x34, 0xde, 0xcc, 0xcc, 0xe6, 0xca, 0xe8, 0x88, 0x98, 0xb1, 0xbd, + 0x85, 0xd1, 0xcd, 0xe0, 0xcd, 0xd0, 0x68, 0x0b, 0xa3, 0x93, 0x4b, 0xc3, + 0x1b, 0x42, 0x7d, 0xcb, 0xe7, 0x7c, 0xcb, 0x18, 0xdc, 0xc1, 0x18, 0xe0, + 0xc1, 0xe7, 0x7c, 0xd8, 0xb7, 0x8c, 0x41, 0x1e, 0x8c, 0x81, 0x1e, 0x30, + 0xc9, 0xaa, 0xb2, 0x22, 0x2a, 0x1b, 0x7b, 0x23, 0x2b, 0xa3, 0x41, 0x56, + 0x36, 0xf6, 0x46, 0x56, 0x36, 0x84, 0x0c, 0xbe, 0x66, 0x0c, 0xc6, 0x60, + 0x0c, 0xc8, 0xe0, 0x93, 0xc6, 0xa0, 0x0c, 0x3e, 0xe6, 0x63, 0xc6, 0xc0, + 0x0c, 0xc6, 0xe0, 0x0c, 0xc6, 0x60, 0x0f, 0xc6, 0x40, 0x0e, 0x3e, 0x69, + 0x0c, 0xe6, 0xe0, 0x73, 0xc6, 0x00, 0x1a, 0x03, 0x3e, 0x18, 0x83, 0x6b, + 0x0c, 0xfa, 0x80, 0x4b, 0x58, 0x9a, 0x9c, 0x0b, 0x5d, 0x19, 0x1e, 0x5d, + 0x9d, 0x5c, 0x19, 0x95, 0xb0, 0x34, 0x39, 0x97, 0xb9, 0xb0, 0x36, 0x38, + 0xb6, 0x32, 0x62, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, + 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x3e, 0x24, 0xe8, 0xca, 0xf0, 0xb2, 0x86, 0x50, 0x5f, 0x36, + 0x06, 0x7f, 0x30, 0x06, 0x65, 0xf0, 0x2d, 0x1f, 0x33, 0x06, 0xa0, 0x30, + 0x06, 0xd0, 0x18, 0x84, 0xc2, 0x18, 0x5c, 0x63, 0x20, 0x0a, 0x2c, 0xe8, + 0xca, 0xf0, 0xaa, 0xac, 0x86, 0x50, 0x9f, 0x36, 0x06, 0x7f, 0x30, 0x06, + 0x65, 0xf0, 0x31, 0x1f, 0x33, 0x06, 0xa0, 0x30, 0x06, 0xd0, 0x18, 0x84, + 0xc2, 0x18, 0x5c, 0x63, 0x40, 0x0a, 0x5c, 0xc2, 0xd2, 0xe4, 0x5c, 0xe6, + 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0xe4, 0x78, 0xcc, 0x85, 0xb5, 0xc1, 0xb1, + 0x95, 0xc9, 0x31, 0x98, 0x1b, 0x22, 0x7d, 0xdb, 0x18, 0x98, 0xc2, 0x18, + 0x94, 0xc1, 0xb7, 0x7c, 0xcc, 0x18, 0x40, 0x63, 0x70, 0x0a, 0x63, 0x70, + 0x8d, 0x01, 0x2a, 0x0c, 0x81, 0xc6, 0x20, 0x1b, 0x03, 0x6f, 0x0c, 0xc4, + 0x60, 0x0c, 0xec, 0x60, 0x0c, 0xfc, 0x60, 0x0c, 0x46, 0x61, 0x0c, 0x4a, + 0x61, 0x0c, 0x52, 0x61, 0x88, 0xf1, 0x00, 0x63, 0x30, 0x8d, 0x81, 0x2a, + 0xb0, 0xfa, 0xd2, 0xa2, 0x9a, 0x8a, 0xa9, 0x99, 0x42, 0x0b, 0x23, 0x2b, + 0x93, 0x1b, 0x7a, 0x73, 0x9b, 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0xe3, 0xf3, + 0xd6, 0xe6, 0x96, 0x06, 0xf7, 0x46, 0x57, 0xe6, 0x46, 0x07, 0x32, 0x86, + 0x16, 0x26, 0xc7, 0x67, 0x2a, 0xad, 0x0d, 0x8e, 0xad, 0x0c, 0x64, 0x68, + 0x65, 0x05, 0x84, 0x4a, 0x28, 0x28, 0x68, 0x88, 0x30, 0x06, 0xae, 0x30, + 0xc4, 0x18, 0x83, 0x56, 0x18, 0x83, 0x57, 0x28, 0x83, 0x6e, 0x88, 0x31, + 0x06, 0x68, 0x30, 0x06, 0xb0, 0x50, 0x06, 0xdd, 0x10, 0x31, 0x18, 0x03, + 0x56, 0x18, 0x83, 0x58, 0x28, 0x83, 0x6e, 0x0c, 0x62, 0xa1, 0x0c, 0xbc, + 0x31, 0x88, 0x85, 0x32, 0xf8, 0xc6, 0x20, 0x16, 0xca, 0x00, 0x0c, 0xc6, + 0x20, 0x16, 0xca, 0x20, 0x0c, 0xc6, 0x20, 0x16, 0xca, 0x40, 0x0c, 0xc6, + 0x20, 0x16, 0xca, 0x60, 0x0c, 0xc6, 0x20, 0x16, 0xca, 0x80, 0x1b, 0x62, + 0x8c, 0x81, 0x2c, 0x8c, 0x41, 0x2c, 0x94, 0x81, 0xc7, 0x31, 0x08, 0x4b, + 0x93, 0x6b, 0x09, 0x63, 0x4b, 0x0b, 0x9b, 0x6b, 0x99, 0x1b, 0x7b, 0x83, + 0x2b, 0x9b, 0x43, 0x99, 0x22, 0x62, 0xfa, 0x72, 0xb2, 0x8a, 0x91, 0xf9, + 0x32, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, 0x73, 0xa3, 0x4b, 0x19, 0x42, 0x8c, + 0x41, 0x2d, 0x8c, 0x01, 0x2d, 0xd0, 0x0a, 0x4b, 0x93, 0x6b, 0x09, 0x63, + 0x4b, 0x0b, 0x9b, 0x6b, 0x99, 0x1b, 0x7b, 0x83, 0x2b, 0x6b, 0x09, 0x93, + 0x3b, 0x43, 0x99, 0x49, 0x19, 0x62, 0x8c, 0xc1, 0x2d, 0x8c, 0x41, 0x2d, + 0x8c, 0x81, 0x2d, 0x0c, 0x11, 0xc6, 0xe0, 0x16, 0x68, 0x85, 0xa5, 0xc9, + 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, + 0xb5, 0x84, 0xc9, 0x9d, 0xa1, 0xd0, 0xa4, 0x0c, 0x31, 0xc6, 0x40, 0x17, + 0xc6, 0xa0, 0x16, 0xc6, 0x20, 0x17, 0x88, 0x85, 0xa5, 0xc9, 0xb5, 0x84, + 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0xd0, + 0x95, 0xe1, 0xd1, 0xd5, 0xc9, 0x95, 0xcd, 0x0d, 0x31, 0xc6, 0x80, 0x17, + 0xc6, 0xa0, 0x16, 0xc6, 0x60, 0x17, 0x88, 0x85, 0xa5, 0xc9, 0xb5, 0x84, + 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0xcc, + 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0xcd, 0x0d, 0x31, 0xc6, 0xc0, 0x17, + 0xc6, 0xa0, 0x16, 0xc6, 0xa0, 0x17, 0x86, 0x18, 0x63, 0xa0, 0x0b, 0x63, + 0xc0, 0x0b, 0x63, 0xe0, 0x0b, 0x43, 0x88, 0x31, 0xe0, 0x85, 0x31, 0xf0, + 0x85, 0x21, 0xc4, 0x18, 0xdc, 0xc2, 0x18, 0xe8, 0xc2, 0x10, 0x61, 0x0c, + 0x74, 0x61, 0x88, 0x31, 0x06, 0xb7, 0x30, 0x06, 0xbc, 0x30, 0x06, 0xbe, + 0x30, 0xc4, 0x18, 0x03, 0x59, 0x18, 0x83, 0x58, 0x28, 0x83, 0x6f, 0x88, + 0x31, 0x06, 0xb2, 0x30, 0x06, 0xb1, 0x50, 0x06, 0xdc, 0x10, 0x63, 0x0c, + 0x64, 0x61, 0x0c, 0x62, 0xa1, 0x0c, 0xc2, 0x60, 0x88, 0x31, 0x06, 0xb2, + 0x30, 0x06, 0xb1, 0x50, 0x06, 0x62, 0x30, 0xc4, 0x18, 0x03, 0x59, 0x18, + 0x83, 0x58, 0x28, 0x83, 0x31, 0x18, 0x62, 0x8c, 0x81, 0x2c, 0x8c, 0x41, + 0x2c, 0x94, 0x01, 0x18, 0x0c, 0x31, 0xc6, 0x40, 0x16, 0xc6, 0x20, 0x16, + 0xca, 0xa0, 0x1b, 0x11, 0xb1, 0x03, 0x3b, 0xd8, 0x43, 0x3b, 0xb8, 0x41, + 0x3b, 0xbc, 0x03, 0x39, 0xd4, 0x03, 0x3b, 0x94, 0x83, 0x1b, 0x98, 0x03, + 0x3b, 0x84, 0xc3, 0x39, 0xcc, 0xc3, 0x14, 0x21, 0x18, 0x46, 0x28, 0xec, + 0xc0, 0x0e, 0xf6, 0xd0, 0x0e, 0x6e, 0x90, 0x0e, 0xe4, 0x50, 0x0e, 0xee, + 0x40, 0x0f, 0x53, 0x82, 0x62, 0xc4, 0x12, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, + 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0x53, + 0x02, 0x63, 0x04, 0x15, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0xc0, 0x0e, 0xe1, + 0xe0, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x70, 0x0e, 0xe5, 0xf0, 0x0b, 0xf6, + 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x25, 0x40, + 0x46, 0x4c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe3, 0xf0, 0x0e, 0xed, + 0x00, 0x0f, 0xe9, 0xc0, 0x0e, 0xe5, 0xf0, 0x0b, 0xef, 0x00, 0x0f, 0xf4, + 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0xf3, 0x30, 0x65, 0x50, 0x18, 0x67, 0x04, + 0x13, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0e, 0xf2, 0x10, 0x0e, 0xe7, + 0xd0, 0x0e, 0xe5, 0xe0, 0x0e, 0xf4, 0x30, 0x25, 0x58, 0x05, 0x00, 0x00, + 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, + 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, + 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, + 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, + 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, + 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, + 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, + 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, + 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, + 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, + 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, + 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, + 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, + 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, + 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, + 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, + 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, + 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, + 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, + 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, + 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, + 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, + 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, + 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, + 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, + 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, + 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, + 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, + 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, + 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, + 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, + 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, + 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, + 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, + 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, + 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, + 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, + 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, + 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, + 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, + 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, + 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, + 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, + 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, + 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, + 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, + 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, + 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, + 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, + 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, + 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, + 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, + 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, + 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, + 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, + 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, + 0x00, 0x2e, 0x00, 0x00, 0x00, 0x56, 0x90, 0xfd, 0x73, 0x6d, 0x6b, 0xcf, + 0xb3, 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74, 0xd5, 0xfd, 0x17, 0x45, + 0x51, 0x14, 0x76, 0x20, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x8f, + 0x63, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x11, 0x34, 0x00, 0x12, 0xf9, 0x83, + 0x33, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x29, 0x6c, 0x00, 0x12, 0xf9, 0x12, + 0xc0, 0x3c, 0x0b, 0xf1, 0x4f, 0xc4, 0x35, 0x51, 0x11, 0xf1, 0xdb, 0x83, + 0x5f, 0xe1, 0xc5, 0x6d, 0x1b, 0xc2, 0x04, 0x20, 0x91, 0x5f, 0x00, 0xd2, + 0xf4, 0x17, 0x40, 0x20, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x05, 0x50, 0x00, + 0x12, 0xf9, 0x05, 0x20, 0x4d, 0xbf, 0xb0, 0x00, 0xcc, 0xe3, 0x57, 0x77, + 0x71, 0xdb, 0x96, 0x30, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, + 0x03, 0x5c, 0x7e, 0x75, 0x17, 0xb7, 0x6d, 0x02, 0x10, 0x80, 0x44, 0x7e, + 0x01, 0x48, 0xd3, 0xff, 0x38, 0x96, 0x5f, 0xdc, 0xb6, 0x01, 0x44, 0x6c, + 0x57, 0xfe, 0xe7, 0x5b, 0xdb, 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34, 0x93, + 0x0d, 0x44, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0x7f, 0x01, 0x04, 0x92, + 0x5f, 0xdc, 0xb6, 0x19, 0x44, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0x7f, + 0xc1, 0x00, 0x97, 0x5f, 0xdc, 0x36, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x12, 0x02, 0x00, 0x00, 0x13, 0x04, 0x72, 0x10, 0x0b, 0x04, 0x00, + 0x00, 0x56, 0x00, 0x00, 0x00, 0xd4, 0x8e, 0x45, 0x00, 0x81, 0x70, 0xcc, + 0x41, 0x2c, 0xcc, 0x83, 0x07, 0x94, 0x8e, 0x35, 0x00, 0x03, 0x31, 0xc7, + 0xb0, 0x30, 0x78, 0x30, 0xc7, 0xb0, 0xe0, 0x01, 0x1e, 0x8c, 0x00, 0x8c, + 0x35, 0x00, 0x81, 0x40, 0x65, 0x11, 0x94, 0x00, 0x81, 0x63, 0x09, 0x01, + 0x30, 0x02, 0x40, 0xdf, 0x0c, 0x00, 0x79, 0x23, 0x00, 0x35, 0x40, 0xc0, + 0x0c, 0x00, 0x05, 0x33, 0x00, 0x33, 0x00, 0x73, 0x10, 0xb4, 0xa0, 0x0b, + 0xb4, 0xb0, 0x07, 0x24, 0xcc, 0x00, 0x50, 0x31, 0x03, 0x30, 0x02, 0x30, + 0x03, 0x30, 0xd6, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82, 0xf8, + 0x07, 0x82, 0x20, 0x88, 0x7f, 0x63, 0x0d, 0x6c, 0x3b, 0xff, 0xa4, 0xc7, + 0xb6, 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4, 0x37, 0xd6, 0x00, 0x82, + 0x20, 0x5b, 0xff, 0x02, 0x08, 0x82, 0x6c, 0xfd, 0x0b, 0x20, 0x08, 0xb2, + 0xf5, 0x2f, 0x8c, 0x35, 0x80, 0x20, 0xb8, 0xe6, 0x60, 0x00, 0x82, 0xe0, + 0x9a, 0x83, 0x01, 0x08, 0x82, 0x6b, 0x0e, 0x06, 0x63, 0x0d, 0x20, 0x48, + 0xb7, 0x39, 0x18, 0x80, 0x20, 0xdd, 0xe6, 0x60, 0x00, 0x82, 0x74, 0x9b, + 0x83, 0xc1, 0x58, 0xc3, 0x3a, 0xe2, 0x31, 0x0b, 0x06, 0xeb, 0x88, 0xc7, + 0x2c, 0x18, 0xac, 0x23, 0x1e, 0xb3, 0x60, 0x30, 0xd6, 0x00, 0x82, 0x30, + 0x1e, 0x8e, 0x01, 0x08, 0xc2, 0x78, 0x38, 0x06, 0x20, 0x08, 0xe3, 0xe1, + 0x18, 0x8c, 0x35, 0x88, 0xb9, 0x98, 0xf6, 0x1f, 0x58, 0xf2, 0x6c, 0xfc, + 0x0b, 0x63, 0xba, 0xaa, 0xb9, 0x2f, 0x8c, 0x35, 0xfc, 0x33, 0xe9, 0xff, + 0xbe, 0x40, 0xd7, 0xa0, 0x98, 0x7f, 0x2d, 0x1c, 0xc7, 0xa0, 0x2f, 0x8c, + 0x35, 0xcc, 0x7d, 0x9b, 0xa6, 0xbe, 0xd0, 0xba, 0x21, 0xcf, 0xfb, 0x02, + 0x9f, 0xb3, 0x3e, 0xfe, 0x11, 0x30, 0x46, 0x00, 0x82, 0x20, 0x48, 0x82, + 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, 0x63, 0x04, 0x3a, 0x6b, + 0xce, 0x21, 0x18, 0x8c, 0x11, 0xbc, 0x7b, 0x5a, 0xde, 0xdf, 0x18, 0x81, + 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, + 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, + 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba, + 0xf8, 0x37, 0x46, 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8, + 0xf6, 0x34, 0x18, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x08, 0x00, + 0x00, 0xe3, 0x0d, 0x73, 0xe0, 0x07, 0xaf, 0x40, 0xc1, 0x18, 0x6e, 0x08, + 0x9e, 0x60, 0x96, 0x21, 0x10, 0x82, 0x11, 0x03, 0xa5, 0x08, 0x68, 0x81, + 0x0e, 0xe4, 0xe0, 0x0e, 0xc8, 0xe0, 0x0c, 0xca, 0x80, 0x18, 0x31, 0x50, + 0x8a, 0xa0, 0x16, 0xe8, 0x60, 0x0e, 0xf0, 0xa0, 0x0c, 0xd0, 0xc0, 0x0c, + 0x8a, 0x41, 0x06, 0x61, 0x0c, 0xde, 0x60, 0x90, 0x41, 0x28, 0x83, 0x38, + 0x18, 0x64, 0x10, 0x82, 0x39, 0x38, 0x3d, 0x50, 0x97, 0x82, 0x32, 0xc8, + 0x10, 0xa4, 0x81, 0x1c, 0x18, 0x11, 0xc0, 0x67, 0xbc, 0xc1, 0x0f, 0x54, + 0x61, 0x17, 0x2e, 0x50, 0x97, 0x82, 0x32, 0xc8, 0x10, 0xb8, 0xc1, 0x1d, + 0x8c, 0x18, 0x14, 0x46, 0x70, 0x0e, 0x45, 0x30, 0xc7, 0xf0, 0x06, 0x41, + 0x38, 0x8c, 0x57, 0x90, 0x02, 0x2c, 0x84, 0x83, 0x38, 0xe0, 0xc1, 0x05, + 0xea, 0x52, 0x50, 0x06, 0x19, 0x02, 0x3a, 0xe8, 0x83, 0x11, 0x83, 0xc2, + 0x08, 0xda, 0x61, 0x09, 0xe6, 0x18, 0x8c, 0xc0, 0x1c, 0xc6, 0x2b, 0x54, + 0xc1, 0x16, 0xce, 0x01, 0x1d, 0xfe, 0xe0, 0x02, 0x75, 0x29, 0x28, 0x83, + 0x0c, 0x81, 0x1e, 0x8c, 0xc2, 0x88, 0x41, 0x61, 0x04, 0xf3, 0x10, 0x05, + 0x73, 0x0c, 0x46, 0x90, 0x0e, 0xb3, 0x04, 0xc4, 0x70, 0x43, 0xc7, 0x06, + 0xc1, 0x2c, 0xc3, 0x40, 0x04, 0x23, 0x06, 0x4a, 0x11, 0xc0, 0x03, 0x2c, + 0xb8, 0xc2, 0x2c, 0x80, 0xc2, 0x28, 0x84, 0x02, 0x18, 0x8c, 0x18, 0x28, + 0x45, 0x10, 0x0f, 0xb0, 0xf0, 0x0a, 0xb4, 0x10, 0x0a, 0xa4, 0x20, 0x0a, + 0x61, 0x30, 0xc8, 0x10, 0x80, 0x82, 0x29, 0x0c, 0x32, 0x0c, 0xa0, 0xc0, + 0x0a, 0x83, 0x0c, 0xc2, 0x1f, 0xb8, 0xc2, 0x20, 0x83, 0x10, 0xc0, 0xc2, + 0xdd, 0x82, 0xba, 0x14, 0x94, 0x41, 0x86, 0xc0, 0x14, 0x5e, 0xc1, 0x88, + 0x00, 0x3e, 0xe3, 0x0d, 0xbb, 0x70, 0x0e, 0xf8, 0x70, 0x81, 0xba, 0x14, + 0x94, 0x41, 0x86, 0x60, 0x15, 0x68, 0x61, 0xc4, 0xa0, 0x30, 0x02, 0x92, + 0x28, 0x82, 0x39, 0x06, 0x56, 0x08, 0xfc, 0x61, 0xbc, 0x22, 0x1c, 0xda, + 0xc1, 0x1f, 0xfe, 0xa1, 0x16, 0x2e, 0x50, 0x97, 0x82, 0x32, 0xc8, 0x10, + 0xc4, 0x82, 0x2e, 0x8c, 0x18, 0x14, 0x46, 0xa0, 0x12, 0x4b, 0x30, 0xc7, + 0x60, 0x04, 0x23, 0x31, 0x5e, 0x71, 0x0e, 0xf3, 0x40, 0x12, 0x25, 0xc1, + 0x0b, 0x17, 0xa8, 0x4b, 0x41, 0x19, 0x64, 0x08, 0x6e, 0x01, 0x1c, 0x46, + 0x0c, 0x0a, 0x23, 0x80, 0x89, 0x28, 0x98, 0x63, 0x30, 0x02, 0x93, 0x98, + 0x25, 0x20, 0x06, 0x3a, 0x02, 0x3e, 0x08, 0x84, 0x01, 0x2e, 0x84, 0x39, + 0x86, 0x60, 0x14, 0x48, 0x62, 0xbc, 0x01, 0x1e, 0xf6, 0x21, 0x25, 0x28, + 0x18, 0xc3, 0x0d, 0x41, 0x2b, 0x04, 0xb3, 0x0c, 0x85, 0x11, 0x0c, 0x32, + 0x10, 0xbf, 0x80, 0x0e, 0xe3, 0x0d, 0xf4, 0xf0, 0x0f, 0x21, 0x41, 0xc1, + 0x18, 0x31, 0x20, 0x8c, 0xc0, 0x26, 0x86, 0x11, 0x83, 0xc2, 0x08, 0x70, + 0x22, 0xd8, 0x05, 0x0b, 0x76, 0x01, 0x3e, 0x23, 0x06, 0x85, 0x11, 0xe0, + 0x44, 0x00, 0x0e, 0x36, 0xf0, 0x82, 0x7c, 0x8c, 0x17, 0x82, 0xf8, 0xd8, + 0x10, 0xd0, 0x67, 0xc4, 0x80, 0x30, 0x82, 0x9e, 0x08, 0x46, 0x0c, 0x0a, + 0x23, 0xf8, 0x89, 0xc0, 0x17, 0x2c, 0xf0, 0x05, 0xf9, 0xcc, 0x31, 0xa0, + 0xc3, 0xd2, 0x13, 0x83, 0x0c, 0x41, 0x3a, 0xdc, 0x83, 0x0d, 0x01, 0x7d, + 0x06, 0x19, 0x82, 0x75, 0xe8, 0x87, 0x41, 0x86, 0xa0, 0xfa, 0x87, 0x59, + 0x02, 0x63, 0xa0, 0x22, 0x10, 0x0a, 0x36, 0x20, 0xc6, 0x1b, 0x4c, 0x22, + 0x26, 0xc2, 0x82, 0x82, 0x31, 0xdc, 0x10, 0xd8, 0x82, 0x33, 0xcb, 0x70, + 0x20, 0xc1, 0x20, 0x03, 0x51, 0x0f, 0xfe, 0x30, 0xde, 0xa0, 0x12, 0x35, + 0x91, 0x13, 0x14, 0x8c, 0xf1, 0x06, 0x96, 0xb8, 0x09, 0x9d, 0xa0, 0x60, + 0x8c, 0x18, 0x20, 0x47, 0x14, 0x17, 0x45, 0x77, 0x0c, 0xc1, 0x20, 0x43, + 0x70, 0x0f, 0x29, 0x31, 0xc8, 0x10, 0x2c, 0x2b, 0x31, 0x4b, 0x80, 0x0c, + 0x54, 0x04, 0xc2, 0x81, 0x19, 0xc3, 0x0d, 0x61, 0x60, 0x0e, 0xc1, 0x2c, + 0x43, 0x72, 0x05, 0xe3, 0x0d, 0x33, 0xe1, 0x13, 0x6f, 0x41, 0xc1, 0x18, + 0x6e, 0x08, 0xd2, 0x21, 0x98, 0x65, 0x50, 0x96, 0x60, 0x90, 0xa1, 0x10, + 0x89, 0x95, 0x18, 0x6f, 0xb8, 0x09, 0xb1, 0x60, 0x0b, 0x0a, 0xc6, 0x1c, + 0x43, 0x48, 0x04, 0x76, 0x31, 0xc8, 0x10, 0x88, 0x04, 0x4c, 0x58, 0x50, + 0xc8, 0x67, 0x90, 0x21, 0x20, 0x09, 0x9b, 0x98, 0x25, 0x88, 0x83, 0xf1, + 0x86, 0x9e, 0x40, 0x0b, 0xbd, 0xa0, 0x60, 0x8c, 0x37, 0xfc, 0x84, 0x5a, + 0xd0, 0x05, 0x05, 0x63, 0x90, 0x01, 0x6a, 0x89, 0x9d, 0x18, 0x6e, 0x20, + 0xe0, 0xc1, 0x99, 0x65, 0x60, 0xac, 0x60, 0x0c, 0x41, 0x02, 0x8d, 0xe1, + 0x86, 0x20, 0x1f, 0x94, 0x59, 0x06, 0xa7, 0x09, 0x4c, 0xd8, 0x07, 0xf9, + 0xcc, 0x12, 0x3c, 0x36, 0xf4, 0x03, 0x7c, 0x46, 0x0c, 0x08, 0x23, 0x60, + 0x8d, 0xc0, 0x02, 0x90, 0x90, 0xcf, 0x88, 0x41, 0x61, 0x04, 0xaf, 0x11, + 0x88, 0xc4, 0x2c, 0xc1, 0x33, 0x50, 0x01, 0x28, 0x8d, 0xe0, 0xcc, 0x31, + 0xd8, 0x44, 0x80, 0x1a, 0x63, 0x08, 0x1b, 0x6a, 0x0c, 0x37, 0x04, 0x22, + 0xa1, 0xcc, 0x32, 0x44, 0x50, 0x60, 0x02, 0x49, 0xc8, 0x67, 0x96, 0x40, + 0xb2, 0xc1, 0x24, 0xe0, 0x33, 0x62, 0x40, 0x18, 0x41, 0x6d, 0x04, 0x16, + 0xa4, 0x84, 0x7c, 0x46, 0x0c, 0x0a, 0x23, 0xc0, 0x8d, 0x60, 0x25, 0x66, + 0x09, 0xa4, 0x81, 0x0a, 0x40, 0x81, 0x84, 0x68, 0x8e, 0x21, 0x09, 0x60, + 0x63, 0x0c, 0x81, 0x0c, 0x5c, 0x63, 0xb8, 0x21, 0x58, 0x09, 0x65, 0x96, + 0x81, 0x9a, 0x02, 0x13, 0x5a, 0x42, 0x3e, 0xb3, 0x04, 0x95, 0x0d, 0x2f, + 0x01, 0x9f, 0x11, 0x03, 0xc2, 0x08, 0x7c, 0x23, 0xb0, 0x40, 0x26, 0xe4, + 0x33, 0x62, 0x50, 0x18, 0x41, 0x78, 0x04, 0x34, 0x31, 0x4b, 0x50, 0x0d, + 0x54, 0x00, 0xca, 0x24, 0x50, 0x73, 0x0c, 0x49, 0x60, 0x1b, 0xb3, 0x04, + 0xd6, 0x40, 0x45, 0x20, 0x54, 0x7a, 0xb0, 0x0c, 0x32, 0x04, 0x6b, 0x41, + 0x17, 0x73, 0x0c, 0x68, 0x01, 0x06, 0xbd, 0x31, 0xc8, 0x10, 0xa4, 0xc5, + 0x5d, 0xd8, 0x10, 0xc8, 0x67, 0x90, 0x21, 0x58, 0x8b, 0xbe, 0x98, 0x25, + 0x88, 0x83, 0xe1, 0x86, 0x59, 0xf0, 0x89, 0x60, 0x96, 0x01, 0x23, 0x83, + 0x60, 0x90, 0x81, 0x0e, 0xe2, 0x42, 0x2f, 0xc6, 0x1b, 0x4c, 0x23, 0x36, + 0xc6, 0x83, 0x82, 0x31, 0xde, 0x80, 0x1a, 0xb3, 0xd1, 0x1b, 0x14, 0x8c, + 0x39, 0x06, 0xb9, 0x08, 0xce, 0x63, 0x90, 0x21, 0x98, 0x8b, 0xd0, 0xb0, + 0xe0, 0x90, 0xcf, 0x20, 0x43, 0x50, 0x17, 0xa7, 0x31, 0xdc, 0x70, 0xf0, + 0x84, 0x33, 0xcb, 0x30, 0x06, 0x59, 0x30, 0x86, 0x30, 0xb0, 0xc7, 0x70, + 0x43, 0xf0, 0x13, 0xca, 0x2c, 0xc3, 0xa6, 0x05, 0x26, 0x84, 0x85, 0x7c, + 0x66, 0x09, 0xb8, 0x11, 0x03, 0xc2, 0x08, 0xee, 0x63, 0x18, 0x31, 0x28, + 0x8c, 0x20, 0x3f, 0x02, 0xb2, 0xb0, 0xc0, 0x2c, 0xe4, 0x63, 0x01, 0x5a, + 0xc0, 0x67, 0x96, 0x80, 0x1b, 0xa8, 0x00, 0x14, 0x4d, 0xd8, 0xe6, 0x18, + 0xfa, 0x22, 0xa0, 0x8f, 0x31, 0x04, 0x86, 0x3e, 0x86, 0x1b, 0x02, 0xb4, + 0x50, 0x66, 0x19, 0xbc, 0x2e, 0x30, 0x41, 0x2d, 0xe4, 0x33, 0x4b, 0xf0, + 0x8d, 0x18, 0x10, 0x46, 0x00, 0x22, 0xc3, 0x88, 0x41, 0x61, 0x04, 0x22, + 0x12, 0xb4, 0x85, 0x05, 0x6f, 0x21, 0x1f, 0x0b, 0xe2, 0x02, 0x3e, 0xb3, + 0x04, 0xdf, 0x40, 0x05, 0xa0, 0x74, 0x82, 0x37, 0xc7, 0x90, 0x04, 0xfc, + 0x31, 0x86, 0x50, 0xe9, 0xc7, 0x70, 0x43, 0x10, 0x17, 0xca, 0x2c, 0x43, + 0x18, 0x80, 0x41, 0x60, 0xc2, 0x5c, 0xc8, 0x67, 0x96, 0x40, 0x0c, 0x46, + 0x0c, 0x08, 0x23, 0x48, 0x91, 0x61, 0xc4, 0xa0, 0x30, 0x82, 0x15, 0x09, + 0xec, 0xc2, 0x02, 0xbc, 0x90, 0x8f, 0x05, 0x7a, 0x01, 0x9f, 0x59, 0x02, + 0x31, 0x18, 0xa8, 0x00, 0x14, 0x30, 0x10, 0xc2, 0x60, 0x8e, 0x21, 0x09, + 0x44, 0x64, 0xc4, 0xc0, 0x30, 0x82, 0x18, 0x09, 0x62, 0xe3, 0x35, 0x06, + 0x19, 0x82, 0xd9, 0x28, 0x8f, 0x59, 0x82, 0x31, 0x18, 0xa8, 0x08, 0xfc, + 0x00, 0x13, 0xc4, 0x60, 0x90, 0x21, 0xc8, 0x8d, 0xf3, 0x98, 0x25, 0x88, + 0x83, 0x59, 0x86, 0x32, 0x88, 0x03, 0x7e, 0x18, 0x64, 0xe8, 0x05, 0xdd, + 0x18, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0x66, 0x24, 0x68, 0x8d, 0x39, 0x06, + 0xdb, 0x08, 0x5a, 0x64, 0xc4, 0xa0, 0x30, 0x82, 0x1a, 0x19, 0x5c, 0x63, + 0x8e, 0x41, 0x08, 0x5c, 0x64, 0xc4, 0xa0, 0x30, 0x82, 0x1b, 0x29, 0x5e, + 0x63, 0x8e, 0x41, 0x08, 0x5a, 0x64, 0x90, 0x21, 0xe8, 0x8d, 0xf7, 0x18, + 0x64, 0x08, 0xca, 0x21, 0x3e, 0xc6, 0x1b, 0xee, 0x43, 0x44, 0x68, 0x84, + 0x82, 0x31, 0xde, 0x90, 0x1f, 0x24, 0xe2, 0x22, 0x14, 0x8c, 0x39, 0x86, + 0xf1, 0x08, 0x70, 0x64, 0x90, 0x21, 0x20, 0x0f, 0xf9, 0xb0, 0x20, 0x91, + 0xcf, 0x20, 0x43, 0x60, 0x1e, 0xf8, 0x31, 0xdc, 0x70, 0xb4, 0x86, 0x33, + 0xcb, 0x00, 0x07, 0x66, 0x10, 0x8c, 0x21, 0x0c, 0x3d, 0x32, 0xdc, 0x10, + 0xc0, 0x86, 0x32, 0xcb, 0x80, 0x06, 0x67, 0x10, 0x98, 0x20, 0x1b, 0xf2, + 0x99, 0x25, 0x48, 0x83, 0x11, 0x03, 0xc2, 0x08, 0xd0, 0x64, 0x18, 0x31, + 0x28, 0x8c, 0x40, 0x4d, 0x82, 0xda, 0xb0, 0xe0, 0x36, 0xe4, 0x63, 0x41, + 0x6e, 0xc0, 0x67, 0x96, 0x20, 0x0d, 0x06, 0x2a, 0x00, 0xe5, 0x0c, 0x04, + 0x34, 0x98, 0x63, 0x70, 0x8f, 0xa0, 0x4c, 0xc6, 0x10, 0x98, 0x32, 0x19, + 0x6e, 0x08, 0x72, 0x43, 0x99, 0x65, 0x58, 0x03, 0x35, 0x08, 0x4c, 0xd8, + 0x0d, 0xf9, 0xcc, 0x12, 0xb0, 0xc1, 0x88, 0x01, 0x61, 0x04, 0x71, 0x32, + 0x8c, 0x18, 0x14, 0x46, 0x30, 0x27, 0x81, 0x6f, 0x58, 0x00, 0x1e, 0xf2, + 0xb1, 0x40, 0x3c, 0xe0, 0x33, 0x4b, 0xc0, 0x06, 0x03, 0x15, 0x80, 0xa2, + 0x06, 0xc2, 0x1a, 0xcc, 0x31, 0x24, 0x41, 0x9b, 0x8c, 0x21, 0x54, 0x6b, + 0x32, 0xdc, 0x10, 0x88, 0x87, 0x32, 0xcb, 0xe0, 0x06, 0x6d, 0x10, 0x98, + 0x40, 0x1e, 0xf2, 0x99, 0x25, 0x78, 0x83, 0x11, 0x03, 0xc2, 0x08, 0xf4, + 0x64, 0x18, 0x31, 0x28, 0x8c, 0x80, 0x4f, 0x82, 0xf3, 0xb0, 0x20, 0x3d, + 0xe4, 0x63, 0xc1, 0x7a, 0xc0, 0x67, 0x96, 0xe0, 0x0d, 0x06, 0x2a, 0x00, + 0xa5, 0x0d, 0x04, 0x37, 0x98, 0x63, 0x48, 0x82, 0x39, 0x19, 0x31, 0x30, + 0x8c, 0x40, 0x54, 0x02, 0x11, 0x01, 0x91, 0x41, 0x86, 0x80, 0x44, 0x6c, + 0x64, 0x96, 0x00, 0x0e, 0x06, 0x2a, 0x02, 0x3f, 0x28, 0x03, 0xe1, 0x0d, + 0x06, 0x19, 0x02, 0x15, 0xc1, 0x91, 0x59, 0x82, 0x38, 0x18, 0x68, 0x09, + 0x78, 0x44, 0xe1, 0x11, 0x8b, 0x47, 0xc6, 0x40, 0x16, 0xe0, 0x80, 0x47, + 0xc8, 0x60, 0xa0, 0x25, 0x40, 0x11, 0x45, 0x2f, 0x2c, 0x73, 0x18, 0x03, + 0x02, 0x0e, 0x68, 0x88, 0x0c, 0x06, 0x19, 0x02, 0x81, 0x47, 0x2c, 0x20, + 0x13, 0xf9, 0x64, 0x10, 0x0e, 0x04, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x17, 0xd3, 0x07, 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4, + 0x50, 0x13, 0xe7, 0x2c, 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d, + 0x9b, 0x6d, 0x29, 0x38, 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b, + 0x00, 0x03, 0x11, 0x71, 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71, + 0x21, 0x13, 0x00, 0x00, 0x00, 0x01, 0x31, 0x00, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x5b, 0x8e, 0x20, 0x98, 0x85, 0x03, 0x17, 0x90, 0x5f, 0xd8, 0x52, + 0x10, 0x07, 0x38, 0x20, 0xe1, 0xb0, 0xa5, 0x28, 0x0e, 0x70, 0x40, 0xc2, + 0x61, 0x4b, 0xa1, 0x1c, 0xe2, 0x80, 0x8c, 0xc3, 0x96, 0xe2, 0x39, 0xc4, + 0x01, 0x19, 0x87, 0x2d, 0x45, 0x75, 0x88, 0x03, 0x32, 0x0e, 0x5b, 0x8a, + 0xed, 0x10, 0x07, 0x64, 0x1c, 0xb6, 0x14, 0x62, 0x70, 0x80, 0x03, 0x12, + 0x0e, 0x5b, 0x8a, 0x31, 0x38, 0xc0, 0x01, 0x09, 0x87, 0x2d, 0x45, 0x1a, + 0x1c, 0xe2, 0x80, 0x8c, 0xc3, 0x96, 0xc2, 0x0d, 0x0e, 0x71, 0x40, 0xc6, + 0x61, 0x4b, 0x41, 0x07, 0x87, 0x38, 0x20, 0xe3, 0xb0, 0xa5, 0xd0, 0x83, + 0x43, 0x1c, 0x90, 0x71, 0xd8, 0x32, 0x88, 0x42, 0x40, 0x0e, 0x5b, 0x86, + 0x53, 0x08, 0xca, 0x61, 0xcb, 0xa0, 0x0b, 0x81, 0x39, 0x6c, 0x19, 0x7e, + 0x21, 0x38, 0x87, 0x2d, 0x43, 0x38, 0x04, 0xe8, 0xb0, 0x65, 0x50, 0x87, + 0x60, 0x16, 0xb6, 0x0c, 0xef, 0x10, 0xa4, 0xc3, 0x96, 0xc1, 0x1e, 0x02, + 0x75, 0xd8, 0x32, 0xe0, 0x43, 0x90, 0x0e, 0x5b, 0x06, 0xb6, 0x08, 0xd4, + 0x61, 0xcb, 0xe0, 0x16, 0x41, 0x3a, 0x6c, 0x19, 0xd4, 0x23, 0x50, 0x87, + 0x2d, 0x03, 0x7b, 0x04, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x61, 0x20, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, + 0x2c, 0x10, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0xd4, 0xce, 0x41, + 0x2c, 0xcc, 0xd3, 0x06, 0x94, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, + 0xdf, 0x0c, 0x00, 0x05, 0x33, 0x00, 0x54, 0xcc, 0x00, 0x8c, 0x35, 0xb0, + 0xec, 0x19, 0xca, 0x1f, 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce, + 0xde, 0x58, 0x83, 0x5e, 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf, + 0xdb, 0xa7, 0xf4, 0xe8, 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a, + 0xc2, 0xe8, 0xee, 0xdd, 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b, + 0x69, 0xff, 0x81, 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, + 0xc2, 0x58, 0xc3, 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, + 0xd7, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, + 0x0b, 0xad, 0x1b, 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05, + 0x33, 0x00, 0x04, 0x8c, 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, + 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5, + 0x02, 0x0d, 0x37, 0x50, 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43, + 0x43, 0xc5, 0xc1, 0x20, 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64, + 0x08, 0xa0, 0x6a, 0x96, 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61, + 0x48, 0x82, 0xe1, 0x86, 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31, + 0x28, 0x8c, 0xc0, 0x0f, 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xf0, 0x60, 0xc4, + 0xa0, 0x30, 0x02, 0x50, 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xc8, 0x83, 0x11, + 0x83, 0xc2, 0x08, 0x44, 0x21, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xc0, 0x83, + 0x59, 0x82, 0x62, 0xa0, 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xfc, + 0x60, 0x0c, 0x41, 0xf0, 0x83, 0x31, 0x84, 0x81, 0x0f, 0x46, 0x0c, 0x0a, + 0x23, 0x30, 0x05, 0x21, 0x18, 0x31, 0x28, 0x8c, 0xe0, 0x14, 0x88, 0x60, + 0xb8, 0x21, 0xb8, 0x84, 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c, + 0x0c, 0x6c, 0x40, 0x03, 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90, + 0x8f, 0x05, 0x1a, 0x7c, 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81, + 0x2a, 0x0c, 0x32, 0x04, 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64, + 0x08, 0xd2, 0xc0, 0x0d, 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4, + 0xa0, 0x98, 0x65, 0x40, 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18, + 0x31, 0x28, 0x8c, 0xe0, 0x16, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0x20, + 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xc8, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84, + 0x40, 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xd8, 0x85, 0x42, 0x0d, 0xe6, 0x18, + 0x84, 0x20, 0x16, 0x66, 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57, + 0x10, 0x04, 0x04, 0x3a, 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 }; -const unsigned int sdl_metallib_len = 25225; +const unsigned int sdl_metallib_len = 31301; diff --git a/libs/SDL3/src/render/metal/SDL_shaders_metal_iphonesimulator.h b/libs/SDL3/src/render/metal/SDL_shaders_metal_iphonesimulator.h index 1b0d2d42..962d3d02 100644 --- a/libs/SDL3/src/render/metal/SDL_shaders_metal_iphonesimulator.h +++ b/libs/SDL3/src/render/metal/SDL_shaders_metal_iphonesimulator.h @@ -1,18 +1,18 @@ const unsigned char sdl_metallib[] = { 0x4d, 0x54, 0x4c, 0x42, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x41, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xbd, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x87, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x41, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, + 0x3d, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, - 0xb6, 0x1d, 0xd1, 0xa4, 0x83, 0xc1, 0x53, 0x8d, 0x61, 0xd1, 0xea, 0xfe, - 0x27, 0x5d, 0x9c, 0x4a, 0xa6, 0x7f, 0xe5, 0x77, 0x62, 0xc6, 0x2a, 0x8b, - 0x65, 0x2c, 0x5c, 0xbd, 0x6e, 0x75, 0x3d, 0x09, 0x4d, 0x44, 0x53, 0x5a, + 0x40, 0x16, 0x1e, 0x80, 0x6f, 0x65, 0x1c, 0x60, 0x4b, 0xe5, 0x3e, 0x52, + 0xbd, 0x45, 0x4b, 0x73, 0x3d, 0xb1, 0x9c, 0xfa, 0xfe, 0xc3, 0x69, 0x80, + 0x87, 0x85, 0xc7, 0x21, 0xed, 0x04, 0x6d, 0xba, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0xa0, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -21,9 +21,9 @@ const unsigned char sdl_metallib[] = { 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, - 0x00, 0xbd, 0x71, 0x3d, 0xfe, 0x56, 0x3b, 0x79, 0xc4, 0x58, 0x50, 0x9d, - 0xeb, 0x9e, 0x18, 0x9a, 0x83, 0xd0, 0xde, 0xc4, 0x7e, 0x5b, 0x7b, 0xa8, - 0xf7, 0xaf, 0xeb, 0xce, 0x73, 0x28, 0x48, 0xf5, 0x2a, 0x4d, 0x44, 0x53, + 0x00, 0x4f, 0x3e, 0x88, 0xf6, 0xd4, 0xa3, 0x24, 0xb7, 0xdd, 0x38, 0xe0, + 0x22, 0x3d, 0x83, 0x1f, 0x22, 0x68, 0x86, 0x1c, 0x9f, 0x44, 0x3b, 0x7a, + 0x75, 0x43, 0x0b, 0xd5, 0x0c, 0xbf, 0x6a, 0xaf, 0x7a, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0xb0, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0x00, @@ -32,10 +32,10 @@ const unsigned char sdl_metallib[] = { 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x13, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, - 0x41, 0x53, 0x48, 0x20, 0x00, 0xdd, 0x55, 0x90, 0x1e, 0x1f, 0xe4, 0x60, - 0x07, 0x17, 0x78, 0x48, 0x83, 0x65, 0xac, 0x19, 0x98, 0xb5, 0x2e, 0x16, - 0x35, 0xbc, 0xb2, 0x08, 0x8c, 0x22, 0x64, 0x0a, 0xd8, 0x75, 0xb3, 0x6a, - 0xf1, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0x10, 0x0e, 0x00, 0x00, 0x00, + 0x41, 0x53, 0x48, 0x20, 0x00, 0x69, 0x0c, 0xc0, 0x72, 0x21, 0x01, 0x36, + 0xf4, 0x14, 0xe1, 0x4d, 0xa4, 0x88, 0x9b, 0xe6, 0x99, 0x4b, 0x81, 0x66, + 0x0a, 0xe3, 0x36, 0x1a, 0x3b, 0xb2, 0xa9, 0x82, 0x63, 0x0e, 0xec, 0x2c, + 0x58, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0x10, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, @@ -43,596 +43,282 @@ const unsigned char sdl_metallib[] = { 0x4e, 0x44, 0x54, 0x87, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, - 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0x6a, 0x15, 0xce, 0x7b, - 0x28, 0x06, 0x13, 0x70, 0x8f, 0x9e, 0x4b, 0x30, 0x32, 0xa2, 0x0a, 0x3f, - 0x04, 0x19, 0x08, 0xad, 0xb2, 0xaa, 0x51, 0x14, 0x82, 0x50, 0x46, 0xed, - 0x4e, 0xcb, 0x49, 0x4e, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0x00, 0x10, + 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0x66, 0x5d, 0xb4, 0x98, + 0xcf, 0x81, 0x8b, 0x13, 0x13, 0xaf, 0x83, 0xd1, 0x40, 0x24, 0xf0, 0x52, + 0x05, 0xac, 0x7a, 0x64, 0x96, 0xa7, 0xa3, 0x59, 0x4c, 0x41, 0x3c, 0xf3, + 0xe6, 0xe4, 0xf5, 0xf2, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0x50, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x8b, 0x00, 0x00, 0x00, 0x4e, 0x41, - 0x4d, 0x45, 0x16, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x41, 0x64, 0x76, 0x61, - 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, - 0x48, 0x20, 0x00, 0x57, 0xb6, 0xb7, 0x02, 0x67, 0x0e, 0xb9, 0x6c, 0xf0, - 0x7f, 0x45, 0x27, 0xb1, 0x4c, 0x69, 0xc3, 0x13, 0x55, 0x6b, 0x7f, 0x53, - 0x1e, 0x5a, 0x1a, 0x57, 0xd6, 0xea, 0x63, 0x66, 0x75, 0x30, 0xc6, 0x4d, - 0x44, 0x53, 0x5a, 0x08, 0x00, 0xc0, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, - 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, - 0x54, 0x86, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, - 0x44, 0x4c, 0x5f, 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, - 0x41, 0x53, 0x48, 0x20, 0x00, 0xe5, 0x3b, 0x52, 0xf9, 0x63, 0xd6, 0xee, - 0x9f, 0x33, 0xbf, 0xc8, 0x83, 0x8d, 0x0c, 0x09, 0x26, 0x90, 0xb9, 0x1e, - 0xd2, 0xde, 0x2b, 0x8f, 0x1c, 0x3d, 0x10, 0x4f, 0x6e, 0x44, 0xdc, 0x6b, - 0x67, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0xe0, 0x14, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x7e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, - 0x53, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, - 0x4e, 0x44, 0x54, 0x45, 0x4e, 0x44, 0x54, 0x29, 0x00, 0x00, 0x00, 0x56, - 0x41, 0x54, 0x54, 0x15, 0x00, 0x02, 0x00, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, - 0x01, 0x80, 0x56, 0x41, 0x54, 0x59, 0x04, 0x00, 0x02, 0x00, 0x04, 0x06, - 0x45, 0x4e, 0x44, 0x54, 0x35, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, - 0x20, 0x00, 0x03, 0x00, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x00, 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x74, - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x00, 0x02, 0x80, 0x56, 0x41, - 0x54, 0x59, 0x05, 0x00, 0x03, 0x00, 0x04, 0x06, 0x04, 0x45, 0x4e, 0x44, - 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, + 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x86, 0x00, 0x00, 0x00, 0x4e, 0x41, + 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x59, 0x55, 0x56, 0x5f, + 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, + 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0x63, 0x82, + 0xe4, 0xf4, 0x29, 0x67, 0x41, 0x9b, 0x27, 0xdf, 0xce, 0x83, 0x4e, 0x78, + 0x01, 0xd6, 0xf3, 0xc5, 0x34, 0x38, 0x15, 0x0a, 0x0b, 0x3a, 0x6e, 0xc6, + 0x9a, 0xb7, 0x3b, 0x8f, 0x19, 0x4f, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, + 0x10, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, + 0x18, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x4a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x87, 0x00, 0x00, 0x00, + 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x4e, 0x56, + 0x31, 0x32, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, + 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, + 0x00, 0x54, 0x3f, 0x4e, 0x00, 0xe4, 0xb5, 0x11, 0x83, 0x07, 0xe1, 0x16, + 0xbd, 0xe2, 0x4a, 0x65, 0xc1, 0xb1, 0xf2, 0x03, 0x91, 0x7d, 0xa1, 0x48, + 0xf1, 0x9b, 0x1f, 0xe7, 0xa0, 0xe0, 0x46, 0xa5, 0xcc, 0x4d, 0x44, 0x53, + 0x5a, 0x08, 0x00, 0xc0, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, + 0x46, 0x46, 0x54, 0x18, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x6c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x45, + 0x4e, 0x44, 0x54, 0x29, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x15, + 0x00, 0x02, 0x00, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, + 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x56, 0x41, + 0x54, 0x59, 0x04, 0x00, 0x02, 0x00, 0x04, 0x06, 0x45, 0x4e, 0x44, 0x54, + 0x35, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x20, 0x00, 0x03, 0x00, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x74, 0x65, 0x78, 0x63, 0x6f, + 0x6f, 0x72, 0x64, 0x00, 0x02, 0x80, 0x56, 0x41, 0x54, 0x59, 0x05, 0x00, + 0x03, 0x00, 0x04, 0x06, 0x04, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, - 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0xde, 0xc0, 0x17, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x84, 0x0e, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, - 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x65, 0x03, 0x00, - 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, - 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, - 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, - 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, - 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, - 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, - 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x7b, 0x00, 0x00, - 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, - 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, - 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, - 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, - 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, - 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, - 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, - 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, - 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, - 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, - 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, - 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, - 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, - 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, - 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, - 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, - 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, - 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, - 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, - 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, - 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, - 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, - 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, - 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, - 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, - 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, - 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, - 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, - 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, - 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, - 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, - 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, - 0x72, 0x00, 0x36, 0x78, 0xc2, 0x00, 0x2c, 0x40, 0x15, 0xa4, 0x01, 0x28, - 0x0c, 0xe1, 0x90, 0x0e, 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, - 0x0e, 0xe5, 0x20, 0x0f, 0x6d, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe1, 0xc0, - 0x0e, 0xe9, 0x10, 0x0e, 0xf3, 0x00, 0x6c, 0xf0, 0x06, 0x02, 0x58, 0x80, - 0x2a, 0x48, 0x03, 0x50, 0x18, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, - 0xa1, 0x1e, 0xcc, 0xc1, 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, - 0xa1, 0x0d, 0xc2, 0x81, 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0x00, 0x00, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, - 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, - 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, - 0x60, 0x87, 0x10, 0xc0, 0x30, 0x82, 0x00, 0x24, 0x41, 0x98, 0xc9, 0x9a, - 0x07, 0x7a, 0x90, 0x87, 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, - 0x07, 0x7a, 0x08, 0x07, 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, - 0x07, 0x79, 0x48, 0x07, 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, - 0x28, 0x84, 0x52, 0x88, 0x11, 0x8c, 0xa1, 0x33, 0x10, 0x30, 0x47, 0x00, - 0x06, 0x29, 0xa0, 0xe6, 0x08, 0x40, 0x61, 0x10, 0x21, 0x10, 0x86, 0x11, - 0x08, 0x65, 0x04, 0x00, 0x00, 0x13, 0xbe, 0x70, 0x48, 0x07, 0x79, 0xb0, - 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, - 0x83, 0x74, 0x78, 0x87, 0x79, 0x88, 0x83, 0x39, 0x70, 0x03, 0x38, 0x70, - 0x03, 0x38, 0x68, 0x83, 0x79, 0x48, 0x87, 0x76, 0xa8, 0x07, 0x76, 0x08, - 0x07, 0x7a, 0x78, 0x07, 0x79, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, - 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, - 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, - 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, - 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, - 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, - 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, - 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, - 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, - 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, - 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, - 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, - 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, - 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, - 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, - 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, - 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, - 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, - 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, - 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, - 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, - 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, - 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x11, 0xc2, 0x90, 0x10, 0xdb, - 0x95, 0x3f, 0xeb, 0x2c, 0xc8, 0xf0, 0x57, 0x44, 0x34, 0x11, 0xd7, 0x90, - 0x08, 0x80, 0x0e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x90, 0xd8, 0x20, 0x50, 0xf4, 0x6c, 0x00, 0x00, 0x20, 0x0b, 0x04, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, - 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x52, 0x45, 0x50, 0x02, - 0x85, 0x30, 0x02, 0x50, 0x80, 0x01, 0x05, 0x52, 0x06, 0xc4, 0x46, 0x00, - 0x68, 0x8d, 0x25, 0x44, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x18, 0x00, - 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, - 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, - 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, - 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, - 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, - 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, - 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, - 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, - 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, - 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, - 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, - 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, - 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, - 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, - 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, - 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, - 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, - 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, - 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, - 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, - 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, - 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, - 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, - 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, - 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, - 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, - 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, - 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, - 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, - 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, - 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, - 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, - 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, - 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, - 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, - 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, - 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, - 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, - 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, - 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, - 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, - 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, - 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, - 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, - 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, - 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, - 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, - 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, - 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, - 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, - 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, - 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, - 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, - 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, - 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, 0x00, 0xd1, 0x00, 0x00, - 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, - 0x11, 0x32, 0x64, 0xd4, 0x3c, 0xac, 0x7c, 0x00, 0x00, 0x8b, 0xf2, 0x06, - 0xc5, 0xc6, 0x91, 0x01, 0x13, 0x19, 0x0c, 0x12, 0x59, 0x85, 0x53, 0x24, - 0x90, 0xe4, 0x19, 0xca, 0x83, 0x44, 0x17, 0xa2, 0x24, 0x53, 0x44, 0x4b, - 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, - 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, - 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, 0x20, 0x28, - 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, - 0x33, 0x2e, 0x39, 0x38, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, - 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, - 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x69, 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, - 0x5f, 0x66, 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x61, 0x69, 0x72, 0x2e, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, - 0x61, 0x69, 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x67, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x5f, 0x5f, 0x61, 0x69, - 0x72, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, - 0x72, 0x5f, 0x5f, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x61, 0x69, - 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, - 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, - 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x61, - 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x66, - 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, - 0x72, 0x6d, 0x00, 0x00, 0x00, 0xc4, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x30, 0x82, 0xa0, 0x04, 0x23, 0x08, 0x4b, 0x32, 0x82, 0xa0, 0x08, - 0x23, 0x08, 0xca, 0x30, 0x82, 0xa0, 0x10, 0x23, 0x08, 0x08, 0x30, 0x82, - 0xa0, 0x14, 0x23, 0x08, 0x8a, 0x31, 0x82, 0xa0, 0x1c, 0x33, 0x0c, 0x5f, - 0x00, 0x06, 0x33, 0x0c, 0x61, 0x20, 0x88, 0xc1, 0x0c, 0xc1, 0x30, 0xc3, - 0xf0, 0x7d, 0x63, 0x30, 0x03, 0x41, 0x84, 0x41, 0x18, 0x8c, 0xc1, 0x0c, - 0x41, 0x31, 0x43, 0x60, 0xcc, 0x10, 0x1c, 0x33, 0x14, 0x48, 0xa2, 0x2c, - 0xcc, 0x0c, 0x46, 0xe3, 0x24, 0xca, 0xf2, 0xcc, 0x50, 0x40, 0x49, 0xb4, - 0x48, 0x33, 0x0c, 0x70, 0x10, 0x07, 0x72, 0x30, 0x83, 0x32, 0x06, 0x13, - 0x35, 0x06, 0x61, 0x50, 0x25, 0xd6, 0xc2, 0xcc, 0xa0, 0x84, 0xc1, 0x44, - 0x85, 0x41, 0x18, 0x54, 0x89, 0xb2, 0x3c, 0x33, 0x40, 0xdf, 0x85, 0x95, - 0x01, 0xf5, 0x85, 0x41, 0xa6, 0x95, 0xc1, 0x66, 0x06, 0x09, 0xb7, 0x74, - 0x33, 0x40, 0x67, 0x70, 0x61, 0x65, 0x40, 0x9d, 0x41, 0x18, 0x64, 0x5a, - 0x19, 0x6c, 0x66, 0x90, 0x70, 0x8b, 0x37, 0x03, 0x41, 0x07, 0x75, 0x60, - 0x07, 0x77, 0x30, 0xc3, 0x40, 0x06, 0x73, 0x80, 0x07, 0xb5, 0x01, 0x1c, - 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0x1a, 0xb8, 0x81, 0x85, 0x06, 0x7a, - 0x60, 0x59, 0x96, 0x1b, 0xd0, 0x81, 0x1b, 0xd0, 0x81, 0x2f, 0xf8, 0x02, - 0x4a, 0xd0, 0x04, 0x28, 0xc8, 0x48, 0x60, 0x82, 0x2e, 0x62, 0x63, 0xb3, - 0x6b, 0x73, 0x69, 0x7b, 0x23, 0xab, 0x63, 0x2b, 0x73, 0x31, 0x63, 0x0b, - 0x3b, 0x9b, 0x1b, 0x45, 0x38, 0x03, 0x34, 0x38, 0x85, 0x8d, 0xcd, 0xae, - 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x94, 0x20, 0x0d, 0x6e, 0x09, - 0x4b, 0x93, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, - 0x50, 0x83, 0xa3, 0xc2, 0xd2, 0xe4, 0x5c, 0xd8, 0xc2, 0xdc, 0xce, 0xea, - 0xc2, 0xce, 0xca, 0xbe, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0x46, - 0x09, 0xd6, 0xe0, 0xa6, 0xb0, 0x34, 0x39, 0x97, 0xb1, 0xb7, 0x36, 0xb8, - 0x34, 0xb6, 0xb2, 0xaf, 0x37, 0x38, 0xba, 0xb4, 0x37, 0xb7, 0xb9, 0x51, - 0x06, 0x36, 0x68, 0x03, 0x37, 0x38, 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae, - 0x4c, 0x8e, 0xae, 0x0c, 0x6f, 0x94, 0x00, 0x0f, 0x00, 0xa9, 0x18, 0x00, - 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, - 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, - 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, - 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, - 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4, - 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81, - 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08, - 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01, - 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c, - 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c, - 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c, - 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1, - 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, - 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, - 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, - 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x8c, 0x00, 0x00, - 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, - 0x00, 0xc4, 0x4a, 0xa0, 0x0c, 0x8a, 0x80, 0xdc, 0x08, 0xc0, 0x58, 0x44, - 0x10, 0x04, 0xc1, 0x58, 0x84, 0x20, 0x08, 0xc2, 0x58, 0xc4, 0x30, 0x0c, - 0x03, 0x81, 0x31, 0x02, 0x10, 0x04, 0x41, 0xfc, 0xa3, 0x30, 0x03, 0x30, - 0x03, 0x40, 0x62, 0x06, 0x80, 0xc6, 0x0c, 0x00, 0x00, 0xf1, 0x30, 0x00, - 0x00, 0x2c, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0x08, - 0x3d, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x23, 0x06, 0x96, 0x05, 0x00, 0x00, - 0x00, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, - 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, - 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, - 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, - 0x72, 0x74, 0x65, 0x78, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, - 0x28, 0x33, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, - 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x32, - 0x29, 0x13, 0x04, 0x06, 0x59, 0x21, 0x80, 0x02, 0x1f, 0xac, 0x18, 0x42, - 0x01, 0x14, 0xfa, 0x60, 0xc5, 0x20, 0x0a, 0xa0, 0xe0, 0x07, 0x1b, 0x82, - 0x3d, 0xd8, 0x30, 0xe8, 0xc1, 0x28, 0xfc, 0xc1, 0x86, 0x81, 0x14, 0x48, - 0xe1, 0x0f, 0x36, 0x04, 0xa1, 0xb0, 0x21, 0x10, 0x05, 0x00, 0x00, 0x00, - 0x00, 0xbb, 0x10, 0x8d, 0x64, 0x49, 0x14, 0x84, 0xb2, 0x0b, 0x01, 0x51, - 0x18, 0x45, 0x41, 0x28, 0x83, 0x0c, 0xc3, 0xd1, 0x98, 0x10, 0x88, 0xff, - 0x2e, 0x04, 0x85, 0x71, 0x12, 0x05, 0xa1, 0x0c, 0x32, 0x1c, 0x0c, 0x64, - 0x42, 0x20, 0xfe, 0x16, 0x14, 0xe0, 0xbf, 0x0b, 0x91, 0x75, 0x61, 0x50, - 0x51, 0x10, 0xca, 0x20, 0x03, 0x13, 0x51, 0x26, 0x04, 0xe2, 0x6f, 0x45, - 0x00, 0xfe, 0xbb, 0x10, 0x9e, 0x18, 0x98, 0xc1, 0x46, 0x41, 0x28, 0x83, - 0x0c, 0x91, 0x85, 0x99, 0x10, 0x88, 0xbf, 0x15, 0x01, 0xf8, 0xef, 0x42, - 0x88, 0xc1, 0x19, 0xac, 0x41, 0x18, 0x50, 0x10, 0xca, 0x20, 0x43, 0xa0, - 0x81, 0x81, 0x05, 0x95, 0xf8, 0x0f, 0x32, 0x0c, 0x5d, 0x18, 0x58, 0x30, - 0x89, 0xbf, 0x0d, 0x01, 0xf8, 0x0f, 0x32, 0x18, 0x60, 0x30, 0x06, 0x16, - 0x44, 0xe2, 0x6f, 0x43, 0x00, 0xfe, 0x83, 0x0c, 0xc9, 0x18, 0x94, 0x81, - 0x05, 0x8f, 0xf8, 0xdb, 0x10, 0x80, 0xff, 0x2e, 0xc4, 0x1b, 0xd0, 0x01, - 0x1e, 0xb4, 0x01, 0x05, 0xa1, 0x0c, 0x32, 0x04, 0x67, 0xd0, 0x06, 0x16, - 0x88, 0x81, 0xf8, 0x0f, 0x32, 0x0c, 0x6a, 0xe0, 0x06, 0x16, 0x80, 0x81, - 0xf8, 0x0f, 0x32, 0x14, 0x6c, 0xf0, 0x06, 0x16, 0x74, 0xe2, 0x3f, 0xc8, - 0x70, 0xb8, 0x01, 0x1c, 0x58, 0xa0, 0x89, 0xff, 0x20, 0x03, 0x1f, 0xb4, - 0x41, 0x1d, 0x58, 0x16, 0x88, 0xff, 0x20, 0x83, 0x1f, 0xbc, 0x81, 0x1d, - 0x98, 0x13, 0x88, 0xbf, 0x25, 0x03, 0xf8, 0x5b, 0xc0, 0x80, 0xbf, 0x05, - 0x09, 0xf8, 0x5b, 0x80, 0x80, 0xbf, 0x05, 0x05, 0xf8, 0xcf, 0x36, 0xdc, - 0x41, 0x00, 0xcc, 0x36, 0x04, 0xa5, 0x10, 0xcc, 0x36, 0x04, 0x7c, 0x20, - 0x64, 0x10, 0x10, 0x03, 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, - 0x20, 0x85, 0xa3, 0x14, 0x10, 0x53, 0xd8, 0x72, 0x0c, 0x01, 0x29, 0x1c, - 0xa6, 0x80, 0x94, 0xc2, 0x96, 0xe3, 0x08, 0x48, 0xe1, 0x30, 0x05, 0xa4, - 0x14, 0xb6, 0x1c, 0x4c, 0x40, 0x0a, 0x87, 0x29, 0x20, 0xa5, 0xb0, 0xe5, - 0x88, 0x02, 0x52, 0x38, 0x4c, 0x01, 0x29, 0x85, 0x2d, 0x87, 0x15, 0x90, - 0xc2, 0x51, 0x0a, 0x88, 0x29, 0x6c, 0x39, 0xc6, 0x20, 0x20, 0x85, 0xa3, - 0x14, 0x10, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xd9, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, - 0x00, 0x1f, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xf0, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x77, 0x00, 0x00, 0x00, - 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x76, - 0x65, 0x72, 0x74, 0x65, 0x78, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, - 0x38, 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, - 0x2d, 0x69, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, - 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x90, 0x0e, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, - 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x68, 0x03, 0x00, - 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, - 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, - 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, - 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, - 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, - 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, - 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x7b, 0x00, 0x00, - 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, - 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, - 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, - 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, - 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, - 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, - 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, - 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, - 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, - 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, - 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, - 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, - 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, - 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, - 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, - 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, - 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, - 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, - 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, - 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, - 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, - 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, - 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, - 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, - 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, - 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, - 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, - 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, - 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, - 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, - 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, - 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, - 0x72, 0x00, 0x36, 0x78, 0x02, 0x01, 0x2c, 0x40, 0x15, 0xa4, 0x01, 0x28, - 0x0c, 0xe1, 0x90, 0x0e, 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, - 0x0e, 0xe5, 0x20, 0x0f, 0x6d, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe1, 0xc0, - 0x0e, 0xe9, 0x10, 0x0e, 0xf3, 0x00, 0x6c, 0xf0, 0x86, 0x02, 0x58, 0x80, - 0x2a, 0x48, 0x03, 0x50, 0x18, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, - 0xa1, 0x1e, 0xcc, 0xc1, 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, - 0xa1, 0x0d, 0xc2, 0x81, 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0x00, 0x00, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, - 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, - 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, - 0x30, 0x8c, 0x20, 0x00, 0x76, 0x08, 0x41, 0x24, 0x41, 0x98, 0xc9, 0x9a, - 0x07, 0x7a, 0x90, 0x87, 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, - 0x07, 0x7a, 0x08, 0x07, 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, - 0x07, 0x79, 0x48, 0x07, 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, - 0x28, 0x84, 0x62, 0x0c, 0x11, 0x84, 0x31, 0x74, 0x06, 0x02, 0xe6, 0x08, - 0xc0, 0x20, 0x05, 0xd4, 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x04, 0xc2, 0x30, - 0x02, 0xa1, 0x8c, 0x00, 0x00, 0x13, 0xbe, 0x70, 0x48, 0x07, 0x79, 0xb0, - 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, - 0x83, 0x74, 0x78, 0x87, 0x79, 0x88, 0x83, 0x39, 0x70, 0x03, 0x38, 0x70, - 0x03, 0x38, 0x68, 0x83, 0x79, 0x48, 0x87, 0x76, 0xa8, 0x07, 0x76, 0x08, - 0x07, 0x7a, 0x78, 0x07, 0x79, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, - 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, - 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, - 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, - 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, - 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, - 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, - 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, - 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, - 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, - 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, - 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, - 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, - 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, - 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, - 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, - 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, - 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, - 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, - 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, - 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, - 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, - 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x11, 0xc2, 0x90, 0x0f, 0xdb, - 0x95, 0x3f, 0xe7, 0x3c, 0xd8, 0x5f, 0x11, 0xd1, 0x44, 0x5c, 0x43, 0x22, - 0xe0, 0x39, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x40, 0x62, 0x83, 0x40, 0x51, 0xb5, 0x01, 0x00, 0x80, 0x2c, 0x10, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, - 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x52, 0x45, 0x50, 0x02, - 0x85, 0x30, 0x02, 0x50, 0x06, 0x05, 0x18, 0x50, 0x20, 0xc4, 0x46, 0x00, - 0x68, 0x8d, 0x25, 0x44, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x18, 0x00, - 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, - 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, - 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, - 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, - 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, - 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, - 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, - 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, - 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, - 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, - 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, - 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, - 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, - 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, - 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, - 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, - 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, - 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, - 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, - 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, - 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, - 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, - 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, - 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, - 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, - 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, - 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, - 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, - 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, - 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, - 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, - 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, - 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, - 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, - 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, - 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, - 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, - 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, - 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, - 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, - 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, - 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, - 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, - 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, - 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, - 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, - 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, - 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, - 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, - 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, - 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, - 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, - 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, - 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, - 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, 0x00, 0xd6, 0x00, 0x00, - 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, - 0x11, 0x32, 0x64, 0xd4, 0x3a, 0x4c, 0x7d, 0x00, 0x00, 0x8b, 0xf2, 0x06, - 0xc5, 0xc6, 0x91, 0x01, 0x13, 0x19, 0x0c, 0x12, 0x59, 0x45, 0x66, 0x20, - 0x90, 0xe4, 0x29, 0x0f, 0x12, 0x5d, 0x88, 0x92, 0x00, 0x53, 0x44, 0x4b, - 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, - 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, - 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, 0x20, 0x28, - 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, - 0x33, 0x2e, 0x39, 0x38, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, - 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, - 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x69, 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, - 0x5f, 0x66, 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, - 0x6f, 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, - 0x69, 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x67, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x5f, 0x5f, 0x61, 0x69, 0x72, - 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, - 0x5f, 0x5f, 0x29, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, - 0x72, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, - 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x00, 0x00, 0x04, 0x58, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0xa0, 0x04, 0x23, 0x08, 0x4b, - 0x32, 0x82, 0xa0, 0x08, 0x23, 0x08, 0xca, 0x30, 0x82, 0xa0, 0x10, 0x23, - 0x08, 0x08, 0x30, 0x82, 0xa0, 0x14, 0x23, 0x08, 0x8a, 0x31, 0x82, 0xa0, - 0x1c, 0x33, 0x0c, 0x5e, 0xf0, 0xcd, 0x30, 0x80, 0x81, 0x10, 0x06, 0x33, - 0x04, 0xc3, 0x0c, 0x83, 0xe7, 0x89, 0xc1, 0x0c, 0x04, 0x01, 0x06, 0x60, - 0x20, 0x06, 0x33, 0x04, 0xc5, 0x0c, 0x81, 0x31, 0x43, 0x70, 0xcc, 0x50, - 0x20, 0x89, 0xb2, 0x30, 0x33, 0x18, 0x8d, 0x93, 0x28, 0xcb, 0x33, 0x83, - 0xd1, 0x40, 0x49, 0xb4, 0x48, 0x33, 0x0c, 0x6f, 0x00, 0x07, 0x71, 0x30, - 0x83, 0x22, 0x06, 0x13, 0x25, 0x06, 0x60, 0x50, 0x25, 0xd1, 0xc2, 0xcc, - 0xa0, 0x80, 0xc1, 0x44, 0x81, 0x01, 0x18, 0x54, 0x89, 0xb2, 0x3c, 0x33, - 0x28, 0xde, 0x44, 0x79, 0x60, 0x50, 0x25, 0xd1, 0x22, 0xcd, 0x00, 0x91, - 0x81, 0x75, 0x95, 0x01, 0xe5, 0x81, 0x01, 0x96, 0x95, 0x81, 0x66, 0x06, - 0xc9, 0xb6, 0x70, 0x33, 0x40, 0x61, 0x60, 0x5d, 0x65, 0x40, 0x91, 0x01, - 0x18, 0x60, 0x59, 0x19, 0x68, 0x66, 0x90, 0x6c, 0x4b, 0x37, 0x43, 0x31, - 0x07, 0x74, 0x50, 0x07, 0x76, 0x70, 0x07, 0x33, 0x0c, 0x63, 0x20, 0x07, - 0x78, 0x50, 0x1c, 0xc0, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x89, 0x81, - 0x1b, 0x58, 0x68, 0xa0, 0x07, 0x96, 0x65, 0xb9, 0x01, 0x1d, 0xd0, 0x01, - 0x1d, 0xf8, 0x82, 0x2f, 0xc8, 0x82, 0x4b, 0xd0, 0x04, 0x2b, 0xc8, 0x48, - 0x60, 0x82, 0x2e, 0x62, 0x63, 0xb3, 0x6b, 0x73, 0x69, 0x7b, 0x23, 0xab, - 0x63, 0x2b, 0x73, 0x31, 0x63, 0x0b, 0x3b, 0x9b, 0x1b, 0x45, 0x30, 0x83, - 0x33, 0x38, 0x85, 0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, - 0x6e, 0x94, 0x00, 0x0d, 0x6e, 0x09, 0x4b, 0x93, 0x73, 0xb1, 0x2b, 0x93, - 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0x48, 0x83, 0xa3, 0xc2, 0xd2, 0xe4, - 0x5c, 0xd8, 0xc2, 0xdc, 0xce, 0xea, 0xc2, 0xce, 0xca, 0xbe, 0xec, 0xca, - 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0x46, 0x09, 0xd4, 0xe0, 0xa6, 0xb0, 0x34, - 0x39, 0x97, 0xb1, 0xb7, 0x36, 0xb8, 0x34, 0xb6, 0xb2, 0xaf, 0x37, 0x38, - 0xba, 0xb4, 0x37, 0xb7, 0xb9, 0x51, 0x86, 0x35, 0x60, 0x83, 0x36, 0x38, - 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x8e, 0xae, 0x0c, 0x6f, 0x94, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, + 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, + 0x00, 0x45, 0x4e, 0x44, 0x54, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x84, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00, + 0x00, 0x21, 0x0c, 0x00, 0x00, 0x65, 0x03, 0x00, 0x00, 0x0b, 0x02, 0x21, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, + 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, + 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, + 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, + 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, + 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, 0x90, 0x91, 0x22, 0xc4, + 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, + 0x06, 0x51, 0x18, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, + 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, + 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, + 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, + 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, + 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, + 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, + 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, + 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, + 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, + 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, + 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, + 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, + 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, + 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, + 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, + 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, + 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, + 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, + 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, + 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, + 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, + 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, + 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, + 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, + 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, + 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, + 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, + 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, + 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, + 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, + 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, + 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x78, + 0xc2, 0x00, 0x2c, 0x40, 0x15, 0xa4, 0x01, 0x28, 0x0c, 0xe1, 0x90, 0x0e, + 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, 0x0e, 0xe5, 0x20, 0x0f, + 0x6d, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe1, 0xc0, 0x0e, 0xe9, 0x10, 0x0e, + 0xf3, 0x00, 0x6c, 0xf0, 0x06, 0x02, 0x58, 0x80, 0x2a, 0x48, 0x03, 0x50, + 0x18, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, 0xcc, 0xc1, + 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d, 0xc2, 0x81, + 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, + 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x60, 0x87, 0x10, 0xc0, + 0x30, 0x82, 0x00, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87, + 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07, + 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07, + 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x52, 0x88, + 0x11, 0x8c, 0xa1, 0x33, 0x10, 0x30, 0x47, 0x00, 0x06, 0x29, 0xa0, 0xe6, + 0x08, 0x40, 0x61, 0x10, 0x21, 0x10, 0x86, 0x11, 0x08, 0x65, 0x04, 0x00, + 0x00, 0x13, 0xbe, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, + 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, + 0x79, 0x88, 0x83, 0x39, 0x70, 0x03, 0x38, 0x70, 0x03, 0x38, 0x68, 0x83, + 0x79, 0x48, 0x87, 0x76, 0xa8, 0x07, 0x76, 0x08, 0x07, 0x7a, 0x78, 0x07, + 0x79, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, + 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, + 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, + 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, + 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, + 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, + 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, + 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, + 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, + 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, + 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, + 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, + 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, + 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, + 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, + 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, + 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, + 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, + 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x11, 0xc2, 0x90, 0x10, 0xdb, 0x95, 0x3f, 0xeb, 0x2c, + 0xc8, 0xf0, 0x57, 0x44, 0x34, 0x11, 0xd7, 0x90, 0x08, 0x80, 0x0e, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0xd8, 0x20, + 0x50, 0xf4, 0x6c, 0x00, 0x00, 0x20, 0x0b, 0x04, 0x00, 0x0a, 0x00, 0x00, + 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, + 0x47, 0xc6, 0x04, 0x43, 0x52, 0x45, 0x50, 0x02, 0x85, 0x30, 0x02, 0x50, + 0x80, 0x01, 0x05, 0x52, 0x06, 0xc4, 0x46, 0x00, 0x68, 0x8d, 0x25, 0x48, + 0x02, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, + 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, + 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, + 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, + 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, + 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, + 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, + 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, + 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, + 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, + 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, + 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, + 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, + 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, + 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, + 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, + 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, + 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, + 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, + 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, + 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, + 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, + 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, + 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, + 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, + 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, + 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, + 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, + 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, + 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, + 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, + 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, + 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, + 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, + 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, + 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, + 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, + 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, + 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, + 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, + 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, + 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, + 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, + 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, + 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, + 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, + 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, + 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, + 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, + 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, + 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, + 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, + 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, + 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, + 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, + 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x79, 0x20, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x32, 0x9a, 0x08, + 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4, + 0x3c, 0xec, 0x7c, 0x00, 0x00, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x01, + 0x13, 0x19, 0x0c, 0x12, 0x59, 0x85, 0x53, 0x24, 0x90, 0xe4, 0x19, 0xca, + 0x83, 0x44, 0x17, 0xa2, 0x24, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, + 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32, + 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74, + 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, + 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, + 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, + 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, + 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, + 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x61, 0x69, + 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x5f, 0x5f, 0x61, 0x69, 0x72, 0x5f, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, + 0x5f, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x61, 0x69, 0x72, 0x2e, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, + 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, + 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x34, 0x78, 0x34, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x00, 0xc4, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0xa0, + 0x04, 0x23, 0x08, 0x4b, 0x32, 0x82, 0xa0, 0x08, 0x23, 0x08, 0xca, 0x30, + 0x82, 0xa0, 0x10, 0x23, 0x08, 0x08, 0x30, 0x82, 0xa0, 0x14, 0x23, 0x08, + 0x8a, 0x31, 0x82, 0xa0, 0x1c, 0x33, 0x0c, 0x5f, 0x00, 0x06, 0x33, 0x0c, + 0x61, 0x20, 0x88, 0xc1, 0x0c, 0xc1, 0x30, 0xc3, 0xf0, 0x7d, 0x63, 0x30, + 0x03, 0x41, 0x84, 0x41, 0x18, 0x8c, 0xc1, 0x0c, 0x41, 0x31, 0x43, 0x60, + 0xcc, 0x10, 0x1c, 0x33, 0x14, 0x48, 0xa2, 0x2c, 0xcc, 0x0c, 0x46, 0xe3, + 0x24, 0xca, 0xf2, 0xcc, 0x50, 0x40, 0x49, 0xb4, 0x48, 0x33, 0x0c, 0x70, + 0x10, 0x07, 0x72, 0x30, 0x83, 0x32, 0x06, 0x13, 0x35, 0x06, 0x61, 0x50, + 0x25, 0xd6, 0xc2, 0xcc, 0xa0, 0x84, 0xc1, 0x44, 0x85, 0x41, 0x18, 0x54, + 0x89, 0xb2, 0x3c, 0x33, 0x40, 0xdf, 0x85, 0x95, 0x01, 0xf5, 0x85, 0x41, + 0xa6, 0x95, 0xc1, 0x66, 0x06, 0x09, 0xb7, 0x74, 0x33, 0x40, 0x67, 0x70, + 0x61, 0x65, 0x40, 0x9d, 0x41, 0x18, 0x64, 0x5a, 0x19, 0x6c, 0x66, 0x90, + 0x70, 0x8b, 0x37, 0x03, 0x41, 0x07, 0x75, 0x60, 0x07, 0x77, 0x30, 0xc3, + 0x40, 0x06, 0x73, 0x80, 0x07, 0xb5, 0x01, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, + 0x71, 0x1c, 0x1a, 0xb8, 0x81, 0x85, 0x06, 0x7a, 0x60, 0x59, 0x96, 0x1b, + 0xd0, 0x81, 0x1b, 0xd0, 0x81, 0x2f, 0xf8, 0x02, 0x4a, 0xd0, 0x04, 0x28, + 0xc8, 0x48, 0x60, 0x82, 0x2e, 0x62, 0x63, 0xb3, 0x6b, 0x73, 0x69, 0x7b, + 0x23, 0xab, 0x63, 0x2b, 0x73, 0x31, 0x63, 0x0b, 0x3b, 0x9b, 0x1b, 0x45, + 0x38, 0x03, 0x34, 0x38, 0x85, 0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, + 0xcc, 0x8d, 0x6e, 0x94, 0x20, 0x0d, 0x6e, 0x09, 0x4b, 0x93, 0x73, 0xb1, + 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0x50, 0x83, 0xa3, 0xc2, + 0xd2, 0xe4, 0x5c, 0xd8, 0xc2, 0xdc, 0xce, 0xea, 0xc2, 0xce, 0xca, 0xbe, + 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0x46, 0x09, 0xd6, 0xe0, 0xa6, + 0xb0, 0x34, 0x39, 0x97, 0xb1, 0xb7, 0x36, 0xb8, 0x34, 0xb6, 0xb2, 0xaf, + 0x37, 0x38, 0xba, 0xb4, 0x37, 0xb7, 0xb9, 0x51, 0x06, 0x36, 0x68, 0x03, + 0x37, 0x38, 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x8e, 0xae, 0x0c, + 0x6f, 0x94, 0x00, 0x0f, 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, @@ -648,638 +334,304 @@ const unsigned char sdl_metallib[] = { 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, - 0x00, 0x61, 0x20, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, - 0x2c, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0xc4, 0x4a, 0xa0, + 0x00, 0x61, 0x20, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, + 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xc4, 0x4a, 0xa0, 0x0c, 0x8a, 0x80, 0xdc, 0x08, 0xc0, 0x58, 0x44, 0x10, 0x04, 0xc1, 0x58, - 0x84, 0x20, 0x08, 0xc2, 0x58, 0xc4, 0x30, 0x0c, 0x03, 0x85, 0x19, 0x80, - 0x19, 0x00, 0x12, 0x33, 0x00, 0x34, 0x66, 0x00, 0x00, 0xf1, 0x30, 0x00, - 0x00, 0x2c, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0xc8, - 0x3c, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x13, 0x06, 0x96, 0x05, 0x00, 0x00, - 0x00, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, - 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, - 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, - 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, - 0x74, 0x65, 0x78, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, - 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, - 0x34, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, - 0x00, 0x13, 0x04, 0x06, 0x59, 0x21, 0x80, 0x02, 0x1f, 0xac, 0x18, 0x42, - 0x01, 0x14, 0xfa, 0x60, 0xc5, 0x20, 0x0a, 0xa0, 0xe0, 0x07, 0x1b, 0x82, - 0x3d, 0xd8, 0x30, 0xe8, 0xc1, 0x28, 0xfc, 0xc1, 0x86, 0x81, 0x14, 0x48, - 0xe1, 0x0f, 0x36, 0x04, 0xa1, 0xb0, 0x21, 0x10, 0x05, 0x00, 0x00, 0x00, - 0x00, 0xbb, 0x10, 0x8c, 0x64, 0x49, 0x14, 0x84, 0xb2, 0x0b, 0xf1, 0x50, - 0x18, 0x45, 0x41, 0x28, 0x83, 0x0c, 0xc3, 0xc1, 0x98, 0x10, 0x88, 0xff, - 0x2e, 0xc4, 0x84, 0x71, 0x11, 0x05, 0xa1, 0x0c, 0x32, 0x1c, 0xcc, 0x63, - 0x42, 0x20, 0xfe, 0x16, 0x14, 0xe0, 0xbf, 0x0b, 0x81, 0x75, 0x61, 0x40, - 0x51, 0x10, 0xca, 0x20, 0x03, 0x13, 0x4d, 0x26, 0x04, 0xe2, 0x6f, 0x45, - 0x00, 0xfe, 0xbb, 0x10, 0x9d, 0x18, 0x98, 0x81, 0x46, 0x41, 0x28, 0x83, - 0x0c, 0x91, 0x75, 0x99, 0x10, 0x88, 0xbf, 0x15, 0x01, 0xf8, 0xef, 0x42, - 0x84, 0xc1, 0x19, 0xac, 0x01, 0x18, 0x50, 0x10, 0xca, 0x20, 0x43, 0xa0, - 0x7d, 0x16, 0x54, 0xe2, 0x3f, 0xc8, 0x30, 0x74, 0x60, 0x60, 0xc1, 0x24, - 0xfe, 0x36, 0x04, 0xe0, 0x3f, 0xc8, 0x60, 0x80, 0x81, 0x18, 0x58, 0x10, - 0x89, 0xbf, 0x0d, 0x01, 0xf8, 0x0f, 0x32, 0x24, 0x63, 0x40, 0x06, 0x16, - 0x3c, 0xe2, 0x6f, 0x43, 0x00, 0xfe, 0xbb, 0x10, 0x6e, 0x40, 0x07, 0x78, - 0xc0, 0x06, 0x14, 0x84, 0x32, 0xc8, 0x10, 0x9c, 0x01, 0x1b, 0x58, 0x20, - 0x06, 0xe2, 0x3f, 0xc8, 0x30, 0xa8, 0x41, 0x1b, 0x58, 0x00, 0x06, 0xe2, - 0x3f, 0xc8, 0x50, 0xb0, 0x81, 0x1b, 0x58, 0xd0, 0x89, 0xff, 0x20, 0xc3, - 0xe1, 0x06, 0x6f, 0x60, 0x81, 0x26, 0xfe, 0x83, 0x0c, 0x7c, 0xe0, 0x06, - 0x74, 0x60, 0x59, 0x20, 0xfe, 0x83, 0x0c, 0x7e, 0x00, 0x07, 0x75, 0x60, - 0x4e, 0x20, 0xfe, 0x96, 0x0c, 0xe0, 0x6f, 0x01, 0x03, 0xfe, 0x16, 0x24, - 0xe0, 0x6f, 0x01, 0x02, 0xfe, 0x16, 0x14, 0xe0, 0x3f, 0xdb, 0x60, 0x07, - 0x01, 0x30, 0xdb, 0x10, 0x94, 0x42, 0x30, 0xdb, 0x10, 0x94, 0x82, 0x90, - 0x41, 0x40, 0x0c, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, - 0x20, 0x85, 0xa3, 0x14, 0x10, 0x53, 0xd8, 0x72, 0x0c, 0x01, 0x29, 0x1c, - 0xa6, 0x80, 0x94, 0xc2, 0x96, 0xe3, 0x08, 0x48, 0xe1, 0x30, 0x05, 0xa4, - 0x14, 0xb6, 0x1c, 0x4c, 0x40, 0x0a, 0x87, 0x29, 0x20, 0xa5, 0xb0, 0xe5, - 0x88, 0x02, 0x52, 0x38, 0x4c, 0x01, 0x29, 0x85, 0x2d, 0x87, 0x15, 0x90, - 0xc2, 0x51, 0x0a, 0x88, 0x29, 0x6c, 0x39, 0xc6, 0x20, 0x20, 0x85, 0xa3, - 0x14, 0x10, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xde, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, - 0x00, 0x1f, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xf0, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, - 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, - 0x72, 0x74, 0x65, 0x78, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, - 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, - 0x69, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, - 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0xf4, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, - 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, - 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, - 0x00, 0x40, 0x03, 0x00, 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, - 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, - 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, - 0x42, 0x84, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x42, - 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, - 0x42, 0x04, 0x49, 0x0e, 0x90, 0x11, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, - 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x21, 0x46, 0x06, 0x51, 0x18, 0x00, - 0x00, 0x71, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0x01, 0x80, 0x03, 0x40, 0x02, 0x28, 0x22, 0x1c, 0xe0, 0x01, 0x1e, - 0xe4, 0xe1, 0x1d, 0xf0, 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, - 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, - 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, - 0x87, 0x36, 0x60, 0x87, 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, - 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, - 0x07, 0x72, 0xa0, 0x07, 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, - 0xdc, 0xe1, 0x1d, 0xda, 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, - 0xd2, 0xc1, 0x1d, 0xe6, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, - 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, - 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, - 0xda, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, - 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, - 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, - 0x07, 0x76, 0x48, 0x87, 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, - 0x03, 0x76, 0x28, 0x87, 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, - 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, - 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, - 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, - 0x87, 0x36, 0x70, 0x87, 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, - 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, - 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, - 0xce, 0xc1, 0x1d, 0xca, 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, - 0xde, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, - 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, - 0x87, 0x77, 0x68, 0x03, 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, - 0x07, 0x77, 0x38, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, - 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, - 0xc6, 0x61, 0x1d, 0xda, 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, - 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, - 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, - 0x00, 0x3c, 0x00, 0x88, 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, - 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, - 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0xe0, 0x09, 0x03, - 0xb0, 0x00, 0x55, 0x90, 0x06, 0x60, 0x30, 0x84, 0x43, 0x3a, 0xc8, 0x43, - 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, - 0x3b, 0xbc, 0x43, 0x1b, 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x84, 0x40, - 0x00, 0x89, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08, - 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, - 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, - 0x4c, 0x10, 0x3c, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, - 0x67, 0x49, 0x53, 0x44, 0x09, 0x93, 0xcf, 0x1e, 0xc0, 0x40, 0x44, 0x9c, - 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x12, 0x42, 0x00, 0x00, 0x00, 0x00, 0x06, - 0x11, 0x06, 0xa1, 0x10, 0x21, 0x41, 0x54, 0x03, 0x01, 0x73, 0x04, 0x60, - 0x90, 0x02, 0x38, 0x47, 0x00, 0x0a, 0x83, 0x08, 0x80, 0x30, 0x8c, 0x30, - 0x00, 0xc3, 0x08, 0x04, 0x32, 0x02, 0x00, 0x00, 0x00, 0x13, 0xbe, 0x70, - 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, - 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, 0x79, 0x88, 0x83, 0x39, - 0x70, 0x03, 0x38, 0x70, 0x03, 0x38, 0x68, 0x83, 0x79, 0x48, 0x87, 0x76, - 0xa8, 0x07, 0x76, 0x08, 0x07, 0x7a, 0x78, 0x07, 0x79, 0xd8, 0x70, 0x1b, - 0xe5, 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, - 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, - 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, - 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, - 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, - 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, - 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, - 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, - 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, - 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, - 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, - 0x72, 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, - 0x6d, 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, - 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, - 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, - 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, - 0x79, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, - 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, - 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, - 0xf6, 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, - 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, - 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, - 0x76, 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, - 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, - 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, - 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, - 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x11, - 0xc2, 0x90, 0x12, 0xdb, 0x95, 0x3f, 0xeb, 0x2c, 0xc8, 0xf0, 0x17, 0x11, - 0x60, 0x30, 0x44, 0x33, 0x0d, 0x89, 0x00, 0xa9, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x89, 0x0d, 0x02, 0x45, 0x85, - 0x06, 0x00, 0x00, 0xb2, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, - 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, - 0xc2, 0x22, 0x28, 0x81, 0x42, 0x18, 0x01, 0x28, 0xa0, 0x82, 0x28, 0x8c, - 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0xd2, 0x11, 0x80, 0x42, 0x28, 0x88, - 0xc2, 0x28, 0x90, 0x42, 0x29, 0x98, 0xc2, 0xa1, 0x1c, 0x4b, 0x88, 0x04, - 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, - 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, - 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, - 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, - 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, - 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, - 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, - 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, - 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, - 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, - 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, - 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, - 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, - 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, - 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, - 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, - 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, - 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, - 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, - 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, - 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, - 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, - 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, - 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, - 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, - 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, - 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, - 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, - 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, - 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, - 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, - 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, - 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, - 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, - 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, - 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, - 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, - 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, - 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, - 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, - 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, - 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, - 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, - 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, - 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, - 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, - 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, - 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, - 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, - 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, - 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, - 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, - 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, - 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, - 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, - 0x00, 0xf6, 0x00, 0x00, 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, - 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4, 0xca, 0x00, 0x0c, 0x62, - 0x09, 0x8b, 0xf2, 0x06, 0xc5, 0xc6, 0x91, 0x41, 0x14, 0x19, 0x52, 0xa6, - 0x3c, 0x06, 0x83, 0x58, 0x85, 0xf2, 0x48, 0x08, 0x55, 0x30, 0x8c, 0xb2, - 0x38, 0xcf, 0xf3, 0x44, 0xd7, 0x13, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b, - 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, - 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, - 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, 0x20, 0x28, - 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, - 0x33, 0x2e, 0x39, 0x38, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, - 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, - 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x61, 0x69, - 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, - 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, + 0x84, 0x20, 0x08, 0xc2, 0x58, 0xc4, 0x30, 0x0c, 0x03, 0x81, 0x31, 0x02, + 0x10, 0x04, 0x41, 0xfc, 0xa3, 0x30, 0x03, 0x30, 0x03, 0x40, 0x62, 0x06, + 0x80, 0xc6, 0x0c, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0x08, 0x3d, 0x00, 0x00, 0x00, + 0x00, 0xcf, 0x23, 0x06, 0x96, 0x05, 0x00, 0x00, 0x00, 0x6f, 0x6d, 0x6e, + 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, + 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, + 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x61, + 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x32, 0x29, 0x13, 0x04, 0x06, + 0x59, 0x21, 0x80, 0x02, 0x1f, 0xac, 0x18, 0x42, 0x01, 0x14, 0xfa, 0x60, + 0xc5, 0x20, 0x0a, 0xa0, 0xe0, 0x07, 0x1b, 0x82, 0x3d, 0xd8, 0x30, 0xe8, + 0xc1, 0x28, 0xfc, 0xc1, 0x86, 0x81, 0x14, 0x48, 0xe1, 0x0f, 0x36, 0x04, + 0xa1, 0xb0, 0x21, 0x10, 0x05, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x10, 0x8d, + 0x64, 0x49, 0x14, 0x84, 0xb2, 0x0b, 0x01, 0x51, 0x18, 0x45, 0x41, 0x28, + 0x83, 0x0c, 0xc3, 0xd1, 0x98, 0x10, 0x88, 0xff, 0x2e, 0x04, 0x85, 0x71, + 0x12, 0x05, 0xa1, 0x0c, 0x32, 0x1c, 0x0c, 0x64, 0x42, 0x20, 0xfe, 0x16, + 0x14, 0xe0, 0xbf, 0x0b, 0x91, 0x75, 0x61, 0x50, 0x51, 0x10, 0xca, 0x20, + 0x03, 0x13, 0x51, 0x26, 0x04, 0xe2, 0x6f, 0x45, 0x00, 0xfe, 0xbb, 0x10, + 0x9e, 0x18, 0x98, 0xc1, 0x46, 0x41, 0x28, 0x83, 0x0c, 0x91, 0x85, 0x99, + 0x10, 0x88, 0xbf, 0x15, 0x01, 0xf8, 0xef, 0x42, 0x88, 0xc1, 0x19, 0xac, + 0x41, 0x18, 0x50, 0x10, 0xca, 0x20, 0x43, 0xa0, 0x81, 0x81, 0x05, 0x95, + 0xf8, 0x0f, 0x32, 0x0c, 0x5d, 0x18, 0x58, 0x30, 0x89, 0xbf, 0x0d, 0x01, + 0xf8, 0x0f, 0x32, 0x18, 0x60, 0x30, 0x06, 0x16, 0x44, 0xe2, 0x6f, 0x43, + 0x00, 0xfe, 0x83, 0x0c, 0xc9, 0x18, 0x94, 0x81, 0x05, 0x8f, 0xf8, 0xdb, + 0x10, 0x80, 0xff, 0x2e, 0xc4, 0x1b, 0xd0, 0x01, 0x1e, 0xb4, 0x01, 0x05, + 0xa1, 0x0c, 0x32, 0x04, 0x67, 0xd0, 0x06, 0x16, 0x88, 0x81, 0xf8, 0x0f, + 0x32, 0x0c, 0x6a, 0xe0, 0x06, 0x16, 0x80, 0x81, 0xf8, 0x0f, 0x32, 0x14, + 0x6c, 0xf0, 0x06, 0x16, 0x74, 0xe2, 0x3f, 0xc8, 0x70, 0xb8, 0x01, 0x1c, + 0x58, 0xa0, 0x89, 0xff, 0x20, 0x03, 0x1f, 0xb4, 0x41, 0x1d, 0x58, 0x16, + 0x88, 0xff, 0x20, 0x83, 0x1f, 0xbc, 0x81, 0x1d, 0x98, 0x13, 0x88, 0xbf, + 0x25, 0x03, 0xf8, 0x5b, 0xc0, 0x80, 0xbf, 0x05, 0x09, 0xf8, 0x5b, 0x80, + 0x80, 0xbf, 0x05, 0x05, 0xf8, 0xcf, 0x36, 0xdc, 0x41, 0x00, 0xcc, 0x36, + 0x04, 0xa5, 0x10, 0xcc, 0x36, 0x04, 0x7c, 0x20, 0x64, 0x10, 0x10, 0x03, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, 0x20, 0x85, 0xa3, 0x14, + 0x10, 0x53, 0xd8, 0x72, 0x0c, 0x01, 0x29, 0x1c, 0xa6, 0x80, 0x94, 0xc2, + 0x96, 0xe3, 0x08, 0x48, 0xe1, 0x30, 0x05, 0xa4, 0x14, 0xb6, 0x1c, 0x4c, + 0x40, 0x0a, 0x87, 0x29, 0x20, 0xa5, 0xb0, 0xe5, 0x88, 0x02, 0x52, 0x38, + 0x4c, 0x01, 0x29, 0x85, 0x2d, 0x87, 0x15, 0x90, 0xc2, 0x51, 0x0a, 0x88, + 0x29, 0x6c, 0x39, 0xc6, 0x20, 0x20, 0x85, 0xa3, 0x14, 0x10, 0x53, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xd9, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x12, 0x03, 0x94, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x12, 0x03, 0x94, 0x78, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, + 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, + 0x78, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x61, 0x69, + 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x69, 0x6f, + 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, + 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x90, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00, + 0x00, 0x21, 0x0c, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x0b, 0x02, 0x21, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, + 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, + 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, + 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, + 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, + 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, 0x90, 0x91, 0x22, 0xc4, + 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, + 0x06, 0x51, 0x18, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, + 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, + 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, + 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, + 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, + 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, + 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, + 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, + 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, + 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, + 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, + 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, + 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, + 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, + 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, + 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, + 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, + 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, + 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, + 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, + 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, + 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, + 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, + 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, + 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, + 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, + 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, + 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, + 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, + 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, + 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, + 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, + 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x78, + 0x02, 0x01, 0x2c, 0x40, 0x15, 0xa4, 0x01, 0x28, 0x0c, 0xe1, 0x90, 0x0e, + 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, 0x0e, 0xe5, 0x20, 0x0f, + 0x6d, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe1, 0xc0, 0x0e, 0xe9, 0x10, 0x0e, + 0xf3, 0x00, 0x6c, 0xf0, 0x86, 0x02, 0x58, 0x80, 0x2a, 0x48, 0x03, 0x50, + 0x18, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, 0xcc, 0xc1, + 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d, 0xc2, 0x81, + 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, + 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, + 0x76, 0x08, 0x41, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87, + 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07, + 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07, + 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x62, 0x0c, + 0x11, 0x84, 0x31, 0x74, 0x06, 0x02, 0xe6, 0x08, 0xc0, 0x20, 0x05, 0xd4, + 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x04, 0xc2, 0x30, 0x02, 0xa1, 0x8c, 0x00, + 0x00, 0x13, 0xbe, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, + 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, + 0x79, 0x88, 0x83, 0x39, 0x70, 0x03, 0x38, 0x70, 0x03, 0x38, 0x68, 0x83, + 0x79, 0x48, 0x87, 0x76, 0xa8, 0x07, 0x76, 0x08, 0x07, 0x7a, 0x78, 0x07, + 0x79, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, + 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, + 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, + 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, + 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, + 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, + 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, + 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, + 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, + 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, + 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, + 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, + 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, + 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, + 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, + 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, + 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, + 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, + 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x11, 0xc2, 0x90, 0x0f, 0xdb, 0x95, 0x3f, 0xe7, 0x3c, + 0xd8, 0x5f, 0x11, 0xd1, 0x44, 0x5c, 0x43, 0x22, 0xe0, 0x39, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x62, 0x83, 0x40, + 0x51, 0xb5, 0x01, 0x00, 0x80, 0x2c, 0x10, 0x00, 0x00, 0x0a, 0x00, 0x00, + 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, + 0x47, 0xc6, 0x04, 0x43, 0x52, 0x45, 0x50, 0x02, 0x85, 0x30, 0x02, 0x50, + 0x06, 0x05, 0x18, 0x50, 0x20, 0xc4, 0x46, 0x00, 0x68, 0x8d, 0x25, 0x48, + 0x02, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, + 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, + 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, + 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, + 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, + 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, + 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, + 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, + 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, + 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, + 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, + 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, + 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, + 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, + 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, + 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, + 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, + 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, + 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, + 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, + 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, + 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, + 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, + 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, + 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, + 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, + 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, + 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, + 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, + 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, + 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, + 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, + 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, + 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, + 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, + 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, + 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, + 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, + 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, + 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, + 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, + 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, + 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, + 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, + 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, + 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, + 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, + 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, + 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, + 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, + 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, + 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, + 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, + 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, + 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, + 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x79, 0x20, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x32, 0x9a, 0x08, + 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4, + 0x3a, 0x8c, 0x7d, 0x00, 0x00, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x01, + 0x13, 0x19, 0x0c, 0x12, 0x59, 0x45, 0x66, 0x20, 0x90, 0xe4, 0x29, 0x0f, + 0x12, 0x5d, 0x88, 0x92, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, + 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32, + 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74, + 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, + 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, + 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, + 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, + 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x28, 0x38, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x76, - 0x32, 0x5f, 0x66, 0x29, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x61, - 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x67, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, - 0x76, 0x34, 0x5f, 0x66, 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x61, 0x69, - 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, - 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, - 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, - 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74, - 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, - 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77, - 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69, + 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, + 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, + 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69, 0x72, + 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x28, 0x5f, 0x5f, 0x61, 0x69, 0x72, 0x5f, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x5f, + 0x29, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, + 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x00, 0x00, 0x00, 0x44, 0x64, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0x80, 0x04, 0x23, 0x08, 0x09, - 0x35, 0x82, 0x80, 0x08, 0x23, 0x08, 0xc8, 0x30, 0x82, 0x80, 0x10, 0x23, - 0x08, 0x06, 0x30, 0x82, 0x80, 0x14, 0x23, 0x08, 0x88, 0x31, 0x82, 0x80, - 0x1c, 0x23, 0x08, 0x08, 0x32, 0x82, 0x80, 0x24, 0x23, 0x08, 0x88, 0x32, - 0x82, 0x80, 0x2c, 0x33, 0x0c, 0x66, 0x10, 0x9c, 0xc1, 0x0c, 0x03, 0x1a, - 0x08, 0x69, 0x30, 0x43, 0x30, 0xcc, 0x30, 0x98, 0x81, 0x19, 0xa8, 0xc1, - 0x0c, 0x04, 0x81, 0x06, 0x68, 0xa0, 0x06, 0x33, 0x04, 0xc5, 0x0c, 0x81, - 0x31, 0x43, 0x70, 0xcc, 0x50, 0x20, 0x6a, 0xa0, 0x06, 0x89, 0x32, 0x43, - 0xb0, 0x07, 0x33, 0x24, 0x6a, 0xb0, 0x30, 0x8d, 0x93, 0x3c, 0x50, 0x34, - 0x43, 0x82, 0x06, 0x8b, 0xd4, 0x38, 0x89, 0x02, 0x4d, 0x33, 0xa0, 0x81, - 0x1a, 0xa4, 0x81, 0x1a, 0x64, 0x5a, 0x1a, 0xa4, 0x81, 0x1a, 0x64, 0x5b, - 0x1b, 0xa4, 0x81, 0x1a, 0x64, 0x9c, 0x1b, 0xa4, 0x81, 0x1a, 0x64, 0xdd, - 0x1b, 0xa4, 0x81, 0x1a, 0x64, 0x1e, 0x1c, 0xa4, 0x81, 0x1a, 0x64, 0x5f, - 0x1c, 0xa4, 0x81, 0x1a, 0x64, 0x60, 0x20, 0x07, 0x69, 0xa0, 0x06, 0x59, - 0x18, 0xcc, 0x20, 0x99, 0x01, 0x55, 0xb1, 0x81, 0xa5, 0x06, 0x68, 0x70, - 0x61, 0x7f, 0x20, 0x06, 0x6c, 0x30, 0x06, 0x69, 0x90, 0x90, 0x01, 0x54, - 0x06, 0x33, 0x0c, 0x7d, 0xe0, 0x07, 0xa0, 0x30, 0xc3, 0xb0, 0x06, 0x7c, - 0x10, 0x0a, 0xd5, 0x01, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, - 0x71, 0x9c, 0x1b, 0xb8, 0x81, 0x45, 0x07, 0x7a, 0x60, 0x59, 0x96, 0x1e, - 0x70, 0xac, 0xc0, 0x0a, 0x62, 0xe3, 0x17, 0x74, 0x20, 0x23, 0x81, 0x09, - 0xba, 0x88, 0x8d, 0xcd, 0xae, 0xcd, 0xa5, 0xed, 0x8d, 0xac, 0x8e, 0xad, - 0xcc, 0xc5, 0x8c, 0x2d, 0xec, 0x6c, 0x6e, 0x14, 0x41, 0x0e, 0xe6, 0xe0, - 0x14, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2, 0x32, 0x37, 0xba, 0x51, - 0x02, 0x3a, 0xb8, 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x6e, 0x2e, - 0xed, 0xcd, 0x6d, 0x94, 0xa0, 0x0e, 0x8e, 0x0a, 0x4b, 0x93, 0x73, 0x61, - 0x0b, 0x73, 0x3b, 0xab, 0x0b, 0x3b, 0x2b, 0xfb, 0xb2, 0x2b, 0x93, 0x9b, - 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0xb0, 0x83, 0x9b, 0xc2, 0xd2, 0xe4, 0x5c, - 0xc6, 0xde, 0xda, 0xe0, 0xd2, 0xd8, 0xca, 0xbe, 0xde, 0xe0, 0xe8, 0xd2, - 0xde, 0xdc, 0xe6, 0x46, 0x19, 0xee, 0x00, 0x0f, 0xf2, 0xe0, 0x98, 0xb0, - 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, 0x51, - 0x82, 0x50, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, - 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, - 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, - 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, - 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60, - 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20, - 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87, - 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07, - 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d, - 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc, - 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2, - 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, - 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, - 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, - 0x00, 0x61, 0x20, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, - 0x2c, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x84, 0x65, 0x30, - 0x03, 0x40, 0x5a, 0x06, 0xd4, 0x73, 0x10, 0x04, 0x41, 0x64, 0x04, 0x63, - 0x04, 0x20, 0x08, 0x82, 0xf8, 0x47, 0x3c, 0x03, 0x00, 0xf1, 0x30, 0x00, - 0x00, 0x38, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0x48, - 0x3d, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x90, 0x81, 0x05, 0x00, 0x00, - 0x00, 0x5f, 0x5a, 0x54, 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, - 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, - 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, - 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, - 0x54, 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, - 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, - 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, - 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, - 0x32, 0x29, 0x00, 0x00, 0x00, 0x13, 0x04, 0x85, 0x99, 0x20, 0x28, 0xcd, - 0x04, 0x41, 0x71, 0x26, 0x08, 0xca, 0x33, 0x41, 0x50, 0xa0, 0x09, 0x82, - 0x12, 0x4d, 0x10, 0x14, 0x69, 0x82, 0xa0, 0x4c, 0x2b, 0x04, 0x58, 0x30, - 0x85, 0x15, 0x43, 0x2c, 0xc0, 0xc2, 0x29, 0x6c, 0x08, 0x4a, 0x61, 0xc3, - 0x40, 0x0a, 0xb2, 0x80, 0x0a, 0x1b, 0x86, 0x6c, 0x16, 0x50, 0x61, 0x43, - 0x34, 0x0a, 0xb4, 0x80, 0x0a, 0xb4, 0x90, 0x0a, 0xb4, 0xa0, 0x0a, 0xb4, - 0xb0, 0x0a, 0xb4, 0xc0, 0x0a, 0xb4, 0xd0, 0x0a, 0xb4, 0xe0, 0x0a, 0xb4, - 0xf0, 0x0a, 0x1b, 0x86, 0x5a, 0xa0, 0x85, 0x55, 0xd8, 0x10, 0xc4, 0x02, - 0x00, 0x7b, 0x86, 0x43, 0x32, 0x28, 0x80, 0x31, 0xc7, 0x30, 0x04, 0xd4, - 0x20, 0x43, 0x40, 0x18, 0x73, 0x0c, 0x81, 0x81, 0x58, 0xd0, 0x88, 0x7f, - 0x06, 0x01, 0x31, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5b, 0x8a, 0x20, - 0xa8, 0x85, 0xc3, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xf2, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, - 0x00, 0x1f, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xf0, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, - 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x79, 0x00, 0x00, 0x00, - 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66, - 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x33, 0x32, 0x30, 0x32, 0x33, - 0x2e, 0x39, 0x38, 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, - 0x6c, 0x65, 0x2d, 0x69, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, - 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0xec, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, - 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, - 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, - 0x00, 0xb2, 0x03, 0x00, 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, - 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, - 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, - 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, - 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, - 0x42, 0x04, 0x49, 0x0e, 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, - 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, - 0x00, 0x80, 0x00, 0x00, 0x00, 0x1b, 0xc6, 0x24, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0x01, 0x68, 0x03, 0x60, 0x0d, 0x00, 0x09, 0xa8, 0x88, 0x70, 0x80, - 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, 0x70, - 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, - 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, 0x1d, - 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, 0x1d, - 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, - 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, 0xc0, - 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, 0x60, - 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, - 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, 0x78, - 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, 0x60, - 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, - 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, - 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, - 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, - 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, 0x90, - 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, 0x70, - 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, - 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, - 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, - 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, - 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x98, - 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, 0x28, - 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, - 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, - 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, 0x1e, - 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, - 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, 0xa0, - 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, 0xa0, - 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, 0xa8, - 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, 0xd0, - 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, 0x1c, - 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, - 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0x83, - 0x27, 0x10, 0xc0, 0x02, 0x54, 0x41, 0x1a, 0x80, 0xc1, 0x10, 0x0e, 0xe9, - 0x20, 0x0f, 0x6d, 0x20, 0x0e, 0xf5, 0x60, 0x0e, 0xe6, 0x50, 0x0e, 0xf2, - 0xd0, 0x06, 0xee, 0xf0, 0x0e, 0x6d, 0x10, 0x0e, 0xec, 0x90, 0x0e, 0xe1, - 0x30, 0x0f, 0xc0, 0x06, 0x63, 0x28, 0x80, 0x05, 0xa8, 0x36, 0x18, 0x84, - 0x01, 0x2c, 0x40, 0xb5, 0x41, 0x29, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x00, - 0xda, 0x00, 0x58, 0x03, 0x40, 0x02, 0xaa, 0x0d, 0x86, 0x11, 0x00, 0x0b, - 0x50, 0x6d, 0x30, 0x0e, 0x01, 0x58, 0x80, 0x6a, 0x83, 0x82, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0x00, 0xb4, 0x01, 0xb0, 0x06, 0x80, 0x04, 0x54, 0x00, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40, - 0x18, 0x88, 0x09, 0x43, 0x61, 0x1c, 0x13, 0x06, 0xc4, 0x38, 0x00, 0x00, - 0x00, 0x89, 0x20, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, - 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, - 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, - 0x4c, 0x10, 0x68, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, - 0x67, 0x49, 0x53, 0x44, 0x09, 0x93, 0xcf, 0x1e, 0xc0, 0x40, 0x44, 0x9c, - 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x12, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x11, 0x06, 0xe1, 0x28, 0x69, 0x8a, 0x28, 0x61, 0xf2, 0xff, 0x89, - 0xb8, 0x26, 0x2a, 0x22, 0x7e, 0x7b, 0xf8, 0xa7, 0x31, 0x02, 0x60, 0x10, - 0xa1, 0x08, 0x2e, 0x92, 0xa6, 0x88, 0x12, 0x26, 0xff, 0x97, 0x00, 0xe6, - 0x59, 0x88, 0xe8, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x84, 0x43, 0x28, 0x47, - 0x08, 0x41, 0x10, 0x83, 0x28, 0xcd, 0x11, 0x20, 0x46, 0x08, 0x6b, 0x8e, - 0x20, 0x98, 0x23, 0x00, 0x83, 0x61, 0x04, 0xc1, 0x29, 0x0a, 0x33, 0x48, - 0xb4, 0xd7, 0x00, 0x70, 0x04, 0x07, 0x02, 0x52, 0xc0, 0xcd, 0x11, 0x80, - 0xc2, 0x20, 0x02, 0x20, 0x0c, 0x23, 0x0c, 0xce, 0x30, 0xc2, 0x00, 0x0c, - 0x23, 0x10, 0xce, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xbe, 0x70, - 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, - 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, 0x79, 0x88, 0x83, 0x39, - 0x70, 0x03, 0x38, 0x70, 0x03, 0x38, 0x68, 0x83, 0x79, 0x48, 0x87, 0x76, - 0xa8, 0x07, 0x76, 0x08, 0x07, 0x7a, 0x78, 0x07, 0x79, 0xd8, 0x70, 0x1b, - 0xe5, 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, - 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, - 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, - 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, - 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, - 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, - 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, - 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, - 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, - 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, - 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, - 0x72, 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, - 0x6d, 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, - 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, - 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, - 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, - 0x79, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, - 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, - 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, - 0xf6, 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, - 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, - 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, - 0x76, 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, - 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, - 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, - 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, - 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x11, - 0xc2, 0x90, 0x11, 0xdb, 0x95, 0x3f, 0xe7, 0x3c, 0xd8, 0x5f, 0x44, 0x80, - 0xc1, 0x10, 0xcd, 0x34, 0x24, 0x02, 0xa2, 0x04, 0x00, 0x80, 0x00, 0x00, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x86, 0x44, 0xd1, 0x06, 0x01, 0x01, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0xc4, 0x06, 0x81, - 0xa2, 0xb4, 0x03, 0x00, 0x00, 0x59, 0x20, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, - 0x47, 0xc6, 0x04, 0x43, 0x72, 0x45, 0x50, 0x02, 0x85, 0x30, 0x02, 0x50, - 0x06, 0x05, 0x54, 0x10, 0x85, 0x51, 0x20, 0x85, 0x52, 0x30, 0x85, 0x53, - 0x0a, 0x44, 0x47, 0x00, 0x0a, 0xa1, 0x20, 0x0a, 0xa3, 0x40, 0x0a, 0xa5, - 0x60, 0x0a, 0x87, 0xe6, 0x58, 0x42, 0x24, 0x00, 0x00, 0xb1, 0x18, 0x00, - 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, - 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, - 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, - 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, - 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, - 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, - 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, - 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, - 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, - 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, - 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, - 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, - 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, - 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, - 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, - 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, - 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, - 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, - 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, - 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, - 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, - 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, - 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, - 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, - 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, - 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, - 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, - 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, - 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, - 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, - 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, - 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, - 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, - 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, - 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, - 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, - 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, - 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, - 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, - 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, - 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, - 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, - 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, - 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, - 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, - 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, - 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, - 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, - 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, - 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, - 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, - 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, - 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, - 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, - 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, 0x00, 0x20, 0x01, 0x00, - 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, - 0x11, 0x32, 0x64, 0xd4, 0xde, 0x00, 0x0d, 0x44, 0x0b, 0x8b, 0xf2, 0x06, - 0xc5, 0xc6, 0x91, 0x41, 0x14, 0x19, 0x8c, 0x22, 0x31, 0x88, 0x64, 0x3d, - 0x45, 0x66, 0x20, 0xca, 0x23, 0x21, 0x54, 0xc1, 0x30, 0xca, 0xe2, 0x3c, - 0xcf, 0x13, 0x5d, 0x4f, 0xb0, 0x28, 0xd8, 0xb0, 0x1c, 0x01, 0x00, 0x00, - 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, - 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, - 0x39, 0x38, 0x20, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, - 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, 0x29, 0x4d, 0x65, 0x74, - 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, - 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, - 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, - 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x34, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x61, - 0x69, 0x72, 0x2e, 0x6e, 0x6f, 0x5f, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, - 0x76, 0x34, 0x5f, 0x66, 0x29, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, - 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x63, 0x6f, 0x6c, 0x6f, - 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, - 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x74, 0x65, 0x78, 0x63, - 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, - 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, - 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, - 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, - 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, - 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, - 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, - 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, - 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, - 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, - 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, - 0x61, 0x69, 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x61, - 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x78, - 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, - 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x00, 0x00, 0x84, 0x7d, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0xe0, 0x08, 0x23, 0x08, 0xd3, - 0x35, 0x82, 0xe0, 0x0c, 0x23, 0x08, 0x0e, 0x31, 0x82, 0xe0, 0x14, 0x23, - 0x08, 0x0a, 0x30, 0x82, 0xe0, 0x18, 0x23, 0x08, 0xce, 0x31, 0x82, 0xe0, - 0x20, 0x23, 0x08, 0x4e, 0x32, 0x82, 0xe0, 0x28, 0x23, 0x08, 0xce, 0x32, - 0x82, 0xe0, 0x30, 0x23, 0x08, 0x4e, 0x33, 0x82, 0xe0, 0x38, 0x33, 0x0c, - 0x70, 0x10, 0xc4, 0xc1, 0x0c, 0x83, 0x1c, 0x08, 0x73, 0x30, 0x43, 0x30, - 0xcc, 0x30, 0xc0, 0x01, 0x1c, 0xd0, 0xc1, 0x0c, 0x04, 0x21, 0x07, 0x72, - 0x40, 0x07, 0x33, 0x04, 0xc5, 0x0c, 0x81, 0x31, 0x43, 0x70, 0xcc, 0x50, - 0x20, 0x74, 0x40, 0x07, 0x89, 0x32, 0x43, 0x70, 0x0a, 0x33, 0x20, 0x74, - 0xb0, 0x30, 0x4d, 0xa2, 0x38, 0xcf, 0x0c, 0x89, 0x1c, 0x40, 0x11, 0x23, - 0x25, 0x8a, 0x33, 0xcd, 0x90, 0xc0, 0x01, 0x44, 0x31, 0x52, 0x52, 0x39, - 0xd6, 0x0c, 0x68, 0x40, 0x07, 0x73, 0x40, 0x07, 0x5c, 0x37, 0x07, 0x73, - 0x40, 0x07, 0x9c, 0x87, 0x07, 0x73, 0x40, 0x07, 0xdc, 0x97, 0x07, 0x73, - 0x40, 0x07, 0x1c, 0x18, 0xe8, 0xc1, 0x1c, 0xd0, 0x01, 0x17, 0x06, 0x7b, - 0x30, 0x07, 0x74, 0xc0, 0x89, 0x01, 0x1f, 0xcc, 0x01, 0x1d, 0x70, 0x63, - 0xd0, 0x07, 0x73, 0x40, 0x07, 0x1c, 0x19, 0xcc, 0x20, 0xd9, 0xc1, 0x85, - 0xdd, 0x41, 0x46, 0x07, 0x72, 0xa0, 0x6d, 0xac, 0x50, 0x06, 0x77, 0x60, - 0x06, 0x73, 0x90, 0x9c, 0x81, 0x83, 0x06, 0x33, 0x28, 0x73, 0x90, 0x06, - 0x19, 0x1d, 0xc8, 0x81, 0x1a, 0x24, 0x6b, 0xe0, 0xb0, 0xc1, 0x0c, 0x89, - 0x1f, 0xb4, 0x41, 0x46, 0x07, 0x72, 0x90, 0xb8, 0x81, 0xf3, 0x06, 0x33, - 0x18, 0xa9, 0xa0, 0x0a, 0xab, 0xd0, 0x0a, 0xae, 0xf0, 0x0a, 0x33, 0x0c, - 0x75, 0x80, 0x0a, 0xb0, 0x50, 0x62, 0x00, 0x70, 0x1c, 0xc7, 0x71, 0x1c, - 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xe7, 0x06, 0x6e, 0x60, 0xd1, 0x81, - 0x1e, 0x58, 0x96, 0xa5, 0x07, 0x9c, 0x29, 0xb0, 0x02, 0x2b, 0xd0, 0x8d, - 0x5f, 0xd8, 0x83, 0x3a, 0xe0, 0x82, 0x8c, 0x04, 0x26, 0xe8, 0x22, 0x36, - 0x36, 0xbb, 0x36, 0x97, 0xb6, 0x37, 0xb2, 0x3a, 0xb6, 0x32, 0x17, 0x33, - 0xb6, 0xb0, 0xb3, 0xb9, 0x51, 0x04, 0x3f, 0xf8, 0x83, 0x53, 0xd8, 0xd8, - 0xec, 0xda, 0x5c, 0xd2, 0xc8, 0xca, 0xdc, 0xe8, 0x46, 0x09, 0x40, 0xe1, - 0x96, 0xb0, 0x34, 0x39, 0x17, 0xbb, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, - 0x51, 0x82, 0x50, 0x38, 0x2a, 0x2c, 0x4d, 0xce, 0x85, 0x2d, 0xcc, 0xed, - 0xac, 0x2e, 0xec, 0xac, 0xec, 0xcb, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, - 0x6d, 0x94, 0x40, 0x14, 0x6e, 0x0a, 0x4b, 0x93, 0x73, 0x19, 0x7b, 0x6b, - 0x83, 0x4b, 0x63, 0x2b, 0xfb, 0x7a, 0x83, 0xa3, 0x4b, 0x7b, 0x73, 0x9b, - 0x1b, 0x65, 0x18, 0x05, 0x52, 0x28, 0x85, 0x63, 0xc2, 0xd2, 0xe4, 0x5c, - 0xcc, 0xe4, 0xc2, 0xce, 0xda, 0xca, 0xdc, 0xe8, 0x46, 0x09, 0x60, 0x01, + 0x7a, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x04, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x82, 0xa0, 0x04, 0x23, 0x08, 0x4b, 0x32, 0x82, 0xa0, 0x08, + 0x23, 0x08, 0xca, 0x30, 0x82, 0xa0, 0x10, 0x23, 0x08, 0x08, 0x30, 0x82, + 0xa0, 0x14, 0x23, 0x08, 0x8a, 0x31, 0x82, 0xa0, 0x1c, 0x33, 0x0c, 0x5e, + 0xf0, 0xcd, 0x30, 0x80, 0x81, 0x10, 0x06, 0x33, 0x04, 0xc3, 0x0c, 0x83, + 0xe7, 0x89, 0xc1, 0x0c, 0x04, 0x01, 0x06, 0x60, 0x20, 0x06, 0x33, 0x04, + 0xc5, 0x0c, 0x81, 0x31, 0x43, 0x70, 0xcc, 0x50, 0x20, 0x89, 0xb2, 0x30, + 0x33, 0x18, 0x8d, 0x93, 0x28, 0xcb, 0x33, 0x83, 0xd1, 0x40, 0x49, 0xb4, + 0x48, 0x33, 0x0c, 0x6f, 0x00, 0x07, 0x71, 0x30, 0x83, 0x22, 0x06, 0x13, + 0x25, 0x06, 0x60, 0x50, 0x25, 0xd1, 0xc2, 0xcc, 0xa0, 0x80, 0xc1, 0x44, + 0x81, 0x01, 0x18, 0x54, 0x89, 0xb2, 0x3c, 0x33, 0x28, 0xde, 0x44, 0x79, + 0x60, 0x50, 0x25, 0xd1, 0x22, 0xcd, 0x00, 0x91, 0x81, 0x75, 0x95, 0x01, + 0xe5, 0x81, 0x01, 0x96, 0x95, 0x81, 0x66, 0x06, 0xc9, 0xb6, 0x70, 0x33, + 0x40, 0x61, 0x60, 0x5d, 0x65, 0x40, 0x91, 0x01, 0x18, 0x60, 0x59, 0x19, + 0x68, 0x66, 0x90, 0x6c, 0x4b, 0x37, 0x43, 0x31, 0x07, 0x74, 0x50, 0x07, + 0x76, 0x70, 0x07, 0x33, 0x0c, 0x63, 0x20, 0x07, 0x78, 0x50, 0x1c, 0xc0, + 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x89, 0x81, 0x1b, 0x58, 0x68, 0xa0, + 0x07, 0x96, 0x65, 0xb9, 0x01, 0x1d, 0xd0, 0x01, 0x1d, 0xf8, 0x82, 0x2f, + 0xc8, 0x82, 0x4b, 0xd0, 0x04, 0x2b, 0xc8, 0x48, 0x60, 0x82, 0x2e, 0x62, + 0x63, 0xb3, 0x6b, 0x73, 0x69, 0x7b, 0x23, 0xab, 0x63, 0x2b, 0x73, 0x31, + 0x63, 0x0b, 0x3b, 0x9b, 0x1b, 0x45, 0x30, 0x83, 0x33, 0x38, 0x85, 0x8d, + 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x94, 0x00, 0x0d, + 0x6e, 0x09, 0x4b, 0x93, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, + 0x1b, 0x25, 0x48, 0x83, 0xa3, 0xc2, 0xd2, 0xe4, 0x5c, 0xd8, 0xc2, 0xdc, + 0xce, 0xea, 0xc2, 0xce, 0xca, 0xbe, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, + 0xdc, 0x46, 0x09, 0xd4, 0xe0, 0xa6, 0xb0, 0x34, 0x39, 0x97, 0xb1, 0xb7, + 0x36, 0xb8, 0x34, 0xb6, 0xb2, 0xaf, 0x37, 0x38, 0xba, 0xb4, 0x37, 0xb7, + 0xb9, 0x51, 0x86, 0x35, 0x60, 0x83, 0x36, 0x38, 0x25, 0x2c, 0x4d, 0xce, + 0xc5, 0xae, 0x4c, 0x8e, 0xae, 0x0c, 0x6f, 0x94, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, @@ -1296,14 +648,757 @@ const unsigned char sdl_metallib[] = { 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, - 0x00, 0x6d, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0xd4, 0x6a, 0x60, 0x04, 0x80, 0xdc, 0x0c, - 0x00, 0xbd, 0x11, 0x00, 0xb2, 0x63, 0x0d, 0x40, 0x20, 0x8c, 0x00, 0x10, - 0x9e, 0x83, 0x28, 0x06, 0x01, 0x0c, 0xc6, 0x22, 0x80, 0x40, 0x38, 0x08, - 0x8c, 0x00, 0x50, 0x98, 0x01, 0xa0, 0x3b, 0x03, 0x00, 0xf1, 0x30, 0x00, - 0x00, 0x48, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x1e, 0x08, - 0x59, 0x00, 0x00, 0x00, 0x00, 0x63, 0x80, 0x61, 0x56, 0xf5, 0x3c, 0x00, - 0x00, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, + 0x00, 0x8a, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x00, 0x00, 0xc4, 0x4a, 0xa0, 0x0c, 0x8a, 0x80, 0xdc, + 0x08, 0xc0, 0x58, 0x44, 0x10, 0x04, 0xc1, 0x58, 0x84, 0x20, 0x08, 0xc2, + 0x58, 0xc4, 0x30, 0x0c, 0x03, 0x85, 0x19, 0x80, 0x19, 0x00, 0x12, 0x33, + 0x00, 0x34, 0x66, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0xc8, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0xcf, 0x13, 0x06, 0x96, 0x05, 0x00, 0x00, 0x00, 0x6f, 0x6d, 0x6e, + 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, + 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, + 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x29, + 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x34, 0x29, 0x61, 0x69, + 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x00, 0x13, 0x04, 0x06, + 0x59, 0x21, 0x80, 0x02, 0x1f, 0xac, 0x18, 0x42, 0x01, 0x14, 0xfa, 0x60, + 0xc5, 0x20, 0x0a, 0xa0, 0xe0, 0x07, 0x1b, 0x82, 0x3d, 0xd8, 0x30, 0xe8, + 0xc1, 0x28, 0xfc, 0xc1, 0x86, 0x81, 0x14, 0x48, 0xe1, 0x0f, 0x36, 0x04, + 0xa1, 0xb0, 0x21, 0x10, 0x05, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x10, 0x8c, + 0x64, 0x49, 0x14, 0x84, 0xb2, 0x0b, 0xf1, 0x50, 0x18, 0x45, 0x41, 0x28, + 0x83, 0x0c, 0xc3, 0xc1, 0x98, 0x10, 0x88, 0xff, 0x2e, 0xc4, 0x84, 0x71, + 0x11, 0x05, 0xa1, 0x0c, 0x32, 0x1c, 0xcc, 0x63, 0x42, 0x20, 0xfe, 0x16, + 0x14, 0xe0, 0xbf, 0x0b, 0x81, 0x75, 0x61, 0x40, 0x51, 0x10, 0xca, 0x20, + 0x03, 0x13, 0x4d, 0x26, 0x04, 0xe2, 0x6f, 0x45, 0x00, 0xfe, 0xbb, 0x10, + 0x9d, 0x18, 0x98, 0x81, 0x46, 0x41, 0x28, 0x83, 0x0c, 0x91, 0x75, 0x99, + 0x10, 0x88, 0xbf, 0x15, 0x01, 0xf8, 0xef, 0x42, 0x84, 0xc1, 0x19, 0xac, + 0x01, 0x18, 0x50, 0x10, 0xca, 0x20, 0x43, 0xa0, 0x7d, 0x16, 0x54, 0xe2, + 0x3f, 0xc8, 0x30, 0x74, 0x60, 0x60, 0xc1, 0x24, 0xfe, 0x36, 0x04, 0xe0, + 0x3f, 0xc8, 0x60, 0x80, 0x81, 0x18, 0x58, 0x10, 0x89, 0xbf, 0x0d, 0x01, + 0xf8, 0x0f, 0x32, 0x24, 0x63, 0x40, 0x06, 0x16, 0x3c, 0xe2, 0x6f, 0x43, + 0x00, 0xfe, 0xbb, 0x10, 0x6e, 0x40, 0x07, 0x78, 0xc0, 0x06, 0x14, 0x84, + 0x32, 0xc8, 0x10, 0x9c, 0x01, 0x1b, 0x58, 0x20, 0x06, 0xe2, 0x3f, 0xc8, + 0x30, 0xa8, 0x41, 0x1b, 0x58, 0x00, 0x06, 0xe2, 0x3f, 0xc8, 0x50, 0xb0, + 0x81, 0x1b, 0x58, 0xd0, 0x89, 0xff, 0x20, 0xc3, 0xe1, 0x06, 0x6f, 0x60, + 0x81, 0x26, 0xfe, 0x83, 0x0c, 0x7c, 0xe0, 0x06, 0x74, 0x60, 0x59, 0x20, + 0xfe, 0x83, 0x0c, 0x7e, 0x00, 0x07, 0x75, 0x60, 0x4e, 0x20, 0xfe, 0x96, + 0x0c, 0xe0, 0x6f, 0x01, 0x03, 0xfe, 0x16, 0x24, 0xe0, 0x6f, 0x01, 0x02, + 0xfe, 0x16, 0x14, 0xe0, 0x3f, 0xdb, 0x60, 0x07, 0x01, 0x30, 0xdb, 0x10, + 0x94, 0x42, 0x30, 0xdb, 0x10, 0x94, 0x82, 0x90, 0x41, 0x40, 0x0c, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, 0x20, 0x85, 0xa3, 0x14, + 0x10, 0x53, 0xd8, 0x72, 0x0c, 0x01, 0x29, 0x1c, 0xa6, 0x80, 0x94, 0xc2, + 0x96, 0xe3, 0x08, 0x48, 0xe1, 0x30, 0x05, 0xa4, 0x14, 0xb6, 0x1c, 0x4c, + 0x40, 0x0a, 0x87, 0x29, 0x20, 0xa5, 0xb0, 0xe5, 0x88, 0x02, 0x52, 0x38, + 0x4c, 0x01, 0x29, 0x85, 0x2d, 0x87, 0x15, 0x90, 0xc2, 0x51, 0x0a, 0x88, + 0x29, 0x6c, 0x39, 0xc6, 0x20, 0x20, 0x85, 0xa3, 0x14, 0x10, 0x53, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xde, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x12, 0x03, 0x94, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x0f, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x12, 0x03, 0x94, 0x77, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, + 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x61, 0x69, 0x72, + 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x69, 0x6f, 0x73, + 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, + 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xf4, 0x0d, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, + 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x40, 0x03, 0x00, + 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, + 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, + 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32, + 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x42, 0x88, 0x48, 0x90, 0x14, + 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, + 0x90, 0x11, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, + 0x8a, 0x04, 0x21, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x71, 0x00, 0x00, + 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0x03, + 0x40, 0x02, 0x28, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0, + 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, + 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, + 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, 0x60, 0x87, + 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, 0x18, 0x07, + 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, 0xa0, 0x07, + 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda, + 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, + 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, + 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, + 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07, + 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, + 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, + 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, + 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87, + 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, + 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc, + 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, + 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87, + 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, + 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, + 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca, + 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda, + 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, + 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, + 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87, + 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, + 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda, + 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, + 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, + 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88, + 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07, + 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, + 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0xe0, 0x09, 0x03, 0xb0, 0x00, 0x55, 0x90, + 0x06, 0x60, 0x30, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, + 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, + 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x84, 0x40, 0x00, 0x89, 0x20, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08, 0x09, 0x20, 0x64, 0x85, + 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, 0xe3, 0x84, 0xa1, 0x90, + 0x14, 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, 0x4c, 0x10, 0x3c, 0x33, + 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, 0x67, 0x49, 0x53, 0x44, + 0x09, 0x93, 0xcf, 0x1e, 0xc0, 0x40, 0x44, 0x9c, 0xd3, 0x48, 0x13, 0xd0, + 0x4c, 0x12, 0x42, 0x00, 0x00, 0x00, 0x00, 0x06, 0x11, 0x06, 0xa1, 0x10, + 0x21, 0x41, 0x54, 0x03, 0x01, 0x73, 0x04, 0x60, 0x90, 0x02, 0x38, 0x47, + 0x00, 0x0a, 0x83, 0x08, 0x80, 0x30, 0x8c, 0x30, 0x00, 0xc3, 0x08, 0x04, + 0x32, 0x02, 0x00, 0x00, 0x00, 0x13, 0xbe, 0x70, 0x48, 0x07, 0x79, 0xb0, + 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, + 0x83, 0x74, 0x78, 0x87, 0x79, 0x88, 0x83, 0x39, 0x70, 0x03, 0x38, 0x70, + 0x03, 0x38, 0x68, 0x83, 0x79, 0x48, 0x87, 0x76, 0xa8, 0x07, 0x76, 0x08, + 0x07, 0x7a, 0x78, 0x07, 0x79, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, + 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, + 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, + 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, + 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, + 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, + 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, + 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, + 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, + 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, + 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, + 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, + 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, + 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, + 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, + 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, + 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, + 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, + 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, + 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, + 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, + 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, + 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, + 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, + 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, + 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, + 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, + 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x11, 0xc2, 0x90, 0x12, 0xdb, + 0x95, 0x3f, 0xeb, 0x2c, 0xc8, 0xf0, 0x17, 0x11, 0x60, 0x30, 0x44, 0x33, + 0x0d, 0x89, 0x00, 0xa9, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x0d, 0x02, 0x45, 0x85, 0x06, 0x00, 0x00, 0xb2, + 0x40, 0x0d, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, + 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xc2, 0x22, 0x28, 0x81, + 0x42, 0x18, 0x01, 0x28, 0xa0, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, + 0x29, 0x1c, 0xd2, 0x11, 0x80, 0x42, 0x28, 0x88, 0xc2, 0x28, 0x90, 0x42, + 0x29, 0x98, 0xc2, 0xa1, 0x1c, 0x4b, 0x90, 0x04, 0x00, 0xb1, 0x18, 0x00, + 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, + 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, + 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, + 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, + 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, + 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, + 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, + 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, + 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, + 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, + 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, + 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, + 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, + 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, + 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, + 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, + 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, + 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, + 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, + 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, + 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, + 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, + 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, + 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, + 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, + 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, + 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, + 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, + 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, + 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, + 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, + 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, + 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, + 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, + 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, + 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, + 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, + 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, + 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, + 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, + 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, + 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, + 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, + 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, + 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, + 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, + 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, + 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, + 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, + 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, + 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, + 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, + 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, + 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, + 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, 0x00, 0xf6, 0x00, 0x00, + 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, + 0x11, 0x32, 0x64, 0xd4, 0xca, 0x00, 0x0c, 0x66, 0x09, 0x8b, 0x12, 0x07, + 0xc5, 0xc6, 0x91, 0x41, 0x14, 0x19, 0x52, 0xa6, 0x3c, 0x06, 0x83, 0x58, + 0x85, 0xf2, 0x48, 0x08, 0x55, 0x30, 0x8c, 0xb2, 0x38, 0xcf, 0xf3, 0x44, + 0xd7, 0x13, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, + 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32, + 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74, + 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, + 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, + 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, + 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e, + 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x76, 0x32, 0x5f, + 0x66, 0x29, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x61, 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x61, 0x69, 0x72, + 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, + 0x5f, 0x66, 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x61, 0x69, 0x72, 0x2e, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, + 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, + 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74, 0x6f, 0x6e, + 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x74, + 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77, 0x68, 0x69, + 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e, + 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x74, 0x73, 0x63, 0x00, 0x44, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x82, 0x80, 0x04, 0x23, 0x08, 0x09, 0x35, 0x82, 0x80, 0x08, + 0x23, 0x08, 0xc8, 0x30, 0x82, 0x80, 0x10, 0x23, 0x08, 0x06, 0x30, 0x82, + 0x80, 0x14, 0x23, 0x08, 0x88, 0x31, 0x82, 0x80, 0x1c, 0x23, 0x08, 0x08, + 0x32, 0x82, 0x80, 0x24, 0x23, 0x08, 0x88, 0x32, 0x82, 0x80, 0x2c, 0x33, + 0x0c, 0x66, 0x10, 0x9c, 0xc1, 0x0c, 0x03, 0x1a, 0x08, 0x69, 0x30, 0x43, + 0x30, 0xcc, 0x30, 0x98, 0x81, 0x19, 0xa8, 0xc1, 0x0c, 0x04, 0x81, 0x06, + 0x68, 0xa0, 0x06, 0x33, 0x04, 0xc5, 0x0c, 0x81, 0x31, 0x43, 0x70, 0xcc, + 0x50, 0x20, 0x6a, 0xa0, 0x06, 0x89, 0x32, 0x43, 0xb0, 0x07, 0x33, 0x24, + 0x6a, 0xb0, 0x30, 0x8d, 0x93, 0x3c, 0x50, 0x34, 0x43, 0x82, 0x06, 0x8b, + 0xd4, 0x38, 0x89, 0x02, 0x4d, 0x33, 0xa0, 0x81, 0x1a, 0xa4, 0x81, 0x1a, + 0x64, 0x5a, 0x1a, 0xa4, 0x81, 0x1a, 0x64, 0x5b, 0x1b, 0xa4, 0x81, 0x1a, + 0x64, 0x9c, 0x1b, 0xa4, 0x81, 0x1a, 0x64, 0xdd, 0x1b, 0xa4, 0x81, 0x1a, + 0x64, 0x1e, 0x1c, 0xa4, 0x81, 0x1a, 0x64, 0x5f, 0x1c, 0xa4, 0x81, 0x1a, + 0x64, 0x60, 0x20, 0x07, 0x69, 0xa0, 0x06, 0x59, 0x18, 0xcc, 0x20, 0x99, + 0x01, 0x55, 0xb1, 0x81, 0xa5, 0x06, 0x68, 0x70, 0x61, 0x7f, 0x20, 0x06, + 0x6c, 0x30, 0x06, 0x69, 0x90, 0x90, 0x01, 0x54, 0x06, 0x33, 0x0c, 0x7d, + 0xe0, 0x07, 0xa0, 0x30, 0xc3, 0xb0, 0x06, 0x7c, 0x10, 0x0a, 0xd5, 0x01, + 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x9c, 0x1b, 0xb8, + 0x81, 0x45, 0x07, 0x7a, 0x60, 0x59, 0x96, 0x1e, 0x70, 0xac, 0xc0, 0x0a, + 0x62, 0xe3, 0x17, 0x74, 0x20, 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d, 0xcd, + 0xae, 0xcd, 0xa5, 0xed, 0x8d, 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c, 0x2d, + 0xec, 0x6c, 0x6e, 0x14, 0x41, 0x0e, 0xe6, 0xe0, 0x14, 0x36, 0x36, 0xbb, + 0x36, 0x97, 0x34, 0xb2, 0x32, 0x37, 0xba, 0x51, 0x02, 0x3a, 0xb8, 0x25, + 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x94, + 0xa0, 0x0e, 0x8e, 0x0a, 0x4b, 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b, 0xab, + 0x0b, 0x3b, 0x2b, 0xfb, 0xb2, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, + 0x25, 0xb0, 0x83, 0x9b, 0xc2, 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda, 0xe0, + 0xd2, 0xd8, 0xca, 0xbe, 0xde, 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0x46, + 0x19, 0xee, 0x00, 0x0f, 0xf2, 0xe0, 0x98, 0xb0, 0x34, 0x39, 0x17, 0x33, + 0xb9, 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, 0x51, 0x82, 0x50, 0x00, 0x00, + 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, + 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, + 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, + 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, + 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, + 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, + 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, + 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, + 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, + 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, + 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, + 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, + 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, + 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, + 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x4e, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x84, 0x65, 0x30, 0x03, 0x40, 0x5a, 0x06, + 0xd4, 0x73, 0x10, 0x04, 0x41, 0x64, 0x04, 0x63, 0x04, 0x20, 0x08, 0x82, + 0xf8, 0x47, 0x3c, 0x03, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0x48, 0x3d, 0x00, 0x00, 0x00, + 0x00, 0xd5, 0xf3, 0x90, 0x81, 0x05, 0x00, 0x00, 0x00, 0x5f, 0x5a, 0x54, + 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f, + 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d, + 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, + 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, + 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, + 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x32, 0x29, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x85, 0x99, 0x20, 0x28, 0xcd, 0x04, 0x41, 0x71, 0x26, + 0x08, 0xca, 0x33, 0x41, 0x50, 0xa0, 0x09, 0x82, 0x12, 0x4d, 0x10, 0x14, + 0x69, 0x82, 0xa0, 0x4c, 0x2b, 0x04, 0x58, 0x30, 0x85, 0x15, 0x43, 0x2c, + 0xc0, 0xc2, 0x29, 0x6c, 0x08, 0x4a, 0x61, 0xc3, 0x40, 0x0a, 0xb2, 0x80, + 0x0a, 0x1b, 0x86, 0x6c, 0x16, 0x50, 0x61, 0x43, 0x34, 0x0a, 0xb4, 0x80, + 0x0a, 0xb4, 0x90, 0x0a, 0xb4, 0xa0, 0x0a, 0xb4, 0xb0, 0x0a, 0xb4, 0xc0, + 0x0a, 0xb4, 0xd0, 0x0a, 0xb4, 0xe0, 0x0a, 0xb4, 0xf0, 0x0a, 0x1b, 0x86, + 0x5a, 0xa0, 0x85, 0x55, 0xd8, 0x10, 0xc4, 0x02, 0x00, 0x7b, 0x86, 0x43, + 0x32, 0x28, 0x80, 0x31, 0xc7, 0x30, 0x04, 0xd4, 0x20, 0x43, 0x40, 0x18, + 0x73, 0x0c, 0x81, 0x81, 0x58, 0xd0, 0x88, 0x7f, 0x06, 0x01, 0x31, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x5b, 0x8a, 0x20, 0xa8, 0x85, 0xc3, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xf2, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x12, 0x03, 0x94, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x12, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x12, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x12, 0x03, 0x94, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, + 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, + 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, + 0x69, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, + 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x30, 0x1f, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, + 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x04, 0x07, 0x00, + 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, + 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, + 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, + 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, + 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, + 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, + 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x64, 0x01, 0x00, + 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x58, 0x03, + 0x40, 0x02, 0x2a, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0, + 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, + 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, + 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, 0x60, 0x87, + 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, 0x18, 0x07, + 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, 0xa0, 0x07, + 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda, + 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, + 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, + 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, + 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07, + 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, + 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, + 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, + 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87, + 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, + 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc, + 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, + 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87, + 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, + 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, + 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca, + 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda, + 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, + 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, + 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87, + 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, + 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda, + 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, + 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, + 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88, + 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07, + 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, + 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0xe0, 0x09, 0x04, 0xb0, 0x00, 0x55, 0x90, + 0x06, 0x60, 0x30, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, + 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, + 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0xc1, 0x18, 0x0a, + 0x60, 0x01, 0xaa, 0x0d, 0x06, 0x61, 0x00, 0x0b, 0x50, 0x6d, 0x08, 0x93, + 0xe2, 0xff, 0xff, 0xff, 0xff, 0x07, 0x60, 0x0d, 0x00, 0x09, 0xa8, 0x88, + 0x70, 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, + 0x7a, 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, + 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, + 0xa2, 0x1d, 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, + 0x81, 0x1d, 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, + 0xa1, 0x0d, 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, + 0x39, 0xc0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, + 0x74, 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, + 0x77, 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, + 0x78, 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, + 0x72, 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, + 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, + 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, + 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, + 0xe1, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, + 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, + 0x74, 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, + 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, + 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, + 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, + 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, + 0x36, 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, + 0x7d, 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, + 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, + 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, + 0x01, 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, + 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, + 0x79, 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, + 0x77, 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, + 0x71, 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, + 0x74, 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, + 0x21, 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, + 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, + 0x60, 0x43, 0x62, 0x08, 0xc0, 0x02, 0x54, 0x41, 0x1a, 0x80, 0xc1, 0x06, + 0xe3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0x83, 0x8f, + 0x20, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00, + 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0, + 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, + 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b, + 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b, + 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b, + 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03, 0x90, 0x07, 0x76, 0x00, + 0x0c, 0xee, 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5, 0x90, 0x0e, 0xec, 0x40, + 0x0f, 0xe9, 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x60, + 0x0e, 0xf2, 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0xef, 0x90, + 0x0e, 0xee, 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d, 0x50, 0x0e, 0xec, 0x90, + 0x0e, 0xed, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, + 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94, 0x43, 0x1b, + 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, 0x43, 0x1b, + 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81, 0x3b, 0xbc, 0x83, 0x3b, + 0xb4, 0x01, 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03, 0x40, 0x0f, 0xf2, 0x50, + 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x90, 0x0e, 0xee, 0x60, + 0x0e, 0xf3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, + 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, + 0xbc, 0x43, 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3, 0x3c, 0xb4, 0x81, 0x39, + 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, + 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xf3, 0x90, + 0x0e, 0xe7, 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d, 0xa0, 0x0f, 0xe5, 0x20, + 0x0f, 0xef, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, + 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, + 0xb8, 0xc3, 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43, 0x38, 0xc0, 0x03, 0x3c, + 0xa4, 0x83, 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, + 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0x31, 0x0f, 0xf4, 0x10, + 0x0e, 0xe3, 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2, 0xf0, 0x0e, 0xf4, 0x50, + 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d, 0x20, 0x0e, 0xf5, 0x60, + 0x0e, 0xe6, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xfa, 0x50, + 0x0e, 0x00, 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3, 0x3c, 0x84, 0x83, 0x39, + 0x94, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, + 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x6c, 0x50, 0x92, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x36, 0x00, 0xd6, 0x00, 0x90, 0x80, + 0x6a, 0x83, 0xa1, 0x04, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x45, 0x00, 0x16, + 0xa0, 0xda, 0xa0, 0x30, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x6d, 0x00, + 0xac, 0x01, 0x20, 0x01, 0xd5, 0x86, 0xa9, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x58, 0x03, 0x40, 0x19, 0xdc, 0xe1, 0x1d, 0xda, 0x40, 0x1c, 0xea, + 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, 0x01, 0xd8, 0x50, + 0x38, 0x42, 0x90, 0x06, 0x60, 0xb0, 0xc1, 0x78, 0xfe, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0x24, 0x80, 0xda, 0x10, 0x41, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x00, 0xca, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe9, 0xc0, + 0x0e, 0xf4, 0x90, 0x0e, 0xee, 0x30, 0x0f, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x42, + 0x61, 0x4c, 0x08, 0x8e, 0x09, 0x01, 0x32, 0x61, 0x48, 0x94, 0x65, 0xc2, + 0xc0, 0x28, 0xcb, 0x04, 0xa1, 0x71, 0x26, 0x04, 0xcf, 0x84, 0x00, 0x02, + 0x00, 0x89, 0x20, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, + 0x4c, 0x10, 0xb4, 0xc1, 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, + 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, + 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x41, 0x84, 0x41, 0x38, 0x4a, 0x9a, 0x22, 0x4a, 0x98, 0xfc, + 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, 0xdf, 0x1e, 0xfe, 0x69, 0x8c, 0x00, + 0x18, 0x44, 0x28, 0x82, 0x8b, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x25, + 0x80, 0x79, 0x16, 0x22, 0xfa, 0xa7, 0x31, 0x02, 0x60, 0x10, 0xe1, 0x10, + 0xca, 0x11, 0x04, 0x81, 0x40, 0x18, 0x08, 0x25, 0x65, 0x08, 0x02, 0x82, + 0x96, 0x61, 0x84, 0x01, 0x28, 0x44, 0xd3, 0x34, 0x0d, 0x39, 0x65, 0x00, + 0x00, 0x80, 0xa0, 0x22, 0x00, 0x00, 0x49, 0x73, 0x04, 0x41, 0x11, 0x28, + 0x80, 0xaa, 0x32, 0x00, 0x4d, 0x43, 0x57, 0x31, 0x9a, 0x06, 0x00, 0x00, + 0x80, 0xb2, 0x32, 0x34, 0x4d, 0x43, 0x5b, 0x11, 0x9a, 0x86, 0xba, 0x39, + 0x02, 0xc4, 0x08, 0xc1, 0x37, 0x47, 0x00, 0x06, 0xc3, 0x08, 0x42, 0x18, + 0x14, 0x05, 0x34, 0x10, 0x81, 0x12, 0x29, 0x00, 0x08, 0x69, 0x1c, 0x08, + 0x48, 0x81, 0x70, 0x04, 0x60, 0x8e, 0x00, 0x14, 0x06, 0x11, 0x00, 0x61, + 0x0a, 0x60, 0x18, 0x61, 0x08, 0x83, 0x61, 0x04, 0x22, 0x0c, 0x00, 0x00, + 0x00, 0x13, 0xbe, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, + 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, + 0x79, 0x88, 0x83, 0x39, 0x70, 0x03, 0x38, 0x70, 0x03, 0x38, 0x68, 0x83, + 0x79, 0x48, 0x87, 0x76, 0xa8, 0x07, 0x76, 0x08, 0x07, 0x7a, 0x78, 0x07, + 0x79, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, + 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, + 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, + 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, + 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, + 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, + 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, + 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, + 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, + 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, + 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, + 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, + 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, + 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, + 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, + 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, + 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, + 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, + 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x11, 0xc2, 0x90, 0x11, 0xdb, 0x95, 0x3f, 0xe7, 0x3c, + 0xd8, 0x5f, 0x44, 0x80, 0xc1, 0x10, 0xcd, 0x34, 0x24, 0x02, 0xa2, 0x04, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x86, 0x44, + 0x11, 0x1e, 0x2c, 0x08, 0x30, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x30, 0x24, 0x4a, 0x05, 0xca, 0x01, 0x02, 0x60, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, 0x51, 0x2f, 0x40, 0x10, 0x10, 0x00, + 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x89, 0xda, 0x21, + 0x92, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, + 0x48, 0xe4, 0x0f, 0x56, 0x05, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x43, 0x22, 0x9a, 0x68, 0x2e, 0x20, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x12, 0x85, 0x45, 0x96, 0x21, + 0xc0, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xc0, 0x90, 0x48, + 0x2f, 0x22, 0x08, 0x08, 0x80, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x86, 0x44, 0xab, 0x21, 0x6d, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x30, 0x24, 0xea, 0x8d, 0xa9, 0x03, 0x02, 0x60, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, 0x11, 0x7c, 0x4c, + 0x1b, 0x10, 0x00, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x89, 0x46, 0x64, 0x1b, 0x03, 0x20, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x90, 0xd8, 0x20, 0x50, 0xb4, 0xe0, 0x00, 0x00, 0x20, + 0x0b, 0x04, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, + 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, + 0x0a, 0x8b, 0xa0, 0x04, 0x0a, 0x61, 0x04, 0xa0, 0x0c, 0x0a, 0xa8, 0x20, + 0x0a, 0xa3, 0x40, 0x0a, 0xa5, 0x60, 0x0a, 0xa7, 0x14, 0x08, 0x1d, 0x01, + 0x28, 0x84, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0x32, + 0xc7, 0x12, 0x24, 0x01, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, + 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, + 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, + 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, + 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, + 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, + 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, + 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, + 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, + 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, + 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, + 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, + 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, + 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, + 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, + 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, + 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, + 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, + 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, + 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, + 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, + 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, + 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, + 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, + 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, + 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, + 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, + 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, + 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, + 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, + 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, + 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, + 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, + 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, + 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, + 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, + 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, + 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, + 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, + 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, + 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, + 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, + 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, + 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, + 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, + 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, + 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, + 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, + 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, + 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, + 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, + 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, + 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, + 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, + 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, + 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x79, 0x20, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x32, 0x9a, 0x08, + 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4, + 0xde, 0x00, 0x0d, 0x48, 0x0b, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x41, + 0x14, 0x19, 0x8c, 0x22, 0x31, 0x88, 0x64, 0x3d, 0x45, 0x66, 0x20, 0xca, + 0x23, 0x21, 0x54, 0xc1, 0x30, 0xca, 0xe2, 0x3c, 0xcf, 0x13, 0x5d, 0x4f, + 0xb0, 0x28, 0xd8, 0xb0, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b, + 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, + 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, + 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, + 0x28, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, + 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, + 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, + 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, + 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x69, 0x72, + 0x2e, 0x6e, 0x6f, 0x5f, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x69, 0x72, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, + 0x5f, 0x66, 0x29, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, + 0x72, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, + 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, + 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, + 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, + 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, + 0x64, 0x72, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, + 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x61, 0x69, + 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x61, 0x69, 0x72, + 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x78, 0x74, 0x75, + 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x61, 0x69, + 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x72, 0x73, 0x24, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x82, 0x10, 0x06, 0xcd, 0x08, 0x82, 0x19, 0x88, 0xc1, 0x08, + 0x42, 0x18, 0x38, 0x23, 0x08, 0x61, 0xf0, 0x8c, 0x20, 0x84, 0x01, 0x34, + 0x82, 0xa0, 0x00, 0x23, 0x08, 0x61, 0x10, 0x8d, 0x20, 0x84, 0x81, 0x34, + 0x82, 0x10, 0x06, 0xd3, 0x08, 0x42, 0x18, 0x50, 0x23, 0x08, 0x61, 0x50, + 0x8d, 0x20, 0x84, 0x81, 0x35, 0x82, 0x10, 0x06, 0xd7, 0x08, 0x42, 0x18, + 0x60, 0x23, 0x08, 0x61, 0x90, 0xcd, 0x30, 0xc0, 0x41, 0x10, 0x07, 0x33, + 0x0c, 0x72, 0x20, 0xcc, 0xc1, 0x0c, 0xc1, 0x30, 0xc3, 0x00, 0x07, 0x70, + 0x40, 0x07, 0x33, 0x10, 0x84, 0x1c, 0xc8, 0x01, 0x1d, 0xcc, 0x10, 0x14, + 0x33, 0x04, 0xc6, 0x0c, 0xc1, 0x31, 0x43, 0x81, 0xd0, 0x01, 0x1d, 0x24, + 0xca, 0x0c, 0xc1, 0x29, 0xcc, 0x80, 0xd0, 0xc1, 0xc2, 0x34, 0x89, 0xe2, + 0x3c, 0x33, 0x24, 0x72, 0x00, 0x45, 0x8c, 0x94, 0x28, 0xce, 0x34, 0x43, + 0x02, 0x07, 0x10, 0xc5, 0x48, 0x49, 0xe5, 0x58, 0x33, 0xa0, 0x01, 0x1d, + 0xcc, 0x01, 0x1d, 0x70, 0xdd, 0x1c, 0xcc, 0x01, 0x1d, 0x70, 0x1e, 0x1e, + 0xcc, 0x01, 0x1d, 0x70, 0x5f, 0x1e, 0xcc, 0x01, 0x1d, 0x70, 0x60, 0xa0, + 0x07, 0x73, 0x40, 0x07, 0x5c, 0x18, 0xec, 0xc1, 0x1c, 0xd0, 0x01, 0x27, + 0x06, 0x7c, 0x30, 0x07, 0x74, 0xc0, 0x8d, 0x41, 0x1f, 0xcc, 0x01, 0x1d, + 0x70, 0x64, 0x30, 0x83, 0x64, 0x07, 0x17, 0x76, 0x07, 0x19, 0x1d, 0xc8, + 0x81, 0xb6, 0xb1, 0x42, 0x19, 0xdc, 0x81, 0x19, 0xcc, 0x41, 0x72, 0x06, + 0x0e, 0x1a, 0xcc, 0xa0, 0xcc, 0x41, 0x1a, 0x64, 0x74, 0x20, 0x07, 0x6a, + 0x90, 0xac, 0x81, 0xc3, 0x06, 0x33, 0x24, 0x7e, 0xd0, 0x06, 0x19, 0x1d, + 0xc8, 0x41, 0xe2, 0x06, 0xce, 0x1b, 0xcc, 0x60, 0xa4, 0x82, 0x2a, 0xac, + 0x42, 0x2b, 0xb8, 0xc2, 0x2b, 0xcc, 0x30, 0xd4, 0x01, 0x2a, 0xc0, 0x42, + 0x89, 0x01, 0x20, 0x06, 0x68, 0x20, 0x06, 0x62, 0x20, 0x06, 0x9c, 0x18, + 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, + 0xb8, 0x81, 0x1b, 0x58, 0x74, 0xa0, 0x07, 0x96, 0x65, 0xe9, 0x01, 0x67, + 0x0a, 0xac, 0xc0, 0x0a, 0x74, 0xe3, 0x17, 0xf6, 0xa0, 0x0e, 0xb8, 0x20, + 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d, 0xcd, 0xae, 0xcd, 0xa5, 0xed, 0x8d, + 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c, 0x2d, 0xec, 0x6c, 0x6e, 0x14, 0xc1, + 0x0f, 0xfe, 0xe0, 0x14, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2, 0x32, + 0x37, 0xba, 0x51, 0x02, 0x50, 0xb8, 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae, + 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x94, 0x20, 0x14, 0x8e, 0x0a, 0x4b, + 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b, 0xab, 0x0b, 0x3b, 0x2b, 0xfb, 0xb2, + 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0x10, 0x85, 0x9b, 0xc2, + 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda, 0xe0, 0xd2, 0xd8, 0xca, 0xbe, 0xde, + 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0x46, 0x19, 0x46, 0x81, 0x14, 0x4a, + 0xe1, 0x98, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, 0xb6, 0x32, + 0x37, 0xba, 0x51, 0x02, 0x58, 0x00, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00, + 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, + 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, + 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, + 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, + 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4, + 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81, + 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08, + 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01, + 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c, + 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c, + 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c, + 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1, + 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, + 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, + 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x3e, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x44, 0xd5, 0xc0, 0x08, 0x00, 0x89, 0x23, 0x00, 0x04, 0x8c, 0x00, + 0x00, 0xf1, 0x30, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, + 0x90, 0x51, 0x12, 0x44, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x63, 0x80, 0x61, + 0x16, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, @@ -1311,56 +1406,1014 @@ const unsigned char sdl_metallib[] = { 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x5f, 0x5a, - 0x54, 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, 0x6e, 0x69, 0x70, - 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, - 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, - 0x41, 0x13, 0x04, 0xea, 0x99, 0x20, 0x50, 0xd0, 0x04, 0x81, 0x8a, 0x26, - 0x08, 0x94, 0x34, 0x41, 0xa0, 0xa6, 0x09, 0x02, 0x45, 0x4d, 0x10, 0xa8, - 0x6a, 0x82, 0x40, 0x59, 0x2b, 0x84, 0x70, 0x90, 0x85, 0x15, 0x83, 0x38, - 0x84, 0xc3, 0x2c, 0xac, 0x18, 0xc6, 0x21, 0x1c, 0x68, 0x61, 0xc5, 0x40, - 0x0e, 0xe1, 0x50, 0x0b, 0x1b, 0x84, 0x71, 0x10, 0x87, 0x0d, 0x01, 0x39, - 0x6c, 0x08, 0x70, 0x61, 0xc3, 0x70, 0x0b, 0xe7, 0x90, 0x0b, 0x1b, 0x06, - 0x0e, 0x1d, 0x72, 0x61, 0x43, 0x64, 0x0b, 0xe9, 0x90, 0x0b, 0xe9, 0xa0, - 0x0b, 0xe9, 0xb0, 0x0b, 0xe9, 0xc0, 0x0b, 0xe9, 0xd0, 0x0b, 0xe9, 0xe0, - 0x0b, 0xe9, 0xf0, 0x0b, 0xe9, 0x00, 0x0e, 0x1b, 0x06, 0x75, 0x48, 0x07, - 0x5e, 0x00, 0x00, 0x00, 0x00, 0x23, 0x06, 0xcd, 0x10, 0x82, 0x60, 0x00, - 0xa1, 0x41, 0xc3, 0x3c, 0x0b, 0xa2, 0x0c, 0x03, 0x19, 0x8c, 0x26, 0x04, - 0xc0, 0x1e, 0x03, 0xc4, 0x95, 0x01, 0x05, 0x60, 0x0c, 0x32, 0x0c, 0xc6, - 0x32, 0xc7, 0x60, 0x08, 0xdf, 0x20, 0x43, 0x70, 0x30, 0x16, 0x0c, 0xe2, - 0x3f, 0xc8, 0x10, 0x24, 0xcd, 0x20, 0x43, 0x80, 0x34, 0x16, 0x68, 0xe2, - 0x9f, 0x41, 0x40, 0x0c, 0x00, 0x05, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0, - 0x20, 0x07, 0xa4, 0x1c, 0xb6, 0x1c, 0x43, 0xa0, 0x0e, 0x47, 0x39, 0x20, - 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xc5, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, - 0x00, 0x25, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x28, 0x01, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x00, 0x00, + 0x00, 0x2b, 0x04, 0x5b, 0x90, 0x85, 0x15, 0xc3, 0x2d, 0xd8, 0xc2, 0x2c, + 0xac, 0x18, 0x70, 0xc1, 0x16, 0x68, 0x61, 0xc5, 0x90, 0x0b, 0xb6, 0x50, + 0x0b, 0x1b, 0x04, 0x5c, 0xb8, 0x85, 0x0d, 0x41, 0x2e, 0x00, 0x00, 0x00, + 0x00, 0x23, 0x06, 0x8d, 0x11, 0x82, 0x60, 0x30, 0x06, 0x61, 0x60, 0x14, + 0x08, 0x21, 0x0c, 0x41, 0xd0, 0x8d, 0x26, 0x04, 0xc0, 0x88, 0xc1, 0x71, + 0xc4, 0x20, 0x58, 0xf8, 0xc7, 0xe2, 0x06, 0x41, 0x62, 0x01, 0x23, 0xfe, + 0x19, 0x04, 0xc4, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0, + 0xc8, 0x05, 0x44, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0xe3, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00, + 0x00, 0x4f, 0x00, 0x00, 0x00, 0x14, 0x96, 0xc3, 0x0c, 0x40, 0x31, 0x10, + 0x5a, 0x02, 0x45, 0x40, 0xeb, 0x58, 0x03, 0x10, 0x08, 0x23, 0x00, 0xc4, + 0xce, 0x41, 0x40, 0x4e, 0x63, 0x06, 0x63, 0x11, 0x40, 0x20, 0x1c, 0x04, + 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x18, 0x81, 0x2c, 0xba, 0x3d, + 0x0d, 0x06, 0x63, 0x04, 0xb5, 0x5a, 0xab, 0xed, 0x37, 0x46, 0xd0, 0xc7, + 0xa2, 0x8b, 0x7f, 0x63, 0x04, 0x6e, 0x1f, 0x8b, 0xb6, 0x2f, 0x8c, 0x11, + 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, + 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, + 0x8d, 0x11, 0xbc, 0x7b, 0x5a, 0xde, 0xdf, 0x18, 0x81, 0xce, 0x9a, 0x73, + 0x08, 0x06, 0x23, 0x00, 0x63, 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, 0x8c, + 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x03, 0x40, 0xc1, 0x0c, 0xc0, + 0x0c, 0xc0, 0x1c, 0xc4, 0x1c, 0xe4, 0xc1, 0x1c, 0xf0, 0x01, 0x35, 0x33, + 0x00, 0x23, 0x00, 0x33, 0x00, 0x63, 0x0d, 0x20, 0x08, 0x82, 0xf8, 0x07, + 0x82, 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82, 0xf8, 0x37, 0xd6, 0xc0, 0xb6, + 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4, 0xc7, 0xb6, 0xf3, 0x4f, 0x7a, + 0x63, 0x0d, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, 0xc8, 0xd6, 0xbf, + 0x00, 0x82, 0x20, 0x5b, 0xff, 0xc2, 0x58, 0x03, 0x08, 0x82, 0x6b, 0x0e, + 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x80, 0x20, 0xb8, 0xe6, 0x60, 0x30, + 0xd6, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, 0x6d, 0x0e, 0x06, + 0x20, 0x48, 0xb7, 0x39, 0x18, 0x8c, 0x35, 0xac, 0x23, 0x1e, 0xb3, 0x60, + 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x3a, 0xe2, 0x31, 0x0b, 0x06, 0x63, + 0x0d, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, 0x87, 0x63, 0x00, + 0x82, 0x30, 0x1e, 0x8e, 0xc1, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, + 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, + 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, + 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, + 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x00, 0xf1, 0x30, 0x00, + 0x00, 0x32, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x0e, 0xc4, + 0x1d, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x00, 0x00, 0x5f, 0x5a, 0x54, + 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f, + 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d, + 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, + 0x00, 0x13, 0x04, 0x34, 0xd0, 0x26, 0x08, 0x68, 0xb0, 0x4d, 0x10, 0xd0, + 0x80, 0x9b, 0x20, 0xa0, 0x41, 0x37, 0x41, 0x40, 0x03, 0x6f, 0x82, 0x80, + 0x06, 0xdf, 0x04, 0x01, 0x0d, 0xc0, 0x60, 0x82, 0x80, 0x06, 0x61, 0xb0, + 0x21, 0xa0, 0x85, 0x0d, 0xc3, 0x2c, 0xf4, 0x42, 0x2d, 0x6c, 0x18, 0x38, + 0x5f, 0xa8, 0x85, 0x0d, 0x91, 0x2c, 0xfc, 0x42, 0x2d, 0xfc, 0x82, 0x2d, + 0xfc, 0xc2, 0x2d, 0xfc, 0x02, 0x2e, 0xfc, 0x42, 0x2e, 0xfc, 0x82, 0x2e, + 0xfc, 0xc2, 0x2e, 0xfc, 0x02, 0x2f, 0x6c, 0x18, 0xc0, 0xe1, 0x17, 0x6e, + 0x61, 0xc3, 0x00, 0x0e, 0xbf, 0xc0, 0x0b, 0x1b, 0x06, 0x70, 0xf8, 0x85, + 0x5c, 0xd8, 0x30, 0x80, 0xc3, 0x2f, 0xe8, 0xc2, 0x86, 0x01, 0x1c, 0x7e, + 0x61, 0x17, 0x36, 0x0c, 0xe0, 0xf0, 0x0b, 0xb6, 0xb0, 0x61, 0x00, 0x87, + 0x5f, 0xc0, 0x85, 0x0d, 0x03, 0x38, 0xfc, 0x42, 0x2d, 0x00, 0x00, 0x00, + 0x00, 0x7b, 0x18, 0xd2, 0x60, 0x0e, 0x40, 0x81, 0x02, 0x60, 0x0c, 0x47, + 0x04, 0x55, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0x0c, 0x32, 0xb4, 0xc1, + 0x64, 0x06, 0x7b, 0x18, 0xda, 0xe0, 0x0e, 0xd8, 0x80, 0x02, 0x60, 0x8c, + 0x18, 0x18, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x74, 0xa9, 0x30, 0x8c, 0x18, + 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x6c, 0xab, 0x10, 0x40, 0x16, 0x40, + 0xe0, 0x3f, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0xb1, 0xad, 0x42, + 0x50, 0xd9, 0x10, 0x89, 0xbf, 0x45, 0x41, 0xf8, 0xdb, 0x10, 0x90, 0xff, + 0x88, 0x81, 0x81, 0x84, 0x20, 0x58, 0xf8, 0x47, 0x07, 0x0b, 0xc1, 0x88, + 0xc1, 0x81, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0x26, 0x0b, 0xc1, 0x64, 0xc1, + 0x24, 0xfe, 0x73, 0x0c, 0xdd, 0x32, 0x0a, 0x83, 0x0c, 0x81, 0x37, 0x07, + 0x36, 0x04, 0xe4, 0x3f, 0xc8, 0x10, 0x80, 0x01, 0x1d, 0x0c, 0x32, 0x04, + 0x7e, 0x40, 0x07, 0xb3, 0x04, 0xc2, 0x40, 0x45, 0x20, 0x04, 0xfe, 0x00, + 0xec, 0x61, 0xf8, 0x83, 0x54, 0xa0, 0x05, 0x0a, 0x80, 0x31, 0x1c, 0x11, + 0xb0, 0x81, 0xe3, 0x1f, 0xb3, 0x0c, 0x03, 0x11, 0x0c, 0x32, 0x10, 0x69, + 0xc0, 0x07, 0x7b, 0x18, 0x46, 0xa1, 0x15, 0x5c, 0x81, 0x02, 0x60, 0xec, + 0x61, 0x28, 0x85, 0x57, 0x10, 0x05, 0x0a, 0x80, 0x31, 0x62, 0xa0, 0x24, + 0x31, 0x08, 0x16, 0xfe, 0x91, 0x91, 0x43, 0xd1, 0x1d, 0x43, 0x30, 0xc8, + 0x10, 0xb0, 0x01, 0x28, 0x0c, 0x32, 0x04, 0x0b, 0x28, 0xcc, 0x12, 0x10, + 0x03, 0x15, 0x81, 0x30, 0x60, 0xc2, 0x70, 0x44, 0x18, 0xf0, 0x41, 0xe0, + 0x1f, 0xb3, 0x0c, 0xc5, 0x14, 0xec, 0x61, 0x60, 0x05, 0x5b, 0x10, 0x07, + 0x0a, 0x80, 0x31, 0x1c, 0x11, 0xfc, 0x41, 0xe0, 0x1f, 0xb3, 0x0c, 0xc6, + 0x11, 0x0c, 0x32, 0x14, 0x76, 0x90, 0x0a, 0x7b, 0x18, 0x60, 0x41, 0x17, + 0xc6, 0x81, 0x02, 0x60, 0xcc, 0x31, 0xd8, 0x41, 0xc0, 0x0b, 0x83, 0x0c, + 0xc1, 0x1d, 0xb0, 0x82, 0x05, 0x85, 0xf8, 0x0f, 0x32, 0x04, 0x79, 0xd0, + 0x0a, 0xb3, 0x04, 0x6d, 0xb0, 0x87, 0xc1, 0x16, 0xc0, 0x41, 0x1d, 0x28, + 0x00, 0xc6, 0x1e, 0x06, 0x5c, 0x10, 0x87, 0x75, 0xa0, 0x00, 0x18, 0x83, + 0x0c, 0x50, 0x28, 0xc8, 0xc2, 0x88, 0x41, 0x81, 0x84, 0x20, 0x18, 0x54, + 0xfa, 0x40, 0xcc, 0x32, 0x20, 0x52, 0x30, 0x86, 0x20, 0x99, 0xc3, 0x70, + 0x44, 0xd0, 0x0a, 0x8a, 0x7f, 0xcc, 0x32, 0x28, 0x49, 0x60, 0x42, 0x2b, + 0x88, 0xff, 0x2c, 0xc1, 0x62, 0x43, 0x2b, 0x80, 0xff, 0x88, 0x81, 0x81, + 0x84, 0x20, 0x58, 0xf8, 0x87, 0x04, 0x12, 0x81, 0x05, 0xae, 0x20, 0xfe, + 0x23, 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0xd0, 0x48, 0x04, 0xae, + 0x30, 0x4b, 0xb0, 0x0c, 0x54, 0x00, 0x4a, 0x22, 0x28, 0x73, 0x0c, 0xaa, + 0x10, 0xb8, 0xc3, 0x18, 0xc2, 0x16, 0x0e, 0xc3, 0x11, 0x81, 0x2d, 0x28, + 0xfe, 0x31, 0xcb, 0xd0, 0x30, 0x81, 0x09, 0xb6, 0x20, 0xfe, 0xb3, 0x04, + 0x8e, 0x0d, 0xb6, 0x00, 0xfe, 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1, + 0x1f, 0x52, 0x4a, 0x04, 0x16, 0xdc, 0x82, 0xf8, 0x8f, 0x18, 0x1c, 0x48, + 0x08, 0x82, 0x85, 0x7f, 0x40, 0x2c, 0x11, 0xdc, 0xc2, 0x2c, 0x81, 0x33, + 0x50, 0x01, 0x28, 0x8c, 0xd0, 0xcc, 0x31, 0x24, 0x41, 0x3a, 0x8c, 0x21, + 0x90, 0x41, 0x3a, 0x0c, 0x47, 0x04, 0xbf, 0xa0, 0xf8, 0xc7, 0x2c, 0x03, + 0xf4, 0x04, 0x26, 0xfc, 0x82, 0xf8, 0xcf, 0x12, 0x44, 0x36, 0xfc, 0x02, + 0xf8, 0x8f, 0x18, 0x18, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x48, 0x32, 0x11, + 0x58, 0x00, 0x0e, 0xe2, 0x3f, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, + 0x01, 0xd5, 0x44, 0x00, 0x0e, 0xb3, 0x04, 0xd1, 0x40, 0x05, 0xa0, 0x3c, + 0x02, 0x34, 0xc7, 0x90, 0x04, 0xf1, 0x30, 0x4b, 0x20, 0x0d, 0x54, 0x04, + 0x42, 0xa4, 0x07, 0xc7, 0x20, 0x43, 0xf0, 0x0b, 0xf2, 0x30, 0xc7, 0xd0, + 0x0b, 0x60, 0x30, 0x12, 0x83, 0x0c, 0x81, 0x2f, 0xcc, 0x83, 0x0d, 0x81, + 0xf8, 0x0f, 0x32, 0x04, 0xe0, 0x40, 0x0f, 0xb3, 0x04, 0x6d, 0x30, 0x1c, + 0x31, 0x0b, 0xe6, 0x10, 0xf8, 0xc7, 0x2c, 0x03, 0x05, 0x06, 0xc1, 0x20, + 0x03, 0x1d, 0x94, 0x03, 0x3e, 0xec, 0x61, 0xf8, 0x87, 0x94, 0x98, 0x09, + 0x0a, 0x80, 0xb1, 0x87, 0x21, 0x24, 0x56, 0x82, 0x26, 0x28, 0x00, 0xc6, + 0x1c, 0xc3, 0x39, 0x04, 0x2d, 0x31, 0xc8, 0x10, 0xa0, 0x43, 0x3f, 0x58, + 0x70, 0x88, 0xff, 0x20, 0x43, 0xa0, 0x0e, 0xfe, 0x30, 0x62, 0x50, 0x20, + 0x21, 0x08, 0x06, 0x95, 0x59, 0x1c, 0xb3, 0x0c, 0x5f, 0x15, 0x8c, 0x21, + 0x0c, 0x32, 0x31, 0x1c, 0x11, 0xfc, 0x83, 0xe2, 0x1f, 0xb3, 0x0c, 0x97, + 0x15, 0x98, 0xf0, 0x0f, 0xe2, 0x3f, 0x4b, 0x80, 0x8d, 0x18, 0x18, 0x48, + 0x08, 0x82, 0x85, 0x7f, 0x48, 0x6b, 0x31, 0x8c, 0x18, 0x1c, 0x48, 0x08, + 0x82, 0x85, 0x7f, 0x40, 0x6d, 0x11, 0x80, 0x84, 0x05, 0x20, 0x21, 0xfe, + 0x16, 0x80, 0x04, 0xf8, 0xcf, 0x12, 0x60, 0x03, 0x15, 0x80, 0x62, 0x09, + 0xd7, 0x1c, 0x83, 0x3c, 0x04, 0x3a, 0x31, 0x86, 0xc0, 0xb4, 0xc4, 0x70, + 0x44, 0x80, 0x12, 0x8a, 0x7f, 0xcc, 0x32, 0x68, 0x59, 0x60, 0x02, 0x4a, + 0x88, 0xff, 0x2c, 0xc1, 0x36, 0x62, 0x60, 0x20, 0x21, 0x08, 0x16, 0xfe, + 0x21, 0xd1, 0xc5, 0x30, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x01, + 0xd9, 0x45, 0x90, 0x12, 0x16, 0xa4, 0x84, 0xf8, 0x5b, 0x90, 0x12, 0xe0, + 0x3f, 0x4b, 0xb0, 0x0d, 0x54, 0x00, 0x4a, 0x26, 0x68, 0x73, 0x0c, 0x49, + 0x50, 0x13, 0x63, 0x08, 0x55, 0x4d, 0x0c, 0x47, 0x04, 0x31, 0xa1, 0xf8, + 0xc7, 0x2c, 0x43, 0xc7, 0x05, 0x26, 0xc4, 0x84, 0xf8, 0xcf, 0x12, 0x78, + 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x52, 0x5f, 0x0c, 0x23, + 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0xd0, 0x5f, 0x04, 0x32, 0x61, + 0x81, 0x4c, 0x88, 0xbf, 0x05, 0x32, 0x01, 0xfe, 0xb3, 0x04, 0xde, 0x40, + 0x05, 0xa0, 0x70, 0x42, 0x37, 0xc7, 0x90, 0x04, 0x3d, 0x31, 0x62, 0x80, + 0x20, 0x21, 0x08, 0x16, 0xfe, 0xe1, 0x94, 0x46, 0x60, 0x12, 0x24, 0x31, + 0xc8, 0x10, 0xa0, 0x04, 0x4f, 0xcc, 0x12, 0x7c, 0x03, 0x15, 0x81, 0x1f, + 0x50, 0x82, 0x37, 0xc8, 0x10, 0xb4, 0x84, 0x4f, 0xcc, 0x12, 0xb4, 0xc1, + 0x2c, 0x43, 0x18, 0xb4, 0x01, 0x3f, 0x0c, 0x32, 0xf4, 0x82, 0x4b, 0x84, + 0xc5, 0x88, 0xc1, 0x81, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0x65, 0x1a, 0x81, + 0x48, 0xcc, 0x31, 0xac, 0x44, 0x30, 0x17, 0x23, 0x06, 0x07, 0x12, 0x82, + 0x60, 0xe1, 0x1f, 0x17, 0x6a, 0x0c, 0x23, 0x31, 0xc7, 0x20, 0x04, 0x67, + 0x31, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x71, 0xa9, 0x46, 0x41, + 0x12, 0x73, 0x0c, 0x42, 0x80, 0x16, 0x83, 0x0c, 0x81, 0x4c, 0x98, 0xc5, + 0x20, 0x43, 0x50, 0x0e, 0x66, 0xb1, 0x87, 0x01, 0x2e, 0xf4, 0x82, 0x34, + 0x28, 0x00, 0xc6, 0x1e, 0x06, 0xb9, 0xe0, 0x8b, 0xd2, 0xa0, 0x00, 0x18, + 0x73, 0x0c, 0x38, 0x11, 0xf8, 0xc5, 0x20, 0x43, 0x90, 0x13, 0x6e, 0x61, + 0x41, 0x22, 0xfe, 0x83, 0x0c, 0xc1, 0x4e, 0xbc, 0xc5, 0x88, 0x41, 0x81, + 0x84, 0x20, 0x18, 0x54, 0xb7, 0x71, 0xcc, 0x32, 0xb0, 0x81, 0x18, 0x04, + 0x63, 0x08, 0xc3, 0x68, 0x0c, 0x47, 0x04, 0x70, 0xa1, 0xf8, 0xc7, 0x2c, + 0x03, 0x19, 0x8c, 0x41, 0x60, 0x02, 0x5c, 0x88, 0xff, 0x2c, 0x41, 0x19, + 0x8c, 0x18, 0x18, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x48, 0xbc, 0x31, 0x8c, + 0x18, 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x40, 0xbe, 0x11, 0xc4, 0x85, + 0x05, 0x71, 0x21, 0xfe, 0x16, 0xc4, 0x05, 0xf8, 0xcf, 0x12, 0x94, 0xc1, + 0x40, 0x05, 0xa0, 0x8c, 0x81, 0x40, 0x06, 0x73, 0x0c, 0x63, 0x11, 0xac, + 0xc6, 0x18, 0x02, 0xe3, 0x17, 0xc3, 0x11, 0x41, 0x5e, 0x28, 0xfe, 0x31, + 0xcb, 0x70, 0x06, 0x66, 0x10, 0x98, 0x90, 0x17, 0xe2, 0x3f, 0x4b, 0x80, + 0x06, 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x52, 0x79, 0x0c, + 0x23, 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0xd0, 0x79, 0x04, 0x7a, + 0x61, 0x81, 0x5e, 0x88, 0xbf, 0x05, 0x7a, 0x01, 0xfe, 0xb3, 0x04, 0x68, + 0x30, 0x50, 0x01, 0x28, 0x66, 0x20, 0x9c, 0xc1, 0x1c, 0x43, 0x12, 0x98, + 0xc6, 0x18, 0x42, 0x65, 0x1a, 0xc3, 0x11, 0x81, 0x68, 0x28, 0xfe, 0x31, + 0xcb, 0xa0, 0x06, 0x69, 0x10, 0x98, 0x20, 0x1a, 0xe2, 0x3f, 0x4b, 0xb0, + 0x06, 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x92, 0x7b, 0x0c, + 0x23, 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x10, 0x7c, 0x04, 0xa3, + 0x61, 0xc1, 0x68, 0x88, 0xbf, 0x05, 0xa3, 0x01, 0xfe, 0xb3, 0x04, 0x6b, + 0x30, 0x50, 0x01, 0x28, 0x69, 0x20, 0xa8, 0xc1, 0x1c, 0x43, 0x12, 0xb8, + 0xc6, 0x88, 0x01, 0x82, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x63, 0x1f, 0xc1, + 0x5d, 0xd4, 0xc5, 0x20, 0x43, 0x90, 0x17, 0xad, 0x31, 0x4b, 0xc0, 0x06, + 0x03, 0x15, 0x81, 0x1f, 0x84, 0x81, 0xb0, 0x06, 0x83, 0x0c, 0x81, 0x5f, + 0xbc, 0xc6, 0x2c, 0x41, 0x1b, 0x0c, 0xb4, 0x04, 0x3c, 0x62, 0xf0, 0x88, + 0xc4, 0x23, 0x9f, 0x2c, 0xb0, 0x01, 0x8f, 0x80, 0xc1, 0x40, 0x4b, 0x80, + 0x22, 0x86, 0x5e, 0x48, 0xe6, 0xf0, 0x11, 0x6c, 0xc0, 0x2f, 0x60, 0x30, + 0xc8, 0x10, 0x08, 0xb1, 0x91, 0x41, 0x40, 0x0c, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x5b, 0x86, 0x20, 0x00, 0x87, 0x2d, 0x83, 0x11, 0x84, 0xc3, 0x96, + 0x21, 0x0b, 0xc4, 0x61, 0xcb, 0xe0, 0x05, 0xe3, 0xb0, 0x65, 0x00, 0x83, + 0x80, 0x1c, 0xb6, 0x0c, 0x69, 0x10, 0x94, 0xc3, 0x96, 0xc1, 0x0d, 0x02, + 0x73, 0xd8, 0x32, 0xd4, 0x41, 0x70, 0x0e, 0x5b, 0x86, 0x3b, 0x08, 0xcc, + 0x61, 0xcb, 0xb0, 0x0e, 0xc1, 0x39, 0x6c, 0x19, 0xda, 0x21, 0x30, 0x87, + 0x2d, 0x43, 0x5a, 0x04, 0xe7, 0xb0, 0x65, 0x58, 0x8b, 0xc0, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x73, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, + 0x00, 0x14, 0xce, 0x00, 0x10, 0x5a, 0x02, 0x45, 0x40, 0xeb, 0x58, 0x03, + 0x10, 0x08, 0x23, 0x00, 0xc4, 0xce, 0x41, 0x40, 0x4e, 0x83, 0x06, 0x04, + 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20, + 0x08, 0x06, 0x23, 0x00, 0x14, 0xcc, 0x00, 0xcc, 0x00, 0x50, 0x33, 0x03, + 0x30, 0xd6, 0xc0, 0xb2, 0x67, 0x28, 0x7f, 0xa8, 0x5f, 0xc6, 0xea, 0x97, + 0x9f, 0xba, 0x38, 0x7b, 0x63, 0x0d, 0x7a, 0x0d, 0xee, 0xb8, 0xa7, 0xe2, + 0xb9, 0x6d, 0x7f, 0x6f, 0x9f, 0xd2, 0xa3, 0x37, 0xd6, 0xb0, 0xce, 0x31, + 0x8b, 0x7a, 0x69, 0x08, 0xa3, 0xbb, 0x77, 0xb7, 0xb1, 0x6a, 0x7f, 0x63, + 0x0d, 0x62, 0x2e, 0xa6, 0xfd, 0x07, 0x96, 0x3c, 0x1b, 0xff, 0xc2, 0x98, + 0xae, 0x6a, 0xee, 0x0b, 0x63, 0x0d, 0xff, 0x4c, 0xfa, 0xbf, 0x2f, 0xd0, + 0x35, 0x28, 0xe6, 0x5f, 0x0b, 0xc7, 0x31, 0xe8, 0x0b, 0x63, 0x0d, 0x73, + 0xdf, 0xa6, 0xa9, 0x2f, 0xb4, 0x6e, 0xc8, 0xf3, 0xbe, 0xc0, 0xe7, 0xac, + 0x8f, 0x7f, 0x00, 0x00, 0x00, 0x83, 0x0c, 0xd7, 0xd1, 0x0c, 0x47, 0x58, + 0x4d, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0xcc, 0x31, 0x24, 0x96, 0x18, + 0x0c, 0x32, 0x04, 0x4a, 0x64, 0xc1, 0x26, 0xfe, 0x83, 0x0c, 0x01, 0x23, + 0xcd, 0x12, 0x24, 0xc3, 0x11, 0x5b, 0x14, 0xf8, 0xc7, 0x2c, 0xc3, 0x90, + 0x04, 0xc3, 0x11, 0x9d, 0x14, 0xf8, 0xc7, 0x2c, 0x03, 0x51, 0x04, 0x23, + 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x17, 0x1f, 0x7c, 0xce, 0x1c, + 0x43, 0x14, 0xa4, 0xc1, 0x88, 0xc1, 0x81, 0x84, 0x20, 0x58, 0xf8, 0xc7, + 0xe5, 0x07, 0x61, 0xf0, 0xcc, 0x31, 0x08, 0x01, 0x37, 0x62, 0x70, 0x20, + 0x21, 0x08, 0x16, 0xfe, 0x71, 0x81, 0xc2, 0x18, 0x40, 0x73, 0x0c, 0x42, + 0xd0, 0xcd, 0x12, 0x14, 0x03, 0x15, 0x81, 0x40, 0x70, 0xc3, 0x18, 0x42, + 0xf0, 0x06, 0x63, 0x08, 0x42, 0x18, 0x8c, 0x21, 0x0c, 0x61, 0x30, 0x62, + 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x01, 0x91, 0x82, 0x10, 0x8c, 0x18, + 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x40, 0xa5, 0x40, 0x04, 0xc3, 0x11, + 0x81, 0x27, 0xf8, 0xc7, 0x2c, 0x83, 0x71, 0x04, 0x83, 0x0c, 0x87, 0x47, + 0x06, 0x36, 0xa8, 0x81, 0xf8, 0x5b, 0x30, 0x06, 0xe0, 0x6f, 0xc5, 0x1a, + 0x88, 0xbf, 0x05, 0x65, 0x00, 0xfe, 0x36, 0x04, 0xe4, 0x3f, 0xc7, 0x20, + 0x06, 0xc1, 0x1e, 0x0c, 0x32, 0x04, 0x63, 0xa0, 0x06, 0x16, 0x20, 0xe2, + 0x3f, 0xc8, 0x10, 0x94, 0xc1, 0x1a, 0xcc, 0x12, 0x1c, 0x03, 0x15, 0x81, + 0x60, 0x88, 0x41, 0x31, 0xcb, 0x80, 0x24, 0xd9, 0x20, 0x43, 0x90, 0x06, + 0x6f, 0x30, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x71, 0xd5, 0x42, + 0x40, 0x06, 0x73, 0x0c, 0x6a, 0x10, 0x88, 0xc2, 0x88, 0xc1, 0x81, 0x84, + 0x20, 0x58, 0xf8, 0xc7, 0x75, 0x0b, 0x43, 0x19, 0xcc, 0x31, 0x08, 0x41, + 0x1d, 0x8c, 0x18, 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x5c, 0xb9, 0x50, + 0x98, 0xc1, 0x1c, 0x83, 0x10, 0xd8, 0xc1, 0x2c, 0x41, 0x32, 0x50, 0x12, + 0x90, 0x42, 0xe0, 0x0a, 0x82, 0x80, 0x40, 0xc7, 0x20, 0x43, 0x10, 0x07, + 0x77, 0x90, 0x01, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xeb, 0x08, 0x18, 0xb0, 0x9a, + 0x80, 0x07, 0x90, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, + 0x00, 0x67, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x30, 0x03, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x01, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x46, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x24, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x24, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x30, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x49, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x5d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, + 0x00, 0x7e, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x94, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, + 0x00, 0xa1, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x30, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0xba, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0xcb, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0xdd, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, + 0x00, 0x03, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, - 0x00, 0x18, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xb3, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xa6, 0x02, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72, - 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, - 0x5f, 0x32, 0x64, 0x2e, 0x76, 0x34, 0x66, 0x33, 0x32, 0x33, 0x32, 0x30, - 0x32, 0x33, 0x2e, 0x39, 0x38, 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, - 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x69, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, - 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x5a, 0x31, 0x34, 0x47, 0x65, + 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, + 0x44, 0x76, 0x34, 0x5f, 0x66, 0x52, 0x55, 0x31, 0x31, 0x4d, 0x54, 0x4c, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x4b, 0x31, 0x35, 0x53, + 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x74, 0x73, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x63, + 0x6c, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, + 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x66, + 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, + 0x61, 0x62, 0x73, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x63, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x2e, 0x75, 0x2e, 0x69, 0x31, 0x2e, + 0x66, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x64, 0x6f, 0x74, + 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x5f, 0x5a, 0x31, 0x32, 0x41, 0x70, + 0x70, 0x6c, 0x79, 0x54, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x44, 0x76, + 0x33, 0x5f, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, 0x69, 0x72, 0x2e, 0x66, + 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78, 0x2e, 0x66, 0x33, 0x32, + 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, + 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, + 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, 0x76, 0x33, 0x66, 0x33, + 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, + 0x61, 0x78, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75, + 0x72, 0x65, 0x5f, 0x32, 0x64, 0x2e, 0x76, 0x34, 0x66, 0x33, 0x32, 0x33, + 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x61, 0x69, 0x72, 0x36, + 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x69, 0x6f, 0x73, 0x31, + 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xf8, 0x21, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, + 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0xa8, 0x07, 0x00, + 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, + 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, + 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, + 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, + 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, + 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, + 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x6e, 0x01, 0x00, + 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x58, 0x03, + 0x40, 0x02, 0x2a, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0, + 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, + 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, + 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, 0x60, 0x87, + 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, 0x18, 0x07, + 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, 0xa0, 0x07, + 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda, + 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, + 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, + 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, + 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07, + 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, + 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, + 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, + 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87, + 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, + 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc, + 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, + 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87, + 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, + 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, + 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca, + 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda, + 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, + 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, + 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87, + 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, + 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda, + 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, + 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, + 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88, + 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07, + 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, + 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0xe0, 0x09, 0x04, 0xb0, 0x00, 0x55, 0x90, + 0x06, 0x60, 0x30, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, + 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, + 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0xc1, 0x1b, 0x0a, + 0x60, 0x01, 0xaa, 0x20, 0x0d, 0x40, 0x61, 0x08, 0x87, 0x74, 0x90, 0x87, + 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x03, + 0x77, 0x78, 0x87, 0x36, 0x08, 0x07, 0x76, 0x48, 0x87, 0x70, 0x98, 0x07, + 0x60, 0x83, 0x41, 0x18, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x02, 0x01, 0x16, + 0xa0, 0xda, 0x10, 0x26, 0xc6, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xc0, 0x1a, + 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00, 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80, + 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0, 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00, + 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, + 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b, 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b, + 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b, 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38, + 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b, 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d, + 0xa0, 0x03, 0x10, 0x07, 0x72, 0x80, 0x07, 0xc0, 0xe0, 0x0e, 0xef, 0xd0, + 0x06, 0xe2, 0x50, 0x0f, 0xe9, 0xc0, 0x0e, 0xf4, 0x90, 0x0e, 0xee, 0x30, + 0x0f, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xe6, 0x20, 0x0f, 0xe1, 0xd0, + 0x0e, 0xe5, 0xd0, 0x06, 0xf0, 0xf0, 0x0e, 0xe9, 0xe0, 0x0e, 0xf4, 0x50, + 0x0e, 0xf2, 0xd0, 0x06, 0xe5, 0xc0, 0x0e, 0xe9, 0xd0, 0x0e, 0x00, 0x3d, + 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3, 0x3b, 0xb4, 0x81, 0x39, + 0xc8, 0x43, 0x38, 0xb4, 0x43, 0x39, 0xb4, 0x01, 0x3c, 0xbc, 0x43, 0x3a, + 0xb8, 0x03, 0x3d, 0x94, 0x83, 0x3c, 0xb4, 0x41, 0x39, 0xb0, 0x43, 0x3a, + 0xb4, 0x43, 0x1b, 0xb8, 0xc3, 0x3b, 0xb8, 0x43, 0x1b, 0xb0, 0x43, 0x39, + 0x84, 0x83, 0x39, 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1, + 0x0e, 0xef, 0xd0, 0x06, 0xe9, 0xe0, 0x0e, 0xe6, 0x30, 0x0f, 0x6d, 0x60, + 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, + 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3, 0x3b, 0xb4, 0x81, 0x3b, + 0x84, 0x83, 0x3b, 0xcc, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, + 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, + 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x30, 0x0f, 0xe9, 0x70, 0x0e, 0xee, 0x50, + 0x0e, 0xe4, 0xd0, 0x06, 0xfa, 0x50, 0x0e, 0xf2, 0xf0, 0x0e, 0xf3, 0xd0, + 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, + 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, 0x1b, + 0xd0, 0x83, 0x3c, 0x84, 0x03, 0x3c, 0xc0, 0x43, 0x3a, 0xb8, 0xc3, 0x39, + 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, + 0x0f, 0xe5, 0x00, 0x10, 0xf3, 0x40, 0x0f, 0xe1, 0x30, 0x0e, 0xeb, 0xd0, + 0x06, 0xf0, 0x20, 0x0f, 0xef, 0x40, 0x0f, 0xe5, 0x30, 0x0e, 0xf4, 0xf0, + 0x0e, 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, 0x0e, 0xe5, 0x20, + 0x0f, 0x6d, 0x30, 0x0f, 0xe9, 0xa0, 0x0f, 0xe5, 0x00, 0xe0, 0x01, 0x40, + 0xd4, 0x83, 0x3b, 0xcc, 0x43, 0x38, 0x98, 0x43, 0x39, 0xb4, 0x81, 0x39, + 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, + 0x0f, 0xf5, 0x50, 0x0e, 0xc0, 0x86, 0xe4, 0x10, 0x80, 0x05, 0xa8, 0x82, + 0x34, 0x00, 0x83, 0x0d, 0x06, 0xf2, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, + 0x01, 0xd4, 0x06, 0x1f, 0x49, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x24, + 0xa0, 0x22, 0xc2, 0x01, 0x1e, 0xe0, 0x41, 0x1e, 0xde, 0x01, 0x1f, 0xda, + 0xc0, 0x1c, 0xea, 0xc1, 0x1d, 0xc6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, + 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, + 0x72, 0x00, 0x88, 0x76, 0x48, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87, + 0x73, 0x08, 0x07, 0x76, 0x68, 0x03, 0x7b, 0x28, 0x87, 0x71, 0xa0, 0x87, + 0x77, 0x90, 0x87, 0x36, 0xb8, 0x87, 0x74, 0x20, 0x07, 0x7a, 0x40, 0x07, + 0x20, 0x0f, 0xec, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda, 0x40, 0x1c, 0xea, + 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, 0x01, 0x20, 0xdc, + 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, + 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, + 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, + 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87, + 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87, + 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x68, 0x03, + 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87, 0x70, 0x30, 0x07, + 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, + 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, + 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, + 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87, 0x70, 0x70, 0x87, + 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, + 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, + 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca, 0x81, 0x1c, 0xda, + 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, + 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, + 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x7a, 0x90, 0x87, + 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87, 0x36, 0x68, 0x87, + 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, + 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda, 0x00, 0x1e, 0xe4, + 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, + 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xe6, + 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88, 0x7a, 0x70, 0x87, + 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, + 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, + 0x01, 0xd8, 0xa0, 0x28, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x6d, 0x00, + 0xac, 0x01, 0x20, 0x01, 0xd5, 0x06, 0x63, 0x09, 0x80, 0x05, 0xa8, 0x36, + 0x18, 0x8c, 0x00, 0x2c, 0x40, 0xb5, 0x41, 0x69, 0xfe, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0xda, 0x00, 0x58, 0x03, 0x40, 0x02, 0xaa, 0x0d, 0x86, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x01, 0xd4, 0x86, 0xe9, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0x01, 0x58, 0x03, 0x40, 0x19, 0xdc, 0xe1, 0x1d, 0xda, + 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, + 0x01, 0xd8, 0x50, 0x40, 0x42, 0x90, 0x06, 0x60, 0xb0, 0x21, 0x8a, 0xfe, + 0xff, 0xff, 0xff, 0x7f, 0x00, 0x94, 0xc1, 0x1d, 0xde, 0xa1, 0x0d, 0xc4, + 0xa1, 0x1e, 0xd2, 0x81, 0x1d, 0xe8, 0x21, 0x1d, 0xdc, 0x61, 0x1e, 0x00, + 0x00, 0x49, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x13, 0x8a, 0x40, + 0x18, 0x88, 0x62, 0x82, 0x60, 0x1c, 0x13, 0x02, 0x64, 0x42, 0x90, 0x4c, + 0x18, 0x94, 0x85, 0x99, 0x30, 0x34, 0x0b, 0x33, 0x21, 0x70, 0x26, 0x08, + 0x0f, 0x34, 0x21, 0x88, 0x00, 0x89, 0x20, 0x00, 0x00, 0x51, 0x00, 0x00, + 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, + 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, + 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xe0, 0xc1, 0x0c, 0xc0, 0x30, 0x02, + 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, + 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18, + 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6, + 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4, + 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50, + 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21, + 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29, + 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1, + 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0x38, 0x4d, 0x9a, 0x22, 0x4a, + 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, 0xdf, 0x1e, 0x7e, 0x20, + 0x8a, 0x00, 0xec, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x26, 0xb8, 0x48, + 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f, + 0x1a, 0x23, 0x00, 0x06, 0x11, 0x1c, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44, + 0xb2, 0x34, 0x0f, 0x41, 0x65, 0x08, 0x02, 0x82, 0xa4, 0x42, 0x14, 0x45, + 0x51, 0x10, 0x55, 0x06, 0x00, 0x00, 0xc8, 0x2a, 0x02, 0x00, 0x10, 0x36, + 0x47, 0x10, 0x14, 0x41, 0x03, 0x68, 0x2b, 0x03, 0x50, 0x14, 0xd4, 0x15, + 0xa3, 0x28, 0x00, 0x00, 0x00, 0xe8, 0x2b, 0x43, 0x51, 0x14, 0x14, 0x16, + 0xa1, 0x28, 0x68, 0x9c, 0x23, 0x40, 0x8c, 0x10, 0x94, 0x73, 0x04, 0x60, + 0x30, 0x8c, 0x20, 0x9c, 0x41, 0x59, 0xcc, 0xe6, 0x11, 0x4e, 0x0d, 0xd5, + 0x00, 0xe0, 0xa4, 0xb4, 0x28, 0xe6, 0xf2, 0x08, 0x1a, 0xaa, 0x01, 0xc0, + 0x49, 0xeb, 0x40, 0x40, 0x0a, 0x9c, 0x73, 0x04, 0xa0, 0x30, 0x8c, 0x30, + 0x9c, 0xc1, 0x20, 0x42, 0x20, 0x0c, 0x22, 0x1c, 0xc2, 0x20, 0x42, 0x21, + 0x8c, 0x00, 0x0c, 0x22, 0x00, 0xc2, 0x14, 0xc0, 0x30, 0x02, 0x71, 0x06, + 0x00, 0x13, 0xbe, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, + 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, + 0x79, 0x88, 0x83, 0x39, 0x70, 0x03, 0x38, 0x70, 0x03, 0x38, 0x68, 0x83, + 0x79, 0x48, 0x87, 0x76, 0xa8, 0x07, 0x76, 0x08, 0x07, 0x7a, 0x78, 0x07, + 0x79, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, + 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, + 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, + 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, + 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, + 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, + 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, + 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, + 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, + 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, + 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, + 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, + 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, + 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, + 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, + 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, + 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, + 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, + 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x11, 0xc2, 0x90, 0x10, 0xdb, 0x95, 0xbf, 0xec, 0xbe, + 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34, 0xd3, 0x90, 0x08, 0x80, 0x20, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x12, 0x41, + 0x78, 0x20, 0x21, 0xc0, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xc0, 0x90, 0x08, 0x15, 0x28, 0x0a, 0x08, 0x80, 0x01, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x86, 0x44, 0xbc, 0x00, 0x59, 0x40, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x24, 0x62, 0x87, 0x08, + 0x03, 0x02, 0x60, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, + 0x51, 0x3f, 0x58, 0x1b, 0x10, 0x00, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x89, 0x66, 0xa2, 0xe9, 0x80, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, 0x48, 0x04, 0x16, 0xd9, 0x87, 0x00, + 0x03, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x43, 0xa2, 0xbc, + 0x88, 0x2c, 0x20, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x18, 0x12, 0xa9, 0x86, 0x14, 0x06, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x30, 0x24, 0xe2, 0x8d, 0x69, 0x0c, 0x80, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, 0x48, 0xf4, 0x1e, + 0x53, 0x18, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xc0, 0x90, 0x48, 0x44, 0xc2, 0x20, 0x0d, 0x80, 0x00, 0x28, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, 0x48, 0x34, 0x26, 0xdb, 0x1a, 0x00, + 0x01, 0x50, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0xc4, 0x06, + 0x81, 0xa2, 0xa9, 0x07, 0x00, 0x00, 0x59, 0x20, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, + 0x47, 0xc6, 0x04, 0x43, 0x3a, 0x8b, 0xa0, 0x04, 0x0a, 0x61, 0x04, 0xa0, + 0x0c, 0x0a, 0xa8, 0x20, 0x0a, 0xa3, 0x40, 0x0a, 0xa5, 0x60, 0x0a, 0xa7, + 0x00, 0x03, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, 0xe8, 0x1d, 0x01, 0x28, + 0x84, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0x72, 0xc7, + 0x12, 0x24, 0x01, 0x00, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, + 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, + 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, + 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, + 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, + 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, + 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, + 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, + 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, + 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, + 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, + 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, + 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, + 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, + 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, + 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, + 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, + 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, + 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, + 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, + 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, + 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, + 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, + 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, + 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, + 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, + 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, + 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, + 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, + 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, + 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, + 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, + 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, + 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, + 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, + 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, + 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, + 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, + 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, + 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, + 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, + 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, + 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, + 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, + 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, + 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, + 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, + 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, + 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, + 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, + 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, + 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, + 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, + 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, + 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, + 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x79, 0x20, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x32, 0x9a, 0x08, + 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4, + 0xee, 0x80, 0x0d, 0x6a, 0x0c, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x41, + 0x14, 0x19, 0x8c, 0x22, 0x31, 0x88, 0x64, 0x3d, 0x45, 0x66, 0x20, 0xca, + 0x23, 0x21, 0x54, 0xc1, 0x30, 0xca, 0xe2, 0x3c, 0xcf, 0x13, 0x5d, 0x4f, + 0x60, 0x18, 0x88, 0x91, 0x18, 0x8b, 0x82, 0x11, 0x5e, 0xb1, 0x1c, 0x01, + 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, + 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, + 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, + 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x29, 0x4d, + 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, + 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x61, 0x69, 0x72, 0x2e, 0x6e, 0x6f, 0x5f, 0x70, 0x65, 0x72, 0x73, + 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, + 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x61, 0x69, 0x72, 0x2e, 0x70, + 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x44, 0x76, + 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x74, 0x65, + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, + 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x63, + 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x74, 0x65, + 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x65, 0x6d, + 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x74, 0x6f, 0x6e, + 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x31, + 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, + 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, + 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x53, 0x68, + 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x73, 0x63, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x6d, 0x61, + 0x74, 0x72, 0x69, 0x78, 0x59, 0x55, 0x56, 0x44, 0x65, 0x63, 0x6f, 0x64, + 0x65, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x74, + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, + 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x59, 0x74, 0x65, 0x78, 0x74, + 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x3e, 0x74, 0x65, 0x78, 0x55, 0x56, 0x61, 0x69, 0x72, 0x2e, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x72, 0x73, 0x00, 0x00, 0x00, 0xe4, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x82, 0x70, 0x06, 0xce, 0x08, 0x82, 0x1b, 0x9c, 0xc1, 0x08, + 0xc2, 0x19, 0x3c, 0x23, 0x08, 0x67, 0x00, 0x8d, 0x20, 0x9c, 0x41, 0x34, + 0x82, 0x10, 0x01, 0x23, 0x08, 0x67, 0x20, 0x8d, 0x20, 0x9c, 0xc1, 0x34, + 0x82, 0x70, 0x06, 0xd4, 0x08, 0xc2, 0x19, 0x54, 0x23, 0x08, 0x67, 0x60, + 0x8d, 0x20, 0x9c, 0xc1, 0x35, 0x82, 0x70, 0x06, 0xd8, 0x08, 0xc2, 0x19, + 0x64, 0x23, 0x08, 0x67, 0xa0, 0x8d, 0x20, 0x9c, 0xc1, 0x36, 0x82, 0x70, + 0x06, 0xdc, 0x08, 0xc2, 0x19, 0x74, 0x23, 0x08, 0x67, 0xe0, 0xcd, 0x30, + 0xe0, 0x41, 0x90, 0x07, 0x33, 0x0c, 0x7a, 0x20, 0xec, 0xc1, 0x0c, 0xc1, + 0x30, 0xc3, 0x80, 0x07, 0x78, 0xc0, 0x07, 0x33, 0x10, 0x84, 0x1e, 0xe8, + 0x01, 0x1f, 0xcc, 0x10, 0x14, 0x33, 0x04, 0xc6, 0x0c, 0xc1, 0x31, 0x43, + 0x81, 0xf0, 0x01, 0x1f, 0x24, 0xca, 0x0c, 0xc1, 0x2c, 0xcc, 0x80, 0xf0, + 0xc1, 0xc2, 0x34, 0x89, 0xe2, 0x3c, 0x33, 0x24, 0x7a, 0x00, 0x45, 0x8c, + 0x94, 0x28, 0xce, 0x34, 0x43, 0x82, 0x07, 0x10, 0xc5, 0x48, 0x49, 0xe5, + 0x58, 0x33, 0xa0, 0x01, 0x1f, 0xec, 0x01, 0x1f, 0x70, 0xdd, 0x1e, 0xec, + 0x01, 0x1f, 0x70, 0x1e, 0x28, 0xec, 0x01, 0x1f, 0x70, 0x5f, 0x28, 0xec, + 0x01, 0x1f, 0x70, 0x60, 0x20, 0x0a, 0x7b, 0xc0, 0x07, 0x5c, 0x18, 0x8c, + 0xc2, 0x1e, 0xf0, 0x01, 0x27, 0x06, 0xa4, 0xb0, 0x07, 0x7c, 0xc0, 0x8d, + 0x41, 0x29, 0xec, 0x01, 0x1f, 0x70, 0x64, 0x30, 0x83, 0xe4, 0x07, 0x17, + 0xf6, 0x07, 0x19, 0x1f, 0xe8, 0x81, 0xb6, 0xe1, 0x42, 0x19, 0xfc, 0x81, + 0x19, 0xec, 0x41, 0x72, 0x06, 0x0e, 0x1a, 0xcc, 0xa0, 0xf0, 0x81, 0x28, + 0xf0, 0x41, 0x1a, 0xa8, 0x81, 0x28, 0x9c, 0x02, 0x1f, 0xac, 0x01, 0x1b, + 0xcc, 0x20, 0xed, 0xc1, 0x85, 0x99, 0x42, 0xa6, 0x07, 0x7a, 0xa0, 0x6d, + 0xba, 0x50, 0x06, 0xa6, 0x60, 0x06, 0xa2, 0x90, 0xb4, 0x81, 0xe3, 0x06, + 0x33, 0x28, 0xa8, 0xf0, 0x06, 0x19, 0x1f, 0xe8, 0x01, 0x1c, 0x24, 0x71, + 0xe0, 0xc8, 0xc1, 0x0c, 0x4a, 0x2a, 0xbc, 0x41, 0xa6, 0x07, 0x7a, 0x00, + 0x07, 0xc9, 0x1c, 0x38, 0x74, 0x30, 0x43, 0xa2, 0x0a, 0x75, 0x90, 0xf1, + 0x81, 0x1e, 0x24, 0x76, 0xe0, 0xdc, 0xc1, 0x0c, 0x48, 0x2d, 0xd8, 0xc2, + 0x2d, 0xe4, 0xc2, 0x2e, 0xf0, 0x42, 0x2f, 0xf8, 0xc2, 0x0c, 0x43, 0x1f, + 0xd0, 0xc2, 0x2f, 0x54, 0x1a, 0x00, 0x62, 0x80, 0x06, 0x62, 0x20, 0x06, + 0x62, 0xc0, 0x89, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, + 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x1b, 0xb8, + 0x81, 0x45, 0x07, 0x7a, 0x60, 0x59, 0x96, 0x1e, 0x70, 0xa6, 0xc0, 0x0a, + 0xac, 0x40, 0x37, 0x7e, 0x81, 0x12, 0x7e, 0x61, 0x0f, 0xf6, 0xa0, 0x0e, + 0xf0, 0x20, 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d, 0xcd, 0xae, 0xcd, 0xa5, + 0xed, 0x8d, 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c, 0x2d, 0xec, 0x6c, 0x6e, + 0x14, 0x41, 0x15, 0x56, 0xe1, 0x14, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, + 0xb2, 0x32, 0x37, 0xba, 0x51, 0x02, 0x56, 0xb8, 0x25, 0x2c, 0x4d, 0xce, + 0xc5, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x94, 0xa0, 0x15, 0x8e, + 0x0a, 0x4b, 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b, 0xab, 0x0b, 0x3b, 0x2b, + 0xfb, 0xb2, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0x70, 0x85, + 0x9b, 0xc2, 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda, 0xe0, 0xd2, 0xd8, 0xca, + 0xbe, 0xde, 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0x46, 0x19, 0x5e, 0x01, + 0x16, 0x62, 0xe1, 0x98, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, + 0xb6, 0x32, 0x37, 0xba, 0x51, 0x82, 0x5f, 0x00, 0x00, 0xa9, 0x18, 0x00, + 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, + 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, + 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, + 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, + 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4, + 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81, + 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08, + 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01, + 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c, + 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c, + 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c, + 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1, + 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, + 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, + 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x8c, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0xa4, 0xd5, 0xc0, 0x08, 0x00, 0x9d, 0x33, 0x00, 0x84, 0x8e, 0x00, + 0xd0, 0x5b, 0x02, 0x45, 0x40, 0xf0, 0x58, 0x03, 0x10, 0x08, 0x73, 0x0c, + 0x91, 0x1c, 0xc8, 0x01, 0x01, 0x23, 0x00, 0x33, 0x00, 0x63, 0x04, 0x20, + 0x08, 0x82, 0xf8, 0x47, 0xc1, 0x0c, 0xc0, 0x0c, 0xc0, 0x1c, 0x44, 0x1e, + 0xe4, 0x41, 0x1e, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00, + 0x00, 0x32, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0x88, + 0x49, 0x00, 0x00, 0x00, 0x00, 0x62, 0x80, 0x61, 0x96, 0x05, 0x00, 0x00, + 0x00, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x59, 0x55, + 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x61, + 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2d, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, + 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x61, + 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x34, 0x29, 0x61, 0x69, 0x72, + 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x00, 0x00, 0x2b, 0x04, 0x73, + 0x08, 0x87, 0x15, 0xc3, 0x39, 0x98, 0x83, 0x38, 0xac, 0x18, 0xd0, 0xc1, + 0x1c, 0xc6, 0x61, 0xc5, 0x90, 0x0e, 0xe6, 0x40, 0x0e, 0x2b, 0x06, 0x75, + 0x30, 0x87, 0x72, 0xd8, 0x20, 0xa0, 0xc3, 0x39, 0x6c, 0x10, 0xd4, 0x21, + 0x1d, 0x36, 0x04, 0xe9, 0xb0, 0x61, 0x50, 0x07, 0x74, 0x38, 0x07, 0x00, + 0x00, 0x23, 0x06, 0x8d, 0x11, 0x82, 0x60, 0xb0, 0x06, 0x71, 0x10, 0x3d, + 0x94, 0xb3, 0x34, 0x86, 0xd1, 0x06, 0xa3, 0x09, 0x01, 0x30, 0x62, 0xe0, + 0x18, 0x21, 0x08, 0x06, 0x69, 0x40, 0x07, 0x52, 0x64, 0xbd, 0x01, 0xd4, + 0x3c, 0x08, 0xf2, 0x06, 0xa3, 0x09, 0x01, 0x30, 0x86, 0x10, 0x8c, 0xc1, + 0x20, 0x03, 0x71, 0x30, 0x73, 0x0c, 0x81, 0x00, 0x8d, 0x18, 0x38, 0x46, + 0x08, 0x82, 0x41, 0x1a, 0xe4, 0xc1, 0x65, 0x6d, 0x76, 0x50, 0x49, 0x54, + 0xd3, 0xd0, 0xc1, 0x68, 0x42, 0x00, 0x8c, 0x21, 0x04, 0x68, 0x30, 0xc7, + 0x40, 0x04, 0xd3, 0x75, 0xf1, 0x52, 0x10, 0x94, 0x41, 0x86, 0x00, 0xaa, + 0x8c, 0x08, 0xc0, 0x7f, 0x23, 0x43, 0x18, 0xb8, 0x81, 0x1f, 0x5c, 0x10, + 0x2f, 0x05, 0x41, 0x19, 0x64, 0x08, 0x2a, 0x6d, 0xc4, 0xe0, 0x38, 0x42, + 0x10, 0x2c, 0xfc, 0xa3, 0x5b, 0x85, 0x22, 0xd8, 0x48, 0x61, 0x06, 0x73, + 0x30, 0x0a, 0xa1, 0xe0, 0x5d, 0x10, 0x2f, 0x05, 0x41, 0x19, 0x64, 0x08, + 0xb4, 0x6f, 0xc4, 0xe0, 0x38, 0x42, 0x10, 0x2c, 0xfc, 0xa3, 0x83, 0x05, + 0x25, 0xd8, 0x48, 0xb1, 0x06, 0x78, 0x80, 0x0a, 0xa6, 0x20, 0x06, 0x17, + 0xc4, 0x4b, 0x41, 0x50, 0x06, 0x19, 0x82, 0x8f, 0x0c, 0x46, 0x0c, 0x8e, + 0x23, 0x04, 0xc1, 0xc2, 0x3f, 0xba, 0x5a, 0x78, 0x82, 0x39, 0x86, 0x6f, + 0xe9, 0x83, 0x39, 0x86, 0xe0, 0x48, 0x83, 0x39, 0x86, 0x60, 0x48, 0x83, + 0x11, 0x83, 0x03, 0x89, 0x41, 0xb0, 0xf0, 0x0f, 0xc9, 0x17, 0x02, 0x3a, + 0xb0, 0xe0, 0x0e, 0xc4, 0x3f, 0x83, 0x80, 0x18, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x5b, 0x0a, 0xe0, 0x50, 0x07, 0x64, 0x1d, 0xb6, 0x14, 0xc2, 0xa1, + 0x0e, 0xc8, 0x3a, 0x6c, 0x29, 0x8e, 0x43, 0x1d, 0x90, 0x75, 0xd8, 0x52, + 0x30, 0x07, 0x3b, 0x20, 0xed, 0xb0, 0xa5, 0x88, 0x0e, 0x76, 0x40, 0xda, + 0x61, 0x4b, 0x61, 0x1d, 0xec, 0x80, 0xb4, 0xc3, 0x96, 0x62, 0x3b, 0xd8, + 0x01, 0x69, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0xe5, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00, + 0x00, 0x4f, 0x00, 0x00, 0x00, 0x74, 0xce, 0x00, 0xd0, 0x5b, 0x02, 0x45, + 0x40, 0xf0, 0x58, 0x03, 0x10, 0x08, 0x23, 0x00, 0x74, 0xcf, 0x41, 0x44, + 0x8f, 0xa3, 0x06, 0x63, 0x11, 0x40, 0x20, 0x1c, 0x04, 0x8c, 0x11, 0xf0, + 0xf0, 0xaa, 0xd3, 0xdd, 0x18, 0x81, 0x2c, 0xba, 0x3d, 0x0d, 0x06, 0x63, + 0x04, 0xb5, 0x5a, 0xab, 0xed, 0x37, 0x46, 0xd0, 0xc7, 0xa2, 0x8b, 0x7f, + 0x63, 0x04, 0x6e, 0x1f, 0x8b, 0xb6, 0x2f, 0x8c, 0x11, 0x80, 0x20, 0x08, + 0xe2, 0xdf, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0xc4, 0x3c, + 0xd8, 0xe7, 0xde, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xbc, + 0x7b, 0x5a, 0xde, 0xdf, 0x18, 0x81, 0xce, 0x9a, 0x73, 0x08, 0x06, 0x23, + 0x00, 0x63, 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, 0x8c, 0x11, 0x80, 0x20, + 0x08, 0x82, 0x60, 0x30, 0x03, 0x40, 0xc1, 0x0c, 0xc0, 0x0c, 0xc0, 0x1c, + 0x84, 0x1d, 0xf0, 0x81, 0x1d, 0xfc, 0x01, 0x15, 0x33, 0x00, 0x23, 0x00, + 0x33, 0x00, 0x63, 0x0d, 0x20, 0x08, 0x82, 0xf8, 0x07, 0x82, 0x20, 0x88, + 0x7f, 0x20, 0x08, 0x82, 0xf8, 0x37, 0xd6, 0xc0, 0xb6, 0xf3, 0x4f, 0x7a, + 0x6c, 0x3b, 0xff, 0xa4, 0xc7, 0xb6, 0xf3, 0x4f, 0x7a, 0x63, 0x0d, 0x20, + 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, 0xc8, 0xd6, 0xbf, 0x00, 0x82, 0x20, + 0x5b, 0xff, 0xc2, 0x58, 0x03, 0x08, 0x82, 0x6b, 0x0e, 0x06, 0x20, 0x08, + 0xae, 0x39, 0x18, 0x80, 0x20, 0xb8, 0xe6, 0x60, 0x30, 0xd6, 0x00, 0x82, + 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, 0x6d, 0x0e, 0x06, 0x20, 0x48, 0xb7, + 0x39, 0x18, 0x8c, 0x35, 0xac, 0x23, 0x1e, 0xb3, 0x60, 0xb0, 0x8e, 0x78, + 0xcc, 0x82, 0xc1, 0x3a, 0xe2, 0x31, 0x0b, 0x06, 0x63, 0x0d, 0x20, 0x08, + 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, 0x87, 0x63, 0x00, 0x82, 0x30, 0x1e, + 0x8e, 0xc1, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25, 0xcf, 0xc6, + 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f, 0x93, 0xfe, + 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, + 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2, 0xbc, 0x2f, + 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00, + 0x00, 0x33, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x0e, 0xc4, + 0x1d, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x00, 0x00, 0x5f, 0x5a, 0x54, + 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f, + 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d, + 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, + 0x00, 0x13, 0x84, 0x37, 0xf8, 0x26, 0x08, 0x6f, 0x00, 0x06, 0x13, 0x84, + 0x37, 0x08, 0x83, 0x09, 0xc2, 0x1b, 0x88, 0xc1, 0x04, 0xe1, 0x0d, 0xc6, + 0x60, 0x82, 0xf0, 0x06, 0x64, 0x30, 0x41, 0x78, 0x83, 0x32, 0x98, 0x20, + 0xbc, 0x81, 0x19, 0x6c, 0x08, 0xc6, 0x61, 0xc3, 0x20, 0x0e, 0xec, 0x40, + 0x0e, 0x1b, 0x06, 0xae, 0x1d, 0xc8, 0x61, 0x43, 0x14, 0x0e, 0xee, 0x40, + 0x0e, 0xee, 0x50, 0x0e, 0xee, 0x60, 0x0e, 0xee, 0x70, 0x0e, 0xee, 0x80, + 0x0e, 0xee, 0x90, 0x0e, 0xee, 0xa0, 0x0e, 0xee, 0xb0, 0x0e, 0x1b, 0x86, + 0x77, 0x70, 0x07, 0x73, 0xd8, 0x30, 0xbc, 0x83, 0x3b, 0xac, 0xc3, 0x86, + 0xe1, 0x1d, 0xdc, 0x01, 0x1d, 0x36, 0x0c, 0xef, 0xe0, 0x0e, 0xe9, 0xb0, + 0x61, 0x78, 0x07, 0x77, 0x50, 0x87, 0x0d, 0xc3, 0x3b, 0xb8, 0x43, 0x39, + 0x6c, 0x18, 0xde, 0xc1, 0x1d, 0xce, 0x61, 0xc3, 0xf0, 0x0e, 0xee, 0x40, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x18, 0xce, 0x20, 0x0e, 0x44, 0x81, + 0x02, 0x60, 0x0c, 0x47, 0x04, 0x55, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, + 0x0c, 0x32, 0xac, 0xc1, 0x64, 0x06, 0x7b, 0x18, 0xd6, 0xa0, 0x0e, 0xec, + 0x80, 0x02, 0x60, 0x8c, 0x18, 0x18, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x8c, + 0x01, 0x2b, 0x0c, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x61, + 0xe0, 0x0a, 0x01, 0x64, 0x01, 0x04, 0xfe, 0x23, 0x06, 0xc7, 0x11, 0x82, + 0x60, 0xe1, 0x1f, 0x61, 0xe0, 0x0a, 0x41, 0x65, 0x43, 0x24, 0xfe, 0x16, + 0x05, 0xe1, 0x6f, 0x43, 0x40, 0xfe, 0x23, 0x06, 0xc6, 0x11, 0x82, 0x60, + 0xe1, 0x1f, 0x63, 0x30, 0x0b, 0xc1, 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, + 0xf8, 0x47, 0x18, 0xd4, 0x42, 0x30, 0x59, 0x30, 0x89, 0xff, 0x1c, 0x43, + 0xb7, 0x84, 0xc2, 0x20, 0x43, 0xe0, 0xcd, 0x81, 0x0d, 0x01, 0xf9, 0x0f, + 0x32, 0x04, 0x60, 0x40, 0x07, 0x83, 0x0c, 0x01, 0x1f, 0xd0, 0xc1, 0x2c, + 0x81, 0x30, 0x50, 0x11, 0x08, 0x81, 0x3e, 0x00, 0x7b, 0x18, 0xfa, 0xe0, + 0x14, 0x6c, 0x81, 0x02, 0x60, 0x0c, 0x47, 0x04, 0x6c, 0xe0, 0xf8, 0xc7, + 0x2c, 0xc3, 0x40, 0x04, 0x83, 0x0c, 0x44, 0x1a, 0xf0, 0xc1, 0x1e, 0x86, + 0x50, 0x58, 0x05, 0x57, 0xa0, 0x00, 0x18, 0x7b, 0x18, 0x46, 0xa1, 0x15, + 0x5e, 0x81, 0x02, 0x60, 0x8c, 0x18, 0x28, 0x49, 0x0c, 0x82, 0x85, 0x7f, + 0x7c, 0xe7, 0x50, 0x74, 0xc7, 0x10, 0x0c, 0x32, 0x04, 0x6c, 0x00, 0x0a, + 0x83, 0x0c, 0xc1, 0x02, 0x0a, 0xb3, 0x04, 0xc4, 0x40, 0x45, 0x20, 0x0c, + 0x98, 0x30, 0x1c, 0x11, 0x06, 0x7c, 0x10, 0xf8, 0xc7, 0x2c, 0x43, 0x31, + 0x05, 0x7b, 0x18, 0x54, 0x81, 0x16, 0xc8, 0x81, 0x02, 0x60, 0x0c, 0x47, + 0x04, 0x7f, 0x10, 0xf8, 0xc7, 0x2c, 0x83, 0x71, 0x04, 0x83, 0x0c, 0x85, + 0x1d, 0xa4, 0xc2, 0x1e, 0x06, 0x57, 0xc0, 0x85, 0x72, 0xa0, 0x00, 0x18, + 0x73, 0x0c, 0x76, 0x10, 0xe8, 0xc2, 0x20, 0x43, 0x70, 0x07, 0xac, 0x60, + 0x41, 0x21, 0xfe, 0x83, 0x0c, 0x41, 0x1e, 0xb4, 0xc2, 0x2c, 0x41, 0x1b, + 0xec, 0x61, 0xa0, 0x05, 0x5f, 0x60, 0x07, 0x0a, 0x80, 0xb1, 0x87, 0xc1, + 0x16, 0xc0, 0xa1, 0x1d, 0x28, 0x00, 0xc6, 0x20, 0x03, 0x14, 0x0a, 0xb2, + 0x30, 0x62, 0x50, 0x1c, 0x21, 0x08, 0x06, 0x5b, 0x3f, 0x10, 0xb3, 0x0c, + 0x88, 0x14, 0x8c, 0x21, 0x48, 0xe4, 0x30, 0x1c, 0x11, 0xb4, 0x82, 0xe2, + 0x1f, 0xb3, 0x0c, 0x4a, 0x12, 0x98, 0xd0, 0x0a, 0xe2, 0x3f, 0x4b, 0xb0, + 0xd8, 0xd0, 0x0a, 0xe0, 0x3f, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, + 0x81, 0x8d, 0x44, 0x60, 0x81, 0x2b, 0x88, 0xff, 0x88, 0xc1, 0x71, 0x84, + 0x20, 0x58, 0xf8, 0x87, 0x65, 0x12, 0x81, 0x2b, 0xcc, 0x12, 0x2c, 0x03, + 0x15, 0x80, 0x92, 0x08, 0xca, 0x1c, 0x83, 0x2a, 0x04, 0xec, 0x30, 0x86, + 0xb0, 0x85, 0xc3, 0x70, 0x44, 0x60, 0x0b, 0x8a, 0x7f, 0xcc, 0x32, 0x34, + 0x4c, 0x60, 0x82, 0x2d, 0x88, 0xff, 0x2c, 0x81, 0x63, 0x83, 0x2d, 0x80, + 0xff, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0xc6, 0x12, 0x81, + 0x05, 0xb7, 0x20, 0xfe, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, + 0xd6, 0x4b, 0x04, 0xb7, 0x30, 0x4b, 0xe0, 0x0c, 0x54, 0x00, 0x0a, 0x23, + 0x34, 0x73, 0x0c, 0x49, 0x90, 0x0e, 0x63, 0x08, 0x64, 0x90, 0x0e, 0xc3, + 0x11, 0xc1, 0x2f, 0x28, 0xfe, 0x31, 0xcb, 0x00, 0x3d, 0x81, 0x09, 0xbf, + 0x20, 0xfe, 0xb3, 0x04, 0x91, 0x0d, 0xbf, 0x00, 0xfe, 0x23, 0x06, 0xc6, + 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x58, 0x4d, 0x04, 0x16, 0x80, 0x83, 0xf8, + 0x8f, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x58, 0x38, 0x11, 0x80, + 0xc3, 0x2c, 0x41, 0x34, 0x50, 0x01, 0x28, 0x8f, 0x00, 0xcd, 0x31, 0x24, + 0x41, 0x3c, 0xcc, 0x12, 0x48, 0x03, 0x15, 0x81, 0x10, 0xe9, 0xc1, 0x31, + 0xc8, 0x10, 0xfc, 0x82, 0x3c, 0xcc, 0x31, 0xf4, 0x02, 0x18, 0x84, 0xc4, + 0x20, 0x43, 0xe0, 0x0b, 0xf3, 0x60, 0x43, 0x20, 0xfe, 0x83, 0x0c, 0x01, + 0x38, 0xd0, 0xc3, 0x2c, 0x41, 0x1b, 0x0c, 0x47, 0xcc, 0x82, 0x39, 0x04, + 0xfe, 0x31, 0xcb, 0x40, 0x81, 0x41, 0x30, 0xc8, 0x40, 0x07, 0xe5, 0x80, + 0x0f, 0x7b, 0x18, 0xfa, 0xe1, 0x24, 0x6a, 0x82, 0x02, 0x60, 0xec, 0x61, + 0xf8, 0x87, 0x94, 0xb0, 0x09, 0x0a, 0x80, 0x31, 0xc7, 0x70, 0x0e, 0xc1, + 0x4a, 0x0c, 0x32, 0x04, 0xe8, 0xd0, 0x0f, 0x16, 0x1c, 0xe2, 0x3f, 0xc8, + 0x10, 0xa8, 0x83, 0x3f, 0x8c, 0x18, 0x14, 0x47, 0x08, 0x82, 0xc1, 0x96, + 0x16, 0xc7, 0x2c, 0xc3, 0x57, 0x05, 0x63, 0x08, 0x03, 0x4c, 0x0c, 0x47, + 0x04, 0xff, 0xa0, 0xf8, 0xc7, 0x2c, 0xc3, 0x65, 0x05, 0x26, 0xfc, 0x83, + 0xf8, 0xcf, 0x12, 0x60, 0x23, 0x06, 0xc6, 0x11, 0x82, 0x60, 0xe1, 0x1f, + 0x98, 0x5b, 0x0c, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x16, + 0x5c, 0x04, 0x20, 0x61, 0x01, 0x48, 0x88, 0xbf, 0x05, 0x20, 0x01, 0xfe, + 0xb3, 0x04, 0xd8, 0x40, 0x05, 0xa0, 0x58, 0xc2, 0x35, 0xc7, 0x20, 0x0f, + 0x01, 0x4e, 0x8c, 0x21, 0x30, 0x2d, 0x31, 0x1c, 0x11, 0xa0, 0x84, 0xe2, + 0x1f, 0xb3, 0x0c, 0x5a, 0x16, 0x98, 0x80, 0x12, 0xe2, 0x3f, 0x4b, 0xb0, + 0x8d, 0x18, 0x18, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x60, 0x77, 0x31, 0x8c, + 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x58, 0x79, 0x11, 0xa4, 0x84, + 0x05, 0x29, 0x21, 0xfe, 0x16, 0xa4, 0x04, 0xf8, 0xcf, 0x12, 0x6c, 0x03, + 0x15, 0x80, 0x92, 0x09, 0xda, 0x1c, 0x43, 0x12, 0xd4, 0xc4, 0x18, 0x42, + 0x55, 0x13, 0xc3, 0x11, 0x41, 0x4c, 0x28, 0xfe, 0x31, 0xcb, 0xd0, 0x71, + 0x81, 0x09, 0x31, 0x21, 0xfe, 0xb3, 0x04, 0xde, 0x88, 0x81, 0x71, 0x84, + 0x20, 0x58, 0xf8, 0x07, 0x06, 0x1a, 0xc3, 0x88, 0xc1, 0x71, 0x84, 0x20, + 0x58, 0xf8, 0x87, 0x25, 0x1a, 0x81, 0x4c, 0x58, 0x20, 0x13, 0xe2, 0x6f, + 0x81, 0x4c, 0x80, 0xff, 0x2c, 0x81, 0x37, 0x50, 0x01, 0x28, 0x9c, 0xd0, + 0xcd, 0x31, 0x24, 0x41, 0x4f, 0x8c, 0x18, 0x20, 0x47, 0x08, 0x82, 0x85, + 0x7f, 0x50, 0xa8, 0x11, 0x98, 0x04, 0x49, 0x0c, 0x32, 0x04, 0x28, 0xc1, + 0x13, 0xb3, 0x04, 0xdf, 0x40, 0x45, 0xe0, 0x07, 0x94, 0xe0, 0x0d, 0x32, + 0x04, 0x2d, 0xe1, 0x13, 0xb3, 0x04, 0x6d, 0x30, 0xcb, 0x10, 0x06, 0x6d, + 0xc0, 0x0f, 0x83, 0x0c, 0xbd, 0xe0, 0x12, 0x61, 0x31, 0x62, 0x70, 0x1c, + 0x21, 0x08, 0x16, 0xfe, 0xd1, 0xa5, 0x46, 0x20, 0x12, 0x73, 0x0c, 0x2b, + 0x11, 0xc4, 0xc5, 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x47, 0xb7, + 0x1a, 0xc3, 0x48, 0xcc, 0x31, 0x08, 0xc1, 0x59, 0x8c, 0x18, 0x1c, 0x47, + 0x08, 0x82, 0x85, 0x7f, 0x74, 0xad, 0x51, 0x90, 0xc4, 0x1c, 0x83, 0x10, + 0xa0, 0xc5, 0x20, 0x43, 0x20, 0x13, 0x66, 0x31, 0xc8, 0x10, 0x94, 0x83, + 0x59, 0xec, 0x61, 0x70, 0x0b, 0xbc, 0x30, 0x0d, 0x0a, 0x80, 0xb1, 0x87, + 0x01, 0x2e, 0xf4, 0xe2, 0x34, 0x28, 0x00, 0xc6, 0x1c, 0x03, 0x4e, 0x04, + 0x7c, 0x31, 0xc8, 0x10, 0xe4, 0x84, 0x5b, 0x58, 0x90, 0x88, 0xff, 0x20, + 0x43, 0xb0, 0x13, 0x6f, 0x31, 0x62, 0x50, 0x1c, 0x21, 0x08, 0x06, 0x9b, + 0x6e, 0x1c, 0xb3, 0x0c, 0x6c, 0x20, 0x06, 0xc1, 0x18, 0xc2, 0x10, 0x1a, + 0xc3, 0x11, 0x01, 0x5c, 0x28, 0xfe, 0x31, 0xcb, 0x40, 0x06, 0x63, 0x10, + 0x98, 0x00, 0x17, 0xe2, 0x3f, 0x4b, 0x50, 0x06, 0x23, 0x06, 0xc6, 0x11, + 0x82, 0x60, 0xe1, 0x1f, 0xd8, 0x6f, 0x0c, 0x23, 0x06, 0xc7, 0x11, 0x82, + 0x60, 0xe1, 0x1f, 0x56, 0x78, 0x04, 0x71, 0x61, 0x41, 0x5c, 0x88, 0xbf, + 0x05, 0x71, 0x01, 0xfe, 0xb3, 0x04, 0x65, 0x30, 0x50, 0x01, 0x28, 0x63, + 0x20, 0x90, 0xc1, 0x1c, 0xc3, 0x58, 0x04, 0xa9, 0x31, 0x86, 0xc0, 0xf8, + 0xc5, 0x70, 0x44, 0x90, 0x17, 0x8a, 0x7f, 0xcc, 0x32, 0x9c, 0x81, 0x19, + 0x04, 0x26, 0xe4, 0x85, 0xf8, 0xcf, 0x12, 0xa0, 0xc1, 0x88, 0x81, 0x71, + 0x84, 0x20, 0x58, 0xf8, 0x07, 0x86, 0x1e, 0xc3, 0x88, 0xc1, 0x71, 0x84, + 0x20, 0x58, 0xf8, 0x87, 0xa5, 0x1e, 0x81, 0x5e, 0x58, 0xa0, 0x17, 0xe2, + 0x6f, 0x81, 0x5e, 0x80, 0xff, 0x2c, 0x01, 0x1a, 0x0c, 0x54, 0x00, 0x8a, + 0x19, 0x08, 0x67, 0x30, 0xc7, 0x90, 0x04, 0xa6, 0x31, 0x86, 0x50, 0x99, + 0xc6, 0x70, 0x44, 0x20, 0x1a, 0x8a, 0x7f, 0xcc, 0x32, 0xa8, 0x41, 0x1a, + 0x04, 0x26, 0x88, 0x86, 0xf8, 0xcf, 0x12, 0xac, 0xc1, 0x88, 0x81, 0x71, + 0x84, 0x20, 0x58, 0xf8, 0x07, 0x16, 0x1f, 0xc3, 0x88, 0xc1, 0x71, 0x84, + 0x20, 0x58, 0xf8, 0x87, 0x35, 0x1f, 0xc1, 0x68, 0x58, 0x30, 0x1a, 0xe2, + 0x6f, 0xc1, 0x68, 0x80, 0xff, 0x2c, 0xc1, 0x1a, 0x0c, 0x54, 0x00, 0x4a, + 0x1a, 0x08, 0x6a, 0x30, 0xc7, 0x90, 0x04, 0xae, 0x31, 0x62, 0x80, 0x1c, + 0x21, 0x08, 0x16, 0xfe, 0x41, 0xe5, 0x47, 0x70, 0x17, 0x75, 0x31, 0xc8, + 0x10, 0xe4, 0x45, 0x6b, 0xcc, 0x12, 0xb0, 0xc1, 0x40, 0x45, 0xe0, 0x07, + 0x61, 0x20, 0xac, 0xc1, 0x20, 0x43, 0xe0, 0x17, 0xaf, 0x31, 0x4b, 0xd0, + 0x06, 0x03, 0x2d, 0x01, 0x8f, 0x18, 0x3c, 0x22, 0xf1, 0xc8, 0x27, 0x0b, + 0x6c, 0xc0, 0x23, 0x60, 0x30, 0xd0, 0x12, 0xa0, 0x88, 0xa1, 0x17, 0x92, + 0x39, 0x7c, 0x04, 0x1b, 0xf0, 0x0b, 0x18, 0x0c, 0x32, 0x04, 0x42, 0x6c, + 0x64, 0x10, 0x10, 0x03, 0x00, 0x12, 0x00, 0x00, 0x00, 0x5b, 0x86, 0x20, + 0x78, 0x87, 0x2d, 0x83, 0x11, 0xc0, 0xc3, 0x96, 0x21, 0x0b, 0xe2, 0x61, + 0xcb, 0xe0, 0x05, 0xf2, 0xb0, 0x65, 0x00, 0x83, 0x60, 0x1e, 0xb6, 0x0c, + 0x69, 0x10, 0xd0, 0xc3, 0x96, 0xc1, 0x0d, 0x82, 0x7a, 0xd8, 0x32, 0xd4, + 0x41, 0x60, 0x0f, 0x5b, 0x86, 0x3b, 0x08, 0xea, 0x61, 0xcb, 0xb0, 0x0e, + 0x81, 0x3d, 0x6c, 0x19, 0xda, 0x21, 0xa8, 0x87, 0x2d, 0x43, 0x5a, 0x04, + 0xf6, 0xb0, 0x65, 0x58, 0x8b, 0xa0, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x61, 0x20, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, + 0x2c, 0x10, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x74, 0xce, 0x00, + 0xd0, 0x5b, 0x02, 0x45, 0x40, 0xf0, 0x58, 0x03, 0x10, 0x08, 0x23, 0x00, + 0x74, 0xcf, 0x41, 0x44, 0x8f, 0xd3, 0x06, 0x04, 0x8c, 0x11, 0x80, 0x20, + 0x08, 0xe2, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, 0x23, 0x00, + 0x14, 0xcc, 0x00, 0xcc, 0x00, 0x50, 0x31, 0x03, 0x30, 0xd6, 0xc0, 0xb2, + 0x67, 0x28, 0x7f, 0xa8, 0x5f, 0xc6, 0xea, 0x97, 0x9f, 0xba, 0x38, 0x7b, + 0x63, 0x0d, 0x7a, 0x0d, 0xee, 0xb8, 0xa7, 0xe2, 0xb9, 0x6d, 0x7f, 0x6f, + 0x9f, 0xd2, 0xa3, 0x37, 0xd6, 0xb0, 0xce, 0x31, 0x8b, 0x7a, 0x69, 0x08, + 0xa3, 0xbb, 0x77, 0xb7, 0xb1, 0x6a, 0x7f, 0x63, 0x0d, 0x62, 0x2e, 0xa6, + 0xfd, 0x07, 0x96, 0x3c, 0x1b, 0xff, 0xc2, 0x98, 0xae, 0x6a, 0xee, 0x0b, + 0x63, 0x0d, 0xff, 0x4c, 0xfa, 0xbf, 0x2f, 0xd0, 0x35, 0x28, 0xe6, 0x5f, + 0x0b, 0xc7, 0x31, 0xe8, 0x0b, 0x63, 0x0d, 0x73, 0xdf, 0xa6, 0xa9, 0x2f, + 0xb4, 0x6e, 0xc8, 0xf3, 0xbe, 0xc0, 0xe7, 0xac, 0x8f, 0x7f, 0x00, 0x00, + 0x00, 0x83, 0x0c, 0xd7, 0xd1, 0x0c, 0x47, 0x58, 0x4d, 0xe0, 0x1f, 0xb3, + 0x0c, 0x81, 0x10, 0xcc, 0x31, 0x24, 0x96, 0x18, 0x0c, 0x32, 0x04, 0x4a, + 0x64, 0xc1, 0x26, 0xfe, 0x83, 0x0c, 0x01, 0x23, 0xcd, 0x12, 0x24, 0xc3, + 0x11, 0x5b, 0x14, 0xf8, 0xc7, 0x2c, 0xc3, 0x90, 0x04, 0xc3, 0x11, 0x9d, + 0x14, 0xf8, 0xc7, 0x2c, 0x03, 0x51, 0x04, 0x23, 0x06, 0xc7, 0x11, 0x82, + 0x60, 0xe1, 0x1f, 0x5d, 0x28, 0x7c, 0xce, 0x1c, 0x43, 0x14, 0xa4, 0xc1, + 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x47, 0x37, 0x0a, 0x61, 0xf0, + 0xcc, 0x31, 0x08, 0x01, 0x37, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, + 0xd1, 0x95, 0xc2, 0x18, 0x40, 0x73, 0x0c, 0x42, 0xd0, 0xcd, 0x12, 0x14, + 0x03, 0x15, 0x81, 0x40, 0x70, 0xc3, 0x18, 0x42, 0xf0, 0x06, 0x63, 0x08, + 0x42, 0x18, 0x8c, 0x21, 0x0c, 0x61, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, + 0x16, 0xfe, 0x61, 0xa5, 0x82, 0x10, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, + 0x85, 0x7f, 0x58, 0xaa, 0x40, 0x04, 0xc3, 0x11, 0x81, 0x27, 0xf8, 0xc7, + 0x2c, 0x83, 0x71, 0x04, 0x83, 0x0c, 0x87, 0x47, 0x06, 0x36, 0xa8, 0x81, + 0xf8, 0x5b, 0x30, 0x06, 0xe0, 0x6f, 0xc5, 0x1a, 0x88, 0xbf, 0x05, 0x65, + 0x00, 0xfe, 0x36, 0x04, 0xe4, 0x3f, 0xc7, 0x20, 0x06, 0xc1, 0x1e, 0x0c, + 0x32, 0x04, 0x63, 0xa0, 0x06, 0x16, 0x20, 0xe2, 0x3f, 0xc8, 0x10, 0x94, + 0xc1, 0x1a, 0xcc, 0x12, 0x1c, 0x03, 0x15, 0x81, 0x60, 0x88, 0x41, 0x31, + 0xcb, 0x80, 0x24, 0xd9, 0x20, 0x43, 0x90, 0x06, 0x6f, 0x30, 0x62, 0x70, + 0x1c, 0x21, 0x08, 0x16, 0xfe, 0xd1, 0xe9, 0x42, 0x40, 0x06, 0x73, 0x0c, + 0x6a, 0x10, 0x88, 0xc2, 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x47, + 0xc7, 0x0b, 0x43, 0x19, 0xcc, 0x31, 0x08, 0x41, 0x1d, 0x8c, 0x18, 0x1c, + 0x47, 0x08, 0x82, 0x85, 0x7f, 0x74, 0xbe, 0x50, 0x98, 0xc1, 0x1c, 0x83, + 0x10, 0xd8, 0xc1, 0x2c, 0x41, 0x32, 0x50, 0x12, 0x90, 0x42, 0xe0, 0x0a, + 0x82, 0x80, 0x40, 0xc7, 0x20, 0x43, 0x10, 0x07, 0x77, 0x90, 0x01, 0x00, + 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, + 0x22, 0x84, 0x00, 0xbf, 0x09, 0x18, 0xd0, 0xac, 0x80, 0x07, 0xb4, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x6d, 0x00, 0x00, + 0x00, 0x12, 0x03, 0x94, 0x68, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x3e, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x58, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xa8, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x66, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x00, + 0x00, 0x48, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, + 0x00, 0x5c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, + 0x00, 0x6c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, + 0x00, 0x7d, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, + 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, + 0x00, 0x93, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, + 0x00, 0xa0, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, + 0x00, 0x19, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x00, + 0x00, 0xb9, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, + 0x00, 0xca, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, + 0x00, 0x12, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, + 0x00, 0xdc, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, + 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, + 0x00, 0xef, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, + 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, + 0x00, 0x02, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, + 0x00, 0x21, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, + 0x00, 0x23, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x23, 0x01, 0x00, + 0x00, 0x1b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x5d, 0x00, 0x00, + 0x00, 0x12, 0x03, 0x94, 0xe6, 0x02, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, + 0x5f, 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x5a, 0x31, 0x34, 0x47, 0x65, 0x74, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, + 0x52, 0x55, 0x31, 0x31, 0x4d, 0x54, 0x4c, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x74, 0x4b, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x61, 0x69, 0x72, + 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x2e, + 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, + 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, + 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, 0x66, + 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x74, 0x2e, 0x75, 0x2e, 0x69, 0x31, 0x2e, 0x66, 0x2e, 0x66, 0x33, 0x32, + 0x61, 0x69, 0x72, 0x2e, 0x64, 0x6f, 0x74, 0x2e, 0x76, 0x33, 0x66, 0x33, + 0x32, 0x5f, 0x5a, 0x31, 0x32, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x54, 0x6f, + 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x44, 0x76, 0x33, 0x5f, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, + 0x6d, 0x61, 0x78, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, + 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x76, 0x33, 0x66, 0x33, + 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, + 0x62, 0x73, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, + 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78, 0x2e, 0x76, 0x33, + 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x32, 0x64, + 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x76, 0x34, 0x66, 0x33, 0x32, + 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x32, 0x64, 0x2e, 0x76, 0x34, + 0x66, 0x33, 0x32, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, + 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, + 0x69, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, + 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0xa8, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x00, 0x14, 0x00, 0x00, 0x00, 0xa4, 0x22, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00, - 0x00, 0x21, 0x0c, 0x00, 0x00, 0xa2, 0x06, 0x00, 0x00, 0x0b, 0x02, 0x21, + 0x00, 0x21, 0x0c, 0x00, 0x00, 0xe1, 0x07, 0x00, 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, @@ -1368,7 +2421,7 @@ const unsigned char sdl_metallib[] = { 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x31, 0x46, - 0x06, 0x51, 0x18, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, + 0x06, 0x51, 0x18, 0x00, 0x00, 0x6d, 0x01, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x58, 0x03, 0x40, 0x02, 0x2a, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0, 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, @@ -1410,889 +2463,350 @@ const unsigned char sdl_metallib[] = { 0x0d, 0x40, 0x61, 0x08, 0x87, 0x74, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x03, 0x77, 0x78, 0x87, 0x36, 0x08, 0x07, 0x76, 0x48, 0x87, 0x70, 0x98, 0x07, 0x60, 0x83, 0x41, 0x20, - 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0xe2, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, - 0x02, 0xa8, 0x0d, 0x89, 0x31, 0x00, 0x0b, 0x50, 0x05, 0x69, 0x00, 0x0a, - 0x1b, 0x8c, 0xc3, 0x00, 0x16, 0xa0, 0xda, 0xa0, 0x20, 0xff, 0xff, 0xff, - 0xff, 0x3f, 0x00, 0x6d, 0x00, 0xac, 0x01, 0x20, 0x01, 0xd5, 0x06, 0x23, - 0x09, 0x80, 0x05, 0xa8, 0x36, 0x18, 0x8a, 0x00, 0x2c, 0x40, 0xb5, 0x61, - 0x5a, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xd6, 0x00, 0x50, 0x06, 0x77, - 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, - 0x70, 0x87, 0x79, 0x00, 0x36, 0x14, 0xcc, 0x10, 0xa4, 0x01, 0x28, 0x6c, - 0x30, 0x9a, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa0, 0x36, 0x28, - 0xce, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x40, 0x1b, 0x00, 0x6b, 0x00, 0x48, - 0x40, 0x05, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x07, 0x00, 0x00, - 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x41, 0x31, 0x61, 0x08, 0x8c, - 0x63, 0xc2, 0x80, 0x24, 0xca, 0x04, 0x61, 0x61, 0x26, 0x04, 0xcd, 0x84, - 0xc1, 0x49, 0x14, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x47, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, - 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, - 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xc8, 0xc1, 0x0c, 0xc0, 0x30, 0x02, - 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, - 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18, - 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6, - 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4, - 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50, - 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21, - 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29, - 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1, - 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0xb8, 0x48, 0x9a, 0x22, 0x4a, - 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00, - 0x06, 0x11, 0x18, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44, 0xb2, 0x2c, 0x0d, - 0x39, 0x85, 0x28, 0x8a, 0xa2, 0x20, 0xa8, 0x0c, 0x00, 0x00, 0x90, 0x54, - 0x04, 0x00, 0x20, 0x6a, 0x8e, 0x20, 0x28, 0x82, 0x05, 0xd0, 0x55, 0x06, - 0xa0, 0x28, 0x28, 0x2b, 0x43, 0x51, 0x14, 0xb4, 0x15, 0xa1, 0x28, 0xa8, - 0x2b, 0x47, 0x20, 0x00, 0xc9, 0xb2, 0x34, 0xf4, 0xcd, 0x11, 0x20, 0x46, - 0x08, 0xc2, 0x39, 0x02, 0x30, 0x18, 0x46, 0x10, 0xc6, 0xa0, 0x28, 0xe2, - 0xd2, 0x08, 0x16, 0x69, 0x01, 0xc0, 0x48, 0xe5, 0x40, 0x40, 0x0a, 0x8c, - 0x73, 0x04, 0xa0, 0x30, 0x88, 0x00, 0x08, 0x53, 0x00, 0x23, 0x00, 0xc3, - 0x08, 0xc3, 0x18, 0x0c, 0x23, 0x10, 0x63, 0x30, 0x88, 0x10, 0x08, 0x83, - 0x08, 0x87, 0x30, 0x88, 0x50, 0x08, 0x00, 0x00, 0x00, 0x13, 0xbe, 0x70, - 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, - 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, 0x79, 0x88, 0x83, 0x39, - 0x70, 0x03, 0x38, 0x70, 0x03, 0x38, 0x68, 0x83, 0x79, 0x48, 0x87, 0x76, - 0xa8, 0x07, 0x76, 0x08, 0x07, 0x7a, 0x78, 0x07, 0x79, 0xd8, 0x70, 0x1b, - 0xe5, 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, - 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, - 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, - 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, - 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, - 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, - 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, - 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, - 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, - 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, - 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, - 0x72, 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, - 0x6d, 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, - 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, - 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, - 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, - 0x79, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, - 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, - 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, - 0xf6, 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, - 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, - 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, - 0x76, 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, - 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, - 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, - 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, - 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x11, - 0xc2, 0x90, 0x15, 0xdb, 0x95, 0xbf, 0x36, 0x54, 0x40, 0x23, 0x10, 0xc3, - 0x5f, 0x44, 0x80, 0xc1, 0x10, 0xcd, 0x34, 0x24, 0x02, 0x2a, 0x07, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x86, 0x44, 0x15, - 0x05, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xc0, - 0x90, 0x28, 0x0d, 0x20, 0x09, 0x08, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x86, 0x44, 0x79, 0x10, 0x51, 0x40, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x24, 0x52, 0x05, 0xeb, 0x02, - 0x02, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, 0x11, - 0x38, 0x34, 0x19, 0x10, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x0c, 0x89, 0xda, 0x21, 0x92, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x60, 0x48, 0xe4, 0x0f, 0xd2, 0x06, 0x04, 0x80, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0x22, 0x98, 0x98, - 0x3a, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, - 0x12, 0x8d, 0xc5, 0xb4, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x00, 0xc0, 0x90, 0xc8, 0x2e, 0xcc, 0xe1, 0x43, 0x80, 0x61, 0x00, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0x21, 0x11, 0x8f, 0x6c, 0x65, - 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x12, - 0x1b, 0x04, 0x8a, 0x92, 0x1a, 0x00, 0x00, 0x64, 0x81, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, - 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x1a, 0x8b, 0xa0, 0x04, - 0x0a, 0x61, 0x04, 0xa0, 0x0c, 0x0a, 0xa8, 0x20, 0x0a, 0xa3, 0x40, 0x0a, - 0xa5, 0x60, 0x0a, 0xa7, 0x00, 0x03, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, - 0x28, 0x1d, 0x01, 0x28, 0x84, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, - 0x29, 0x1c, 0x42, 0xc7, 0x12, 0x22, 0x01, 0x00, 0x00, 0xb1, 0x18, 0x00, - 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, - 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, - 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, - 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, - 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, - 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, - 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, - 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, - 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, - 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, - 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, - 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, - 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, - 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, - 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, - 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, - 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, - 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, - 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, - 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, - 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, - 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, - 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, - 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, - 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, - 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, - 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, - 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, - 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, - 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, - 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, - 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, - 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, - 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, - 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, - 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, - 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, - 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, - 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, - 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, - 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, - 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, - 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, - 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, - 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, - 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, - 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, - 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, - 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, - 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, - 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, - 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, - 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, - 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, - 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, 0x00, 0x47, 0x01, 0x00, - 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, - 0x11, 0x32, 0x64, 0xd4, 0xec, 0x80, 0x0d, 0xe8, 0x0b, 0x8b, 0xf2, 0x06, - 0xc5, 0xc6, 0x91, 0x41, 0x14, 0x19, 0x8c, 0x22, 0x31, 0x88, 0x64, 0x3d, - 0x45, 0x66, 0x20, 0xca, 0x23, 0x21, 0x54, 0xc1, 0x30, 0xca, 0xe2, 0x3c, - 0xcf, 0x13, 0x5d, 0x4f, 0x60, 0x18, 0x88, 0x91, 0x18, 0x8b, 0x82, 0x11, - 0xc4, 0x72, 0x04, 0x00, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, + 0xc0, 0x02, 0x54, 0x1b, 0xc2, 0xa4, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, + 0x58, 0x03, 0x40, 0x02, 0x2a, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, + 0x1d, 0xf0, 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, + 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, + 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, + 0x60, 0x87, 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, + 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, + 0xa0, 0x07, 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1, + 0x1d, 0xda, 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, + 0x1d, 0xe6, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, + 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, + 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, + 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, + 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, + 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, + 0x48, 0x87, 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, + 0x28, 0x87, 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, + 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, + 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, + 0x70, 0x87, 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, + 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, + 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, + 0x1d, 0xca, 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, + 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, + 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, + 0x68, 0x03, 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, + 0x38, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, + 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, + 0x1d, 0xda, 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, + 0x1e, 0xde, 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, + 0x1c, 0xe4, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, + 0x00, 0x88, 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, + 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, + 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0x90, 0x18, 0x02, 0xb0, 0x00, + 0x55, 0x90, 0x06, 0x60, 0xb0, 0xc1, 0x38, 0xfe, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x24, 0x80, 0xda, 0xe0, 0x23, 0xc8, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x80, 0x04, 0x54, 0x44, 0x38, 0xc0, 0x03, 0x3c, 0xc8, 0xc3, 0x3b, 0xe0, + 0x43, 0x1b, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb4, 0x81, 0x39, 0xc0, + 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f, + 0xf5, 0x50, 0x0e, 0x00, 0xd1, 0x0e, 0xe9, 0xe0, 0x0e, 0x6d, 0xc0, 0x0e, + 0xe5, 0x70, 0x0e, 0xe1, 0xc0, 0x0e, 0x6d, 0x60, 0x0f, 0xe5, 0x30, 0x0e, + 0xf4, 0xf0, 0x0e, 0xf2, 0xd0, 0x06, 0xf7, 0x90, 0x0e, 0xe4, 0x40, 0x0f, + 0xe8, 0x00, 0xe4, 0x81, 0x1d, 0x00, 0x83, 0x3b, 0xbc, 0x43, 0x1b, 0x88, + 0x43, 0x3d, 0xa4, 0x03, 0x3b, 0xd0, 0x43, 0x3a, 0xb8, 0xc3, 0x3c, 0x00, + 0x84, 0x3b, 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94, + 0x43, 0x1b, 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, + 0x43, 0x1b, 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0x00, 0xf4, 0x20, 0x0f, + 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xe6, 0x20, 0x0f, + 0xe1, 0xd0, 0x0e, 0xe5, 0xd0, 0x06, 0xf0, 0xf0, 0x0e, 0xe9, 0xe0, 0x0e, + 0xf4, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xe5, 0xc0, 0x0e, 0xe9, 0xd0, 0x0e, + 0x6d, 0xe0, 0x0e, 0xef, 0xe0, 0x0e, 0x6d, 0xc0, 0x0e, 0xe5, 0x10, 0x0e, + 0xe6, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, + 0x43, 0x1b, 0xa4, 0x83, 0x3b, 0x98, 0xc3, 0x3c, 0xb4, 0x81, 0x39, 0xc0, + 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f, + 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xee, 0x10, 0x0e, + 0xee, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, 0x0e, + 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8, + 0xc3, 0x3b, 0xb4, 0xc1, 0x3c, 0xa4, 0xc3, 0x39, 0xb8, 0x43, 0x39, 0x90, + 0x43, 0x1b, 0xe8, 0x43, 0x39, 0xc8, 0xc3, 0x3b, 0xcc, 0x43, 0x1b, 0x98, + 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f, + 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x40, 0x0f, + 0xf2, 0x10, 0x0e, 0xf0, 0x00, 0x0f, 0xe9, 0xe0, 0x0e, 0xe7, 0xd0, 0x06, + 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, + 0x03, 0x40, 0xcc, 0x03, 0x3d, 0x84, 0xc3, 0x38, 0xac, 0x43, 0x1b, 0xc0, + 0x83, 0x3c, 0xbc, 0x03, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, + 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, + 0xc1, 0x3c, 0xa4, 0x83, 0x3e, 0x94, 0x03, 0x80, 0x07, 0x00, 0x51, 0x0f, + 0xee, 0x30, 0x0f, 0xe1, 0x60, 0x0e, 0xe5, 0xd0, 0x06, 0xe6, 0x00, 0x0f, + 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, + 0x43, 0x39, 0x00, 0x1b, 0x94, 0xe4, 0xff, 0xff, 0xff, 0xff, 0x07, 0xa0, + 0x0d, 0x80, 0x35, 0x00, 0x24, 0xa0, 0xda, 0x60, 0x28, 0x01, 0xb0, 0x00, + 0xd5, 0x06, 0x63, 0x11, 0x80, 0x05, 0xa8, 0x36, 0x28, 0xcc, 0xff, 0xff, + 0xff, 0xff, 0x0f, 0x40, 0x1b, 0x00, 0x6b, 0x00, 0x48, 0x40, 0xb5, 0xc1, + 0x68, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x24, 0x80, 0xda, 0x30, 0x39, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x6b, 0x00, 0x28, 0x83, 0x3b, 0xbc, + 0x43, 0x1b, 0x88, 0x43, 0x3d, 0xa4, 0x03, 0x3b, 0xd0, 0x43, 0x3a, 0xb8, + 0xc3, 0x3c, 0x00, 0x1b, 0x8a, 0x47, 0x08, 0xd2, 0x00, 0x0c, 0x36, 0x44, + 0xd0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x32, 0xb8, 0xc3, 0x3b, 0xb4, + 0x81, 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03, 0x3d, 0xa4, 0x83, 0x3b, 0xcc, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x42, 0x61, 0x4c, 0x08, 0x8e, + 0x09, 0x01, 0x32, 0x61, 0x48, 0x94, 0x65, 0xc2, 0xc0, 0x28, 0xcb, 0x84, + 0xa0, 0x99, 0x20, 0x38, 0xcf, 0x84, 0x00, 0x02, 0x00, 0x89, 0x20, 0x00, + 0x00, 0x48, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, + 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, + 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xd0, 0xc1, + 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, + 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, + 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, + 0x41, 0x18, 0x46, 0x18, 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, + 0xe4, 0xa1, 0x1e, 0xc6, 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, + 0xc2, 0x81, 0x1d, 0xf4, 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, + 0xd2, 0x01, 0x1f, 0x50, 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, + 0xec, 0xbe, 0x1d, 0x21, 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, + 0x84, 0xa3, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, + 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0xb8, + 0x48, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, + 0x7f, 0x1a, 0x23, 0x00, 0x06, 0x11, 0x18, 0xa1, 0x24, 0x41, 0x10, 0x08, + 0x44, 0xb2, 0x2c, 0x0d, 0x39, 0x65, 0x08, 0x02, 0x82, 0xa0, 0x42, 0x14, + 0x45, 0x51, 0x90, 0x54, 0x06, 0x00, 0x00, 0x88, 0x2a, 0x02, 0x00, 0x90, + 0x35, 0x47, 0x10, 0x14, 0x01, 0x03, 0x28, 0x2b, 0x03, 0x50, 0x14, 0xb4, + 0x15, 0xa3, 0x28, 0x00, 0x00, 0x00, 0xa8, 0x2b, 0x43, 0x51, 0x14, 0xf4, + 0x15, 0xa1, 0x28, 0x28, 0x9c, 0x23, 0x40, 0x8c, 0x10, 0x8c, 0x73, 0x04, + 0x60, 0x30, 0x8c, 0x20, 0x94, 0x41, 0x51, 0xc8, 0xa5, 0x11, 0x30, 0x13, + 0x03, 0x80, 0x92, 0xce, 0x81, 0x80, 0x14, 0x28, 0xe7, 0x08, 0x40, 0x61, + 0x10, 0x01, 0x10, 0xa6, 0x00, 0x46, 0x00, 0x86, 0x11, 0x86, 0x32, 0x18, + 0x44, 0x08, 0x84, 0x41, 0x84, 0x43, 0x18, 0x44, 0x28, 0x84, 0x61, 0x04, + 0xa2, 0x0c, 0x00, 0x00, 0x00, 0x13, 0xbe, 0x70, 0x48, 0x07, 0x79, 0xb0, + 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, + 0x83, 0x74, 0x78, 0x87, 0x79, 0x88, 0x83, 0x39, 0x70, 0x03, 0x38, 0x70, + 0x03, 0x38, 0x68, 0x83, 0x79, 0x48, 0x87, 0x76, 0xa8, 0x07, 0x76, 0x08, + 0x07, 0x7a, 0x78, 0x07, 0x79, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, + 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, + 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, + 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, + 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, + 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, + 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, + 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, + 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, + 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, + 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, + 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, + 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, + 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, + 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, + 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, + 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, + 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, + 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, + 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, + 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, + 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, + 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, + 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, + 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, + 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, + 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, + 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x11, 0xc2, 0x90, 0x11, 0xdb, + 0x95, 0xff, 0xf9, 0xd6, 0xf6, 0x5f, 0x44, 0x80, 0xc1, 0x10, 0xcd, 0x34, + 0x24, 0x02, 0x22, 0x07, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x86, 0x44, 0x11, 0x1e, 0x40, 0x08, 0x30, 0x08, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x30, 0x24, 0x4a, 0x05, 0x4a, 0x02, 0x02, + 0x60, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, 0x51, 0x2f, + 0x40, 0x14, 0x10, 0x00, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x89, 0xda, 0x21, 0xb2, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x60, 0x48, 0xe4, 0x0f, 0x56, 0x06, 0x04, 0xc0, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0x22, 0x9a, 0x68, 0x36, + 0x20, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x12, + 0x85, 0x45, 0xd6, 0x21, 0xc0, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0xc0, 0x90, 0x48, 0x2f, 0x22, 0x0a, 0x08, 0x80, 0x01, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x86, 0x44, 0xab, 0x21, 0x7d, 0x40, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x24, 0xea, 0x8d, + 0x29, 0x0c, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x60, 0x48, 0x04, 0x1f, 0xd3, 0x07, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x43, 0xa2, 0x11, 0xd9, 0xce, 0x00, 0x08, 0x80, + 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x36, 0x08, 0x14, + 0x15, 0x3f, 0x00, 0x00, 0xc8, 0x02, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, + 0x47, 0xc6, 0x04, 0x43, 0x2a, 0x8b, 0xa0, 0x04, 0x0a, 0x61, 0x04, 0xa0, + 0x0c, 0x0a, 0xa8, 0x20, 0x0a, 0xa3, 0x40, 0x0a, 0xa5, 0x60, 0x0a, 0xa7, + 0x00, 0x03, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, 0x68, 0x1d, 0x01, 0x28, + 0x84, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0x52, 0xc7, + 0x12, 0x24, 0x01, 0x00, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, + 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, + 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, + 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, + 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, + 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, + 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, + 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, + 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, + 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, + 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, + 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, + 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, + 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, + 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, + 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, + 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, + 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, + 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, + 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, + 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, + 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, + 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, + 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, + 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, + 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, + 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, + 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, + 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, + 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, + 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, + 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, + 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, + 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, + 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, + 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, + 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, + 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, + 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, + 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, + 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, + 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, + 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, + 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, + 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, + 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, + 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, + 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, + 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, + 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, + 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, + 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, + 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, + 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, + 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, + 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x79, 0x20, 0x00, 0x00, 0x71, 0x01, 0x00, 0x00, 0x32, 0x9a, 0x08, + 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4, + 0xf2, 0x00, 0x0e, 0xdc, 0x0c, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x41, + 0x14, 0x19, 0x8c, 0x22, 0x31, 0x88, 0x64, 0x3d, 0x45, 0x66, 0x20, 0xca, + 0x23, 0x21, 0x54, 0xc1, 0x30, 0xca, 0xe2, 0x3c, 0xcf, 0x13, 0x5d, 0x4f, + 0x60, 0x18, 0x88, 0x91, 0x18, 0x8b, 0x82, 0x11, 0xc5, 0x72, 0x04, 0xd5, + 0xf3, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32, - 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, 0x20, 0x28, 0x6d, 0x65, 0x74, 0x61, - 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, - 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, - 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, - 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, - 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, - 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x6e, 0x6f, 0x5f, 0x70, 0x65, - 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, - 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x61, 0x69, 0x72, - 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, - 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69, 0x72, 0x2e, - 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, - 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x63, 0x6f, - 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74, 0x6f, 0x6e, - 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x74, - 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, - 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, - 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77, 0x68, 0x69, - 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e, - 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x74, 0x73, 0x63, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x6f, 0x66, - 0x66, 0x73, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, - 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x59, 0x55, 0x56, 0x44, 0x65, 0x63, - 0x6f, 0x64, 0x65, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x61, 0x69, 0x72, 0x2e, - 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, - 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x30, 0x74, 0x65, - 0x78, 0x31, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0xe4, 0xa8, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0x30, 0x06, 0xcc, 0x08, 0x02, - 0x1a, 0x94, 0xc1, 0x08, 0xc2, 0x18, 0x34, 0x23, 0x08, 0x63, 0xe0, 0x8c, - 0x20, 0x8c, 0xc1, 0x33, 0x82, 0xf0, 0x00, 0x23, 0x08, 0x63, 0x00, 0x8d, - 0x20, 0x8c, 0x41, 0x34, 0x82, 0x30, 0x06, 0xd2, 0x08, 0xc2, 0x18, 0x4c, - 0x23, 0x08, 0x63, 0x40, 0x8d, 0x20, 0x8c, 0x41, 0x35, 0x82, 0x30, 0x06, - 0xd6, 0x08, 0xc2, 0x18, 0x5c, 0x23, 0x08, 0x63, 0x80, 0x8d, 0x20, 0x8c, - 0x41, 0x36, 0x82, 0x30, 0x06, 0xda, 0x08, 0xc2, 0x18, 0x6c, 0x23, 0x08, - 0x63, 0xc0, 0xcd, 0x30, 0xdc, 0x41, 0x80, 0x07, 0x33, 0x0c, 0x79, 0x20, - 0xe8, 0xc1, 0x0c, 0xc1, 0x30, 0xc3, 0x70, 0x07, 0x77, 0xb0, 0x07, 0x33, - 0x10, 0x44, 0x1e, 0xe4, 0xc1, 0x1e, 0xcc, 0x10, 0x14, 0x33, 0x04, 0xc6, - 0x0c, 0xc1, 0x31, 0x43, 0x81, 0xec, 0xc1, 0x1e, 0x24, 0xca, 0x0c, 0x81, - 0x2c, 0xcc, 0x80, 0xec, 0xc1, 0xc2, 0x34, 0x89, 0xe2, 0x3c, 0x33, 0x24, - 0x79, 0x00, 0x45, 0x8c, 0x94, 0x28, 0xce, 0x34, 0x43, 0x72, 0x07, 0x10, - 0xc5, 0x48, 0x49, 0xe5, 0x58, 0x33, 0xa0, 0xc1, 0x1e, 0xe8, 0xc1, 0x1e, - 0x70, 0x9d, 0x1e, 0xe8, 0xc1, 0x1e, 0x70, 0xde, 0x1f, 0xe8, 0xc1, 0x1e, - 0x70, 0x1f, 0x28, 0xe8, 0xc1, 0x1e, 0x70, 0x60, 0x10, 0x0a, 0x7a, 0xb0, - 0x07, 0x5c, 0x18, 0x88, 0x82, 0x1e, 0xec, 0x01, 0x27, 0x06, 0xa3, 0xa0, - 0x07, 0x7b, 0xc0, 0x8d, 0x01, 0x29, 0xe8, 0xc1, 0x1e, 0x70, 0x64, 0x30, - 0x83, 0xd4, 0x07, 0x17, 0xe6, 0x07, 0xd9, 0x1e, 0xe4, 0x81, 0xb6, 0xdd, - 0x42, 0x19, 0xf8, 0x81, 0x19, 0xe8, 0x41, 0x72, 0x06, 0x0e, 0x1a, 0xcc, - 0xa0, 0xec, 0x41, 0x28, 0xec, 0x41, 0x1a, 0xa8, 0x41, 0x28, 0x98, 0xc2, - 0x1e, 0xac, 0x01, 0x1b, 0xcc, 0x20, 0xe9, 0xc1, 0x85, 0x95, 0x42, 0x96, - 0x07, 0x79, 0xa0, 0x6d, 0xb9, 0x50, 0x06, 0xa5, 0x60, 0x06, 0xa1, 0x90, - 0xb4, 0x81, 0xe3, 0x06, 0x33, 0x28, 0xa7, 0xf0, 0x06, 0xd9, 0x1e, 0xe4, - 0x01, 0x1c, 0x24, 0x71, 0xe0, 0xc8, 0xc1, 0x0c, 0x0a, 0x2a, 0xbc, 0x41, - 0x96, 0x07, 0x79, 0x00, 0x07, 0x49, 0x1c, 0x38, 0x73, 0x30, 0x43, 0x92, - 0x0a, 0x74, 0x90, 0xed, 0x41, 0x1e, 0x24, 0x75, 0xe0, 0xd8, 0xc1, 0x0c, - 0x08, 0x2d, 0xd4, 0x82, 0x2d, 0xe0, 0x82, 0x2e, 0xec, 0x02, 0x2f, 0xf4, - 0xc2, 0x0c, 0x03, 0x1f, 0xcc, 0x82, 0x2f, 0x54, 0x1a, 0x00, 0x62, 0x80, - 0x06, 0x62, 0x20, 0x06, 0x62, 0xc0, 0x89, 0x81, 0x18, 0x88, 0x81, 0x18, - 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, - 0x88, 0x81, 0x1b, 0xb8, 0x81, 0x45, 0x07, 0x7a, 0x60, 0x59, 0x96, 0x1e, - 0x70, 0xa6, 0xc0, 0x0a, 0xac, 0x40, 0x37, 0x7e, 0x81, 0x12, 0x7e, 0x61, - 0x0f, 0xf6, 0xa0, 0x0e, 0xf0, 0x20, 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d, - 0xcd, 0xae, 0xcd, 0xa5, 0xed, 0x8d, 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c, - 0x2d, 0xec, 0x6c, 0x6e, 0x14, 0x21, 0x15, 0x54, 0xe1, 0x14, 0x36, 0x36, - 0xbb, 0x36, 0x97, 0x34, 0xb2, 0x32, 0x37, 0xba, 0x51, 0x82, 0x55, 0xb8, - 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, - 0x94, 0x80, 0x15, 0x8e, 0x0a, 0x4b, 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b, - 0xab, 0x0b, 0x3b, 0x2b, 0xfb, 0xb2, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, - 0x1b, 0x25, 0x68, 0x85, 0x9b, 0xc2, 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda, - 0xe0, 0xd2, 0xd8, 0xca, 0xbe, 0xde, 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, - 0x46, 0x19, 0x5c, 0xe1, 0x15, 0x60, 0xe1, 0x98, 0xb0, 0x34, 0x39, 0x17, - 0x33, 0xb9, 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, 0x51, 0x02, 0x5f, 0x00, - 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, - 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, - 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, - 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, - 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, - 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, - 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, - 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, - 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, - 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, - 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, - 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, - 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, - 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, - 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, - 0x00, 0x3b, 0x02, 0x00, 0x00, 0x13, 0x04, 0x72, 0x10, 0x0b, 0x04, 0x00, - 0x00, 0x4c, 0x00, 0x00, 0x00, 0x34, 0xce, 0x00, 0x50, 0x5a, 0x02, 0x45, - 0x40, 0xed, 0x08, 0xc0, 0x58, 0x03, 0x10, 0x08, 0xe4, 0xce, 0x41, 0x3c, - 0x0d, 0xe3, 0x06, 0x63, 0x11, 0x40, 0x20, 0x1c, 0x04, 0x8c, 0x11, 0xf0, - 0xf0, 0xaa, 0xd3, 0xdd, 0x18, 0x81, 0x2c, 0xba, 0x3d, 0x0d, 0x06, 0x63, - 0x04, 0xb5, 0x5a, 0xab, 0xed, 0x37, 0x46, 0xd0, 0xc7, 0xa2, 0x8b, 0x7f, - 0x63, 0x04, 0x6e, 0x1f, 0x8b, 0xb6, 0x2f, 0x8c, 0x11, 0x80, 0x20, 0x08, - 0xe2, 0xdf, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0xc4, 0x3c, - 0xd8, 0xe7, 0xde, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xbc, - 0x7b, 0x5a, 0xde, 0xdf, 0x18, 0x81, 0xce, 0x9a, 0x73, 0x08, 0x06, 0x23, - 0x00, 0x63, 0x04, 0x20, 0x08, 0x82, 0x20, 0x18, 0x8c, 0x11, 0x80, 0x20, - 0x08, 0x92, 0x60, 0x40, 0xc1, 0x0c, 0xc0, 0x0c, 0x00, 0x15, 0x33, 0x00, - 0x23, 0x00, 0x33, 0x00, 0x63, 0x0d, 0x20, 0x08, 0x82, 0xf8, 0x07, 0x82, - 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82, 0xf8, 0x37, 0xd6, 0xc0, 0xb6, 0xf3, - 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4, 0xc7, 0xb6, 0xf3, 0x4f, 0x7a, 0x63, - 0x0d, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, 0xc8, 0xd6, 0xbf, 0x00, - 0x82, 0x20, 0x5b, 0xff, 0xc2, 0x58, 0x03, 0x08, 0x82, 0x6b, 0x0e, 0x06, - 0x20, 0x08, 0xae, 0x39, 0x18, 0x80, 0x20, 0xb8, 0xe6, 0x60, 0x30, 0xd6, - 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, 0x6d, 0x0e, 0x06, 0x20, - 0x48, 0xb7, 0x39, 0x18, 0x8c, 0x35, 0xac, 0x23, 0x1e, 0xb3, 0x60, 0xb0, - 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x3a, 0xe2, 0x31, 0x0b, 0x06, 0x63, 0x0d, - 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, 0x87, 0x63, 0x00, 0x82, - 0x30, 0x1e, 0x8e, 0xc1, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25, - 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f, - 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c, - 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2, - 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x00, 0x00, 0xf1, 0x30, 0x00, - 0x00, 0x5e, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x22, 0x88, - 0x5f, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x9c, 0x81, 0x85, 0x61, 0x16, - 0x00, 0x5f, 0x5a, 0x54, 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, - 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, - 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, - 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, - 0x54, 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, - 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, - 0x5f, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x66, 0x72, - 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, - 0x72, 0x67, 0x28, 0x33, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x73, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x74, 0x65, 0x78, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, - 0x28, 0x34, 0x29, 0x00, 0x00, 0x13, 0x84, 0x34, 0xe8, 0x26, 0x08, 0x69, - 0xe0, 0x4d, 0x10, 0xd2, 0xe0, 0x9b, 0x20, 0xa4, 0x01, 0x18, 0x4c, 0x10, - 0xd2, 0x20, 0x0c, 0x26, 0x08, 0x69, 0x20, 0x06, 0x13, 0x84, 0x34, 0x18, - 0x83, 0x09, 0x42, 0x1a, 0x90, 0xc1, 0x0a, 0x01, 0x1e, 0xc6, 0x61, 0xc5, - 0x10, 0x0f, 0xf0, 0x40, 0x0e, 0x2b, 0x06, 0x79, 0x80, 0x87, 0x72, 0x58, - 0x31, 0xcc, 0x03, 0x3c, 0x98, 0xc3, 0x8a, 0x81, 0x1e, 0xe0, 0xe1, 0x1c, - 0x36, 0x04, 0xe2, 0xb0, 0x61, 0x08, 0x87, 0x7a, 0x40, 0x87, 0x0d, 0x03, - 0x67, 0x0f, 0xe8, 0xb0, 0x21, 0x02, 0x87, 0x7b, 0x40, 0x87, 0x7b, 0x48, - 0x87, 0x7b, 0x50, 0x87, 0x7b, 0x58, 0x87, 0x7b, 0x60, 0x87, 0x7b, 0x68, - 0x87, 0x7b, 0x70, 0x87, 0x7b, 0x78, 0x87, 0x0d, 0x03, 0x3e, 0xdc, 0x43, - 0x3a, 0x6c, 0x08, 0xe2, 0x61, 0xc3, 0x40, 0x0f, 0xf3, 0x20, 0x0f, 0x1b, - 0x06, 0x7c, 0xb8, 0x07, 0x75, 0xd8, 0x30, 0xe0, 0xc3, 0x3d, 0xbc, 0xc3, - 0x86, 0x01, 0x1f, 0xee, 0x81, 0x1d, 0x36, 0x0c, 0xf8, 0x70, 0x0f, 0xed, - 0xb0, 0x61, 0xc0, 0x87, 0x7b, 0x70, 0x87, 0x0d, 0x03, 0x3e, 0xdc, 0x03, - 0x3a, 0x6c, 0x18, 0xf0, 0xe1, 0x1e, 0xd6, 0x01, 0x00, 0x7b, 0x18, 0xd2, - 0xa0, 0x0e, 0x4a, 0x81, 0x02, 0x60, 0x8c, 0x18, 0x2c, 0x45, 0x0c, 0x82, - 0x85, 0x7f, 0x7c, 0xaa, 0xc0, 0x06, 0x81, 0x1a, 0xa4, 0x01, 0x1a, 0x9c, - 0xc1, 0x1e, 0x06, 0x36, 0xc0, 0x83, 0x54, 0xa0, 0x00, 0x18, 0xc3, 0x11, - 0x41, 0x15, 0xf8, 0xc7, 0x2c, 0x43, 0x20, 0x04, 0x83, 0x0c, 0x44, 0x65, - 0x06, 0x7b, 0x18, 0xe0, 0x80, 0x0f, 0xfa, 0x80, 0x02, 0x60, 0x8c, 0x18, - 0x18, 0x46, 0x08, 0x82, 0x85, 0x7f, 0x74, 0xb3, 0x30, 0x8c, 0x18, 0x1c, - 0x46, 0x08, 0x82, 0x85, 0x7f, 0x6c, 0xb5, 0x10, 0x4c, 0x16, 0x4c, 0xe0, - 0x3f, 0x62, 0x70, 0x18, 0x21, 0x08, 0x16, 0xfe, 0xb1, 0xd5, 0x42, 0x80, - 0xd9, 0x40, 0x89, 0xbf, 0x51, 0x41, 0xf8, 0xdb, 0x10, 0x90, 0xff, 0x88, - 0x81, 0x61, 0x84, 0x20, 0x58, 0xf8, 0x47, 0xa7, 0x0b, 0xc1, 0x88, 0xc1, - 0x61, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0xc6, 0x0b, 0x81, 0x65, 0x81, 0x25, - 0xfe, 0x73, 0x0c, 0x60, 0xb0, 0xa0, 0xc2, 0x20, 0x43, 0x10, 0x06, 0x75, - 0x60, 0x43, 0x40, 0xfe, 0x83, 0x0c, 0xc1, 0x18, 0xd4, 0xc1, 0x20, 0x43, - 0x50, 0xd5, 0xc1, 0x2c, 0x81, 0x30, 0x50, 0x11, 0x08, 0x01, 0x1b, 0x00, - 0x7b, 0x18, 0x44, 0xc1, 0x15, 0x7a, 0x81, 0x02, 0x60, 0x0c, 0x47, 0x04, - 0x6d, 0xe0, 0xf8, 0xc7, 0x2c, 0xc3, 0x90, 0x04, 0x83, 0x0c, 0xc4, 0x1a, - 0xf0, 0xc1, 0x1e, 0x06, 0x53, 0x90, 0x85, 0x5a, 0xa0, 0x00, 0x18, 0x7b, - 0x18, 0x50, 0x81, 0x16, 0x6c, 0x81, 0x02, 0x60, 0x0c, 0x32, 0x24, 0x70, - 0x00, 0x0a, 0xc3, 0x11, 0x88, 0x1e, 0x04, 0xfe, 0x31, 0xcb, 0x40, 0x14, - 0xc1, 0x1c, 0x03, 0x1c, 0x14, 0xb8, 0x30, 0xc8, 0x10, 0xc4, 0x41, 0x29, - 0x58, 0x90, 0x88, 0xff, 0x20, 0x43, 0x30, 0x07, 0xa5, 0x30, 0x4b, 0x80, - 0x0c, 0x47, 0x34, 0x78, 0x10, 0xf8, 0xc7, 0x2c, 0x83, 0x81, 0x04, 0x63, - 0x08, 0x50, 0x2f, 0x8c, 0x21, 0x44, 0xac, 0x30, 0x86, 0x20, 0xb1, 0xc2, - 0x88, 0xc1, 0x61, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x74, 0x0f, 0x42, 0x30, - 0x62, 0x70, 0x18, 0x21, 0x08, 0x16, 0xfe, 0x21, 0xe1, 0x03, 0x11, 0x0c, - 0x47, 0x04, 0x7f, 0x20, 0xf8, 0xc7, 0x2c, 0xc3, 0x81, 0x04, 0x26, 0x40, - 0xe2, 0x6f, 0xc1, 0x29, 0x80, 0xbf, 0x11, 0x90, 0xf8, 0x5b, 0x90, 0x0a, - 0xe0, 0x6f, 0x43, 0x40, 0xfe, 0x73, 0x0c, 0xa0, 0x10, 0xa0, 0xc3, 0x20, - 0x43, 0x10, 0x0a, 0xb5, 0x60, 0x41, 0x26, 0xfe, 0x83, 0x0c, 0xc1, 0x28, - 0xd4, 0xc2, 0x2c, 0x01, 0x32, 0x50, 0x12, 0x88, 0x01, 0xc1, 0x06, 0x85, - 0x70, 0xb0, 0x81, 0x31, 0xc8, 0x10, 0x80, 0x81, 0x2d, 0xcc, 0x12, 0x24, - 0x03, 0x15, 0x81, 0x80, 0x88, 0x82, 0x30, 0x1c, 0x61, 0x07, 0xb2, 0x10, - 0xf8, 0xc7, 0x2c, 0x83, 0x62, 0x05, 0x7b, 0x18, 0xc8, 0x01, 0x1e, 0xfc, - 0x81, 0x02, 0x60, 0xec, 0x61, 0x30, 0x07, 0x79, 0xf8, 0x07, 0x0a, 0x80, - 0x31, 0xc8, 0x60, 0xb8, 0x82, 0x2f, 0x8c, 0x18, 0x14, 0x46, 0x08, 0x82, - 0xc1, 0xe5, 0x12, 0xc4, 0x2c, 0xc3, 0x52, 0x05, 0x63, 0x08, 0x88, 0x3d, - 0x0c, 0x47, 0x04, 0xb9, 0xa0, 0xf8, 0xc7, 0x2c, 0x43, 0xc3, 0x04, 0x26, - 0xe4, 0x82, 0xf8, 0xcf, 0x12, 0x38, 0x36, 0xe4, 0x02, 0xf8, 0x8f, 0x18, - 0x18, 0x46, 0x08, 0x82, 0x85, 0x7f, 0x50, 0x34, 0x11, 0x58, 0xa0, 0x0b, - 0xe2, 0x3f, 0x62, 0x70, 0x18, 0x21, 0x08, 0x16, 0xfe, 0x21, 0xdd, 0x44, - 0xa0, 0x0b, 0xb3, 0x04, 0xce, 0x40, 0x05, 0xa0, 0x30, 0x42, 0x33, 0xc7, - 0x70, 0x0b, 0x81, 0x3f, 0x8c, 0x21, 0x44, 0xed, 0x30, 0x1c, 0x11, 0x88, - 0x83, 0xe2, 0x1f, 0xb3, 0x0c, 0xd0, 0x13, 0x98, 0x20, 0x0e, 0xe2, 0x3f, - 0x4b, 0x10, 0xd9, 0x20, 0x0e, 0xe0, 0x3f, 0x62, 0x60, 0x18, 0x21, 0x08, - 0x16, 0xfe, 0x41, 0xf5, 0x44, 0x60, 0xc1, 0x38, 0x88, 0xff, 0x88, 0xc1, - 0x61, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x04, 0x16, 0xc1, 0x38, 0xcc, 0x12, - 0x44, 0x03, 0x15, 0x80, 0xf2, 0x08, 0xd0, 0x1c, 0x43, 0x12, 0xd4, 0xc3, - 0x18, 0x82, 0x56, 0x0f, 0xc3, 0x11, 0xc1, 0x3a, 0x28, 0xfe, 0x31, 0xcb, - 0x30, 0x49, 0x81, 0x09, 0xeb, 0x20, 0xfe, 0xb3, 0x04, 0x94, 0x0d, 0xeb, - 0x00, 0xfe, 0x23, 0x06, 0x86, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x94, 0x59, - 0x04, 0x16, 0xb0, 0x83, 0xf8, 0x8f, 0x18, 0x1c, 0x46, 0x08, 0x82, 0x85, - 0x7f, 0x48, 0x69, 0x11, 0xb0, 0xc3, 0x2c, 0x01, 0x35, 0x50, 0x01, 0x28, - 0x92, 0x30, 0xcd, 0x31, 0x24, 0x41, 0x3f, 0xcc, 0x12, 0x54, 0x03, 0x15, - 0x81, 0x40, 0xe9, 0x81, 0x32, 0xc8, 0x10, 0xb0, 0x43, 0x3f, 0xcc, 0x31, - 0xac, 0x03, 0x18, 0xcc, 0xc4, 0x20, 0x43, 0xc0, 0x0e, 0x20, 0x61, 0x43, - 0x20, 0xfe, 0x83, 0x0c, 0x81, 0x3b, 0x80, 0xc4, 0x20, 0x43, 0x90, 0x06, - 0x20, 0x31, 0x4b, 0x10, 0x07, 0xc3, 0x11, 0xbf, 0x40, 0x0f, 0x81, 0x7f, - 0xcc, 0x32, 0x5c, 0x63, 0x10, 0x0c, 0x32, 0xac, 0xc1, 0x3c, 0x90, 0xc4, - 0x1e, 0x06, 0x97, 0xd0, 0x09, 0xb4, 0xa0, 0x00, 0x18, 0x7b, 0x18, 0x60, - 0x82, 0x27, 0xd2, 0x82, 0x02, 0x60, 0xcc, 0x31, 0xd8, 0x43, 0xe0, 0x13, - 0x83, 0x0c, 0xc1, 0x3d, 0xac, 0x84, 0x05, 0x87, 0xf8, 0x0f, 0x32, 0x04, - 0xf9, 0xb0, 0x12, 0x23, 0x06, 0x85, 0x11, 0x82, 0x60, 0x70, 0xed, 0xc5, - 0x31, 0xcb, 0x20, 0x06, 0x58, 0x30, 0x86, 0x30, 0x8c, 0xc5, 0x70, 0x44, - 0xc0, 0x12, 0x8a, 0x7f, 0xcc, 0x32, 0x68, 0x59, 0x60, 0x02, 0x4b, 0x88, - 0xff, 0x2c, 0xc1, 0x36, 0x62, 0x60, 0x18, 0x21, 0x08, 0x16, 0xfe, 0x41, - 0x81, 0xc6, 0x30, 0x62, 0x70, 0x18, 0x21, 0x08, 0x16, 0xfe, 0x21, 0x89, - 0x46, 0xd0, 0x12, 0x16, 0xb4, 0x84, 0xf8, 0x5b, 0xd0, 0x12, 0xe0, 0x3f, - 0x4b, 0xb0, 0x0d, 0x54, 0x00, 0x4a, 0x26, 0x68, 0x73, 0x0c, 0x21, 0x11, - 0xac, 0xc5, 0x18, 0x02, 0xa3, 0x13, 0xc3, 0x11, 0x41, 0x4d, 0x28, 0xfe, - 0x31, 0xcb, 0xd0, 0x71, 0x81, 0x09, 0x35, 0x21, 0xfe, 0xb3, 0x04, 0xde, - 0x88, 0x81, 0x61, 0x84, 0x20, 0x58, 0xf8, 0x07, 0x95, 0x1a, 0xc3, 0x88, - 0xc1, 0x61, 0x84, 0x20, 0x58, 0xf8, 0x87, 0xb4, 0x1a, 0x81, 0x4d, 0x58, - 0x60, 0x13, 0xe2, 0x6f, 0x81, 0x4d, 0x80, 0xff, 0x2c, 0x81, 0x37, 0x50, - 0x01, 0x28, 0x9c, 0xd0, 0xcd, 0x31, 0x24, 0x81, 0x58, 0x8c, 0x21, 0x54, - 0x62, 0x31, 0x1c, 0x11, 0xf8, 0x84, 0xe2, 0x1f, 0xb3, 0x0c, 0x60, 0xf0, - 0x05, 0x26, 0xf8, 0x84, 0xf8, 0xcf, 0x12, 0x84, 0xc1, 0x88, 0x81, 0x61, - 0x84, 0x20, 0x58, 0xf8, 0x07, 0x25, 0x1b, 0xc3, 0x88, 0xc1, 0x61, 0x84, - 0x20, 0x58, 0xf8, 0x87, 0x44, 0x1b, 0xc1, 0x4f, 0x58, 0xf0, 0x13, 0xe2, - 0x6f, 0xc1, 0x4f, 0x80, 0xff, 0x2c, 0x41, 0x18, 0x0c, 0x54, 0x00, 0xca, - 0x27, 0x80, 0xc1, 0x1c, 0x43, 0x12, 0xa8, 0xc5, 0x88, 0x01, 0x62, 0x84, - 0x20, 0x58, 0xf8, 0x07, 0xa4, 0x1b, 0x41, 0x4d, 0xcc, 0xc4, 0x20, 0x43, - 0x70, 0x13, 0x69, 0x31, 0x4b, 0x20, 0x06, 0x03, 0x15, 0x81, 0x1f, 0x5c, - 0x42, 0x18, 0x0c, 0x32, 0x04, 0xb3, 0xa0, 0x16, 0xb3, 0x04, 0x71, 0x30, - 0xcb, 0x40, 0x06, 0x70, 0x80, 0x12, 0x83, 0x0c, 0xb4, 0xc0, 0x13, 0x6d, - 0x31, 0x62, 0x70, 0x18, 0x21, 0x08, 0x16, 0xfe, 0x91, 0xed, 0x46, 0x10, - 0x13, 0x73, 0x0c, 0x3a, 0x11, 0x90, 0xc6, 0x88, 0xc1, 0x61, 0x84, 0x20, - 0x58, 0xf8, 0x47, 0xd6, 0x1b, 0x83, 0x4c, 0xcc, 0x31, 0x08, 0x01, 0x5d, - 0x8c, 0x18, 0x1c, 0x46, 0x08, 0x82, 0x85, 0x7f, 0x64, 0xbf, 0x51, 0xcc, - 0xc4, 0x1c, 0x83, 0x10, 0xd4, 0xc5, 0x1e, 0x86, 0xbe, 0x48, 0x8d, 0xdb, - 0xa0, 0x00, 0x18, 0x7b, 0x18, 0xfe, 0x62, 0x35, 0x70, 0x83, 0x02, 0x60, - 0xcc, 0x31, 0x94, 0x45, 0xd0, 0x1a, 0x83, 0x0c, 0x81, 0x59, 0xe8, 0x85, - 0x05, 0x87, 0xf8, 0x0f, 0x32, 0x04, 0x68, 0xa1, 0x17, 0x23, 0x06, 0x85, - 0x11, 0x82, 0x60, 0x70, 0xa9, 0xc7, 0x31, 0xcb, 0xf0, 0x06, 0x65, 0x10, - 0x8c, 0x21, 0x0c, 0xb2, 0x31, 0x1c, 0x11, 0xec, 0x85, 0xe2, 0x1f, 0xb3, - 0x0c, 0x67, 0x60, 0x06, 0x81, 0x09, 0x7b, 0x21, 0xfe, 0xb3, 0x04, 0x68, - 0x30, 0x62, 0x60, 0x18, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xbd, 0xc7, 0x30, - 0x62, 0x70, 0x18, 0x21, 0x08, 0x16, 0xfe, 0x21, 0xc5, 0x47, 0xc0, 0x17, - 0x16, 0xf0, 0x85, 0xf8, 0x5b, 0xc0, 0x17, 0xe0, 0x3f, 0x4b, 0x80, 0x06, - 0x03, 0x15, 0x80, 0x62, 0x06, 0xc2, 0x19, 0xcc, 0x31, 0xc0, 0x45, 0xa0, - 0x1b, 0x63, 0x08, 0x4c, 0x6a, 0x0c, 0x47, 0x04, 0xa4, 0xa1, 0xf8, 0xc7, - 0x2c, 0x83, 0x1a, 0xa4, 0x41, 0x60, 0x02, 0x69, 0x88, 0xff, 0x2c, 0xc1, - 0x1a, 0x8c, 0x18, 0x18, 0x46, 0x08, 0x82, 0x85, 0x7f, 0x50, 0xf8, 0x31, - 0x8c, 0x18, 0x1c, 0x46, 0x08, 0x82, 0x85, 0x7f, 0x48, 0xfa, 0x11, 0x94, - 0x86, 0x05, 0xa5, 0x21, 0xfe, 0x16, 0x94, 0x06, 0xf8, 0xcf, 0x12, 0xac, - 0xc1, 0x40, 0x05, 0xa0, 0xa4, 0x81, 0xa0, 0x06, 0x73, 0x0c, 0x49, 0x10, - 0x1b, 0x63, 0x08, 0x55, 0x6c, 0x0c, 0x47, 0x04, 0xad, 0xa1, 0xf8, 0xc7, - 0x2c, 0x43, 0x1b, 0xb0, 0x41, 0x60, 0x42, 0x6b, 0x88, 0xff, 0x2c, 0x81, - 0x1b, 0x8c, 0x18, 0x18, 0x46, 0x08, 0x82, 0x85, 0x7f, 0x50, 0x21, 0x32, - 0x8c, 0x18, 0x1c, 0x46, 0x08, 0x82, 0x85, 0x7f, 0x48, 0x23, 0x12, 0xb8, - 0x86, 0x05, 0xae, 0x21, 0xfe, 0x16, 0xb8, 0x06, 0xf8, 0xcf, 0x12, 0xb8, - 0xc1, 0x40, 0x05, 0xa0, 0xb0, 0x81, 0xd0, 0x06, 0x73, 0x0c, 0x49, 0x90, - 0x1b, 0x23, 0x06, 0x88, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x50, 0x8a, 0x04, - 0xa4, 0x21, 0x1a, 0x83, 0x0c, 0x81, 0x69, 0xe0, 0xc6, 0x2c, 0xc1, 0x1b, - 0x0c, 0x54, 0x04, 0x7e, 0x40, 0x06, 0x82, 0x1b, 0x0c, 0x32, 0x04, 0x22, - 0x91, 0x1b, 0xb3, 0x04, 0x71, 0xb0, 0x87, 0xa1, 0x3c, 0xe2, 0xc3, 0x3f, - 0x28, 0x00, 0xc6, 0x20, 0x43, 0x49, 0xb4, 0x86, 0x6f, 0xcc, 0x31, 0xb0, - 0x86, 0x40, 0x1f, 0x83, 0x0c, 0x41, 0x6b, 0x84, 0x87, 0x05, 0x83, 0xf8, - 0x0f, 0x32, 0x04, 0xaf, 0x11, 0x1e, 0x83, 0x0c, 0x81, 0x4a, 0x84, 0xc7, - 0x2c, 0x41, 0x1c, 0x0c, 0x94, 0x04, 0xa4, 0x51, 0xc1, 0x83, 0x18, 0x48, - 0x6f, 0x20, 0xc0, 0x81, 0x05, 0xf0, 0x21, 0xfe, 0x19, 0x04, 0xc4, 0x00, - 0x00, 0x21, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, 0xc0, 0x87, 0x23, 0x1f, - 0x10, 0x7d, 0xd8, 0x72, 0x10, 0xc1, 0x3e, 0x1c, 0xf9, 0x80, 0xe8, 0xc3, - 0x96, 0x23, 0x09, 0xf8, 0xe1, 0xc8, 0x07, 0x44, 0x1f, 0xb6, 0x1c, 0x5c, - 0xd0, 0x0f, 0x47, 0x3e, 0x20, 0xfa, 0xb0, 0xe5, 0x08, 0x83, 0xc0, 0x1f, - 0x8e, 0x7c, 0x40, 0xf4, 0x61, 0xcb, 0x31, 0x06, 0xc1, 0x3f, 0x1c, 0xf9, - 0x80, 0xe8, 0xc3, 0x96, 0xc3, 0x14, 0x02, 0x90, 0x38, 0xf2, 0x01, 0xd1, - 0x87, 0x2d, 0x07, 0x2a, 0x04, 0x21, 0x71, 0xe4, 0x03, 0xa2, 0x0f, 0x5b, - 0x8e, 0x7e, 0x08, 0x40, 0xe2, 0xc8, 0x07, 0x44, 0x1f, 0xb6, 0x1c, 0xff, - 0x10, 0x84, 0xc4, 0x91, 0x0f, 0x88, 0x3e, 0x6c, 0x39, 0xf2, 0x22, 0x00, - 0x89, 0x23, 0x1f, 0x10, 0x7d, 0xd8, 0x72, 0xec, 0x45, 0x10, 0x12, 0x47, - 0x3e, 0x20, 0xfa, 0xb0, 0xe5, 0x68, 0x8f, 0x20, 0x24, 0x8e, 0x7c, 0x40, - 0xf4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, - 0x00, 0x94, 0x00, 0x00, 0x00, 0x13, 0x04, 0x48, 0x2c, 0x10, 0x00, 0x00, - 0x00, 0x1d, 0x00, 0x00, 0x00, 0x64, 0xd5, 0xc0, 0x08, 0x00, 0x8d, 0x33, - 0x00, 0x44, 0x8e, 0x00, 0x8c, 0x25, 0x04, 0x00, 0xa5, 0x25, 0x50, 0x04, - 0xd4, 0x8e, 0x35, 0x00, 0x81, 0x30, 0xc7, 0xf0, 0xb8, 0x81, 0x1b, 0xcc, - 0x31, 0x3c, 0x8d, 0x1b, 0x8c, 0x35, 0x00, 0x03, 0x41, 0xc0, 0x08, 0xc0, - 0x0c, 0xc0, 0x18, 0x01, 0x08, 0x82, 0x20, 0xfe, 0x8d, 0x11, 0x80, 0x20, - 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82, 0x20, 0x48, 0x82, 0x01, 0x05, - 0x33, 0x00, 0x33, 0x00, 0x73, 0x10, 0x78, 0x80, 0x07, 0x78, 0x90, 0x07, - 0x63, 0x11, 0x20, 0x08, 0x82, 0xf8, 0x07, 0x82, 0x20, 0x88, 0x7f, 0x20, - 0x08, 0x82, 0xf8, 0x07, 0x82, 0x20, 0x88, 0x7f, 0x63, 0x11, 0x20, 0x08, - 0x82, 0xf8, 0x07, 0x00, 0x20, 0x08, 0x82, 0xf8, 0x47, 0xc2, 0x0c, 0x00, - 0x00, 0xc3, 0x11, 0xdb, 0x12, 0xf8, 0xc7, 0x2c, 0xc3, 0x11, 0x04, 0xc3, - 0x11, 0x9c, 0x12, 0xf8, 0xc7, 0x2c, 0x83, 0x30, 0x04, 0x23, 0x06, 0xcd, - 0x11, 0x82, 0x60, 0x50, 0x06, 0x79, 0xb0, 0x65, 0x1e, 0x56, 0x5d, 0x4d, - 0x53, 0x07, 0xa3, 0x09, 0x01, 0x30, 0x4b, 0x70, 0x0c, 0x47, 0x7c, 0x4c, - 0xe0, 0x1f, 0xb3, 0x0c, 0x44, 0x11, 0x8c, 0x18, 0x34, 0x47, 0x08, 0x82, - 0x41, 0x19, 0xf0, 0x81, 0xc7, 0x85, 0xc1, 0x86, 0x69, 0x10, 0x84, 0x07, - 0xa3, 0x09, 0x01, 0x30, 0x62, 0xd0, 0x1c, 0x21, 0x08, 0x06, 0x65, 0xe0, - 0x07, 0x9f, 0x37, 0x06, 0x9d, 0xc6, 0x49, 0x92, 0x1e, 0x8c, 0x26, 0x04, - 0xc0, 0x20, 0xc3, 0xe0, 0x5c, 0x83, 0x0c, 0x02, 0x74, 0x0d, 0x32, 0x08, - 0xc1, 0x75, 0x66, 0xf0, 0x2e, 0x05, 0x41, 0x19, 0x64, 0x08, 0xa8, 0xce, - 0x88, 0x00, 0xfc, 0x37, 0x32, 0xa8, 0x41, 0x1d, 0x94, 0xc2, 0x05, 0xef, - 0x52, 0x10, 0x94, 0x41, 0x86, 0x20, 0x13, 0x83, 0x11, 0x83, 0xc3, 0x08, - 0x41, 0xb0, 0xf0, 0x8f, 0x2c, 0x16, 0x8a, 0x60, 0x23, 0xc5, 0x1b, 0xe8, - 0x81, 0x2a, 0xa0, 0x82, 0x19, 0x5c, 0xf0, 0x2e, 0x05, 0x41, 0x19, 0x64, - 0x08, 0xbc, 0x33, 0x18, 0x31, 0x38, 0x8c, 0x10, 0x04, 0x0b, 0xff, 0xc8, - 0x6c, 0x41, 0x09, 0x36, 0x52, 0xd0, 0xc1, 0x1f, 0xbc, 0x42, 0x2b, 0xa8, - 0xc1, 0x05, 0xef, 0x52, 0x10, 0x94, 0x41, 0x86, 0x60, 0x0c, 0xd8, 0x60, - 0xc4, 0xe0, 0x30, 0x42, 0x10, 0x2c, 0xfc, 0x23, 0xdb, 0x85, 0x27, 0x98, - 0x63, 0x18, 0x83, 0x85, 0x14, 0xe6, 0x18, 0x82, 0x23, 0x0e, 0xe6, 0x18, - 0x82, 0x21, 0x0e, 0x66, 0x09, 0x8e, 0xe1, 0x88, 0x3e, 0x48, 0x83, 0xc0, - 0x3f, 0x66, 0x19, 0x8c, 0x23, 0x18, 0x31, 0x68, 0x8e, 0x10, 0x04, 0x83, - 0x32, 0xd0, 0x05, 0x3e, 0xd0, 0x83, 0x3f, 0xc8, 0x03, 0x3b, 0xc0, 0x03, - 0x37, 0x70, 0x03, 0x5b, 0x18, 0x4d, 0x08, 0x80, 0x11, 0x83, 0xe6, 0x08, - 0x41, 0x30, 0x28, 0x03, 0x5e, 0xe8, 0x03, 0x3e, 0x08, 0x85, 0x3d, 0xc0, - 0x03, 0x3d, 0x80, 0x03, 0x38, 0xc0, 0x85, 0xd1, 0x84, 0x00, 0x18, 0x64, - 0x08, 0xda, 0x20, 0x0f, 0x06, 0x19, 0x88, 0x36, 0xb0, 0x83, 0x41, 0x06, - 0x41, 0x0d, 0xec, 0x60, 0x90, 0x41, 0x08, 0xec, 0xe0, 0x4a, 0xe1, 0x5d, - 0x0a, 0x82, 0x32, 0xc8, 0x10, 0xcc, 0x01, 0x1f, 0x18, 0x11, 0x80, 0xff, - 0x46, 0x86, 0x54, 0xa0, 0x05, 0x72, 0xb8, 0xe0, 0x5d, 0x0a, 0x82, 0x32, - 0xc8, 0x10, 0xe0, 0x41, 0x28, 0x8c, 0x18, 0x1c, 0x46, 0x08, 0x82, 0x85, - 0x7f, 0x64, 0xf0, 0x50, 0x04, 0x1b, 0x29, 0x5c, 0x21, 0x17, 0xd2, 0xe1, - 0x1c, 0x4a, 0xe1, 0x82, 0x77, 0x29, 0x08, 0xca, 0x20, 0x43, 0xd0, 0x07, - 0xa6, 0x30, 0x62, 0x70, 0x18, 0x21, 0x08, 0x16, 0xfe, 0x91, 0xd5, 0x83, - 0x12, 0x6c, 0xa4, 0x98, 0x05, 0x5f, 0x70, 0x07, 0x76, 0x48, 0x85, 0x0b, - 0xde, 0xa5, 0x20, 0x28, 0x83, 0x0c, 0x81, 0x28, 0xac, 0xc2, 0x88, 0xc1, - 0x61, 0x84, 0x20, 0x58, 0xf8, 0x47, 0xa6, 0x0f, 0x4f, 0x30, 0xc7, 0x20, - 0x0a, 0xcb, 0x38, 0xcc, 0x31, 0x04, 0x07, 0x2c, 0xcc, 0x31, 0x04, 0x03, - 0x2c, 0xcc, 0x12, 0x1c, 0x03, 0x2d, 0x01, 0x3f, 0x08, 0xa0, 0x40, 0x08, - 0x06, 0x4a, 0x00, 0x26, 0x51, 0x64, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xd1, - 0x07, 0xa8, 0xe0, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, - 0x00, 0x61, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xf8, 0x02, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x37, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x01, 0x00, - 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, - 0x00, 0x5e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x24, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x15, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x08, 0x24, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x29, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x08, 0x24, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x39, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x08, 0x24, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, - 0x00, 0x4a, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x08, 0x24, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x08, 0x24, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x08, 0x24, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x7e, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x08, 0x24, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x00, 0x90, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x08, 0x24, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x00, 0xa3, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x08, 0x24, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, - 0x00, 0xb6, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x30, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, - 0x00, 0x1c, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, - 0x00, 0x5b, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xbe, 0x02, 0x00, 0x00, - 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, - 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x69, - 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x6d, 0x70, - 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, - 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, - 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, - 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, - 0x72, 0x74, 0x2e, 0x75, 0x2e, 0x69, 0x31, 0x2e, 0x66, 0x2e, 0x66, 0x33, - 0x32, 0x61, 0x69, 0x72, 0x2e, 0x64, 0x6f, 0x74, 0x2e, 0x76, 0x33, 0x66, - 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, - 0x6d, 0x61, 0x78, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, - 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x76, 0x33, 0x66, 0x33, - 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, - 0x62, 0x73, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, - 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78, 0x2e, 0x76, 0x33, - 0x66, 0x33, 0x32, 0x5f, 0x5a, 0x31, 0x33, 0x47, 0x65, 0x74, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x32, 0x5f, - 0x66, 0x66, 0x52, 0x55, 0x31, 0x31, 0x4d, 0x54, 0x4c, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x74, 0x4b, 0x39, 0x59, 0x55, 0x56, 0x44, 0x65, - 0x63, 0x6f, 0x64, 0x65, 0x4e, 0x35, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x39, - 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x49, 0x66, 0x4c, - 0x4e, 0x53, 0x33, 0x5f, 0x36, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x45, - 0x30, 0x45, 0x76, 0x45, 0x45, 0x53, 0x36, 0x5f, 0x4e, 0x53, 0x33, 0x5f, - 0x37, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x45, 0x61, 0x69, 0x72, - 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, - 0x75, 0x72, 0x65, 0x5f, 0x32, 0x64, 0x2e, 0x76, 0x34, 0x66, 0x33, 0x32, - 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, 0x61, 0x69, 0x72, 0x36, - 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x69, 0x6f, 0x73, 0x31, - 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, - 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0xcc, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, - 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, - 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, - 0x00, 0xb3, 0x04, 0x00, 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, - 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, - 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, - 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, - 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, - 0x42, 0x04, 0x49, 0x0e, 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, - 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, - 0x00, 0x8f, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0x01, 0x58, 0x03, 0x40, 0x02, 0x2a, 0x22, 0x1c, 0xe0, 0x01, 0x1e, - 0xe4, 0xe1, 0x1d, 0xf0, 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, - 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, - 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, - 0x87, 0x36, 0x60, 0x87, 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, - 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, - 0x07, 0x72, 0xa0, 0x07, 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, - 0xdc, 0xe1, 0x1d, 0xda, 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, - 0xd2, 0xc1, 0x1d, 0xe6, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, - 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, - 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, - 0xda, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, - 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, - 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, - 0x07, 0x76, 0x48, 0x87, 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, - 0x03, 0x76, 0x28, 0x87, 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, - 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, - 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, - 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, - 0x87, 0x36, 0x70, 0x87, 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, - 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, - 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, - 0xce, 0xc1, 0x1d, 0xca, 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, - 0xde, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, - 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, - 0x87, 0x77, 0x68, 0x03, 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, - 0x07, 0x77, 0x38, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, - 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, - 0xc6, 0x61, 0x1d, 0xda, 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, - 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, - 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, - 0x00, 0x3c, 0x00, 0x88, 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, - 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, - 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0xe0, 0x09, 0x04, - 0xb0, 0x00, 0x55, 0x90, 0x06, 0x60, 0x30, 0x84, 0x43, 0x3a, 0xc8, 0x43, - 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, - 0x3b, 0xbc, 0x43, 0x1b, 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, - 0xb0, 0xc1, 0x1b, 0x0a, 0x60, 0x01, 0xaa, 0x20, 0x0d, 0x40, 0x61, 0x08, - 0x87, 0x74, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, - 0x07, 0x79, 0x68, 0x03, 0x77, 0x78, 0x87, 0x36, 0x08, 0x07, 0x76, 0x48, - 0x87, 0x70, 0x98, 0x07, 0x60, 0x83, 0x41, 0x18, 0xc0, 0x02, 0x54, 0x1b, - 0x8c, 0x02, 0x01, 0x16, 0xa0, 0xda, 0x60, 0x18, 0xff, 0xff, 0xff, 0xff, - 0x3f, 0x00, 0x12, 0x40, 0x6d, 0x50, 0x8e, 0xff, 0xff, 0xff, 0xff, 0x1f, - 0x80, 0x36, 0x00, 0xd6, 0x00, 0x90, 0x80, 0x6a, 0x83, 0x81, 0x04, 0xc0, - 0x02, 0x54, 0x1b, 0x8c, 0x44, 0x00, 0x16, 0xa0, 0xda, 0xa0, 0x28, 0xff, - 0xff, 0xff, 0xff, 0x3f, 0x00, 0x6d, 0x00, 0xac, 0x01, 0x20, 0x01, 0xd5, - 0x06, 0x63, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x0a, 0x00, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x13, 0x8a, 0x40, - 0x18, 0x88, 0x62, 0x42, 0x60, 0x4c, 0x18, 0x0e, 0x24, 0x99, 0x30, 0x28, - 0x48, 0x32, 0x21, 0x58, 0x00, 0x89, 0x20, 0x00, 0x00, 0x4a, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, - 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, - 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xb8, 0xc1, 0x0c, 0xc0, 0x30, 0x02, - 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, - 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18, - 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6, - 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4, - 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50, - 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21, - 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29, - 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1, - 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0x38, 0x4d, 0x9a, 0x22, 0x4a, - 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, 0xdf, 0x1e, 0x7e, 0x20, - 0x8a, 0x00, 0xec, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x26, 0xb8, 0x48, - 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f, - 0x1a, 0x23, 0x00, 0x06, 0x11, 0x1c, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44, - 0xb2, 0x34, 0x0f, 0x41, 0x65, 0x00, 0x00, 0x80, 0xa4, 0x22, 0x00, 0x00, - 0x51, 0x73, 0x04, 0x41, 0x11, 0x2c, 0x80, 0xae, 0x32, 0x00, 0x45, 0x41, - 0xd9, 0x1c, 0x01, 0x62, 0x84, 0x60, 0x9b, 0x23, 0x00, 0x83, 0x61, 0x04, - 0xa1, 0x2b, 0x0b, 0xd7, 0x3c, 0x42, 0x67, 0x79, 0x16, 0x00, 0x74, 0xf4, - 0x15, 0x85, 0x5b, 0x1e, 0xc1, 0xf2, 0x2c, 0x00, 0xe8, 0x28, 0x1c, 0x08, - 0x48, 0x81, 0x6e, 0x8e, 0x00, 0x14, 0x86, 0x11, 0x86, 0x6e, 0x10, 0x21, - 0x10, 0x06, 0x11, 0x0e, 0x61, 0x10, 0xa1, 0x10, 0x06, 0x11, 0x00, 0x61, - 0x0a, 0x60, 0x04, 0x60, 0x18, 0x81, 0xe8, 0x00, 0x00, 0x13, 0xbe, 0x70, - 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, - 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, 0x79, 0x88, 0x83, 0x39, - 0x70, 0x03, 0x38, 0x70, 0x03, 0x38, 0x68, 0x83, 0x79, 0x48, 0x87, 0x76, - 0xa8, 0x07, 0x76, 0x08, 0x07, 0x7a, 0x78, 0x07, 0x79, 0xd8, 0x70, 0x1b, - 0xe5, 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, - 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, - 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, - 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, - 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, - 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, - 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, - 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, - 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, - 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, - 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, - 0x72, 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, - 0x6d, 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, - 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, - 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, - 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, - 0x79, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, - 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, - 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, - 0xf6, 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, - 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, - 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, - 0x76, 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, - 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, - 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, - 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, - 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x11, - 0xc2, 0x90, 0x10, 0xdb, 0x95, 0xbf, 0xec, 0xbe, 0x7f, 0x11, 0x01, 0x06, - 0x43, 0x34, 0xd3, 0x90, 0x08, 0x80, 0x20, 0x00, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x12, 0x41, 0x90, 0x04, 0x04, 0x80, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0x22, 0x30, 0x88, - 0x28, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, - 0x12, 0xc5, 0x81, 0x75, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x00, 0xc0, 0x90, 0xe8, 0x14, 0x9a, 0x0c, 0x08, 0x00, 0x01, 0x00, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x86, 0x44, 0xb4, 0x10, 0x06, 0x1f, - 0x10, 0x00, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x89, - 0xea, 0x61, 0x0b, 0x03, 0x20, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x90, 0xd8, 0x20, 0x50, 0xb4, 0x96, 0x00, 0x00, 0x20, 0x0b, - 0x04, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, - 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xea, 0x8a, 0xa0, 0x04, - 0x0a, 0x61, 0x04, 0xa0, 0x0c, 0x0a, 0xa8, 0x20, 0x0a, 0xa3, 0x40, 0x0a, - 0xa5, 0x60, 0x0a, 0xa7, 0x00, 0x03, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, - 0xa8, 0x1c, 0x01, 0x28, 0x84, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, - 0x29, 0x1c, 0x22, 0xc7, 0x12, 0x22, 0x01, 0x00, 0x00, 0xb1, 0x18, 0x00, - 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, - 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, - 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, - 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, - 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, - 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, - 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, - 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, - 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, - 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, - 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, - 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, - 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, - 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, - 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, - 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, - 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, - 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, - 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, - 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, - 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, - 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, - 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, - 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, - 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, - 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, - 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, - 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, - 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, - 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, - 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, - 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, - 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, - 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, - 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, - 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, - 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, - 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, - 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, - 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, - 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, - 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, - 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, - 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, - 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, - 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, - 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, - 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, - 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, - 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, - 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, - 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, - 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, - 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, - 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, 0x00, 0x49, 0x01, 0x00, - 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, - 0x11, 0x32, 0x64, 0xd4, 0xee, 0x80, 0x0d, 0x66, 0x0c, 0x8b, 0xf2, 0x06, - 0xc5, 0xc6, 0x91, 0x41, 0x14, 0x19, 0x8c, 0x22, 0x31, 0x88, 0x64, 0x3d, - 0x45, 0x66, 0x20, 0xca, 0x23, 0x21, 0x54, 0xc1, 0x30, 0xca, 0xe2, 0x3c, - 0xcf, 0x13, 0x5d, 0x4f, 0x60, 0x18, 0x88, 0x91, 0x18, 0x8b, 0x82, 0x11, - 0x5e, 0xb1, 0x1c, 0x01, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, - 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32, - 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, 0x20, 0x28, 0x6d, 0x65, 0x74, 0x61, - 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, - 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, - 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, - 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, - 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, - 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x6e, 0x6f, 0x5f, 0x70, 0x65, - 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, - 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x61, 0x69, 0x72, - 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, - 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69, 0x72, 0x2e, - 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, - 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x63, 0x6f, - 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74, 0x6f, 0x6e, - 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x74, - 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, - 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, - 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77, 0x68, 0x69, - 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e, - 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x74, 0x73, 0x63, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x6f, 0x66, - 0x66, 0x73, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, - 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x59, 0x55, 0x56, 0x44, 0x65, 0x63, - 0x6f, 0x64, 0x65, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x61, 0x69, 0x72, 0x2e, - 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, - 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x59, 0x74, 0x65, - 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, - 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x55, 0x56, 0x61, 0x69, 0x72, - 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, - 0x6c, 0x65, 0x72, 0x73, 0x00, 0x84, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x30, 0x82, 0xd0, 0x1d, 0x23, 0x08, 0x64, 0x00, 0x06, 0x23, 0x08, - 0x1d, 0x32, 0x82, 0xd0, 0x25, 0x23, 0x08, 0x9d, 0x32, 0x82, 0x10, 0x01, - 0x23, 0x08, 0xdd, 0x32, 0x82, 0xd0, 0x31, 0x23, 0x08, 0x5d, 0x33, 0x82, - 0xd0, 0x39, 0x23, 0x08, 0xdd, 0x33, 0x82, 0xd0, 0x41, 0x23, 0x08, 0x5d, - 0x34, 0x82, 0xd0, 0x49, 0x23, 0x08, 0xdd, 0x34, 0x82, 0xd0, 0x51, 0x23, - 0x08, 0x5d, 0x35, 0x82, 0xd0, 0x59, 0x23, 0x08, 0xdd, 0x35, 0xc3, 0x80, - 0x07, 0x41, 0x1e, 0xcc, 0x30, 0xe8, 0x81, 0xb0, 0x07, 0x33, 0x04, 0xc3, - 0x0c, 0x03, 0x1e, 0xe0, 0x01, 0x1f, 0xcc, 0x40, 0x10, 0x7a, 0xa0, 0x07, - 0x7c, 0x30, 0x43, 0x50, 0xcc, 0x10, 0x18, 0x33, 0x04, 0xc7, 0x0c, 0x05, - 0xc2, 0x07, 0x7c, 0x90, 0x28, 0x33, 0x04, 0xb3, 0x30, 0x03, 0xc2, 0x07, - 0x0b, 0xd3, 0x24, 0x8a, 0xf3, 0xcc, 0x90, 0xe8, 0x01, 0x14, 0x31, 0x52, - 0xa2, 0x38, 0xd3, 0x0c, 0x09, 0x1e, 0x40, 0x14, 0x23, 0x25, 0x95, 0x63, - 0xcd, 0x80, 0x06, 0x7c, 0xb0, 0x07, 0x7c, 0xc0, 0x75, 0x7b, 0xb0, 0x07, - 0x7c, 0xc0, 0x79, 0xa0, 0xb0, 0x07, 0x7c, 0xc0, 0x7d, 0xa1, 0xb0, 0x07, - 0x7c, 0xc0, 0x81, 0x81, 0x28, 0xec, 0x01, 0x1f, 0x70, 0x61, 0x30, 0x0a, - 0x7b, 0xc0, 0x07, 0x9c, 0x18, 0x90, 0xc2, 0x1e, 0xf0, 0x01, 0x37, 0x06, - 0xa5, 0xb0, 0x07, 0x7c, 0xc0, 0x91, 0xc1, 0x0c, 0x92, 0x1f, 0x5c, 0xd8, - 0x1f, 0x64, 0x7c, 0xa0, 0x07, 0xda, 0x86, 0x0b, 0x65, 0xf0, 0x07, 0x66, - 0xb0, 0x07, 0xc9, 0x19, 0x38, 0x68, 0x30, 0x83, 0xc2, 0x07, 0xa2, 0xc0, - 0x07, 0x69, 0xa0, 0x06, 0xa2, 0x70, 0x0a, 0x7c, 0xb0, 0x06, 0x6c, 0x30, - 0x83, 0xb4, 0x07, 0x17, 0x66, 0x0a, 0x99, 0x1e, 0xe8, 0x81, 0xb6, 0xe9, - 0x42, 0x19, 0x98, 0x82, 0x19, 0x88, 0x42, 0xd2, 0x06, 0x8e, 0x1b, 0xcc, - 0xa0, 0xa0, 0xc2, 0x1b, 0x64, 0x7c, 0xa0, 0x07, 0x70, 0x90, 0xc4, 0x81, - 0x23, 0x07, 0x33, 0x28, 0xa9, 0xf0, 0x06, 0x99, 0x1e, 0xe8, 0x01, 0x1c, - 0x24, 0x73, 0xe0, 0xd0, 0xc1, 0x0c, 0x89, 0x2a, 0xd4, 0x41, 0xc6, 0x07, - 0x7a, 0x90, 0xd8, 0x81, 0x73, 0x07, 0x33, 0x20, 0xb5, 0x60, 0x0b, 0xb7, - 0x90, 0x0b, 0xbb, 0xc0, 0x0b, 0xbd, 0xe0, 0x0b, 0x33, 0x0c, 0x7d, 0x40, - 0x0b, 0xbf, 0x50, 0x69, 0x00, 0x70, 0x68, 0xc0, 0x71, 0x1c, 0xc7, 0x71, - 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0xb9, 0x81, 0x1b, 0x58, - 0x74, 0xa0, 0x07, 0x96, 0x65, 0xe9, 0x01, 0x67, 0x0a, 0xac, 0xc0, 0x0a, - 0x74, 0xe3, 0x17, 0x28, 0xe1, 0x17, 0xf6, 0x60, 0x0f, 0xea, 0x00, 0x0f, - 0x32, 0x12, 0x98, 0xa0, 0x8b, 0xd8, 0xd8, 0xec, 0xda, 0x5c, 0xda, 0xde, - 0xc8, 0xea, 0xd8, 0xca, 0x5c, 0xcc, 0xd8, 0xc2, 0xce, 0xe6, 0x46, 0x11, - 0x54, 0x61, 0x15, 0x4e, 0x61, 0x63, 0xb3, 0x6b, 0x73, 0x49, 0x23, 0x2b, - 0x73, 0xa3, 0x1b, 0x25, 0x60, 0x85, 0x5b, 0xc2, 0xd2, 0xe4, 0x5c, 0xec, - 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0x46, 0x09, 0x5a, 0xe1, 0xa8, 0xb0, - 0x34, 0x39, 0x17, 0xb6, 0x30, 0xb7, 0xb3, 0xba, 0xb0, 0xb3, 0xb2, 0x2f, - 0xbb, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x51, 0x02, 0x57, 0xb8, 0x29, - 0x2c, 0x4d, 0xce, 0x65, 0xec, 0xad, 0x0d, 0x2e, 0x8d, 0xad, 0xec, 0xeb, - 0x0d, 0x8e, 0x2e, 0xed, 0xcd, 0x6d, 0x6e, 0x94, 0xe1, 0x15, 0x60, 0x21, - 0x16, 0x8e, 0x09, 0x4b, 0x93, 0x73, 0x31, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, - 0x73, 0xa3, 0x1b, 0x25, 0xf8, 0x05, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00, + 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74, + 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, + 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, + 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, + 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e, + 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x6e, 0x6f, 0x5f, + 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x61, + 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, + 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69, + 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, + 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74, + 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, + 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, + 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77, + 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69, + 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, + 0x78, 0x33, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x59, 0x55, 0x56, 0x44, + 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x61, 0x69, + 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x78, 0x74, + 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, + 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x59, + 0x74, 0x65, 0x78, 0x55, 0x56, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, + 0x5f, 0x5a, 0x54, 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, 0x6e, + 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, + 0x42, 0x41, 0x41, 0x00, 0x00, 0x04, 0xd5, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x82, 0x50, 0x06, 0xcd, 0x08, 0x82, 0x1a, 0x98, 0xc1, 0x08, + 0x42, 0x19, 0x38, 0x23, 0x08, 0x65, 0xf0, 0x8c, 0x20, 0x94, 0x01, 0x34, + 0x82, 0xf0, 0x00, 0x23, 0x08, 0x65, 0x10, 0x8d, 0x20, 0x94, 0x81, 0x34, + 0x82, 0x50, 0x06, 0xd3, 0x08, 0x42, 0x19, 0x50, 0x23, 0x08, 0x65, 0x50, + 0x8d, 0x20, 0x94, 0x81, 0x35, 0x82, 0x50, 0x06, 0xd7, 0x08, 0x42, 0x19, + 0x60, 0x23, 0x08, 0x65, 0x90, 0x8d, 0x20, 0x94, 0x81, 0x36, 0x82, 0x50, + 0x06, 0xdb, 0x08, 0x42, 0x19, 0x70, 0x23, 0x08, 0x65, 0xd0, 0x8d, 0x20, + 0xac, 0x81, 0x37, 0x82, 0xb0, 0x06, 0xdf, 0x08, 0xc2, 0x1a, 0x80, 0xc1, + 0x08, 0xc2, 0x1a, 0x84, 0xc1, 0x08, 0xc2, 0x1a, 0x88, 0xc1, 0x08, 0xc2, + 0x1a, 0x8c, 0xc1, 0x08, 0xc2, 0x1a, 0x90, 0xc1, 0x08, 0xc2, 0x1a, 0x94, + 0xc1, 0x0c, 0x83, 0x1e, 0x04, 0x7b, 0x30, 0xc3, 0xc0, 0x07, 0x42, 0x1f, + 0xcc, 0x10, 0x0c, 0x33, 0x0c, 0x7a, 0xa0, 0x07, 0x7e, 0x30, 0x03, 0x41, + 0xf0, 0x01, 0x1f, 0xf8, 0xc1, 0x0c, 0x41, 0x31, 0x43, 0x60, 0xcc, 0x10, + 0x1c, 0x33, 0x14, 0x88, 0x1f, 0xf8, 0x41, 0xa2, 0xcc, 0x10, 0xf4, 0xc2, + 0x0c, 0x88, 0x1f, 0x2c, 0x4c, 0x93, 0x28, 0xce, 0x33, 0x43, 0xc2, 0x07, + 0x50, 0xc4, 0x48, 0x89, 0xe2, 0x4c, 0x33, 0x24, 0x7a, 0x00, 0x51, 0x8c, + 0x94, 0x54, 0x8e, 0x35, 0x03, 0x1a, 0xf8, 0x41, 0x1f, 0xf8, 0x01, 0xd7, + 0xf5, 0x41, 0x1f, 0xf8, 0x01, 0xe7, 0x89, 0x42, 0x1f, 0xf8, 0x01, 0xf7, + 0x8d, 0x42, 0x1f, 0xf8, 0x01, 0x07, 0x06, 0xa4, 0xd0, 0x07, 0x7e, 0xc0, + 0x85, 0x41, 0x29, 0xf4, 0x81, 0x1f, 0x70, 0x62, 0x60, 0x0a, 0x7d, 0xe0, + 0x07, 0xdc, 0x18, 0x9c, 0x42, 0x1f, 0xf8, 0x01, 0x47, 0x06, 0x33, 0x48, + 0xa0, 0x70, 0x61, 0xa1, 0x90, 0xf9, 0x01, 0x1f, 0x68, 0x9b, 0x38, 0x94, + 0x41, 0x28, 0x98, 0x41, 0x1f, 0x24, 0x67, 0xe0, 0xa0, 0xc1, 0x0c, 0x8a, + 0x1f, 0x90, 0x82, 0x1f, 0xa4, 0x81, 0x1a, 0x90, 0x42, 0x2a, 0xf8, 0xc1, + 0x1a, 0xb0, 0xc1, 0x0c, 0x52, 0x1f, 0x5c, 0x18, 0x2a, 0x64, 0x7c, 0xc0, + 0x07, 0xda, 0x46, 0x0e, 0x65, 0x80, 0x0a, 0x66, 0x40, 0x0a, 0x49, 0x1b, + 0x38, 0x6e, 0x30, 0x83, 0xa2, 0x0a, 0x6f, 0x90, 0xf9, 0x01, 0x1f, 0xc0, + 0x41, 0x12, 0x07, 0x8e, 0x1c, 0xcc, 0xa0, 0xac, 0xc2, 0x1b, 0x64, 0x7c, + 0xc0, 0x07, 0x70, 0x90, 0xc4, 0x81, 0x33, 0x07, 0x33, 0x24, 0xac, 0x40, + 0x07, 0x99, 0x1f, 0xf0, 0x41, 0x52, 0x07, 0x8e, 0x1d, 0xcc, 0x80, 0xfc, + 0x02, 0x38, 0x84, 0xc3, 0x38, 0x94, 0x83, 0x39, 0x9c, 0x03, 0x3a, 0xcc, + 0x30, 0xfc, 0x81, 0x2f, 0xa4, 0xc3, 0x0c, 0x41, 0x1e, 0xcc, 0x30, 0xe0, + 0xc1, 0x3a, 0xb4, 0xc2, 0x0c, 0x03, 0xc7, 0x0e, 0xad, 0x30, 0x43, 0x74, + 0x07, 0xed, 0xd0, 0x0a, 0xed, 0xe0, 0x0a, 0xed, 0xf0, 0x0a, 0xed, 0x00, + 0x0b, 0xed, 0x10, 0x0b, 0xed, 0x20, 0x0b, 0xed, 0x30, 0x0b, 0xed, 0x40, + 0x0b, 0x33, 0x0c, 0xee, 0xd0, 0x0e, 0xae, 0x50, 0x76, 0x00, 0x88, 0x01, + 0x1a, 0x88, 0x81, 0x18, 0x88, 0x01, 0x27, 0x06, 0x62, 0x20, 0x06, 0x62, + 0x20, 0x06, 0x62, 0x20, 0x06, 0x62, 0x20, 0x06, 0x62, 0x20, 0x06, 0x62, + 0x20, 0x06, 0x62, 0x20, 0x06, 0x68, 0x80, 0x06, 0x68, 0x80, 0x06, 0x68, + 0x80, 0x06, 0x6e, 0xe0, 0x06, 0x16, 0x1d, 0xe8, 0x81, 0x65, 0x59, 0x7a, + 0xc0, 0x99, 0x02, 0x2b, 0xb0, 0x02, 0xdd, 0xf8, 0x05, 0x4a, 0xf8, 0x85, + 0x3d, 0xd8, 0x83, 0x3a, 0xc0, 0x03, 0x1d, 0x70, 0x74, 0xe0, 0x06, 0xbc, + 0x21, 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d, 0xcd, 0xae, 0xcd, 0xa5, 0xed, + 0x8d, 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c, 0x2d, 0xec, 0x6c, 0x6e, 0x14, + 0x81, 0x16, 0x6a, 0xe1, 0x14, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2, + 0x32, 0x37, 0xba, 0x51, 0x02, 0x5b, 0xb8, 0x25, 0x2c, 0x4d, 0xce, 0xc5, + 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x94, 0xe0, 0x16, 0x8e, 0x0a, + 0x4b, 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b, 0xab, 0x0b, 0x3b, 0x2b, 0xfb, + 0xb2, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0xc0, 0x85, 0x9b, + 0xc2, 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda, 0xe0, 0xd2, 0xd8, 0xca, 0xbe, + 0xde, 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0x46, 0x19, 0x72, 0x41, 0x17, + 0x76, 0xe1, 0x98, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, 0xb6, + 0x32, 0x37, 0xba, 0x51, 0x82, 0x74, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, @@ -2308,134 +2822,334 @@ const unsigned char sdl_metallib[] = { 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, - 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x13, 0x04, 0x4c, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, - 0x00, 0x64, 0xd5, 0xc0, 0x08, 0x00, 0x75, 0x33, 0x00, 0xe4, 0x8d, 0x00, - 0x50, 0x59, 0x02, 0x45, 0x50, 0x06, 0x64, 0x8e, 0x35, 0x00, 0x81, 0x30, - 0xc7, 0xa0, 0xac, 0xc1, 0x1a, 0x8c, 0x00, 0x50, 0x3b, 0x07, 0xa1, 0x20, - 0xc7, 0x1a, 0x10, 0x30, 0x02, 0x30, 0x46, 0x60, 0xde, 0xeb, 0x2a, 0x7b, - 0x63, 0x04, 0x31, 0x0f, 0xf6, 0xb9, 0x37, 0x46, 0xe0, 0xf6, 0xb1, 0x68, - 0x7b, 0x63, 0x04, 0xef, 0x9e, 0x96, 0xf7, 0x37, 0x46, 0xa0, 0xb3, 0xe6, - 0x1c, 0x82, 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0xfe, 0x51, 0x30, 0x03, - 0x30, 0x03, 0x40, 0xc5, 0x0c, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00, - 0x00, 0x58, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x22, 0x48, - 0x5e, 0x00, 0x00, 0x00, 0x00, 0x62, 0x80, 0x61, 0x96, 0x55, 0x3d, 0x0f, - 0x00, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x59, 0x55, - 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x61, - 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2d, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, - 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x61, - 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x34, 0x29, 0x61, 0x69, 0x72, + 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0xd9, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x45, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, + 0x00, 0x84, 0xd5, 0xc0, 0x08, 0x00, 0x95, 0x33, 0x00, 0x64, 0x8e, 0x00, + 0x8c, 0x25, 0x04, 0x00, 0xad, 0x25, 0x50, 0x04, 0x65, 0x40, 0xef, 0x58, + 0x03, 0x10, 0x08, 0x73, 0x0c, 0x50, 0x1c, 0xc4, 0xc1, 0x1c, 0x03, 0xe4, + 0xc4, 0xc1, 0x58, 0x03, 0x30, 0x10, 0x04, 0x8c, 0x00, 0x8c, 0x11, 0x80, + 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, 0x63, + 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, 0xcc, 0x00, 0x50, 0x30, 0x03, 0x30, + 0x03, 0x30, 0x07, 0xc1, 0x07, 0x7b, 0xc0, 0x07, 0x7f, 0x40, 0xc2, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x34, 0x00, 0x00, + 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0xc8, 0x49, 0x00, 0x00, 0x00, + 0x00, 0x63, 0x60, 0x61, 0x98, 0x05, 0x00, 0x00, 0x00, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x5f, 0x5a, 0x54, 0x53, 0x31, - 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, - 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, - 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x00, 0x00, - 0x00, 0x13, 0x84, 0x32, 0xc0, 0x26, 0x08, 0x65, 0x90, 0x4d, 0x10, 0xca, - 0x40, 0x9b, 0x20, 0x94, 0xc1, 0x36, 0x41, 0x28, 0x03, 0x6e, 0x82, 0x50, - 0x06, 0xdd, 0x04, 0xa1, 0x0c, 0xbc, 0x09, 0x42, 0x19, 0x7c, 0x2b, 0x84, - 0x78, 0x08, 0x87, 0x15, 0x83, 0x3c, 0xc4, 0x83, 0x38, 0xac, 0x18, 0xe6, - 0x21, 0x1e, 0xc6, 0x61, 0xc5, 0x40, 0x0f, 0xf1, 0x40, 0x0e, 0x2b, 0x86, - 0x7a, 0x88, 0x87, 0x72, 0xd8, 0x20, 0xcc, 0x83, 0x3c, 0x6c, 0x10, 0xea, - 0x81, 0x1e, 0x36, 0x04, 0xf4, 0xb0, 0x61, 0xa8, 0x87, 0x79, 0x90, 0x87, - 0x0d, 0x01, 0x3a, 0x6c, 0x18, 0xce, 0x41, 0x1f, 0xd2, 0x61, 0xc3, 0xc0, - 0xed, 0x43, 0x3a, 0x6c, 0x88, 0xcc, 0x81, 0x1f, 0xd2, 0x81, 0x1f, 0xd4, - 0x81, 0x1f, 0xd6, 0x81, 0x1f, 0xd8, 0x81, 0x1f, 0xda, 0x81, 0x1f, 0xdc, - 0x81, 0x1f, 0xde, 0x81, 0x1f, 0xe0, 0x61, 0xc3, 0xd0, 0x0f, 0xfc, 0x90, - 0x0e, 0x1b, 0x82, 0x7a, 0xd8, 0x30, 0xd0, 0xc3, 0x3c, 0xc8, 0xc3, 0x86, - 0xa1, 0x1f, 0xf8, 0x81, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x23, 0x06, 0x0d, - 0x11, 0x82, 0x60, 0x10, 0x06, 0x78, 0x80, 0x59, 0x5b, 0x25, 0x51, 0x8a, - 0x42, 0x07, 0xa3, 0x09, 0x01, 0x30, 0x62, 0xe0, 0x10, 0x21, 0x08, 0x06, - 0xdf, 0x1e, 0x64, 0x58, 0x67, 0x07, 0x17, 0x65, 0x31, 0x8c, 0x1d, 0x8c, - 0x26, 0x04, 0xc0, 0x18, 0x42, 0xa0, 0x06, 0x83, 0x0c, 0xc4, 0x21, 0xcd, - 0x31, 0x04, 0xc2, 0x35, 0x62, 0xe0, 0x10, 0x21, 0x08, 0x06, 0x1f, 0x28, - 0x78, 0x9d, 0x18, 0xf4, 0x01, 0x97, 0x6d, 0x51, 0xb4, 0x07, 0xa3, 0x09, - 0x01, 0x30, 0x86, 0x10, 0xbc, 0xc1, 0x1c, 0x03, 0x11, 0x68, 0x47, 0x06, - 0xe7, 0x52, 0x10, 0x94, 0x41, 0x86, 0x00, 0xda, 0x8c, 0x08, 0xc0, 0x7f, - 0x23, 0x03, 0x1a, 0xd4, 0x41, 0x29, 0x5c, 0x70, 0x2e, 0x05, 0x41, 0x19, - 0x64, 0x08, 0x2a, 0x30, 0x18, 0x31, 0x38, 0x8a, 0x10, 0x04, 0x0b, 0xff, - 0xc8, 0x5a, 0xa1, 0x08, 0xe6, 0x18, 0xac, 0x40, 0x0f, 0x36, 0x52, 0xb8, - 0xc1, 0x1e, 0xac, 0x42, 0x2a, 0x98, 0xc1, 0x05, 0xe7, 0x52, 0x10, 0x94, - 0x41, 0x86, 0x60, 0x33, 0x83, 0x11, 0x83, 0xa3, 0x08, 0x41, 0xb0, 0xf0, - 0x8f, 0x6c, 0x16, 0x96, 0x60, 0x8e, 0xc1, 0x08, 0xd6, 0x60, 0x23, 0x05, - 0x1d, 0x84, 0x42, 0x2c, 0xbc, 0xc2, 0x1a, 0x5c, 0x70, 0x2e, 0x05, 0x41, - 0x19, 0x64, 0x08, 0xc2, 0x80, 0x0d, 0x46, 0x0c, 0x8e, 0x22, 0x04, 0xc1, - 0xc2, 0x3f, 0xb2, 0x5c, 0x88, 0x82, 0x39, 0x06, 0x23, 0x80, 0x83, 0x3d, - 0x0c, 0x7b, 0x70, 0x0a, 0xb5, 0x40, 0x01, 0x30, 0xf6, 0x30, 0xf4, 0x41, - 0x2a, 0xd8, 0x02, 0x05, 0xc0, 0x18, 0x31, 0x28, 0x8a, 0x10, 0x04, 0x83, - 0x0b, 0x1c, 0x86, 0x59, 0x86, 0x60, 0x09, 0x86, 0x23, 0xa6, 0x37, 0x50, - 0xfc, 0x63, 0x96, 0x61, 0x10, 0x02, 0xa3, 0xde, 0x40, 0xfc, 0x67, 0x09, - 0x08, 0xab, 0xde, 0x00, 0xfc, 0x47, 0x0c, 0x8c, 0x22, 0x04, 0xc1, 0xc2, - 0x3f, 0xa8, 0x72, 0x08, 0x2c, 0x80, 0x03, 0xf1, 0x1f, 0x31, 0x38, 0x8a, - 0x10, 0x04, 0x0b, 0xff, 0x90, 0xd0, 0x21, 0x80, 0x83, 0x59, 0x02, 0x62, - 0xa0, 0x02, 0x50, 0x04, 0x61, 0x98, 0x63, 0x78, 0x83, 0x60, 0x16, 0x86, - 0x23, 0xaa, 0x3b, 0x50, 0xfc, 0x63, 0x96, 0xc1, 0x28, 0x02, 0xb3, 0xee, - 0x40, 0xfc, 0x67, 0x09, 0x0e, 0xbb, 0xee, 0x00, 0xfc, 0x47, 0x0c, 0x8c, - 0x22, 0x04, 0xc1, 0xc2, 0x3f, 0xa8, 0x76, 0x08, 0x2c, 0xc0, 0x03, 0xf1, - 0x1f, 0x31, 0x38, 0x8a, 0x10, 0x04, 0x0b, 0xff, 0x90, 0xe0, 0x21, 0xc0, - 0x83, 0x59, 0x82, 0x63, 0xa0, 0x02, 0x50, 0x0a, 0xc1, 0x98, 0x63, 0x40, - 0x02, 0x53, 0x18, 0x8e, 0xb8, 0xfe, 0x40, 0xf1, 0x8f, 0x59, 0x86, 0x04, - 0x09, 0x0c, 0xfb, 0x03, 0xf1, 0x9f, 0x25, 0x50, 0x2c, 0xfb, 0x03, 0xf0, - 0x1f, 0x31, 0x30, 0x8a, 0x10, 0x04, 0x0b, 0xff, 0xa0, 0xea, 0x21, 0xb0, - 0x00, 0x14, 0xc4, 0x7f, 0xc4, 0xe0, 0x28, 0x42, 0x10, 0x2c, 0xfc, 0x43, - 0xc2, 0x87, 0x00, 0x14, 0x66, 0x09, 0x94, 0x81, 0x0a, 0x40, 0x41, 0x84, - 0x64, 0x8e, 0x01, 0x09, 0x5a, 0x61, 0x96, 0x60, 0x19, 0xa8, 0x08, 0x04, - 0x85, 0x0f, 0x80, 0x41, 0x86, 0x40, 0x14, 0x5a, 0x61, 0x8e, 0x21, 0x14, - 0x38, 0x73, 0x18, 0x64, 0x08, 0x44, 0xa1, 0x15, 0x6c, 0x08, 0xc4, 0x7f, - 0x90, 0x21, 0x20, 0x05, 0x57, 0x98, 0x63, 0x08, 0x50, 0x61, 0x16, 0x2c, - 0x08, 0x07, 0xf1, 0xcf, 0x20, 0x20, 0x06, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x5b, 0x0a, 0xe0, 0xa8, 0x07, 0xc4, 0x1e, 0xb6, 0x14, 0xc2, 0x51, - 0x0f, 0x88, 0x3d, 0x6c, 0x29, 0x8e, 0xa3, 0x1e, 0x10, 0x7b, 0xd8, 0x52, - 0x30, 0xc7, 0x3d, 0x20, 0xf8, 0xb0, 0xa5, 0x88, 0x8e, 0x7b, 0x40, 0xf0, - 0x61, 0x4b, 0x71, 0x1d, 0xf7, 0x80, 0xe0, 0xc3, 0x96, 0xa2, 0x3b, 0xee, - 0x01, 0xc1, 0x87, 0x2d, 0x87, 0x18, 0x04, 0xfd, 0x70, 0xf8, 0x03, 0xf2, - 0x0f, 0x5b, 0x0e, 0x32, 0x08, 0x40, 0xe2, 0xf0, 0x07, 0xe4, 0x1f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xb3, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x43, 0x00, 0x00, - 0x00, 0x12, 0x03, 0x94, 0x20, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x90, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x58, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, - 0x00, 0x31, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, - 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, - 0x00, 0x47, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, - 0x00, 0x54, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, - 0x00, 0x21, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, - 0x00, 0x75, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, - 0x00, 0x1b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x31, 0x00, 0x00, - 0x00, 0x12, 0x03, 0x94, 0x77, 0x01, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, - 0x5f, 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, - 0x77, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, - 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, - 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x2e, 0x75, 0x2e, - 0x69, 0x31, 0x2e, 0x66, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, - 0x64, 0x6f, 0x74, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, - 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, - 0x75, 0x72, 0x65, 0x5f, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, - 0x2e, 0x76, 0x34, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, - 0x5f, 0x32, 0x64, 0x2e, 0x76, 0x34, 0x66, 0x33, 0x32, 0x33, 0x32, 0x30, - 0x32, 0x33, 0x2e, 0x39, 0x38, 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, - 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x69, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, - 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, - 0x00, 0x00, 0x00, 0x00, 0x00 + 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x4e, 0x56, 0x31, 0x32, 0x5f, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x61, 0x69, 0x72, 0x2d, + 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, + 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x73, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x74, 0x65, + 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, + 0x67, 0x28, 0x34, 0x29, 0x00, 0x2b, 0x84, 0x7a, 0x80, 0x87, 0x15, 0x83, + 0x3d, 0xd4, 0x43, 0x3c, 0xac, 0x18, 0xee, 0xa1, 0x1e, 0xe4, 0x61, 0xc5, + 0x80, 0x0f, 0xf5, 0x30, 0x0f, 0x2b, 0x86, 0x7c, 0xa8, 0x07, 0x7a, 0xd8, + 0x10, 0xd8, 0xc3, 0x86, 0x21, 0x1f, 0xf0, 0xe1, 0x1e, 0x36, 0x08, 0xf8, + 0x70, 0x0f, 0x1b, 0x04, 0x7b, 0xc8, 0x87, 0x0d, 0x41, 0x3e, 0x6c, 0x18, + 0xec, 0x01, 0x1f, 0xee, 0x01, 0x7b, 0x18, 0x34, 0x33, 0xb0, 0x03, 0x0a, + 0x80, 0x31, 0x1c, 0x11, 0x24, 0x81, 0x7f, 0xcc, 0x32, 0x04, 0x42, 0x30, + 0x62, 0xd0, 0x18, 0x21, 0x08, 0x06, 0x67, 0xb0, 0x07, 0x5b, 0xe6, 0x61, + 0xd5, 0xc5, 0x30, 0x77, 0x30, 0x9a, 0x10, 0x00, 0x23, 0x06, 0x8d, 0x11, + 0x82, 0x60, 0x70, 0x06, 0x7d, 0xc0, 0x6d, 0x60, 0xa0, 0x5d, 0x99, 0xe3, + 0xe4, 0xc1, 0x68, 0x42, 0x00, 0x0c, 0x32, 0x0c, 0xca, 0x34, 0xc8, 0x20, + 0x30, 0xd3, 0x20, 0x83, 0x10, 0x4c, 0x37, 0x06, 0xf0, 0x52, 0x10, 0x94, + 0x41, 0x86, 0x00, 0xca, 0x8c, 0x08, 0xc0, 0x7f, 0x23, 0xc3, 0x19, 0xd0, + 0x01, 0x29, 0x5c, 0x00, 0x2f, 0x05, 0x41, 0x19, 0x64, 0x08, 0x2a, 0x6f, + 0xc4, 0xe0, 0x38, 0x42, 0x10, 0x2c, 0xfc, 0x63, 0x83, 0x85, 0x22, 0x98, + 0x63, 0xb0, 0x82, 0x3c, 0xd8, 0x48, 0xd1, 0x06, 0x7a, 0xa0, 0x0a, 0xa8, + 0x40, 0x06, 0x17, 0xc0, 0x4b, 0x41, 0x50, 0x06, 0x19, 0x82, 0x8d, 0x0c, + 0x46, 0x0c, 0x8e, 0x23, 0x04, 0xc1, 0xc2, 0x3f, 0x36, 0x5b, 0x58, 0x82, + 0x39, 0x06, 0x23, 0x48, 0x83, 0x8d, 0x14, 0x73, 0x00, 0x0a, 0xb0, 0xe0, + 0x0a, 0x69, 0x70, 0x01, 0xbc, 0x14, 0x04, 0x65, 0x90, 0x21, 0x08, 0x03, + 0x35, 0x18, 0x31, 0x38, 0x8e, 0x10, 0x04, 0x0b, 0xff, 0xd8, 0x78, 0x21, + 0x0a, 0xe6, 0x18, 0x8c, 0xc0, 0x0d, 0x66, 0x09, 0x88, 0xe1, 0x88, 0xcf, + 0x0c, 0x02, 0xff, 0x98, 0x65, 0x18, 0x88, 0x60, 0xc4, 0xa0, 0x31, 0x42, + 0x10, 0x0c, 0xce, 0x20, 0x17, 0xf2, 0xe0, 0x0e, 0xf8, 0xc0, 0x0e, 0xe6, + 0xa0, 0x0e, 0xd4, 0x40, 0x0d, 0x6a, 0x61, 0x34, 0x21, 0x00, 0x46, 0x0c, + 0x1a, 0x23, 0x04, 0xc1, 0xe0, 0x0c, 0x76, 0x41, 0x0f, 0xf2, 0xc0, 0x0f, + 0xf0, 0xa0, 0x0e, 0xee, 0x80, 0x0d, 0xd8, 0xe0, 0x16, 0x46, 0x13, 0x02, + 0x60, 0x90, 0x21, 0x48, 0x03, 0x3b, 0x18, 0x64, 0x20, 0xd2, 0x40, 0x0e, + 0x06, 0x19, 0x04, 0x34, 0x90, 0x83, 0x41, 0x06, 0x21, 0x90, 0x83, 0x13, + 0x05, 0x78, 0x29, 0x08, 0xca, 0x20, 0x43, 0xf0, 0x06, 0x78, 0x60, 0x44, + 0x00, 0xfe, 0x1b, 0x19, 0x4c, 0x61, 0x16, 0xc6, 0xe1, 0x02, 0x78, 0x29, + 0x08, 0xca, 0x20, 0x43, 0x40, 0x07, 0x7d, 0x30, 0x62, 0x70, 0x1c, 0x21, + 0x08, 0x16, 0xfe, 0xb1, 0xbd, 0x43, 0x11, 0xcc, 0x31, 0xd4, 0x41, 0x80, + 0x0b, 0x1b, 0x29, 0x58, 0x21, 0x17, 0xd2, 0xe1, 0x1c, 0x46, 0xe1, 0x02, + 0x78, 0x29, 0x08, 0xca, 0x20, 0x43, 0xa0, 0x07, 0xa3, 0x30, 0x62, 0x70, + 0x1c, 0x21, 0x08, 0x16, 0xfe, 0xb1, 0xd5, 0xc3, 0x12, 0xcc, 0x31, 0x18, + 0x01, 0x2a, 0x6c, 0xa4, 0x90, 0x85, 0x5f, 0x78, 0x87, 0x76, 0x40, 0x85, + 0x0b, 0xe0, 0xa5, 0x20, 0x28, 0x83, 0x0c, 0x01, 0x28, 0xa4, 0xc2, 0x88, + 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0xb6, 0x0f, 0x51, 0x30, 0xc7, + 0x60, 0x04, 0xad, 0x30, 0x4b, 0x40, 0x0c, 0x74, 0x04, 0xa0, 0x10, 0x08, + 0x83, 0x48, 0x08, 0x73, 0x0c, 0x01, 0x2a, 0xb8, 0xc2, 0x88, 0xc1, 0x81, + 0xc4, 0x20, 0x58, 0xf8, 0x07, 0x44, 0x12, 0xc1, 0x2e, 0x58, 0xe0, 0x0b, + 0xe2, 0x9f, 0x41, 0x40, 0x0c, 0x19, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, + 0x70, 0x87, 0x23, 0x1f, 0x10, 0x7d, 0xd8, 0x52, 0x10, 0xc7, 0x3e, 0x20, + 0xfc, 0xb0, 0xa5, 0x30, 0x8e, 0x7d, 0x40, 0xf8, 0x61, 0x4b, 0xc1, 0x1c, + 0xfd, 0x80, 0xf8, 0xc3, 0x96, 0x22, 0x3a, 0xfa, 0x01, 0xf1, 0x87, 0x2d, + 0xc5, 0x75, 0xf4, 0x03, 0xe2, 0x0f, 0x5b, 0x8a, 0xee, 0xe8, 0x07, 0xc4, + 0x1f, 0xb6, 0x14, 0x64, 0x70, 0xec, 0x03, 0xc2, 0x0f, 0x5b, 0x0a, 0x33, + 0x38, 0xf6, 0x01, 0xe1, 0x87, 0x2d, 0x45, 0x1b, 0x1c, 0xfd, 0x80, 0xf8, + 0xc3, 0x96, 0x42, 0x0e, 0x8e, 0x7e, 0x40, 0xfc, 0x61, 0x4b, 0x81, 0x07, + 0x47, 0x3f, 0x20, 0xfe, 0xb0, 0xa5, 0xf0, 0x83, 0xa3, 0x1f, 0x10, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0xbe, 0x01, 0x00, + 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00, 0x00, 0x4f, 0x00, 0x00, + 0x00, 0x54, 0xce, 0x00, 0xd0, 0x5a, 0x02, 0x45, 0x40, 0xef, 0x58, 0x03, + 0x10, 0x08, 0x23, 0x00, 0x34, 0xcf, 0x41, 0x40, 0x4e, 0x93, 0x06, 0x63, + 0x11, 0x40, 0x20, 0x1c, 0x04, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, + 0x18, 0x81, 0x2c, 0xba, 0x3d, 0x0d, 0x06, 0x63, 0x04, 0xb5, 0x5a, 0xab, + 0xed, 0x37, 0x46, 0xd0, 0xc7, 0xa2, 0x8b, 0x7f, 0x63, 0x04, 0x6e, 0x1f, + 0x8b, 0xb6, 0x2f, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, + 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, + 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xbc, 0x7b, 0x5a, 0xde, 0xdf, + 0x18, 0x81, 0xce, 0x9a, 0x73, 0x08, 0x06, 0x23, 0x00, 0x63, 0x04, 0x20, + 0x08, 0x82, 0x24, 0x18, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, + 0x03, 0x40, 0xc1, 0x0c, 0xc0, 0x0c, 0xc0, 0x1c, 0x44, 0x1d, 0xec, 0x41, + 0x1d, 0xf8, 0x01, 0x15, 0x33, 0x00, 0x23, 0x00, 0x33, 0x00, 0x63, 0x0d, + 0x20, 0x08, 0x82, 0xf8, 0x07, 0x82, 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82, + 0xf8, 0x37, 0xd6, 0xc0, 0xb6, 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4, + 0xc7, 0xb6, 0xf3, 0x4f, 0x7a, 0x63, 0x0d, 0x20, 0x08, 0xb2, 0xf5, 0x2f, + 0x80, 0x20, 0xc8, 0xd6, 0xbf, 0x00, 0x82, 0x20, 0x5b, 0xff, 0xc2, 0x58, + 0x03, 0x08, 0x82, 0x6b, 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x80, + 0x20, 0xb8, 0xe6, 0x60, 0x30, 0xd6, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, + 0x08, 0xd2, 0x6d, 0x0e, 0x06, 0x20, 0x48, 0xb7, 0x39, 0x18, 0x8c, 0x35, + 0xac, 0x23, 0x1e, 0xb3, 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x3a, + 0xe2, 0x31, 0x0b, 0x06, 0x63, 0x0d, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, + 0x20, 0x8c, 0x87, 0x63, 0x00, 0x82, 0x30, 0x1e, 0x8e, 0xc1, 0x58, 0x83, + 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, + 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, + 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, + 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0x00, 0x1b, 0x06, 0x77, 0x68, 0x87, 0x57, 0xd8, 0x30, 0xb8, 0x43, 0x3b, + 0xd0, 0xc2, 0x86, 0xc1, 0x1d, 0xda, 0x21, 0x16, 0x36, 0x0c, 0xee, 0xd0, + 0x0e, 0xb2, 0xb0, 0x61, 0x70, 0x87, 0x76, 0x98, 0x85, 0x0d, 0x83, 0x3b, + 0xb4, 0x03, 0x2c, 0x6c, 0x18, 0xdc, 0xa1, 0x1d, 0x5a, 0x01, 0x00, 0x00, + 0x00, 0x7b, 0x18, 0xce, 0x20, 0x0e, 0x44, 0x81, 0x02, 0x60, 0x0c, 0x47, + 0x04, 0x55, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0x0c, 0x32, 0xac, 0xc1, + 0x64, 0x06, 0x7b, 0x18, 0xd6, 0xa0, 0x0e, 0xec, 0x80, 0x02, 0x60, 0x8c, + 0x18, 0x18, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x84, 0xc1, 0x2a, 0x0c, 0x23, + 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x5f, 0x2b, 0x04, 0x90, 0x05, + 0x10, 0xf8, 0x8f, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x7c, 0xad, + 0x10, 0x54, 0x36, 0x44, 0xe2, 0x6f, 0x51, 0x10, 0xfe, 0x36, 0x04, 0xe4, + 0x3f, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x11, 0x06, 0xb2, 0x10, + 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x7c, 0xb4, 0x10, 0x4c, + 0x16, 0x4c, 0xe2, 0x3f, 0xc7, 0xd0, 0x2d, 0xa1, 0x30, 0xc8, 0x10, 0x78, + 0x73, 0x60, 0x43, 0x40, 0xfe, 0x83, 0x0c, 0x01, 0x18, 0xd0, 0xc1, 0x20, + 0x43, 0xc0, 0x07, 0x74, 0x30, 0x4b, 0x20, 0x0c, 0x54, 0x04, 0x42, 0xa0, + 0x0f, 0xc0, 0x1e, 0x86, 0x3e, 0x38, 0x05, 0x5b, 0xa0, 0x00, 0x18, 0xc3, + 0x11, 0x01, 0x1b, 0x38, 0xfe, 0x31, 0xcb, 0x30, 0x10, 0xc1, 0x20, 0x03, + 0x91, 0x06, 0x7c, 0xb0, 0x87, 0x21, 0x14, 0x56, 0xc1, 0x15, 0x28, 0x00, + 0xc6, 0x1e, 0x86, 0x51, 0x68, 0x85, 0x57, 0xa0, 0x00, 0x18, 0x23, 0x06, + 0x4a, 0x12, 0x83, 0x60, 0xe1, 0x1f, 0x9d, 0x39, 0x14, 0xdd, 0x31, 0x04, + 0x83, 0x0c, 0x01, 0x1b, 0x80, 0xc2, 0x20, 0x43, 0xb0, 0x80, 0xc2, 0x2c, + 0x01, 0x31, 0x50, 0x11, 0x08, 0x03, 0x26, 0x0c, 0x47, 0x84, 0x01, 0x1f, + 0x04, 0xfe, 0x31, 0xcb, 0x50, 0x4c, 0xc1, 0x1e, 0x06, 0x55, 0xa0, 0x05, + 0x72, 0xa0, 0x00, 0x18, 0xc3, 0x11, 0xc1, 0x1f, 0x04, 0xfe, 0x31, 0xcb, + 0x60, 0x1c, 0xc1, 0x20, 0x43, 0x61, 0x07, 0xa9, 0xb0, 0x87, 0xc1, 0x15, + 0x70, 0xa1, 0x1c, 0x28, 0x00, 0xc6, 0x1c, 0x83, 0x1d, 0x04, 0xba, 0x30, + 0xc8, 0x10, 0xdc, 0x01, 0x2b, 0x58, 0x50, 0x88, 0xff, 0x20, 0x43, 0x90, + 0x07, 0xad, 0x30, 0x4b, 0xd0, 0x06, 0x7b, 0x18, 0x68, 0xc1, 0x17, 0xd8, + 0x81, 0x02, 0x60, 0xec, 0x61, 0xb0, 0x05, 0x70, 0x68, 0x07, 0x0a, 0x80, + 0x31, 0xc8, 0x00, 0x85, 0x82, 0x2c, 0x8c, 0x18, 0x14, 0x47, 0x08, 0x82, + 0x41, 0xc6, 0x0f, 0xc4, 0x2c, 0x03, 0x22, 0x05, 0x63, 0x08, 0x12, 0x39, + 0x0c, 0x47, 0x04, 0xad, 0xa0, 0xf8, 0xc7, 0x2c, 0x83, 0x92, 0x04, 0x26, + 0xb4, 0x82, 0xf8, 0xcf, 0x12, 0x2c, 0x36, 0xb4, 0x02, 0xf8, 0x8f, 0x18, + 0x18, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x58, 0x22, 0x11, 0x58, 0xe0, 0x0a, + 0xe2, 0x3f, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0x95, 0x44, + 0xe0, 0x0a, 0xb3, 0x04, 0xcb, 0x40, 0x05, 0xa0, 0x24, 0x82, 0x32, 0xc7, + 0xa0, 0x0a, 0x01, 0x3b, 0x8c, 0x21, 0x6c, 0xe1, 0x30, 0x1c, 0x11, 0xd8, + 0x82, 0xe2, 0x1f, 0xb3, 0x0c, 0x0d, 0x13, 0x98, 0x60, 0x0b, 0xe2, 0x3f, + 0x4b, 0xe0, 0xd8, 0x60, 0x0b, 0xe0, 0x3f, 0x62, 0x60, 0x1c, 0x21, 0x08, + 0x16, 0xfe, 0x61, 0xad, 0x44, 0x60, 0xc1, 0x2d, 0x88, 0xff, 0x88, 0xc1, + 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0xe5, 0x12, 0xc1, 0x2d, 0xcc, 0x12, + 0x38, 0x03, 0x15, 0x80, 0xc2, 0x08, 0xcd, 0x1c, 0x43, 0x12, 0xa4, 0xc3, + 0x18, 0x02, 0x19, 0xa4, 0xc3, 0x70, 0x44, 0xf0, 0x0b, 0x8a, 0x7f, 0xcc, + 0x32, 0x40, 0x4f, 0x60, 0xc2, 0x2f, 0x88, 0xff, 0x2c, 0x41, 0x64, 0xc3, + 0x2f, 0x80, 0xff, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x45, + 0x13, 0x81, 0x05, 0xe0, 0x20, 0xfe, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, + 0xe1, 0x1f, 0xd4, 0x4d, 0x04, 0xe0, 0x30, 0x4b, 0x10, 0x0d, 0x54, 0x00, + 0xca, 0x23, 0x40, 0x73, 0x0c, 0x49, 0x10, 0x0f, 0xb3, 0x04, 0xd2, 0x40, + 0x45, 0x20, 0x44, 0x7a, 0x70, 0x0c, 0x32, 0x04, 0xbf, 0x20, 0x0f, 0x73, + 0x0c, 0xbd, 0x00, 0x06, 0x21, 0x31, 0xc8, 0x10, 0xf8, 0xc2, 0x3c, 0xd8, + 0x10, 0x88, 0xff, 0x20, 0x43, 0x00, 0x0e, 0xf4, 0x30, 0x4b, 0xd0, 0x06, + 0xc3, 0x11, 0xb3, 0x60, 0x0e, 0x81, 0x7f, 0xcc, 0x32, 0x50, 0x60, 0x10, + 0x0c, 0x32, 0xd0, 0x41, 0x39, 0xe0, 0xc3, 0x1e, 0x86, 0x7e, 0x38, 0x89, + 0x9a, 0xa0, 0x00, 0x18, 0x7b, 0x18, 0xfe, 0x21, 0x25, 0x6c, 0x82, 0x02, + 0x60, 0xcc, 0x31, 0x9c, 0x43, 0xb0, 0x12, 0x83, 0x0c, 0x01, 0x3a, 0xf4, + 0x83, 0x05, 0x87, 0xf8, 0x0f, 0x32, 0x04, 0xea, 0xe0, 0x0f, 0x23, 0x06, + 0xc5, 0x11, 0x82, 0x60, 0x90, 0xa1, 0xc5, 0x31, 0xcb, 0xf0, 0x55, 0xc1, + 0x18, 0xc2, 0x00, 0x13, 0xc3, 0x11, 0xc1, 0x3f, 0x28, 0xfe, 0x31, 0xcb, + 0x70, 0x59, 0x81, 0x09, 0xff, 0x20, 0xfe, 0xb3, 0x04, 0xd8, 0x88, 0x81, + 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0xd5, 0x16, 0xc3, 0x88, 0xc1, 0x71, + 0x84, 0x20, 0x58, 0xf8, 0x07, 0xf5, 0x16, 0x01, 0x48, 0x58, 0x00, 0x12, + 0xe2, 0x6f, 0x01, 0x48, 0x80, 0xff, 0x2c, 0x01, 0x36, 0x50, 0x01, 0x28, + 0x96, 0x70, 0xcd, 0x31, 0xc8, 0x43, 0x80, 0x13, 0x63, 0x08, 0x4c, 0x4b, + 0x0c, 0x47, 0x04, 0x28, 0xa1, 0xf8, 0xc7, 0x2c, 0x83, 0x96, 0x05, 0x26, + 0xa0, 0x84, 0xf8, 0xcf, 0x12, 0x6c, 0x23, 0x06, 0xc6, 0x11, 0x82, 0x60, + 0xe1, 0x1f, 0x96, 0x5d, 0x0c, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, + 0x1f, 0x14, 0x5e, 0x04, 0x29, 0x61, 0x41, 0x4a, 0x88, 0xbf, 0x05, 0x29, + 0x01, 0xfe, 0xb3, 0x04, 0xdb, 0x40, 0x05, 0xa0, 0x64, 0x82, 0x36, 0xc7, + 0x90, 0x04, 0x35, 0x31, 0x86, 0x50, 0xd5, 0xc4, 0x70, 0x44, 0x10, 0x13, + 0x8a, 0x7f, 0xcc, 0x32, 0x74, 0x5c, 0x60, 0x42, 0x4c, 0x88, 0xff, 0x2c, + 0x81, 0x37, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x61, 0xfd, 0xc5, + 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0x85, 0x46, 0x20, + 0x13, 0x16, 0xc8, 0x84, 0xf8, 0x5b, 0x20, 0x13, 0xe0, 0x3f, 0x4b, 0xe0, + 0x0d, 0x54, 0x00, 0x0a, 0x27, 0x74, 0x73, 0x0c, 0x49, 0xd0, 0x13, 0x23, + 0x06, 0xc8, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0xd2, 0x69, 0x04, 0x26, 0x41, + 0x12, 0x83, 0x0c, 0x01, 0x4a, 0xf0, 0xc4, 0x2c, 0xc1, 0x37, 0x50, 0x11, + 0xf8, 0x01, 0x25, 0x78, 0x83, 0x0c, 0x41, 0x4b, 0xf8, 0xc4, 0x2c, 0x41, + 0x1b, 0xcc, 0x32, 0x84, 0x41, 0x1b, 0xf0, 0xc3, 0x20, 0x43, 0x2f, 0xb8, + 0x44, 0x58, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x6c, 0xa8, + 0x11, 0x88, 0xc4, 0x1c, 0xc3, 0x4a, 0x04, 0x71, 0x31, 0x62, 0x70, 0x1c, + 0x21, 0x08, 0x16, 0xfe, 0xb1, 0xa9, 0xc6, 0x30, 0x12, 0x73, 0x0c, 0x42, + 0x70, 0x16, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x1b, 0x6b, + 0x14, 0x24, 0x31, 0xc7, 0x20, 0x04, 0x68, 0x31, 0xc8, 0x10, 0xc8, 0x84, + 0x59, 0x0c, 0x32, 0x04, 0xe5, 0x60, 0x16, 0x7b, 0x18, 0xdc, 0x02, 0x2f, + 0x4c, 0x83, 0x02, 0x60, 0xec, 0x61, 0x80, 0x0b, 0xbd, 0x38, 0x0d, 0x0a, + 0x80, 0x31, 0xc7, 0x80, 0x13, 0x01, 0x5f, 0x0c, 0x32, 0x04, 0x39, 0xe1, + 0x16, 0x16, 0x24, 0xe2, 0x3f, 0xc8, 0x10, 0xec, 0xc4, 0x5b, 0x8c, 0x18, + 0x14, 0x47, 0x08, 0x82, 0x41, 0x96, 0x1b, 0xc7, 0x2c, 0x03, 0x1b, 0x88, + 0x41, 0x30, 0x86, 0x30, 0x84, 0xc6, 0x70, 0x44, 0x00, 0x17, 0x8a, 0x7f, + 0xcc, 0x32, 0x90, 0xc1, 0x18, 0x04, 0x26, 0xc0, 0x85, 0xf8, 0xcf, 0x12, + 0x94, 0xc1, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0xe5, 0x1b, + 0xc3, 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0x05, 0x1e, 0x41, + 0x5c, 0x58, 0x10, 0x17, 0xe2, 0x6f, 0x41, 0x5c, 0x80, 0xff, 0x2c, 0x41, + 0x19, 0x0c, 0x54, 0x00, 0xca, 0x18, 0x08, 0x64, 0x30, 0xc7, 0x30, 0x16, + 0x41, 0x6a, 0x8c, 0x21, 0x30, 0x7e, 0x31, 0x1c, 0x11, 0xe4, 0x85, 0xe2, + 0x1f, 0xb3, 0x0c, 0x67, 0x60, 0x06, 0x81, 0x09, 0x79, 0x21, 0xfe, 0xb3, + 0x04, 0x68, 0x30, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x61, 0x9d, + 0xc7, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xa5, 0x47, + 0xa0, 0x17, 0x16, 0xe8, 0x85, 0xf8, 0x5b, 0xa0, 0x17, 0xe0, 0x3f, 0x4b, + 0x80, 0x06, 0x03, 0x15, 0x80, 0x62, 0x06, 0xc2, 0x19, 0xcc, 0x31, 0x24, + 0x81, 0x69, 0x8c, 0x21, 0x54, 0xa6, 0x31, 0x1c, 0x11, 0x88, 0x86, 0xe2, + 0x1f, 0xb3, 0x0c, 0x6a, 0x90, 0x06, 0x81, 0x09, 0xa2, 0x21, 0xfe, 0xb3, + 0x04, 0x6b, 0x30, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x61, 0xc1, + 0xc7, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xc9, 0x47, + 0x30, 0x1a, 0x16, 0x8c, 0x86, 0xf8, 0x5b, 0x30, 0x1a, 0xe0, 0x3f, 0x4b, + 0xb0, 0x06, 0x03, 0x15, 0x80, 0x92, 0x06, 0x82, 0x1a, 0xcc, 0x31, 0x24, + 0x81, 0x6b, 0x8c, 0x18, 0x20, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x48, 0xf8, + 0x11, 0xdc, 0x45, 0x5d, 0x0c, 0x32, 0x04, 0x79, 0xd1, 0x1a, 0xb3, 0x04, + 0x6c, 0x30, 0x50, 0x11, 0xf8, 0x41, 0x18, 0x08, 0x6b, 0x30, 0xc8, 0x10, + 0xf8, 0xc5, 0x6b, 0xcc, 0x12, 0xb4, 0xc1, 0x40, 0x4b, 0xc0, 0x23, 0x06, + 0x8f, 0x48, 0x3c, 0xf2, 0xc9, 0x02, 0x1b, 0xf0, 0x08, 0x18, 0x0c, 0xb4, + 0x04, 0x28, 0x62, 0xe8, 0x85, 0x64, 0x0e, 0x1f, 0xc1, 0x06, 0xfc, 0x02, + 0x06, 0x83, 0x0c, 0x81, 0x10, 0x1b, 0x19, 0x04, 0xc4, 0x00, 0x00, 0x00, + 0x00, 0x12, 0x00, 0x00, 0x00, 0x5b, 0x86, 0x20, 0x78, 0x87, 0x2d, 0x83, + 0x11, 0xc0, 0xc3, 0x96, 0x21, 0x0b, 0xe2, 0x61, 0xcb, 0xe0, 0x05, 0xf2, + 0xb0, 0x65, 0x00, 0x83, 0x60, 0x1e, 0xb6, 0x0c, 0x69, 0x10, 0xb8, 0xc3, + 0x96, 0xc1, 0x0d, 0x02, 0x7a, 0xd8, 0x32, 0xd4, 0x41, 0x50, 0x0f, 0x5b, + 0x86, 0x3b, 0x08, 0xe8, 0x61, 0xcb, 0xb0, 0x0e, 0x41, 0x3d, 0x6c, 0x19, + 0xda, 0x21, 0xa0, 0x87, 0x2d, 0x43, 0x5a, 0x04, 0xf5, 0xb0, 0x65, 0x58, + 0x8b, 0x80, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x73, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, + 0x00, 0x25, 0x00, 0x00, 0x00, 0x54, 0xce, 0x00, 0xd0, 0x5a, 0x02, 0x45, + 0x40, 0xef, 0x58, 0x03, 0x10, 0x08, 0x23, 0x00, 0x34, 0xcf, 0x41, 0x40, + 0x4e, 0xc3, 0x06, 0x04, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, + 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, 0x23, 0x00, 0x14, 0xcc, 0x00, 0xcc, + 0x00, 0x50, 0x31, 0x03, 0x30, 0xd6, 0xc0, 0xb2, 0x67, 0x28, 0x7f, 0xa8, + 0x5f, 0xc6, 0xea, 0x97, 0x9f, 0xba, 0x38, 0x7b, 0x63, 0x0d, 0x7a, 0x0d, + 0xee, 0xb8, 0xa7, 0xe2, 0xb9, 0x6d, 0x7f, 0x6f, 0x9f, 0xd2, 0xa3, 0x37, + 0xd6, 0xb0, 0xce, 0x31, 0x8b, 0x7a, 0x69, 0x08, 0xa3, 0xbb, 0x77, 0xb7, + 0xb1, 0x6a, 0x7f, 0x63, 0x0d, 0x62, 0x2e, 0xa6, 0xfd, 0x07, 0x96, 0x3c, + 0x1b, 0xff, 0xc2, 0x98, 0xae, 0x6a, 0xee, 0x0b, 0x63, 0x0d, 0xff, 0x4c, + 0xfa, 0xbf, 0x2f, 0xd0, 0x35, 0x28, 0xe6, 0x5f, 0x0b, 0xc7, 0x31, 0xe8, + 0x0b, 0x63, 0x0d, 0x73, 0xdf, 0xa6, 0xa9, 0x2f, 0xb4, 0x6e, 0xc8, 0xf3, + 0xbe, 0xc0, 0xe7, 0xac, 0x8f, 0x7f, 0x00, 0x00, 0x00, 0x83, 0x0c, 0xd7, + 0xd1, 0x0c, 0x47, 0x58, 0x4d, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0xcc, + 0x31, 0x24, 0x96, 0x18, 0x0c, 0x32, 0x04, 0x4a, 0x64, 0xc1, 0x26, 0xfe, + 0x83, 0x0c, 0x01, 0x23, 0xcd, 0x12, 0x24, 0xc3, 0x11, 0x5b, 0x14, 0xf8, + 0xc7, 0x2c, 0xc3, 0x90, 0x04, 0xc3, 0x11, 0x9d, 0x14, 0xf8, 0xc7, 0x2c, + 0x03, 0x51, 0x04, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x1b, + 0x28, 0x7c, 0xce, 0x1c, 0x43, 0x14, 0xa4, 0xc1, 0x88, 0xc1, 0x71, 0x84, + 0x20, 0x58, 0xf8, 0xc7, 0x26, 0x0a, 0x61, 0xf0, 0xcc, 0x31, 0x08, 0x01, + 0x37, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0xb1, 0x91, 0xc2, 0x18, + 0x40, 0x73, 0x0c, 0x42, 0xd0, 0xcd, 0x12, 0x14, 0x03, 0x15, 0x81, 0x40, + 0x70, 0xc3, 0x18, 0x42, 0xf0, 0x06, 0x63, 0x08, 0x42, 0x18, 0x8c, 0x21, + 0x0c, 0x61, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xa1, + 0x82, 0x10, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x50, 0xa9, + 0x40, 0x04, 0xc3, 0x11, 0x81, 0x27, 0xf8, 0xc7, 0x2c, 0x83, 0x71, 0x04, + 0x83, 0x0c, 0x87, 0x47, 0x06, 0x36, 0xa8, 0x81, 0xf8, 0x5b, 0x30, 0x06, + 0xe0, 0x6f, 0xc5, 0x1a, 0x88, 0xbf, 0x05, 0x65, 0x00, 0xfe, 0x36, 0x04, + 0xe4, 0x3f, 0xc7, 0x20, 0x06, 0xc1, 0x1e, 0x0c, 0x32, 0x04, 0x63, 0xa0, + 0x06, 0x16, 0x20, 0xe2, 0x3f, 0xc8, 0x10, 0x94, 0xc1, 0x1a, 0xcc, 0x12, + 0x1c, 0x03, 0x15, 0x81, 0x60, 0x88, 0x41, 0x31, 0xcb, 0x80, 0x24, 0xd9, + 0x20, 0x43, 0x90, 0x06, 0x6f, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, + 0xfe, 0xb1, 0xe5, 0x42, 0x40, 0x06, 0x73, 0x0c, 0x6a, 0x10, 0x88, 0xc2, + 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0xb6, 0x0b, 0x43, 0x19, + 0xcc, 0x31, 0x08, 0x41, 0x1d, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, + 0x7f, 0x6c, 0xbd, 0x50, 0x98, 0xc1, 0x1c, 0x83, 0x10, 0xd8, 0xc1, 0x2c, + 0x41, 0x32, 0x50, 0x12, 0x90, 0x42, 0xe0, 0x0a, 0x82, 0x80, 0x40, 0xc7, + 0x20, 0x43, 0x10, 0x07, 0x77, 0x90, 0x01, 0x00, 0x00, 0x71, 0x20, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xd2, + 0x09, 0x18, 0xd0, 0xba, 0x80, 0x07, 0xed, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x65, 0x0c, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, + 0x30, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x01, 0x00, + 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x27, 0x01, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x00, 0x00, 0x49, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x5d, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x6d, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x16, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x94, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xa1, 0x00, 0x00, + 0x00, 0x19, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x00, 0x00, 0xba, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xcb, 0x00, 0x00, + 0x00, 0x12, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xdd, 0x00, 0x00, + 0x00, 0x13, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x13, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x03, 0x01, 0x00, + 0x00, 0x1b, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, + 0xa6, 0x02, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x4e, 0x56, 0x31, + 0x32, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x5a, + 0x31, 0x34, 0x47, 0x65, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, + 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x52, 0x55, 0x31, + 0x31, 0x4d, 0x54, 0x4c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x4b, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, + 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x33, 0x66, + 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, + 0x6f, 0x77, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, + 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, 0x66, 0x33, 0x32, 0x61, + 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x2e, 0x75, + 0x2e, 0x69, 0x31, 0x2e, 0x66, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, + 0x2e, 0x64, 0x6f, 0x74, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x5f, 0x5a, + 0x31, 0x32, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x54, 0x6f, 0x6e, 0x65, 0x6d, + 0x61, 0x70, 0x44, 0x76, 0x33, 0x5f, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, + 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78, + 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, + 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, + 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, + 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, + 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, + 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x32, 0x64, 0x2e, 0x76, 0x34, + 0x66, 0x33, 0x32, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, + 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, + 0x69, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, + 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -const unsigned int sdl_metallib_len = 29249; +const unsigned int sdl_metallib_len = 37821; diff --git a/libs/SDL3/src/render/metal/SDL_shaders_metal_macos.h b/libs/SDL3/src/render/metal/SDL_shaders_metal_macos.h index 18fede76..e3c4230a 100644 --- a/libs/SDL3/src/render/metal/SDL_shaders_metal_macos.h +++ b/libs/SDL3/src/render/metal/SDL_shaders_metal_macos.h @@ -1,28 +1,28 @@ const unsigned char sdl_metallib[] = { 0x4d, 0x54, 0x4c, 0x42, 0x01, 0x80, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x59, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x85, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe9, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x5a, 0x00, 0x00, + 0xe5, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, - 0x58, 0x8d, 0x80, 0x95, 0xd5, 0x8c, 0x63, 0x39, 0x1a, 0x22, 0x70, 0xbe, - 0xde, 0x4b, 0xc5, 0xfa, 0xc8, 0x80, 0x4f, 0xb4, 0x9a, 0xa9, 0x91, 0xa5, - 0xa8, 0x70, 0x3f, 0x3b, 0x8d, 0x4f, 0xed, 0x3e, 0x4f, 0x46, 0x46, 0x54, + 0x50, 0x0f, 0x81, 0xd3, 0x48, 0x9a, 0xd9, 0x04, 0x20, 0xa9, 0x3e, 0x02, + 0x8a, 0x68, 0xb0, 0x30, 0x34, 0x06, 0x99, 0x69, 0x0c, 0x03, 0x74, 0x35, + 0xb5, 0x66, 0x90, 0x7b, 0x6c, 0x3a, 0x14, 0x62, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x77, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54, 0x59, - 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0xc1, - 0x3d, 0x75, 0xc0, 0x60, 0x46, 0x35, 0x6f, 0x59, 0x08, 0x6b, 0xb1, 0xfb, - 0xff, 0xc4, 0x9c, 0x22, 0xcc, 0xf5, 0x40, 0xff, 0x45, 0x94, 0x08, 0x17, - 0xf7, 0x3c, 0x1c, 0x78, 0x35, 0x00, 0xbe, 0x4f, 0x46, 0x46, 0x54, 0x18, + 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0xf0, + 0x2e, 0x14, 0xc5, 0xee, 0x9f, 0xd5, 0xcc, 0x21, 0x55, 0xa5, 0x5b, 0xe0, + 0x3c, 0xdf, 0x01, 0x52, 0xa7, 0x30, 0x4a, 0x99, 0xd1, 0xa8, 0x5f, 0x13, + 0xe2, 0xf0, 0x62, 0x6a, 0x80, 0x37, 0xb7, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, @@ -30,9 +30,9 @@ const unsigned char sdl_metallib[] = { 0x41, 0x4d, 0x45, 0x13, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, - 0x00, 0x50, 0x65, 0x68, 0xbf, 0xb6, 0x08, 0x5e, 0xe6, 0x24, 0xbd, 0x32, - 0x76, 0xff, 0x45, 0xed, 0x78, 0x8c, 0x7f, 0xb1, 0x95, 0x86, 0x73, 0x75, - 0xf8, 0x72, 0x7d, 0x39, 0x31, 0xf2, 0xa8, 0x3c, 0x26, 0x4f, 0x46, 0x46, + 0x00, 0x74, 0x71, 0x0b, 0x57, 0x4b, 0xa1, 0xa5, 0xee, 0x31, 0x5f, 0xf7, + 0x98, 0x90, 0x9f, 0xc4, 0x0b, 0x72, 0x5f, 0x4b, 0xd5, 0x4b, 0xce, 0x85, + 0x2b, 0x45, 0x6c, 0x7e, 0xdd, 0xa5, 0x54, 0x8e, 0xb0, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, @@ -40,814 +40,51 @@ const unsigned char sdl_metallib[] = { 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, - 0x20, 0x00, 0xb4, 0x91, 0x21, 0x17, 0x4c, 0x5e, 0x6e, 0x46, 0x26, 0xab, - 0x42, 0x76, 0x60, 0xec, 0x03, 0x7e, 0x55, 0x4c, 0x64, 0x47, 0xbb, 0x47, - 0xb1, 0x01, 0x05, 0x04, 0x3f, 0x51, 0x4c, 0x01, 0xae, 0x25, 0x4f, 0x46, + 0x20, 0x00, 0x83, 0x74, 0xe0, 0x68, 0x12, 0xd5, 0x8c, 0xd4, 0x71, 0xdb, + 0xb9, 0x4c, 0x41, 0x85, 0x0e, 0x4d, 0x36, 0xf9, 0x66, 0x8d, 0x70, 0x81, + 0x5b, 0xbb, 0xe9, 0x81, 0x42, 0xc5, 0x56, 0x6f, 0x27, 0xa3, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, - 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x7d, 0x00, - 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x16, 0x00, 0x53, 0x44, 0x4c, 0x5f, - 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, - 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0xf4, 0x48, 0x26, 0x28, 0xf5, - 0xea, 0xcc, 0x0e, 0xa4, 0x20, 0xae, 0x8b, 0xd0, 0x25, 0x30, 0x45, 0x3a, - 0x84, 0x25, 0x0a, 0x8c, 0xd8, 0xd1, 0x6d, 0x48, 0x5b, 0xd0, 0x08, 0xa0, - 0x65, 0x71, 0x40, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x76, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x70, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, - 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, - 0x4e, 0x44, 0x54, 0x78, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, - 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, - 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0xcb, 0xa1, 0x4b, 0x14, 0x4e, - 0xb9, 0xee, 0x29, 0x43, 0x7b, 0xc1, 0x33, 0x36, 0xc2, 0x90, 0x12, 0x64, - 0x7e, 0x31, 0xfb, 0x59, 0x2e, 0x85, 0xd4, 0x41, 0x03, 0x60, 0x39, 0x72, - 0x92, 0x59, 0x39, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x7e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, - 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, - 0x4e, 0x44, 0x54, 0x29, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x15, - 0x00, 0x02, 0x00, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, - 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x56, 0x41, - 0x54, 0x59, 0x04, 0x00, 0x02, 0x00, 0x04, 0x06, 0x45, 0x4e, 0x44, 0x54, - 0x35, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x20, 0x00, 0x03, 0x00, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, - 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x74, 0x65, 0x78, 0x63, 0x6f, - 0x6f, 0x72, 0x64, 0x00, 0x02, 0x80, 0x56, 0x41, 0x54, 0x59, 0x05, 0x00, - 0x03, 0x00, 0x04, 0x06, 0x04, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, - 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, + 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x78, 0x00, + 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, + 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, + 0x20, 0x00, 0x3a, 0x25, 0xd4, 0xcc, 0x66, 0x7c, 0x15, 0x7f, 0xc4, 0x37, + 0x91, 0x2a, 0xc4, 0x81, 0x61, 0xee, 0xdc, 0xcf, 0xd6, 0x25, 0x51, 0xcf, + 0x14, 0x26, 0xf5, 0xe3, 0xb9, 0xd9, 0x21, 0x42, 0x05, 0x8e, 0x4f, 0x46, + 0x46, 0x54, 0x18, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x3c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, + 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x79, 0x00, + 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f, + 0x4e, 0x56, 0x31, 0x32, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, + 0x48, 0x20, 0x00, 0x22, 0x61, 0x99, 0x75, 0x7e, 0x79, 0xc7, 0x29, 0xce, + 0x24, 0x1e, 0x6f, 0x01, 0x62, 0x29, 0x3a, 0x12, 0xe8, 0xf8, 0xd8, 0xa5, + 0xf2, 0x5e, 0x21, 0xb5, 0x28, 0x04, 0xc8, 0xf3, 0x8d, 0x60, 0xfb, 0x4f, + 0x46, 0x46, 0x54, 0x18, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x57, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x29, + 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x15, 0x00, 0x02, 0x00, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x56, 0x41, 0x54, 0x59, 0x04, 0x00, + 0x02, 0x00, 0x04, 0x06, 0x45, 0x4e, 0x44, 0x54, 0x35, 0x00, 0x00, 0x00, + 0x56, 0x41, 0x54, 0x54, 0x20, 0x00, 0x03, 0x00, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x00, 0x01, 0x80, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x00, + 0x02, 0x80, 0x56, 0x41, 0x54, 0x59, 0x05, 0x00, 0x03, 0x00, 0x04, 0x06, + 0x04, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, - 0x00, 0x45, 0x4e, 0x44, 0x54, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0xe8, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xf7, 0x02, 0x00, - 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, - 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, - 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, - 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, - 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, - 0x48, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, - 0x00, 0x51, 0x18, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, - 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, - 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, - 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, - 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, - 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, - 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, - 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, - 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, - 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, - 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, - 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, - 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, - 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, - 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, - 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, - 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, - 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, - 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, - 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, - 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, - 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, - 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, - 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, - 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, - 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, - 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, - 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, - 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, - 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, - 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, - 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, - 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x18, - 0xc2, 0x00, 0x2c, 0x40, 0xb5, 0xc1, 0x18, 0x08, 0x60, 0x01, 0x2a, 0x00, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, - 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, - 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, - 0x60, 0x87, 0x10, 0xc0, 0x30, 0x82, 0x00, 0x24, 0x41, 0x98, 0xc9, 0x9a, - 0x07, 0x7a, 0x90, 0x87, 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, - 0x07, 0x7a, 0x08, 0x07, 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, - 0x07, 0x79, 0x48, 0x07, 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, - 0x28, 0x84, 0x52, 0x88, 0x11, 0x8c, 0xa1, 0x33, 0x10, 0x30, 0x47, 0x00, - 0x06, 0x29, 0xa0, 0xe6, 0x08, 0x40, 0x61, 0x10, 0x21, 0x10, 0x86, 0x11, - 0x08, 0x65, 0x04, 0x00, 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0, - 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, - 0x83, 0x76, 0x08, 0x87, 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80, - 0x03, 0x37, 0x88, 0x83, 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5, - 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, - 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, - 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, - 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, - 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, - 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, - 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, - 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, - 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, - 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, - 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, - 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, - 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, - 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, - 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, - 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, - 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, - 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x41, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0x01, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, - 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x52, 0x25, 0x30, 0x02, - 0x50, 0x80, 0x01, 0x45, 0x50, 0x20, 0x65, 0x50, 0x08, 0x05, 0x41, 0x6c, - 0x04, 0x80, 0xd6, 0x58, 0x82, 0x23, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, - 0x00, 0xe4, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, - 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x86, 0x42, - 0x24, 0xc0, 0xa2, 0x50, 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, - 0xd3, 0x2b, 0x1b, 0x62, 0x28, 0x41, 0x22, 0x28, 0x07, 0xe3, 0x20, 0x08, - 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, - 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, - 0x25, 0x06, 0x26, 0x06, 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, - 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x25, 0x06, 0x26, 0x26, 0x65, - 0x88, 0x90, 0x10, 0x43, 0x0c, 0x25, 0x50, 0x10, 0x45, 0x60, 0xd1, 0x54, - 0x46, 0x17, 0xc6, 0x36, 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, 0x45, 0xe0, - 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, - 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, - 0x26, 0xc6, 0x56, 0x36, 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, - 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x43, 0x84, 0x64, 0x61, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, - 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, - 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x91, - 0xa5, 0xcd, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, 0x58, - 0x9a, 0x9c, 0x0b, 0xdc, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, 0xa3, - 0xb0, 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, - 0x2f, 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, - 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, 0xda, - 0xca, 0x88, 0xc0, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, 0x51, - 0x92, 0x27, 0x81, 0x92, 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, 0x9c, - 0x8b, 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, - 0x1d, 0x1d, 0xad, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32, - 0x94, 0x9a, 0xb1, 0x37, 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, 0xb3, - 0x14, 0x16, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, 0xac, - 0x04, 0x4a, 0xa2, 0x44, 0x4a, 0x2e, 0x3a, 0x61, 0x69, 0x72, 0x2e, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xcc, 0xd8, - 0xde, 0xc2, 0xe8, 0x98, 0xc0, 0xbd, 0xa5, 0xb9, 0xd1, 0x4d, 0xa5, 0xe9, - 0x95, 0x0d, 0x51, 0x92, 0x2c, 0x81, 0x12, 0x2d, 0x91, 0x92, 0x6d, 0x88, - 0x91, 0x50, 0x09, 0x96, 0x70, 0x84, 0xc2, 0xd2, 0xe4, 0x5c, 0xec, 0xca, - 0xe4, 0xe8, 0xca, 0xf0, 0xbe, 0xd2, 0xdc, 0xe0, 0xea, 0xe8, 0x28, 0x85, - 0xa5, 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, 0x85, 0xd1, 0xa5, 0xbd, 0xb9, 0x7d, - 0xa5, 0xb9, 0x91, 0x95, 0xe1, 0xd1, 0x3b, 0x2b, 0x73, 0x2b, 0x93, 0x0b, - 0xa3, 0x2b, 0x23, 0x43, 0xf9, 0xfa, 0x0a, 0x4b, 0x93, 0xfb, 0x82, 0x63, - 0x0b, 0x1b, 0x2b, 0x43, 0x7b, 0x63, 0x23, 0x2b, 0x93, 0xfb, 0xfa, 0x4a, - 0xa1, 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x27, 0x33, 0x84, 0x52, 0x84, 0xc4, - 0x4b, 0x3e, 0x45, 0x50, 0x82, 0x04, 0x0c, 0x12, 0x28, 0x09, 0x83, 0x44, - 0x4a, 0xa6, 0x21, 0x94, 0x12, 0x24, 0x5e, 0xf2, 0x29, 0x81, 0x12, 0x24, - 0x60, 0x90, 0x40, 0x49, 0x94, 0x48, 0xc9, 0x45, 0x25, 0x2c, 0x4d, 0xce, - 0x45, 0xac, 0xce, 0xcc, 0xac, 0x4c, 0x8e, 0x4f, 0x58, 0x9a, 0x9c, 0x8b, - 0x58, 0x9d, 0x99, 0x59, 0x99, 0xdc, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x91, - 0xb0, 0x34, 0x39, 0x17, 0xb9, 0xb2, 0x30, 0x32, 0x46, 0x61, 0x69, 0x72, - 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0xbc, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xe8, - 0xf2, 0xe0, 0xca, 0xbe, 0xc2, 0xd8, 0xd2, 0xce, 0xdc, 0xbe, 0xe6, 0xd2, - 0xf4, 0xca, 0x88, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xd1, 0xe0, 0xd1, 0x50, - 0x81, 0x93, 0x7b, 0x53, 0x2b, 0x1b, 0xa3, 0x4b, 0x7b, 0x73, 0x1b, 0x02, - 0x06, 0x0a, 0x91, 0x90, 0x41, 0x52, 0x06, 0xca, 0x90, 0x7c, 0x0a, 0xa1, - 0x04, 0x89, 0x19, 0x24, 0x67, 0xa0, 0x0c, 0x09, 0x1a, 0x28, 0x45, 0x02, - 0x25, 0x69, 0x90, 0x48, 0x89, 0x1a, 0x30, 0xa1, 0x93, 0x0b, 0x73, 0x9b, - 0x33, 0x7b, 0x93, 0x6b, 0x1b, 0x02, 0x06, 0x8a, 0x91, 0x90, 0x41, 0x52, - 0x06, 0xca, 0x90, 0x7c, 0x8a, 0xa1, 0x04, 0x89, 0x19, 0x24, 0x67, 0xa0, - 0x0c, 0x09, 0x1a, 0x28, 0x45, 0x02, 0x25, 0x69, 0x90, 0x48, 0x09, 0x1b, - 0x0c, 0x41, 0x12, 0x31, 0x48, 0xc6, 0x20, 0x59, 0x83, 0xa4, 0x0d, 0x86, - 0x18, 0x08, 0x90, 0x74, 0x89, 0x1b, 0xf0, 0x79, 0x6b, 0x73, 0x4b, 0x83, - 0x7b, 0xa3, 0x2b, 0x73, 0xa3, 0x03, 0x19, 0x43, 0x0b, 0x93, 0xe3, 0x33, - 0x95, 0xd6, 0x06, 0xc7, 0x56, 0x06, 0x32, 0xb4, 0xb2, 0x02, 0x42, 0x25, - 0x14, 0x14, 0x34, 0x44, 0x48, 0xe2, 0x60, 0x88, 0x91, 0xc0, 0x41, 0x22, - 0x07, 0x4c, 0x32, 0xc4, 0x48, 0xe6, 0x20, 0x99, 0x03, 0x26, 0x19, 0x11, - 0xb1, 0x03, 0x3b, 0xd8, 0x43, 0x3b, 0xb8, 0x41, 0x3b, 0xbc, 0x03, 0x39, - 0xd4, 0x03, 0x3b, 0x94, 0x83, 0x1b, 0x98, 0x03, 0x3b, 0x84, 0xc3, 0x39, - 0xcc, 0xc3, 0x14, 0x21, 0x18, 0x46, 0x28, 0xec, 0xc0, 0x0e, 0xf6, 0xd0, - 0x0e, 0x6e, 0x90, 0x0e, 0xe4, 0x50, 0x0e, 0xee, 0x40, 0x0f, 0x53, 0x82, - 0x62, 0xc4, 0x12, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0f, 0xe5, 0x20, - 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0x53, 0x02, 0x63, 0x04, 0x15, - 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0xc0, 0x0e, 0xe1, 0xe0, 0x0e, 0xe7, 0x50, - 0x0f, 0xe1, 0x70, 0x0e, 0xe5, 0xf0, 0x0b, 0xf6, 0x50, 0x0e, 0xf2, 0x30, - 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x25, 0x40, 0x46, 0x4c, 0xe1, 0x90, - 0x0e, 0xf2, 0xe0, 0x06, 0xe3, 0xf0, 0x0e, 0xed, 0x00, 0x0f, 0xe9, 0xc0, - 0x0e, 0xe5, 0xf0, 0x0b, 0xef, 0x00, 0x0f, 0xf4, 0x90, 0x0e, 0xef, 0xe0, - 0x0e, 0xf3, 0x30, 0x65, 0x50, 0x18, 0x67, 0x84, 0x12, 0x0e, 0xe9, 0x20, - 0x0f, 0x6e, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf4, 0x50, 0x0e, 0xf8, 0x30, - 0x25, 0x78, 0x03, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, - 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, - 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, - 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, - 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, - 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, - 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, - 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, - 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, - 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, - 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, - 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, - 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, - 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, - 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, - 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, - 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, - 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, - 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, - 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, - 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, - 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, - 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, - 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, - 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, - 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, - 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, - 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, - 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, - 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, - 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, - 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, - 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, - 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, - 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, - 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, - 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, - 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, - 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, - 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, - 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, - 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, - 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, - 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, - 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, - 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, - 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, - 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, - 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, - 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, - 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, - 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, - 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, - 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, - 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, - 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb1, - 0x5d, 0xf9, 0xb3, 0xce, 0x82, 0x0c, 0x7f, 0x45, 0x44, 0x13, 0x71, 0x01, - 0x00, 0x61, 0x20, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, - 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0xc6, 0x22, - 0x86, 0x61, 0x18, 0xc6, 0x22, 0x04, 0x41, 0x10, 0xc6, 0x22, 0x82, 0x20, - 0x08, 0x46, 0x00, 0x88, 0x15, 0x41, 0x09, 0x94, 0x01, 0x8d, 0x19, 0x00, - 0x12, 0x33, 0x00, 0x14, 0x66, 0x00, 0x66, 0x00, 0x08, 0x8c, 0x11, 0x80, - 0x20, 0x08, 0xe2, 0x1f, 0x00, 0xe3, 0x11, 0x8d, 0x94, 0x49, 0x14, 0x94, - 0xf1, 0x08, 0x88, 0xda, 0x28, 0x0a, 0xca, 0x20, 0xc3, 0x70, 0x34, 0x26, - 0x04, 0xf2, 0x19, 0x8f, 0xa0, 0xb0, 0xaf, 0xa1, 0xa0, 0x0c, 0x32, 0x1c, - 0x8a, 0x64, 0x42, 0x20, 0x1f, 0x0b, 0x0a, 0xf8, 0x8c, 0x47, 0x64, 0x1d, - 0x19, 0x4c, 0x14, 0x94, 0x41, 0x06, 0xe6, 0xc1, 0x4c, 0x08, 0xe4, 0x63, - 0x45, 0x00, 0x9f, 0xf1, 0x08, 0x4f, 0x0c, 0xd2, 0xc0, 0xa2, 0xa0, 0x0c, - 0x32, 0x44, 0x94, 0x67, 0x42, 0x20, 0x1f, 0x2b, 0x02, 0xf8, 0x8c, 0x47, - 0x88, 0xc1, 0x19, 0xb8, 0x01, 0x47, 0x41, 0x19, 0x64, 0x08, 0x34, 0x30, - 0xb0, 0xa0, 0x92, 0xcf, 0x20, 0xc3, 0xb0, 0x8d, 0x81, 0x05, 0x93, 0x7c, - 0x6c, 0x08, 0xe0, 0x33, 0xc8, 0x60, 0x78, 0x67, 0x60, 0x41, 0x24, 0x1f, - 0x1b, 0x02, 0xf8, 0x0c, 0x32, 0x24, 0x61, 0xb0, 0x06, 0x16, 0x3c, 0xf2, - 0xb1, 0x21, 0x80, 0xcf, 0x78, 0xc4, 0x1b, 0xd0, 0xc1, 0x1e, 0xa0, 0x01, - 0x05, 0x65, 0x90, 0x21, 0x38, 0x83, 0x36, 0xb0, 0x40, 0x0c, 0xe4, 0x33, - 0xc8, 0x30, 0xa0, 0x01, 0x1c, 0x58, 0x00, 0x06, 0xf2, 0x19, 0x64, 0x28, - 0xd4, 0x60, 0x0e, 0x2c, 0xe8, 0xe4, 0x33, 0xc8, 0x70, 0xb0, 0x81, 0x1d, - 0x58, 0xa0, 0xc9, 0x67, 0x90, 0x81, 0x0f, 0xe2, 0xa0, 0x0e, 0x2c, 0x0b, - 0xe4, 0x33, 0xc8, 0xe0, 0x07, 0x73, 0x80, 0x07, 0xe6, 0x04, 0xf2, 0xb1, - 0x64, 0x80, 0x8f, 0x05, 0x0c, 0x7c, 0x2c, 0x48, 0xe0, 0x63, 0x01, 0x02, - 0x1f, 0x0b, 0x0a, 0xf8, 0xcc, 0x36, 0xe4, 0x41, 0x00, 0xcc, 0x36, 0x04, - 0xa5, 0x10, 0xcc, 0x36, 0x04, 0x78, 0x20, 0x64, 0x10, 0x10, 0x03, 0x00, - 0x00, 0x09, 0x00, 0x00, 0x00, 0x5b, 0x86, 0x20, 0xa0, 0x83, 0x2d, 0xc3, - 0x10, 0xd0, 0xc1, 0x96, 0xe1, 0x08, 0xe8, 0x60, 0xcb, 0xc0, 0x04, 0x74, - 0xb0, 0x65, 0x88, 0x02, 0x3a, 0xd8, 0x32, 0x58, 0x01, 0x1d, 0x6c, 0x19, - 0xc6, 0x20, 0xa0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0xf8, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xfb, 0x02, 0x00, - 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, - 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, - 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, - 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, - 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, - 0x48, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, - 0x00, 0x51, 0x18, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, - 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, - 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, - 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, - 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, - 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, - 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, - 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, - 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, - 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, - 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, - 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, - 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, - 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, - 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, - 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, - 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, - 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, - 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, - 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, - 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, - 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, - 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, - 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, - 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, - 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, - 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, - 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, - 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, - 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, - 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, - 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, - 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x18, - 0x02, 0x01, 0x2c, 0x40, 0xb5, 0xc1, 0x18, 0x0a, 0x60, 0x01, 0x2a, 0x00, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, - 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, - 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, - 0x30, 0x8c, 0x20, 0x00, 0x76, 0x08, 0x41, 0x24, 0x41, 0x98, 0xc9, 0x9a, - 0x07, 0x7a, 0x90, 0x87, 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, - 0x07, 0x7a, 0x08, 0x07, 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, - 0x07, 0x79, 0x48, 0x07, 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, - 0x28, 0x84, 0x62, 0x0c, 0x11, 0x84, 0x31, 0x74, 0x06, 0x02, 0xe6, 0x08, - 0xc0, 0x20, 0x05, 0xd4, 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x04, 0xc2, 0x30, - 0x02, 0xa1, 0x8c, 0x00, 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0, - 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, - 0x83, 0x76, 0x08, 0x87, 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80, - 0x03, 0x37, 0x88, 0x83, 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5, - 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, - 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, - 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, - 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, - 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, - 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, - 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, - 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, - 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, - 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, - 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, - 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, - 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, - 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, - 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, - 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, - 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, - 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x41, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0x01, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, - 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x52, 0x25, 0x50, 0x04, - 0x23, 0x00, 0x05, 0x18, 0x50, 0x08, 0x65, 0x50, 0x20, 0x05, 0x41, 0x6c, - 0x04, 0x80, 0xd6, 0x58, 0x82, 0x23, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, - 0x00, 0xea, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, - 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x86, 0x22, - 0x24, 0xc0, 0xa2, 0x50, 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, - 0xd3, 0x2b, 0x1b, 0x62, 0x28, 0x41, 0x22, 0x28, 0x05, 0xe3, 0x20, 0x08, - 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, - 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, - 0x25, 0x06, 0x26, 0x06, 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, - 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x25, 0x06, 0x26, 0x26, 0x65, - 0x88, 0x90, 0x10, 0x43, 0x0c, 0x25, 0x50, 0x10, 0x65, 0x60, 0xd1, 0x54, - 0x46, 0x17, 0xc6, 0x36, 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, 0x65, 0xe0, - 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, - 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, - 0x26, 0xc6, 0x56, 0x36, 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, - 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x43, 0x84, 0x64, 0x61, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, - 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, - 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x91, - 0xa5, 0xcd, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, 0x58, - 0x9a, 0x9c, 0x0b, 0xdc, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, 0xa3, - 0xb0, 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, - 0x2f, 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, - 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, 0xda, - 0xca, 0x88, 0xc0, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, 0x51, - 0x92, 0x27, 0x81, 0x92, 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, 0x9c, - 0x8b, 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, - 0x1d, 0x1d, 0xad, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32, - 0x94, 0x9a, 0xb1, 0x37, 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, 0xb3, - 0x14, 0x16, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, 0xac, - 0x04, 0x4a, 0xa2, 0x44, 0x4a, 0x2e, 0x66, 0x67, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, - 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x34, 0xcc, 0xd8, 0xde, - 0xc2, 0xe8, 0x64, 0x88, 0xd0, 0x95, 0xe1, 0x8d, 0xbd, 0xbd, 0xc9, 0x91, - 0x0d, 0x61, 0x92, 0x2a, 0xc9, 0x12, 0x28, 0xd1, 0x12, 0x29, 0xd9, 0x86, - 0x18, 0x09, 0x95, 0x60, 0x09, 0x47, 0x28, 0x2c, 0x4d, 0xce, 0xc5, 0xae, - 0x4c, 0x8e, 0xae, 0x0c, 0xef, 0x2b, 0xcd, 0x0d, 0xae, 0x8e, 0x8e, 0x52, - 0x58, 0x9a, 0x9c, 0x0b, 0xdb, 0xdb, 0x58, 0x18, 0x5d, 0xda, 0x9b, 0xdb, - 0x57, 0x9a, 0x1b, 0x59, 0x19, 0x1e, 0xbd, 0xb3, 0x32, 0xb7, 0x32, 0xb9, - 0x30, 0xba, 0x32, 0x32, 0x94, 0xaf, 0xaf, 0xb0, 0x34, 0xb9, 0x2f, 0x38, - 0xb6, 0xb0, 0xb1, 0x32, 0xb4, 0x37, 0x36, 0xb2, 0x32, 0xb9, 0xaf, 0xaf, - 0x94, 0x21, 0x94, 0x32, 0x24, 0x5e, 0xf2, 0x29, 0x83, 0x12, 0x24, 0x60, - 0x90, 0x40, 0x89, 0x96, 0x48, 0xc9, 0x34, 0x84, 0x52, 0x82, 0xc4, 0x4b, - 0x3e, 0x25, 0x50, 0x82, 0x04, 0x0c, 0x12, 0x28, 0x89, 0x12, 0x29, 0xb9, - 0x86, 0x50, 0x8a, 0x90, 0x78, 0xc9, 0xa7, 0x08, 0x4a, 0x90, 0x80, 0x41, - 0x02, 0x25, 0x5a, 0x22, 0x25, 0x1b, 0x95, 0xb0, 0x34, 0x39, 0x17, 0xb1, - 0x3a, 0x33, 0xb3, 0x32, 0x39, 0x3e, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x44, 0xc2, 0xd2, - 0xe4, 0x5c, 0xe4, 0xca, 0xc2, 0xc8, 0x18, 0x85, 0xa5, 0xc9, 0xb9, 0x84, - 0xc9, 0x9d, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0xcd, 0xa5, 0xe9, 0x95, - 0xf1, 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, - 0x2b, 0xfb, 0x0a, 0x63, 0x4b, 0x3b, 0x73, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, - 0x23, 0x62, 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x83, 0x47, 0x43, 0x05, 0x4e, - 0xee, 0x4d, 0xad, 0x6c, 0x8c, 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0x18, 0x28, - 0x46, 0x42, 0x06, 0x49, 0x19, 0x28, 0x44, 0xf2, 0x29, 0x82, 0x12, 0x24, - 0x66, 0x90, 0x9c, 0x81, 0x42, 0x24, 0x68, 0xa0, 0x1c, 0x09, 0x94, 0xa4, - 0x41, 0x22, 0x25, 0x6a, 0xc0, 0x84, 0x4e, 0x2e, 0xcc, 0x6d, 0xce, 0xec, - 0x4d, 0xae, 0x6d, 0x08, 0x18, 0x28, 0x45, 0x42, 0x06, 0x49, 0x19, 0x28, - 0x44, 0xf2, 0x29, 0x86, 0x12, 0x24, 0x66, 0x90, 0x9c, 0x81, 0x42, 0x24, - 0x68, 0xa0, 0x1c, 0x09, 0x94, 0xa4, 0x41, 0x22, 0x25, 0x6c, 0x30, 0x44, - 0x49, 0xc2, 0x20, 0x11, 0x83, 0x64, 0x0c, 0x92, 0x35, 0x48, 0xda, 0x60, - 0x88, 0x81, 0x00, 0x49, 0x97, 0xb8, 0x01, 0x9f, 0xb7, 0x36, 0xb7, 0x34, - 0xb8, 0x37, 0xba, 0x32, 0x37, 0x3a, 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, - 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, - 0x42, 0x41, 0x41, 0x43, 0x84, 0x24, 0x0e, 0x86, 0x18, 0x09, 0x1c, 0x24, - 0x72, 0xc0, 0x24, 0x43, 0x8c, 0x64, 0x0e, 0x92, 0x39, 0x60, 0x92, 0x11, - 0x11, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0xb4, 0xc3, 0x3b, 0x90, - 0x43, 0x3d, 0xb0, 0x43, 0x39, 0xb8, 0x81, 0x39, 0xb0, 0x43, 0x38, 0x9c, - 0xc3, 0x3c, 0x4c, 0x11, 0x82, 0x61, 0x84, 0xc2, 0x0e, 0xec, 0x60, 0x0f, - 0xed, 0xe0, 0x06, 0xe9, 0x40, 0x0e, 0xe5, 0xe0, 0x0e, 0xf4, 0x30, 0x25, - 0x28, 0x46, 0x2c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xf6, 0x50, 0x0e, - 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x25, 0x30, 0x46, 0x50, - 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xec, 0x10, 0x0e, 0xee, 0x70, 0x0e, - 0xf5, 0x10, 0x0e, 0xe7, 0x50, 0x0e, 0xbf, 0x60, 0x0f, 0xe5, 0x20, 0x0f, - 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0x53, 0x02, 0x64, 0xc4, 0x14, 0x0e, - 0xe9, 0x20, 0x0f, 0x6e, 0x30, 0x0e, 0xef, 0xd0, 0x0e, 0xf0, 0x90, 0x0e, - 0xec, 0x50, 0x0e, 0xbf, 0xf0, 0x0e, 0xf0, 0x40, 0x0f, 0xe9, 0xf0, 0x0e, - 0xee, 0x30, 0x0f, 0x53, 0x06, 0x85, 0x71, 0x46, 0x28, 0xe1, 0x90, 0x0e, - 0xf2, 0xe0, 0x06, 0xf6, 0x50, 0x0e, 0xf2, 0x40, 0x0f, 0xe5, 0x80, 0x0f, - 0x53, 0x82, 0x37, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, - 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, - 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, - 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, - 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, - 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, - 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, - 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, - 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, - 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, - 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, - 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, - 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, - 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, - 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, - 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, - 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, - 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, - 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, - 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, - 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, - 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, - 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, - 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, - 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, - 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, - 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, - 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, - 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, - 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, - 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, - 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, - 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, - 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, - 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, - 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, - 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, - 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, - 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, - 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, - 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, - 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, - 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, - 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, - 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, - 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, - 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, - 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, - 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, - 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, - 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, - 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, - 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, - 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, - 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, - 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0xf0, 0xb0, - 0x5d, 0xf9, 0x73, 0xce, 0x83, 0xfd, 0x15, 0x11, 0x4d, 0xc4, 0x05, 0x00, - 0x00, 0x61, 0x20, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, - 0x2c, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0xe4, 0xc6, 0x22, - 0x86, 0x61, 0x18, 0xc6, 0x22, 0x04, 0x41, 0x10, 0xc6, 0x22, 0x82, 0x20, - 0x08, 0x46, 0x00, 0x88, 0x95, 0x40, 0x19, 0x14, 0x01, 0x8d, 0x19, 0x00, - 0x12, 0x33, 0x00, 0x14, 0x66, 0x00, 0x66, 0x00, 0x00, 0xe3, 0x11, 0x8c, - 0x84, 0x49, 0x14, 0x94, 0xf1, 0x88, 0x87, 0xd2, 0x28, 0x0a, 0xca, 0x20, - 0xc3, 0x60, 0x30, 0x26, 0x04, 0xf2, 0x19, 0x8f, 0x98, 0x30, 0xaf, 0xa1, - 0xa0, 0x0c, 0x32, 0x1c, 0x49, 0x64, 0x42, 0x20, 0x1f, 0x0b, 0x0a, 0xf8, - 0x8c, 0x47, 0x60, 0xdd, 0x18, 0x40, 0x14, 0x94, 0x41, 0x06, 0xc6, 0xb9, - 0x4c, 0x08, 0xe4, 0x63, 0x45, 0x00, 0x9f, 0xf1, 0x88, 0x4e, 0x0c, 0xd0, - 0xc0, 0xa2, 0xa0, 0x0c, 0x32, 0x44, 0x53, 0x67, 0x42, 0x20, 0x1f, 0x2b, - 0x02, 0xf8, 0x8c, 0x47, 0x84, 0xc1, 0x19, 0xb4, 0x01, 0x47, 0x41, 0x19, - 0x64, 0x08, 0xb2, 0xcf, 0x82, 0x4a, 0x3e, 0x83, 0x0c, 0x83, 0x26, 0x06, - 0x16, 0x4c, 0xf2, 0xb1, 0x21, 0x80, 0xcf, 0x20, 0x83, 0xd1, 0x99, 0x81, - 0x05, 0x91, 0x7c, 0x6c, 0x08, 0xe0, 0x33, 0xc8, 0x90, 0x80, 0x81, 0x1a, - 0x58, 0xf0, 0xc8, 0xc7, 0x86, 0x00, 0x3e, 0xe3, 0x11, 0x6e, 0x40, 0x07, - 0x7a, 0x80, 0x06, 0x14, 0x94, 0x41, 0x86, 0xc0, 0x0c, 0xd8, 0xc0, 0x02, - 0x31, 0x90, 0xcf, 0x20, 0xc3, 0x70, 0x06, 0x6f, 0x60, 0x01, 0x18, 0xc8, - 0x67, 0x90, 0xa1, 0x48, 0x03, 0x39, 0xb0, 0xa0, 0x93, 0xcf, 0x20, 0xc3, - 0xb1, 0x06, 0x75, 0x60, 0x81, 0x26, 0x9f, 0x41, 0x06, 0x3e, 0x78, 0x03, - 0x3a, 0xb0, 0x2c, 0x90, 0xcf, 0x20, 0x83, 0x1f, 0xc4, 0xc1, 0x1d, 0x98, - 0x13, 0xc8, 0xc7, 0x92, 0x01, 0x3e, 0x16, 0x30, 0xf0, 0xb1, 0x20, 0x81, - 0x8f, 0x05, 0x08, 0x7c, 0x2c, 0x28, 0xe0, 0x33, 0xdb, 0x90, 0x07, 0x01, - 0x30, 0xdb, 0x10, 0x94, 0x42, 0x30, 0xdb, 0x10, 0x94, 0x82, 0x90, 0x41, - 0x40, 0x0c, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x5b, 0x86, 0x20, - 0xa0, 0x83, 0x2d, 0xc3, 0x10, 0xd0, 0xc1, 0x96, 0xe1, 0x08, 0xe8, 0x60, - 0xcb, 0xc0, 0x04, 0x74, 0xb0, 0x65, 0x88, 0x02, 0x3a, 0xd8, 0x32, 0x58, - 0x01, 0x1d, 0x6c, 0x19, 0xc6, 0x20, 0xa0, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x98, 0x0b, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, - 0x00, 0xe3, 0x02, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, - 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, - 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, - 0x42, 0x84, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, - 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, - 0x72, 0x24, 0x07, 0xc8, 0x08, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, - 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, 0x00, 0x68, 0x00, 0x00, - 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, - 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, - 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, - 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, - 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, - 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, - 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, - 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, - 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, - 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, - 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, - 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, - 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, - 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, - 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, - 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, - 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, - 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, - 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, - 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, - 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, - 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, - 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, - 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, - 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, - 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, - 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, - 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, - 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, - 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, - 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, - 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, - 0x72, 0x00, 0x36, 0x18, 0xc2, 0x00, 0x2c, 0x40, 0x05, 0x49, 0x18, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x84, 0x40, 0x00, 0x89, 0x20, 0x00, - 0x00, 0x18, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08, 0x09, 0x20, 0x64, 0x85, - 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, 0xe3, 0x84, 0xa1, 0x90, - 0x14, 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, 0x4c, 0x10, 0x3c, 0x33, - 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, 0x67, 0x49, 0x53, 0x44, - 0x09, 0x93, 0xcf, 0x1e, 0xc0, 0x40, 0x44, 0x9c, 0xd3, 0x48, 0x13, 0xd0, - 0x4c, 0x12, 0x42, 0x00, 0x00, 0x00, 0x00, 0x06, 0x11, 0x06, 0xa1, 0x10, - 0x21, 0x41, 0x54, 0x03, 0x01, 0x73, 0x04, 0x60, 0x90, 0x02, 0x38, 0x47, - 0x00, 0x0a, 0x83, 0x08, 0x80, 0x30, 0x8c, 0x30, 0x00, 0xc3, 0x08, 0x04, - 0x32, 0x02, 0x00, 0x00, 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0, - 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, - 0x83, 0x76, 0x08, 0x87, 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80, - 0x03, 0x37, 0x88, 0x83, 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5, - 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, - 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, - 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, - 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, - 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, - 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, - 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, - 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, - 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, - 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, - 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, - 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, - 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, - 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, - 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, - 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, - 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, - 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x31, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0x01, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, - 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xc2, 0x11, 0x80, 0x42, - 0x28, 0x81, 0x22, 0x28, 0x88, 0x02, 0x2a, 0x8c, 0x02, 0x29, 0x94, 0x82, - 0x29, 0x1c, 0xd2, 0xc2, 0x19, 0x01, 0x28, 0x8c, 0x42, 0x28, 0x88, 0x02, - 0x29, 0x94, 0x82, 0xa1, 0x1c, 0x4b, 0x70, 0x04, 0x00, 0x79, 0x18, 0x00, - 0x00, 0x13, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, - 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0x42, - 0x1c, 0x40, 0x42, 0x51, 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, - 0xd3, 0x2b, 0x1b, 0x62, 0x20, 0xc3, 0x21, 0x20, 0x02, 0xe3, 0x20, 0x08, - 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, - 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, - 0x25, 0x06, 0x26, 0x06, 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, - 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x25, 0x06, 0x26, 0x26, 0x65, - 0x88, 0x70, 0x10, 0x43, 0x0c, 0x64, 0x40, 0x0a, 0x24, 0x60, 0xd1, 0x54, - 0x46, 0x17, 0xc6, 0x36, 0x04, 0x39, 0x0e, 0x64, 0x40, 0x06, 0x24, 0xe0, - 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, - 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, - 0x26, 0xc6, 0x56, 0x36, 0x44, 0x38, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, - 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x43, 0x84, 0x63, 0x61, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, - 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, - 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x91, - 0xa5, 0xcd, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x8e, 0x86, 0x51, 0x58, - 0x9a, 0x9c, 0x8b, 0x5c, 0x99, 0x1b, 0x59, 0x99, 0xdc, 0x17, 0x5d, 0x98, - 0xdc, 0x59, 0x19, 0x1d, 0xa3, 0xb0, 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, - 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f, 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, - 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x43, 0x90, 0xe3, 0x41, 0x82, 0x03, 0x3a, - 0xa2, 0x21, 0xc2, 0x21, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x31, 0x93, 0x0b, - 0x3b, 0x6b, 0x2b, 0x73, 0xa3, 0xfb, 0x4a, 0x73, 0x83, 0xab, 0xa3, 0x63, - 0x76, 0x56, 0xe6, 0x56, 0x26, 0x17, 0x46, 0x57, 0x46, 0x86, 0x82, 0x03, - 0xf7, 0x36, 0x97, 0x46, 0x97, 0xf6, 0xe6, 0x46, 0x64, 0x27, 0xf3, 0x65, - 0x96, 0x42, 0x25, 0x2c, 0x4d, 0xce, 0x65, 0xac, 0xcc, 0x8d, 0xae, 0x4c, - 0x8e, 0x4f, 0x58, 0x9a, 0x9c, 0x0b, 0x5c, 0x99, 0xdc, 0x1c, 0x5c, 0xd9, - 0x18, 0x5d, 0x9a, 0x5d, 0x19, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, - 0x32, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x44, 0xe0, 0xde, 0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0x86, 0x48, - 0x48, 0x70, 0x50, 0x47, 0x75, 0x58, 0xc7, 0x75, 0x40, 0x07, 0x76, 0x64, - 0x87, 0x46, 0xeb, 0xac, 0xcc, 0xad, 0x4c, 0x2e, 0x8c, 0xae, 0x8c, 0x0c, - 0xa5, 0x66, 0xec, 0x8d, 0xed, 0x4d, 0x8e, 0xc8, 0x8e, 0xe6, 0xcb, 0x2c, - 0x85, 0xc5, 0xd8, 0x1b, 0xdb, 0x9b, 0xdc, 0x10, 0x09, 0x19, 0x0e, 0xea, - 0xe0, 0x0e, 0xeb, 0xb8, 0x0e, 0xe8, 0x88, 0x8e, 0xec, 0xe8, 0xa8, 0x84, - 0xa5, 0xc9, 0xb9, 0x88, 0xd5, 0x99, 0x99, 0x95, 0xc9, 0xf1, 0x09, 0x4b, - 0x93, 0x73, 0x11, 0xab, 0x33, 0x33, 0x2b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, - 0x2b, 0xa3, 0x14, 0x96, 0x26, 0xe7, 0xc2, 0xf6, 0x36, 0x16, 0x46, 0x97, - 0xf6, 0xe6, 0xf6, 0x95, 0xe6, 0x46, 0x56, 0x86, 0x47, 0x24, 0x2c, 0x4d, - 0xce, 0x45, 0xae, 0x2c, 0x8c, 0x8c, 0x54, 0x58, 0x9a, 0x9c, 0xcb, 0x1c, - 0x9d, 0x5c, 0xdd, 0x18, 0xdd, 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x9a, - 0x9b, 0xd9, 0x1b, 0x0b, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x32, 0x73, 0x63, - 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x64, 0xe8, - 0xca, 0xf0, 0xe8, 0xea, 0xe4, 0xca, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, 0xa8, - 0xa4, 0xb9, 0xc1, 0xd5, 0xd1, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x71, 0x19, - 0x7b, 0x63, 0x7b, 0x93, 0xfb, 0x9a, 0x1b, 0x0b, 0x63, 0x2b, 0xa3, 0x43, - 0xf7, 0xe6, 0x56, 0xd6, 0x16, 0x06, 0xf7, 0xd5, 0x56, 0x46, 0x87, 0xf6, - 0x46, 0xc6, 0x87, 0xee, 0xcd, 0xad, 0xac, 0x2d, 0x0c, 0xee, 0xcb, 0x2c, - 0x6c, 0x8c, 0xee, 0x4d, 0x2e, 0x86, 0x0f, 0xdd, 0x9b, 0x5b, 0x59, 0x5b, - 0x18, 0xdc, 0x97, 0x59, 0xd8, 0x18, 0xdd, 0x9b, 0x9c, 0x0c, 0x9f, 0x39, - 0x32, 0xb9, 0xaf, 0x3b, 0xb4, 0x34, 0xba, 0xb2, 0x2f, 0xb8, 0xb7, 0x34, - 0x37, 0xba, 0x21, 0xb0, 0x80, 0x04, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, - 0x65, 0x80, 0x08, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x66, 0x80, 0x14, - 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x67, 0x80, 0x1c, 0x88, 0x80, 0x04, - 0x07, 0x19, 0x1c, 0x68, 0x80, 0x20, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, - 0x69, 0x80, 0x24, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x6a, 0x80, 0x28, - 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x6b, 0x80, 0x2c, 0x88, 0x80, 0x04, - 0x07, 0x19, 0x1c, 0x6c, 0xc0, 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, - 0xec, 0x8b, 0x2e, 0x0f, 0xae, 0xec, 0x6b, 0x2e, 0x4d, 0xaf, 0x8c, 0x57, - 0x58, 0x9a, 0x9c, 0x4b, 0x98, 0xdc, 0xd9, 0x17, 0x5d, 0x1e, 0x5c, 0xd9, - 0x57, 0x18, 0x5b, 0xda, 0x99, 0xdb, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x9f, - 0x29, 0xb4, 0x30, 0xb2, 0x32, 0xb9, 0xa1, 0x37, 0xb7, 0x39, 0xba, 0x30, - 0x37, 0xba, 0x39, 0x06, 0x63, 0x43, 0xc8, 0x00, 0x21, 0x8e, 0xef, 0x00, - 0x03, 0xc4, 0x38, 0xc2, 0x00, 0x09, 0x90, 0xe1, 0x10, 0x83, 0x63, 0x0c, - 0x8e, 0x36, 0x38, 0xdc, 0x00, 0x31, 0x8e, 0x37, 0x40, 0x84, 0x03, 0x3a, - 0xe0, 0xe0, 0xc8, 0x8e, 0x38, 0x18, 0x62, 0x1c, 0xdb, 0xe1, 0x1d, 0x72, - 0x30, 0xc4, 0x30, 0x80, 0x63, 0x3a, 0xe6, 0x80, 0xd5, 0x97, 0x16, 0xd5, - 0x54, 0x4c, 0xcd, 0x14, 0x5a, 0x18, 0x59, 0x99, 0xdc, 0xd0, 0x9b, 0xdb, - 0x1c, 0x5d, 0x98, 0x1b, 0xdd, 0x1c, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, - 0x37, 0xba, 0x32, 0x37, 0x3a, 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, - 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, - 0x41, 0x41, 0x43, 0x84, 0xe3, 0x0e, 0x86, 0x18, 0x87, 0x1d, 0x1c, 0x78, - 0xa0, 0x34, 0x43, 0x8c, 0x83, 0x0c, 0x8e, 0x3c, 0x50, 0x9a, 0x21, 0x62, - 0x70, 0xd4, 0xc1, 0xa1, 0x07, 0x4a, 0x73, 0xe8, 0x81, 0xf2, 0x1c, 0x7a, - 0xa0, 0x40, 0x87, 0x1e, 0x28, 0xce, 0xa1, 0x07, 0x4a, 0x74, 0xe8, 0x81, - 0x22, 0x1d, 0x7a, 0xa0, 0x4c, 0x87, 0x1e, 0x28, 0xcc, 0x10, 0xe3, 0xd8, - 0x83, 0x43, 0x0f, 0x14, 0x67, 0x44, 0xc4, 0x0e, 0xec, 0x60, 0x0f, 0xed, - 0xe0, 0x06, 0xed, 0xf0, 0x0e, 0xe4, 0x50, 0x0f, 0xec, 0x50, 0x0e, 0x6e, - 0x60, 0x0e, 0xec, 0x10, 0x0e, 0xe7, 0x30, 0x0f, 0x53, 0x84, 0x60, 0x18, - 0xa1, 0xb0, 0x03, 0x3b, 0xd8, 0x43, 0x3b, 0xb8, 0x41, 0x3a, 0x90, 0x43, - 0x39, 0xb8, 0x03, 0x3d, 0x4c, 0x09, 0x8a, 0x11, 0x4b, 0x38, 0xa4, 0x83, - 0x3c, 0xb8, 0x81, 0x3d, 0x94, 0x83, 0x3c, 0xcc, 0x43, 0x3a, 0xbc, 0x83, - 0x3b, 0x4c, 0x09, 0x8c, 0x11, 0x54, 0x38, 0xa4, 0x83, 0x3c, 0xb8, 0x01, - 0x3b, 0x84, 0x83, 0x3b, 0x9c, 0x43, 0x3d, 0x84, 0xc3, 0x39, 0x94, 0xc3, - 0x2f, 0xd8, 0x43, 0x39, 0xc8, 0xc3, 0x3c, 0xa4, 0xc3, 0x3b, 0xb8, 0xc3, - 0x94, 0x00, 0x19, 0x31, 0x85, 0x43, 0x3a, 0xc8, 0x83, 0x1b, 0x8c, 0xc3, - 0x3b, 0xb4, 0x03, 0x3c, 0xa4, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x03, - 0x3c, 0xd0, 0x43, 0x3a, 0xbc, 0x83, 0x3b, 0xcc, 0xc3, 0x94, 0x41, 0x61, - 0x9c, 0x11, 0x4c, 0x38, 0xa4, 0x83, 0x3c, 0xb8, 0x81, 0x39, 0xc8, 0x43, - 0x38, 0x9c, 0x43, 0x3b, 0x94, 0x83, 0x3b, 0xd0, 0xc3, 0x94, 0x80, 0x0e, - 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, - 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, - 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, - 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, - 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, - 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, - 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, - 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, - 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, - 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, - 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, - 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, - 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, - 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, - 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, - 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, - 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, - 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, - 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, - 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, - 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, - 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, - 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, - 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, - 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, - 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, - 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, - 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, - 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, - 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, - 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, - 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, - 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, - 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, - 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, - 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, - 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, - 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, - 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, - 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, - 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, - 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, - 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, - 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, - 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, - 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, - 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, - 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, - 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, - 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, - 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, - 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, - 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, - 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, - 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x20, 0xb1, 0x5d, 0xf9, 0xb3, 0xce, - 0x82, 0x0c, 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34, 0x13, 0x00, 0x00, 0x00, - 0x00, 0x61, 0x20, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, - 0x2c, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xd4, 0x73, 0x10, - 0x41, 0x10, 0x68, 0x84, 0x65, 0x30, 0x03, 0x40, 0x3c, 0x03, 0x40, 0x30, - 0x46, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x00, 0x00, 0x00, 0xe3, 0x0d, 0x06, - 0x44, 0x50, 0x30, 0xe6, 0x18, 0x88, 0xc0, 0x1b, 0x64, 0x08, 0x0a, 0x64, - 0x8e, 0x21, 0x28, 0x10, 0x0b, 0x18, 0xf9, 0x64, 0x10, 0x10, 0x03, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x5b, 0x86, 0x20, 0xe0, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x90, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, - 0xde, 0x21, 0x0c, 0x00, 0x00, 0x61, 0x03, 0x00, 0x00, 0x0b, 0x82, 0x20, + 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, + 0x54, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0xe8, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, + 0xde, 0x21, 0x0c, 0x00, 0x00, 0xf7, 0x02, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, @@ -855,216 +92,165 @@ const unsigned char sdl_metallib[] = { 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x48, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, - 0x00, 0x75, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90, - 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68, + 0x00, 0x6a, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, + 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, + 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, + 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, + 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, + 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, + 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78, + 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70, + 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, + 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, + 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00, + 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, + 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d, + 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d, + 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d, + 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, + 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, - 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, 0x1d, 0xd2, 0xc1, 0x1d, - 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, 0x1d, 0xda, 0xc0, 0x1e, - 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, 0xee, 0x21, 0x1d, - 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, 0xc0, 0x03, 0x60, 0x70, - 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48, - 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90, - 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70, - 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68, - 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, - 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, - 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, - 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d, - 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, - 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98, + 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, + 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, + 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, + 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70, + 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, - 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, - 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, - 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38, - 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78, - 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, - 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, - 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d, - 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, - 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18, - 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18, - 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30, - 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00, - 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c, - 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, - 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0x83, 0x21, 0x10, 0xc0, - 0x02, 0x54, 0x1b, 0x8c, 0xa1, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x10, 0x06, - 0xb0, 0x00, 0xd5, 0x06, 0xa4, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, - 0x00, 0x09, 0xa8, 0x36, 0x18, 0x46, 0x00, 0x2c, 0x40, 0xb5, 0xc1, 0x38, - 0x04, 0x60, 0x01, 0xaa, 0x0d, 0x08, 0xf2, 0xff, 0xff, 0xff, 0xff, 0x03, - 0xc0, 0x00, 0x12, 0x50, 0x01, 0x49, 0x18, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x43, 0x61, 0x1c, 0x13, 0x06, - 0xc4, 0x38, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x28, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, - 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, - 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x60, 0x33, 0x00, 0xc3, 0x08, 0x04, - 0x30, 0x8c, 0x20, 0x00, 0x67, 0x49, 0x53, 0x44, 0x09, 0x93, 0xcf, 0x1e, - 0xc0, 0x40, 0x44, 0x9c, 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x12, 0x42, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x11, 0x06, 0xe1, 0x28, 0x69, 0x8a, 0x28, - 0x61, 0xf2, 0xff, 0x89, 0xb8, 0x26, 0x2a, 0x22, 0x7e, 0x7b, 0xf8, 0xa7, - 0x31, 0x02, 0x60, 0x10, 0xa1, 0x08, 0x2e, 0x92, 0xa6, 0x88, 0x12, 0x26, - 0xff, 0x97, 0x00, 0xe6, 0x59, 0x88, 0xe8, 0x9f, 0xc6, 0x08, 0x80, 0x41, - 0x84, 0x43, 0x28, 0x47, 0x08, 0x41, 0x10, 0x83, 0x28, 0xcd, 0x11, 0x04, - 0x73, 0x04, 0x60, 0x30, 0x8c, 0x20, 0x30, 0x05, 0x09, 0x06, 0x89, 0xd5, - 0x16, 0x20, 0x37, 0x10, 0x90, 0x02, 0x6c, 0x8e, 0x00, 0x14, 0x06, 0x11, - 0x00, 0x61, 0x18, 0x61, 0x60, 0x86, 0x11, 0x06, 0x60, 0x18, 0x81, 0x60, - 0x46, 0x00, 0x00, 0x00, 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0, - 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, - 0x83, 0x76, 0x08, 0x87, 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80, - 0x03, 0x37, 0x88, 0x83, 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5, - 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, - 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, - 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, - 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, - 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, - 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, - 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, - 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, - 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, - 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, - 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, - 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, - 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, - 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, - 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, - 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, - 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, - 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x51, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x3c, 0x40, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x81, 0x00, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, - 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x62, 0x23, 0x00, 0x85, - 0x50, 0x02, 0x45, 0x50, 0x10, 0x05, 0x54, 0x06, 0x85, 0x51, 0x20, 0x85, - 0x52, 0x30, 0x85, 0x53, 0x0a, 0x24, 0x0b, 0x67, 0x04, 0xa0, 0x30, 0x0a, - 0xa1, 0x20, 0x0a, 0xa4, 0x50, 0x0a, 0x86, 0xe2, 0x58, 0x82, 0x23, 0x00, - 0x00, 0x79, 0x18, 0x00, 0x00, 0x5d, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, - 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, - 0xb7, 0x21, 0x06, 0x53, 0x40, 0x40, 0x74, 0x51, 0xb9, 0x1b, 0x43, 0x0b, - 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, 0x30, 0x04, 0x24, 0x30, - 0x03, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, - 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, - 0x06, 0x46, 0x66, 0xc6, 0x25, 0x06, 0x26, 0x06, 0x04, 0xa5, 0xad, 0x8c, - 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x25, - 0x06, 0x26, 0x26, 0x65, 0x88, 0x00, 0x11, 0x43, 0x0c, 0x86, 0x60, 0x0c, - 0x46, 0x60, 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36, 0x04, 0x81, 0x0e, 0x86, - 0x60, 0x08, 0x46, 0xe0, 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, - 0x97, 0xc6, 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, - 0x45, 0x96, 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36, 0x44, 0x80, 0x12, 0x72, - 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, - 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x43, 0x04, 0x68, 0x61, 0x19, 0x84, 0xa5, 0xc9, - 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, - 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, - 0x8d, 0xa1, 0x7d, 0x91, 0xa5, 0xcd, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, - 0xa0, 0x86, 0x51, 0x58, 0x9a, 0x9c, 0x8b, 0x5c, 0x99, 0x1b, 0x59, 0x99, - 0xdc, 0x17, 0x5d, 0x98, 0xdc, 0x59, 0x19, 0x1d, 0xa3, 0xb0, 0x34, 0x39, - 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f, 0xb7, 0xb0, - 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x43, 0x10, 0xe8, - 0x61, 0x04, 0x08, 0x82, 0xa2, 0x21, 0x02, 0x24, 0x91, 0x09, 0x4b, 0x93, - 0x73, 0x81, 0x7b, 0x9b, 0x4b, 0xa3, 0x4b, 0x7b, 0x73, 0xa3, 0x12, 0x96, - 0x26, 0xe7, 0x32, 0x56, 0xe6, 0x46, 0x57, 0x26, 0x47, 0x29, 0x2c, 0x4d, - 0xce, 0xc5, 0xed, 0xed, 0x0b, 0xae, 0x4c, 0x6e, 0x0e, 0xae, 0x6c, 0x8c, - 0x2e, 0xcd, 0xae, 0x8c, 0x4c, 0x58, 0x9a, 0x9c, 0x4b, 0x98, 0xdc, 0xd9, - 0x97, 0x5b, 0x58, 0x5b, 0x19, 0x11, 0xb8, 0xb7, 0xb9, 0x34, 0xba, 0xb4, - 0x37, 0xb7, 0x21, 0x10, 0x23, 0x40, 0x14, 0x54, 0x41, 0x16, 0x04, 0x41, - 0x11, 0x74, 0x41, 0x18, 0xa5, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, - 0xb3, 0xb6, 0x32, 0x37, 0xba, 0xaf, 0x34, 0x37, 0xb8, 0x3a, 0x3a, 0x5a, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, - 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x7c, 0xc2, - 0xd2, 0xe4, 0x5c, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca, 0xc6, 0xe8, 0xd2, - 0xec, 0xca, 0x58, 0x8c, 0xbd, 0xb1, 0xbd, 0xc9, 0x0d, 0x91, 0x18, 0x02, - 0xd2, 0xa0, 0x0d, 0xaa, 0x20, 0x0e, 0x82, 0xa0, 0x08, 0xba, 0xa0, 0x8e, - 0xd9, 0x59, 0x99, 0x5b, 0x99, 0x5c, 0x18, 0x5d, 0x19, 0x19, 0x0a, 0x0e, - 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b, 0x1c, 0x19, 0x91, 0x9d, 0xcc, 0x97, - 0x59, 0x0a, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x22, 0x74, 0x65, - 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x43, 0x24, 0xa6, 0x80, 0x34, 0xe8, - 0x83, 0x2a, 0x88, 0x83, 0x20, 0x08, 0x0c, 0xa0, 0x0b, 0x0a, 0x03, 0x2a, - 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x7c, 0xc2, - 0xd2, 0xe4, 0x5c, 0xc4, 0xea, 0xcc, 0xcc, 0xca, 0xe4, 0xbe, 0xe6, 0xd2, - 0xf4, 0xca, 0x28, 0x85, 0xa5, 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, 0x85, 0xd1, - 0xa5, 0xbd, 0xb9, 0x7d, 0xa5, 0xb9, 0x91, 0x95, 0xe1, 0x11, 0x09, 0x4b, - 0x93, 0x73, 0x91, 0x2b, 0x0b, 0x23, 0x23, 0x15, 0x96, 0x26, 0xe7, 0x32, - 0x47, 0x27, 0x57, 0x37, 0x46, 0xf7, 0x45, 0x97, 0x07, 0x57, 0xf6, 0x95, - 0xe6, 0x66, 0xf6, 0xc6, 0xc2, 0x8c, 0xed, 0x2d, 0x8c, 0x8e, 0xcc, 0xdc, - 0x98, 0xd4, 0x91, 0xd0, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, 0x1d, 0x19, - 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x2f, 0xba, 0x3c, 0xb8, 0x32, - 0x2a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5c, - 0xc6, 0xde, 0xd8, 0xde, 0xe4, 0xbe, 0xe6, 0xc6, 0xc2, 0xd8, 0xca, 0xe8, - 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0xb5, 0x95, 0xd1, 0xa1, - 0xbd, 0x91, 0xf1, 0xa1, 0x7b, 0x73, 0x2b, 0x6b, 0x0b, 0x83, 0xfb, 0x32, - 0x0b, 0x1b, 0xa3, 0x7b, 0x93, 0x8b, 0xe1, 0x43, 0xf7, 0xe6, 0x56, 0xd6, - 0x16, 0x06, 0xf7, 0x65, 0x16, 0x36, 0x46, 0xf7, 0x26, 0x27, 0xc3, 0x67, - 0x8e, 0x4c, 0xee, 0xeb, 0x0e, 0x2d, 0x8d, 0xae, 0xec, 0x0b, 0xee, 0x2d, - 0xcd, 0x8d, 0x6e, 0x08, 0x2c, 0x30, 0x02, 0x33, 0x30, 0x02, 0x84, 0x06, - 0x50, 0x1a, 0x30, 0x03, 0x33, 0x30, 0x02, 0x84, 0x06, 0x90, 0x1a, 0x30, - 0x06, 0x33, 0x30, 0x02, 0x84, 0x06, 0xd0, 0x1a, 0x30, 0x09, 0x33, 0x30, - 0x02, 0x84, 0x06, 0x10, 0x1b, 0x30, 0x0a, 0x33, 0x30, 0x02, 0x84, 0x06, - 0x50, 0x1b, 0x30, 0x0b, 0x33, 0x30, 0x02, 0x84, 0x06, 0x90, 0x1b, 0x30, - 0x0c, 0x33, 0x30, 0x02, 0x84, 0x06, 0xd0, 0x1b, 0x30, 0x0d, 0x33, 0x30, - 0x02, 0x84, 0x06, 0x10, 0x1c, 0x30, 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, - 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0xe3, - 0x15, 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0x45, 0x97, 0x07, 0x57, - 0xf6, 0x15, 0xc6, 0x96, 0x76, 0xe6, 0xf6, 0x35, 0x97, 0xa6, 0x57, 0xc6, - 0x67, 0x0a, 0x2d, 0x8c, 0xac, 0x4c, 0x6e, 0xe8, 0xcd, 0x6d, 0x8e, 0x2e, - 0xcc, 0x8d, 0x6e, 0x8e, 0xc1, 0xd8, 0x10, 0x32, 0x60, 0x10, 0x68, 0x0c, - 0x20, 0x32, 0x60, 0x0e, 0xa8, 0x0c, 0x18, 0x81, 0x21, 0x20, 0x33, 0x80, - 0xce, 0x00, 0x8a, 0x03, 0x48, 0x0e, 0x98, 0x03, 0x9a, 0x03, 0x66, 0x80, - 0x20, 0x88, 0x0e, 0xa0, 0x0b, 0xaa, 0x03, 0x2e, 0x61, 0x69, 0x72, 0x2e, - 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x54, 0xc2, 0xd2, 0xe4, 0x5c, - 0xe6, 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0x88, 0xd1, 0x95, 0xe1, 0xd1, 0xd5, - 0xc9, 0x95, 0xc9, 0x90, 0xf1, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xb1, 0x80, - 0xcc, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xf9, 0x70, 0xa0, 0x2b, 0xc3, 0x1b, - 0x42, 0x31, 0x03, 0x74, 0x07, 0x50, 0x19, 0x30, 0x02, 0x43, 0x40, 0x78, - 0x00, 0x41, 0x50, 0x1e, 0x40, 0x17, 0xa4, 0x07, 0x5c, 0xc2, 0xd2, 0xe4, - 0x5c, 0xe6, 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0xe4, 0x78, 0xcc, 0x85, 0xb5, - 0xc1, 0xb1, 0x95, 0xc9, 0x31, 0x98, 0x1b, 0x22, 0x31, 0x0e, 0xc4, 0x07, - 0x50, 0x19, 0x30, 0x02, 0x43, 0x40, 0x10, 0xd4, 0x07, 0xd0, 0x05, 0xf9, - 0xc1, 0x10, 0x06, 0xca, 0x20, 0x0f, 0x12, 0x03, 0xc8, 0x0e, 0xa0, 0x3d, - 0x80, 0xfe, 0x60, 0x88, 0xa1, 0x00, 0xd0, 0x04, 0x81, 0x02, 0xc7, 0x20, - 0x2c, 0x4d, 0xae, 0x25, 0x8c, 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, 0xec, - 0x0d, 0xae, 0x6c, 0x0e, 0x65, 0x8a, 0x88, 0xe9, 0x6b, 0xe8, 0x0d, 0x2e, - 0xef, 0xcb, 0x4c, 0x2e, 0xec, 0xac, 0xad, 0xcc, 0x8d, 0x2e, 0x65, 0x08, - 0x01, 0x8d, 0x02, 0x24, 0x0a, 0xc4, 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8, - 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a, 0xe8, 0xca, - 0xf0, 0xe8, 0xea, 0xe4, 0xca, 0xe6, 0x86, 0x18, 0x50, 0x29, 0x40, 0xa3, - 0x00, 0x91, 0x02, 0xb1, 0xb0, 0x34, 0xb9, 0x96, 0x30, 0xb6, 0xb4, 0xb0, - 0xb9, 0x96, 0xb9, 0xb1, 0x37, 0xb8, 0xb2, 0x96, 0xb9, 0xb0, 0x36, 0x38, - 0xb6, 0x32, 0xb9, 0xb9, 0x21, 0x06, 0x74, 0x0a, 0xd0, 0x28, 0x40, 0xa6, - 0x30, 0x84, 0x80, 0x4a, 0x01, 0x3a, 0x05, 0x56, 0x5f, 0x5a, 0x54, 0x53, - 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x74, 0x73, 0x7c, 0xde, 0xda, 0xdc, 0xd2, 0xe0, 0xde, - 0xe8, 0xca, 0xdc, 0xe8, 0x40, 0xc6, 0xd0, 0xc2, 0xe4, 0xf8, 0x4c, 0xa5, - 0xb5, 0xc1, 0xb1, 0x95, 0x81, 0x0c, 0xad, 0xac, 0x80, 0x50, 0x09, 0x05, - 0x05, 0x0d, 0x11, 0xa0, 0x55, 0x18, 0x62, 0x40, 0xaa, 0x00, 0xb1, 0x82, - 0x04, 0x0d, 0x31, 0x20, 0x34, 0x80, 0x5a, 0x41, 0x82, 0x86, 0x88, 0x01, - 0x94, 0x0a, 0x90, 0x2b, 0x48, 0x10, 0xe4, 0x0a, 0x92, 0x04, 0xb9, 0x82, - 0x34, 0x41, 0xae, 0x20, 0x45, 0x90, 0x2b, 0x48, 0x14, 0xe4, 0x0a, 0x52, - 0x05, 0xb9, 0x82, 0x64, 0x41, 0xae, 0x20, 0x3d, 0x43, 0x0c, 0xe8, 0x15, - 0x20, 0x57, 0x90, 0xa2, 0x11, 0x11, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, - 0x1b, 0xb4, 0xc3, 0x3b, 0x90, 0x43, 0x3d, 0xb0, 0x43, 0x39, 0xb8, 0x81, - 0x39, 0xb0, 0x43, 0x38, 0x9c, 0xc3, 0x3c, 0x4c, 0x11, 0x82, 0x61, 0x84, - 0xc2, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xe9, 0x40, 0x0e, 0xe5, - 0xe0, 0x0e, 0xf4, 0x30, 0x25, 0x28, 0x46, 0x2c, 0xe1, 0x90, 0x0e, 0xf2, - 0xe0, 0x06, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, - 0x30, 0x25, 0x30, 0x46, 0x50, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xec, - 0x10, 0x0e, 0xee, 0x70, 0x0e, 0xf5, 0x10, 0x0e, 0xe7, 0x50, 0x0e, 0xbf, - 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0x53, - 0x02, 0x64, 0xc4, 0x14, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x30, 0x0e, 0xef, - 0xd0, 0x0e, 0xf0, 0x90, 0x0e, 0xec, 0x50, 0x0e, 0xbf, 0xf0, 0x0e, 0xf0, - 0x40, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x0f, 0x53, 0x06, 0x85, 0x71, - 0x46, 0x30, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe6, 0x20, 0x0f, 0xe1, - 0x70, 0x0e, 0xed, 0x50, 0x0e, 0xee, 0x40, 0x0f, 0x53, 0x82, 0x50, 0x00, + 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d, + 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, + 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58, + 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0, + 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, + 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f, + 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d, + 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, + 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x18, 0xc2, 0x00, 0x2c, 0x40, + 0xb5, 0xc1, 0x18, 0x08, 0x60, 0x01, 0x2a, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, + 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x60, 0x87, 0x10, 0xc0, + 0x30, 0x82, 0x00, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87, + 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07, + 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07, + 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x52, 0x88, + 0x11, 0x8c, 0xa1, 0x33, 0x10, 0x30, 0x47, 0x00, 0x06, 0x29, 0xa0, 0xe6, + 0x08, 0x40, 0x61, 0x10, 0x21, 0x10, 0x86, 0x11, 0x08, 0x65, 0x04, 0x00, + 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, + 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x76, 0x08, 0x87, + 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80, 0x03, 0x37, 0x88, 0x83, + 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, + 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, + 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, + 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, + 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, + 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, + 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, + 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20, + 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, + 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10, + 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, + 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, + 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20, + 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, + 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, + 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50, + 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, + 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40, + 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, + 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x41, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, + 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, + 0x47, 0xc6, 0x04, 0x43, 0x52, 0x25, 0x30, 0x02, 0x50, 0x80, 0x01, 0x45, + 0x50, 0x20, 0x65, 0x50, 0x08, 0x05, 0x41, 0x6c, 0x04, 0x80, 0xd6, 0x58, + 0xc2, 0x23, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xe4, 0x00, 0x00, + 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, + 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x86, 0x42, 0x24, 0xc0, 0xa2, 0x50, + 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, + 0x28, 0x41, 0x22, 0x28, 0x07, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, + 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, + 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x06, + 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, + 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88, 0x90, 0x10, 0x43, + 0x0c, 0x25, 0x50, 0x10, 0x45, 0x60, 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36, + 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, 0x45, 0xe0, 0x16, 0x96, 0x26, 0xe7, + 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6, + 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36, + 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, + 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x64, 0x61, + 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, + 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9, + 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x91, 0xa5, 0xcd, 0x85, 0x89, + 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, 0x58, 0x9a, 0x9c, 0x0b, 0xdc, + 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, 0xa3, 0xb0, 0x34, 0x39, 0x97, + 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f, 0xb7, 0xb0, 0xb6, + 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x64, 0xc2, 0xd2, 0xe4, + 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, 0xda, 0xca, 0x88, 0xc0, 0xbd, + 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, 0x51, 0x92, 0x27, 0x81, 0x92, + 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, 0x9c, 0x8b, 0x5d, 0x99, 0x1c, + 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, 0x1d, 0xad, 0xb3, + 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32, 0x94, 0x9a, 0xb1, 0x37, + 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, 0xb3, 0x14, 0x16, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, 0xac, 0x04, 0x4a, 0xa2, 0x44, + 0x4a, 0x2e, 0x3a, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xcc, 0xd8, 0xde, 0xc2, 0xe8, 0x98, + 0xc0, 0xbd, 0xa5, 0xb9, 0xd1, 0x4d, 0xa5, 0xe9, 0x95, 0x0d, 0x51, 0x92, + 0x2c, 0x81, 0x12, 0x2d, 0x91, 0x92, 0x6d, 0x88, 0x91, 0x50, 0x09, 0x96, + 0x70, 0x84, 0xc2, 0xd2, 0xe4, 0x5c, 0xec, 0xca, 0xe4, 0xe8, 0xca, 0xf0, + 0xbe, 0xd2, 0xdc, 0xe0, 0xea, 0xe8, 0x28, 0x85, 0xa5, 0xc9, 0xb9, 0xb0, + 0xbd, 0x8d, 0x85, 0xd1, 0xa5, 0xbd, 0xb9, 0x7d, 0xa5, 0xb9, 0x91, 0x95, + 0xe1, 0xd1, 0x3b, 0x2b, 0x73, 0x2b, 0x93, 0x0b, 0xa3, 0x2b, 0x23, 0x43, + 0xf9, 0xfa, 0x0a, 0x4b, 0x93, 0xfb, 0x82, 0x63, 0x0b, 0x1b, 0x2b, 0x43, + 0x7b, 0x63, 0x23, 0x2b, 0x93, 0xfb, 0xfa, 0x4a, 0xa1, 0x61, 0xc6, 0xf6, + 0x16, 0x46, 0x27, 0x33, 0x84, 0x52, 0x84, 0xc4, 0x4b, 0x3e, 0x45, 0x50, + 0x82, 0x04, 0x0c, 0x12, 0x28, 0x09, 0x83, 0x44, 0x4a, 0xa6, 0x21, 0x94, + 0x12, 0x24, 0x5e, 0xf2, 0x29, 0x81, 0x12, 0x24, 0x60, 0x90, 0x40, 0x49, + 0x94, 0x48, 0xc9, 0x45, 0x25, 0x2c, 0x4d, 0xce, 0x45, 0xac, 0xce, 0xcc, + 0xac, 0x4c, 0x8e, 0x4f, 0x58, 0x9a, 0x9c, 0x8b, 0x58, 0x9d, 0x99, 0x59, + 0x99, 0xdc, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x91, 0xb0, 0x34, 0x39, 0x17, + 0xb9, 0xb2, 0x30, 0x32, 0x46, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0xbc, 0xc2, + 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, 0xbe, + 0xc2, 0xd8, 0xd2, 0xce, 0xdc, 0xbe, 0xe6, 0xd2, 0xf4, 0xca, 0x88, 0x98, + 0xb1, 0xbd, 0x85, 0xd1, 0xd1, 0xe0, 0xd1, 0x50, 0x81, 0x93, 0x7b, 0x53, + 0x2b, 0x1b, 0xa3, 0x4b, 0x7b, 0x73, 0x1b, 0x02, 0x06, 0x0a, 0x91, 0x90, + 0x41, 0x52, 0x06, 0xca, 0x90, 0x7c, 0x0a, 0xa1, 0x04, 0x89, 0x19, 0x24, + 0x67, 0xa0, 0x0c, 0x09, 0x1a, 0x28, 0x45, 0x02, 0x25, 0x69, 0x90, 0x48, + 0x89, 0x1a, 0x30, 0xa1, 0x93, 0x0b, 0x73, 0x9b, 0x33, 0x7b, 0x93, 0x6b, + 0x1b, 0x02, 0x06, 0x8a, 0x91, 0x90, 0x41, 0x52, 0x06, 0xca, 0x90, 0x7c, + 0x8a, 0xa1, 0x04, 0x89, 0x19, 0x24, 0x67, 0xa0, 0x0c, 0x09, 0x1a, 0x28, + 0x45, 0x02, 0x25, 0x69, 0x90, 0x48, 0x09, 0x1b, 0x0c, 0x41, 0x12, 0x31, + 0x48, 0xc6, 0x20, 0x59, 0x83, 0xa4, 0x0d, 0x86, 0x18, 0x08, 0x90, 0x74, + 0x89, 0x1b, 0xf0, 0x79, 0x6b, 0x73, 0x4b, 0x83, 0x7b, 0xa3, 0x2b, 0x73, + 0xa3, 0x03, 0x19, 0x43, 0x0b, 0x93, 0xe3, 0x33, 0x95, 0xd6, 0x06, 0xc7, + 0x56, 0x06, 0x32, 0xb4, 0xb2, 0x02, 0x42, 0x25, 0x14, 0x14, 0x34, 0x44, + 0x48, 0xe2, 0x60, 0x88, 0x91, 0xc0, 0x41, 0x22, 0x07, 0x4c, 0x32, 0xc4, + 0x48, 0xe6, 0x20, 0x99, 0x03, 0x26, 0x19, 0x11, 0xb1, 0x03, 0x3b, 0xd8, + 0x43, 0x3b, 0xb8, 0x41, 0x3b, 0xbc, 0x03, 0x39, 0xd4, 0x03, 0x3b, 0x94, + 0x83, 0x1b, 0x98, 0x03, 0x3b, 0x84, 0xc3, 0x39, 0xcc, 0xc3, 0x14, 0x21, + 0x18, 0x46, 0x28, 0xec, 0xc0, 0x0e, 0xf6, 0xd0, 0x0e, 0x6e, 0x90, 0x0e, + 0xe4, 0x50, 0x0e, 0xee, 0x40, 0x0f, 0x53, 0x82, 0x62, 0xc4, 0x12, 0x0e, + 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, + 0xef, 0xe0, 0x0e, 0x53, 0x02, 0x63, 0x04, 0x15, 0x0e, 0xe9, 0x20, 0x0f, + 0x6e, 0xc0, 0x0e, 0xe1, 0xe0, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x70, 0x0e, + 0xe5, 0xf0, 0x0b, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, + 0xee, 0x30, 0x25, 0x40, 0x46, 0x4c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, + 0xe3, 0xf0, 0x0e, 0xed, 0x00, 0x0f, 0xe9, 0xc0, 0x0e, 0xe5, 0xf0, 0x0b, + 0xef, 0x00, 0x0f, 0xf4, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0xf3, 0x30, 0x65, + 0x50, 0x18, 0x67, 0x84, 0x12, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0f, + 0xe5, 0x20, 0x0f, 0xf4, 0x50, 0x0e, 0xf8, 0x30, 0x25, 0x78, 0x03, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, @@ -1121,277 +307,208 @@ const unsigned char sdl_metallib[] = { 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x06, 0x10, 0xb1, 0x5d, 0xf9, 0x73, 0xce, - 0x83, 0xfd, 0x45, 0x04, 0x18, 0x0c, 0xd1, 0x4c, 0x16, 0xb0, 0x01, 0x48, - 0xe4, 0x4b, 0x00, 0xf3, 0x2c, 0xc4, 0x3f, 0x11, 0xd7, 0x44, 0x45, 0xc4, - 0x6f, 0x0f, 0x7e, 0x85, 0x17, 0xb7, 0x0d, 0x00, 0x00, 0x61, 0x20, 0x00, - 0x00, 0x1f, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x64, 0xc7, 0x22, 0x80, 0x40, 0x38, 0xe6, - 0x20, 0x04, 0xa2, 0x10, 0x03, 0x5a, 0x35, 0x30, 0x02, 0x40, 0x6c, 0x06, - 0x80, 0xda, 0x08, 0x00, 0xd1, 0xb1, 0x06, 0x20, 0x10, 0x46, 0x00, 0xa8, - 0xce, 0x00, 0x50, 0x98, 0x01, 0x20, 0x30, 0x02, 0x00, 0x23, 0x06, 0xca, - 0x10, 0xa0, 0x41, 0xc3, 0x3c, 0x89, 0x81, 0x04, 0xe3, 0x0d, 0x8f, 0x26, - 0x06, 0x14, 0x8c, 0x41, 0x86, 0xa1, 0x40, 0xe6, 0x18, 0x0e, 0x61, 0x0d, - 0x06, 0x19, 0x02, 0x24, 0xb1, 0x60, 0x90, 0xcf, 0x20, 0x43, 0xa0, 0x44, - 0x83, 0x0c, 0x01, 0x32, 0x59, 0x90, 0xc9, 0x27, 0x83, 0x80, 0x18, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x5b, 0x06, 0xe0, 0x40, 0x85, 0x2d, 0x83, - 0x10, 0xc0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb1, 0x5d, 0xf9, 0xb3, 0xce, + 0x82, 0x0c, 0x7f, 0x45, 0x44, 0x13, 0x71, 0x01, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x54, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, + 0x00, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6, + 0x22, 0x04, 0x41, 0x10, 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88, + 0x15, 0x41, 0x09, 0x94, 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14, + 0x66, 0x00, 0x66, 0x00, 0x08, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0x1f, + 0x00, 0xe3, 0x11, 0x8d, 0x94, 0x49, 0x14, 0x94, 0xf1, 0x08, 0x88, 0xda, + 0x28, 0x0a, 0xca, 0x20, 0xc3, 0x70, 0x34, 0x26, 0x04, 0xf2, 0x19, 0x8f, + 0xa0, 0xb0, 0xaf, 0xa1, 0xa0, 0x0c, 0x32, 0x1c, 0x8a, 0x64, 0x42, 0x20, + 0x1f, 0x0b, 0x0a, 0xf8, 0x8c, 0x47, 0x64, 0x1d, 0x19, 0x4c, 0x14, 0x94, + 0x41, 0x06, 0xe6, 0xc1, 0x4c, 0x08, 0xe4, 0x63, 0x45, 0x00, 0x9f, 0xf1, + 0x08, 0x4f, 0x0c, 0xd2, 0xc0, 0xa2, 0xa0, 0x0c, 0x32, 0x44, 0x94, 0x67, + 0x42, 0x20, 0x1f, 0x2b, 0x02, 0xf8, 0x8c, 0x47, 0x88, 0xc1, 0x19, 0xb8, + 0x01, 0x47, 0x41, 0x19, 0x64, 0x08, 0x34, 0x30, 0xb0, 0xa0, 0x92, 0xcf, + 0x20, 0xc3, 0xb0, 0x8d, 0x81, 0x05, 0x93, 0x7c, 0x6c, 0x08, 0xe0, 0x33, + 0xc8, 0x60, 0x78, 0x67, 0x60, 0x41, 0x24, 0x1f, 0x1b, 0x02, 0xf8, 0x0c, + 0x32, 0x24, 0x61, 0xb0, 0x06, 0x16, 0x3c, 0xf2, 0xb1, 0x21, 0x80, 0xcf, + 0x78, 0xc4, 0x1b, 0xd0, 0xc1, 0x1e, 0xa0, 0x01, 0x05, 0x65, 0x90, 0x21, + 0x38, 0x83, 0x36, 0xb0, 0x40, 0x0c, 0xe4, 0x33, 0xc8, 0x30, 0xa0, 0x01, + 0x1c, 0x58, 0x00, 0x06, 0xf2, 0x19, 0x64, 0x28, 0xd4, 0x60, 0x0e, 0x2c, + 0xe8, 0xe4, 0x33, 0xc8, 0x70, 0xb0, 0x81, 0x1d, 0x58, 0xa0, 0xc9, 0x67, + 0x90, 0x81, 0x0f, 0xe2, 0xa0, 0x0e, 0x2c, 0x0b, 0xe4, 0x33, 0xc8, 0xe0, + 0x07, 0x73, 0x80, 0x07, 0xe6, 0x04, 0xf2, 0xb1, 0x64, 0x80, 0x8f, 0x05, + 0x0c, 0x7c, 0x2c, 0x48, 0xe0, 0x63, 0x01, 0x02, 0x1f, 0x0b, 0x0a, 0xf8, + 0xcc, 0x36, 0xe4, 0x41, 0x00, 0xcc, 0x36, 0x04, 0xa5, 0x10, 0xcc, 0x36, + 0x04, 0x78, 0x20, 0x64, 0x10, 0x10, 0x03, 0x00, 0x00, 0x09, 0x00, 0x00, + 0x00, 0x5b, 0x86, 0x20, 0xa0, 0x83, 0x2d, 0xc3, 0x10, 0xd0, 0xc1, 0x96, + 0xe1, 0x08, 0xe8, 0x60, 0xcb, 0xc0, 0x04, 0x74, 0xb0, 0x65, 0x88, 0x02, + 0x3a, 0xd8, 0x32, 0x58, 0x01, 0x1d, 0x6c, 0x19, 0xc6, 0x20, 0xa0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0xd4, 0x17, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, - 0xde, 0x21, 0x0c, 0x00, 0x00, 0xf2, 0x05, 0x00, 0x00, 0x0b, 0x82, 0x20, + 0x00, 0xf8, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, + 0xde, 0x21, 0x0c, 0x00, 0x00, 0xfb, 0x02, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, - 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, - 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, + 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, + 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, - 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8, + 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x48, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, - 0x00, 0x7b, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90, - 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68, + 0x00, 0x6a, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, + 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, + 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, + 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, + 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, + 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, + 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78, + 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70, + 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, + 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, + 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00, + 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, + 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d, + 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d, + 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d, + 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, + 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, - 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, 0x1d, 0xd2, 0xc1, 0x1d, - 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, 0x1d, 0xda, 0xc0, 0x1e, - 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, 0xee, 0x21, 0x1d, - 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, 0xc0, 0x03, 0x60, 0x70, - 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48, - 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90, - 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70, - 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68, - 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, - 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, - 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, - 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d, - 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, - 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98, + 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, + 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, + 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, + 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70, + 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, - 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, - 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, - 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38, - 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78, - 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, - 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, - 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d, - 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, - 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18, - 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18, - 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30, - 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00, - 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c, - 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, - 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0x83, 0x21, 0x10, 0xc0, - 0x02, 0x54, 0x1b, 0x8c, 0xa1, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x10, 0x08, - 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, - 0x00, 0x6a, 0x03, 0x62, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x80, - 0x04, 0x54, 0x1b, 0x8c, 0x23, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x20, 0x02, - 0xb0, 0x00, 0xd5, 0x06, 0x24, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, - 0x00, 0x09, 0xa8, 0x36, 0x18, 0xca, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, - 0x04, 0x50, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x41, 0x31, 0x61, 0x30, 0x0e, - 0x64, 0xc2, 0x90, 0x1c, 0xc8, 0x84, 0x40, 0x01, 0x00, 0x89, 0x20, 0x00, - 0x00, 0x42, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, - 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, - 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xb0, 0xc1, - 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, - 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, - 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, - 0x41, 0x18, 0x46, 0x18, 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, - 0xe4, 0xa1, 0x1e, 0xc6, 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, - 0xc2, 0x81, 0x1d, 0xf4, 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, - 0xd2, 0x01, 0x1f, 0x50, 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, - 0xec, 0xbe, 0x1d, 0x21, 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, - 0x84, 0xa3, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, - 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0xb8, - 0x48, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, - 0x7f, 0x1a, 0x23, 0x00, 0x06, 0x11, 0x18, 0xa1, 0x24, 0x41, 0x10, 0x08, - 0x44, 0xb2, 0x2c, 0x0d, 0x39, 0x85, 0x28, 0x8a, 0xa2, 0x20, 0xa8, 0x0c, - 0x00, 0x00, 0x90, 0x54, 0x04, 0x00, 0x20, 0xaa, 0x0c, 0x40, 0x51, 0x90, - 0x55, 0x86, 0xa2, 0x28, 0x08, 0x2b, 0x42, 0x51, 0x90, 0x36, 0x47, 0x10, - 0xcc, 0x11, 0x80, 0xc1, 0x30, 0x82, 0xd0, 0x15, 0x24, 0x58, 0x1a, 0x81, - 0xf3, 0x38, 0x80, 0xbe, 0x81, 0x80, 0x14, 0xe8, 0xe6, 0x08, 0x40, 0x61, - 0x10, 0x01, 0x10, 0xa6, 0x00, 0x46, 0x00, 0x86, 0x11, 0x86, 0x6e, 0x10, - 0x21, 0x10, 0x06, 0x11, 0x0e, 0x61, 0x10, 0xa1, 0x10, 0x86, 0x11, 0x88, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0, - 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, - 0x83, 0x76, 0x08, 0x87, 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80, - 0x03, 0x37, 0x88, 0x83, 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5, - 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, - 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, - 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, - 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, - 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, - 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, - 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, - 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, - 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, - 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, - 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, - 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, - 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, - 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, - 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, - 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, - 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, - 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x79, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x44, 0x40, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x61, 0x26, 0x20, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x30, 0x15, 0x10, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x98, 0x0b, 0x08, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x21, 0xcc, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x10, 0x26, 0x03, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x08, 0xb3, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x30, 0x84, 0xc9, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, - 0xc2, 0x80, 0x01, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, - 0x20, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, - 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xea, 0x46, 0x00, 0x4a, - 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80, 0x0a, 0x30, 0xa0, 0x0c, - 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, - 0x68, 0x2c, 0x9c, 0x11, 0x80, 0x42, 0x28, 0x88, 0xc2, 0x28, 0x90, 0x42, - 0x29, 0x18, 0x12, 0xc7, 0x12, 0x1c, 0x01, 0x00, 0x00, 0x79, 0x18, 0x00, - 0x00, 0x8e, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, - 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x46, 0xe7, - 0x84, 0x01, 0x20, 0x06, 0x63, 0x40, 0xe5, 0x6e, 0x0c, 0x2d, 0x4c, 0xee, - 0x6b, 0x2e, 0x4d, 0xaf, 0x6c, 0x88, 0xd1, 0x2d, 0x61, 0x20, 0x74, 0x0c, - 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, 0x8c, - 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, 0x06, - 0x46, 0x66, 0xc6, 0x25, 0x06, 0x26, 0x06, 0x04, 0xa5, 0xad, 0x8c, 0x2e, - 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x25, 0x06, - 0x26, 0x26, 0x65, 0x88, 0x10, 0x06, 0xc4, 0x10, 0xa3, 0x5b, 0xba, 0xa7, - 0x53, 0x58, 0x34, 0x95, 0xd1, 0x85, 0xb1, 0x0d, 0x41, 0xc2, 0xe0, 0xe8, - 0x96, 0x6e, 0xe9, 0x14, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, - 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x30, 0x48, - 0xc8, 0x85, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, - 0xb9, 0x98, 0x85, 0xcd, 0xd1, 0x7d, 0xb5, 0x85, 0xd1, 0xa1, 0x7d, 0x95, - 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0xc2, 0x60, 0x61, 0x19, 0x84, - 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, - 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, - 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x91, 0xa5, 0xcd, 0x85, 0x89, 0xb1, 0x95, - 0x0d, 0x11, 0xc2, 0xa0, 0x61, 0x14, 0x96, 0x26, 0xe7, 0x22, 0x57, 0xe6, - 0x46, 0x56, 0x26, 0xf7, 0x45, 0x17, 0x26, 0x77, 0x56, 0x46, 0xc7, 0x28, - 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, 0xec, 0x8b, 0x2e, 0x0f, 0xae, 0xec, - 0xcb, 0x2d, 0xac, 0xad, 0x8c, 0x86, 0x19, 0xdb, 0x5b, 0x18, 0x1d, 0xcd, - 0x10, 0x24, 0x0c, 0x9e, 0x4e, 0x09, 0x03, 0x28, 0x0c, 0xa2, 0x21, 0x42, - 0x18, 0x48, 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xde, 0xe6, 0xd2, 0xe8, - 0xd2, 0xde, 0xdc, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0x95, 0xb9, 0xd1, - 0x95, 0xc9, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x71, 0x7b, 0xfb, 0x82, 0x2b, - 0x93, 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3, 0x2b, 0x23, 0x13, 0x96, - 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0xe5, 0x16, 0xd6, 0x56, 0x46, 0x04, - 0xee, 0x6d, 0x2e, 0x8d, 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0xd4, 0x29, 0x61, - 0x40, 0x85, 0x41, 0x15, 0x06, 0x56, 0x18, 0x40, 0x61, 0x10, 0x85, 0xc1, - 0x15, 0x06, 0x18, 0xa5, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, - 0xb6, 0x32, 0x37, 0xba, 0xaf, 0x34, 0x37, 0xb8, 0x3a, 0x3a, 0x5a, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, - 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x7c, 0xc2, 0xd2, - 0xe4, 0x5c, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca, 0xc6, 0xe8, 0xd2, 0xec, - 0xca, 0x58, 0x8c, 0xbd, 0xb1, 0xbd, 0xc9, 0x0d, 0x91, 0xba, 0x25, 0x0c, - 0xb4, 0x30, 0xd8, 0xc2, 0xa0, 0x0a, 0x03, 0x2e, 0x0c, 0xa0, 0x30, 0x88, - 0xc2, 0xe0, 0x0a, 0x83, 0x8e, 0xd9, 0x59, 0x99, 0x5b, 0x99, 0x5c, 0x18, - 0x5d, 0x19, 0x19, 0x0a, 0x0e, 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b, 0x1c, - 0x19, 0x91, 0x9d, 0xcc, 0x97, 0x59, 0x0a, 0x0d, 0x33, 0xb6, 0xb7, 0x30, - 0x3a, 0x19, 0x22, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x43, - 0xa4, 0xce, 0x09, 0x03, 0x2d, 0x0c, 0xbe, 0x30, 0xa8, 0xc2, 0x80, 0x0b, - 0x03, 0x28, 0x0c, 0xc0, 0x20, 0x0c, 0xae, 0x30, 0x08, 0x03, 0x2a, 0x61, - 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x7c, 0xc2, 0xd2, - 0xe4, 0x5c, 0xc4, 0xea, 0xcc, 0xcc, 0xca, 0xe4, 0xbe, 0xe6, 0xd2, 0xf4, - 0xca, 0x28, 0x85, 0xa5, 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, 0x85, 0xd1, 0xa5, - 0xbd, 0xb9, 0x7d, 0xa5, 0xb9, 0x91, 0x95, 0xe1, 0x11, 0x09, 0x4b, 0x93, - 0x73, 0x91, 0x2b, 0x0b, 0x23, 0x23, 0x15, 0x96, 0x26, 0xe7, 0x32, 0x47, - 0x27, 0x57, 0x37, 0x46, 0xf7, 0x45, 0x97, 0x07, 0x57, 0xf6, 0x95, 0xe6, - 0x66, 0xf6, 0xc6, 0xc2, 0x8c, 0xed, 0x2d, 0x8c, 0x8e, 0xcc, 0xdc, 0x98, - 0xd4, 0x91, 0xd0, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, 0x1d, 0x19, 0xba, - 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x2f, 0xba, 0x3c, 0xb8, 0x32, 0x2a, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5c, 0xc6, - 0xde, 0xd8, 0xde, 0xe4, 0xbe, 0xe6, 0xc6, 0xc2, 0xd8, 0xca, 0xe8, 0xd0, - 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0xb5, 0x95, 0xd1, 0xa1, 0xbd, - 0x91, 0xf1, 0xa1, 0x7b, 0x73, 0x2b, 0x6b, 0x0b, 0x83, 0xfb, 0x32, 0x0b, - 0x1b, 0xa3, 0x7b, 0x93, 0x8b, 0xe1, 0x43, 0xf7, 0xe6, 0x56, 0xd6, 0x16, - 0x06, 0xf7, 0x65, 0x16, 0x36, 0x46, 0xf7, 0x26, 0x27, 0xc3, 0x67, 0x8e, - 0x4c, 0xee, 0xeb, 0x0e, 0x2d, 0x8d, 0xae, 0xec, 0x0b, 0xee, 0x2d, 0xcd, - 0x8d, 0x6e, 0x08, 0x2c, 0x74, 0x4a, 0xc7, 0x74, 0x4a, 0x18, 0xa0, 0x41, - 0x18, 0xa4, 0x41, 0xc7, 0x74, 0x4c, 0xa7, 0x84, 0x01, 0x1a, 0x84, 0x81, - 0x1a, 0x74, 0x4f, 0xc7, 0x74, 0x4a, 0x18, 0xa0, 0x41, 0x18, 0xac, 0x41, - 0x37, 0x75, 0x4c, 0xa7, 0x84, 0x01, 0x1a, 0x84, 0x01, 0x1b, 0x74, 0x4d, - 0xc7, 0x74, 0x4a, 0x18, 0xa0, 0x41, 0x18, 0xb4, 0x41, 0x47, 0x75, 0x4c, - 0xa7, 0x84, 0x01, 0x1a, 0x84, 0x81, 0x1b, 0x74, 0x55, 0xc7, 0x74, 0x4a, - 0x18, 0xa0, 0x41, 0x18, 0xbc, 0x41, 0x67, 0x75, 0x4c, 0xa7, 0x84, 0x01, - 0x1a, 0x84, 0x01, 0x1c, 0x30, 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, 0x3b, - 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0xe3, 0x15, - 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0x45, 0x97, 0x07, 0x57, 0xf6, - 0x15, 0xc6, 0x96, 0x76, 0xe6, 0xf6, 0x35, 0x97, 0xa6, 0x57, 0xc6, 0x67, - 0x0a, 0x2d, 0x8c, 0xac, 0x4c, 0x6e, 0xe8, 0xcd, 0x6d, 0x8e, 0x2e, 0xcc, - 0x8d, 0x6e, 0x8e, 0xc1, 0xd8, 0x10, 0x32, 0xe8, 0xa4, 0x30, 0x18, 0x83, - 0x30, 0x20, 0x83, 0x0e, 0x0a, 0x83, 0x32, 0xe8, 0x94, 0x6e, 0x09, 0x03, - 0x33, 0x08, 0x83, 0x33, 0x08, 0x83, 0x38, 0x08, 0x03, 0x39, 0xe8, 0xa0, - 0x30, 0x98, 0x83, 0x8e, 0x09, 0x03, 0x28, 0x0c, 0xe8, 0x20, 0x0c, 0xae, - 0x30, 0xa8, 0x03, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x34, 0xde, - 0xcc, 0xcc, 0xe6, 0xca, 0xe8, 0x88, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xcd, - 0xe0, 0xcd, 0xd0, 0x68, 0x0b, 0xa3, 0x93, 0x4b, 0xc3, 0x1b, 0x42, 0x75, - 0x4a, 0xd7, 0x74, 0x4a, 0x18, 0xdc, 0x41, 0x18, 0xe0, 0x41, 0xd7, 0x74, - 0x57, 0xa7, 0x84, 0x41, 0x1e, 0x84, 0x81, 0x1e, 0x30, 0xc9, 0xaa, 0xb2, - 0x22, 0x2a, 0x1b, 0x7b, 0x23, 0x2b, 0xa3, 0x41, 0x56, 0x36, 0xf6, 0x46, - 0x56, 0x36, 0x84, 0x0c, 0x3a, 0x26, 0x0c, 0xc6, 0x20, 0x0c, 0xc8, 0xa0, - 0x8b, 0xc2, 0xa0, 0x0c, 0xba, 0xa5, 0x5b, 0xc2, 0xc0, 0x0c, 0xc2, 0xe0, - 0x0c, 0xc2, 0x60, 0x0f, 0xc2, 0x40, 0x0e, 0xba, 0x28, 0x0c, 0xe6, 0xa0, - 0x6b, 0xc2, 0x00, 0x0a, 0x03, 0x3e, 0x08, 0x83, 0x2b, 0x0c, 0xfa, 0x80, - 0x4b, 0x58, 0x9a, 0x9c, 0x0b, 0x5d, 0x19, 0x1e, 0x5d, 0x9d, 0x5c, 0x19, - 0x95, 0xb0, 0x34, 0x39, 0x97, 0xb9, 0xb0, 0x36, 0x38, 0xb6, 0x32, 0x62, - 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, - 0x24, 0xe8, 0xca, 0xf0, 0x60, 0x86, 0x50, 0x1d, 0x16, 0x06, 0x7f, 0x10, - 0x06, 0x65, 0xd0, 0x29, 0xdd, 0x12, 0x06, 0xa0, 0x10, 0x06, 0x50, 0x18, - 0x84, 0x42, 0x18, 0x5c, 0x61, 0x20, 0x0a, 0x24, 0xe8, 0xca, 0xf0, 0x62, - 0x86, 0x50, 0x5d, 0x16, 0x06, 0x7f, 0x10, 0x06, 0x65, 0xd0, 0x2d, 0xdd, - 0x12, 0x06, 0xa0, 0x10, 0x06, 0x50, 0x18, 0x84, 0x42, 0x18, 0x5c, 0x61, - 0x40, 0x0a, 0x5c, 0xc2, 0xd2, 0xe4, 0x5c, 0xe6, 0xc2, 0xda, 0xe0, 0xd8, - 0xca, 0xe4, 0x78, 0xcc, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0x31, 0x98, - 0x1b, 0x22, 0x75, 0x5a, 0x18, 0x98, 0x42, 0x18, 0x94, 0x41, 0xa7, 0x74, - 0x4b, 0x18, 0x40, 0x61, 0x70, 0x0a, 0x61, 0x70, 0x85, 0x01, 0x2a, 0x0c, - 0x81, 0xc2, 0x20, 0x0b, 0x03, 0x2f, 0x0c, 0xc4, 0x20, 0x0c, 0xec, 0x20, - 0x0c, 0xfc, 0x20, 0x0c, 0x46, 0x21, 0x0c, 0x4a, 0x21, 0x0c, 0x52, 0x61, - 0x88, 0xf1, 0x00, 0x61, 0x30, 0x85, 0x81, 0x2a, 0xb0, 0xfa, 0xd2, 0xa2, - 0x9a, 0x8a, 0xa9, 0x99, 0x42, 0x0b, 0x23, 0x2b, 0x93, 0x1b, 0x7a, 0x73, - 0x9b, 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0xe3, 0xf3, 0xd6, 0xe6, 0x96, 0x06, - 0xf7, 0x46, 0x57, 0xe6, 0x46, 0x07, 0x32, 0x86, 0x16, 0x26, 0xc7, 0x67, - 0x2a, 0xad, 0x0d, 0x8e, 0xad, 0x0c, 0x64, 0x68, 0x65, 0x05, 0x84, 0x4a, - 0x28, 0x28, 0x68, 0x88, 0x10, 0x06, 0xae, 0x30, 0xc4, 0x08, 0x83, 0x56, - 0x08, 0x83, 0x57, 0x18, 0x03, 0x6e, 0x88, 0x11, 0x06, 0x68, 0x10, 0x06, - 0xb0, 0x30, 0x06, 0xdc, 0x10, 0x31, 0x08, 0x03, 0x56, 0x08, 0x83, 0x58, - 0x18, 0x03, 0x2e, 0x0c, 0x62, 0x61, 0x0c, 0xba, 0x30, 0x88, 0x85, 0x31, - 0xf0, 0xc2, 0x20, 0x16, 0xc6, 0xe0, 0x0b, 0x83, 0x58, 0x18, 0x03, 0x30, - 0x08, 0x83, 0x58, 0x18, 0x83, 0x30, 0x08, 0x83, 0x58, 0x18, 0x03, 0x31, - 0x08, 0x83, 0x58, 0x18, 0x83, 0x6d, 0x88, 0x11, 0x06, 0xb2, 0x10, 0x06, - 0xb1, 0x30, 0x06, 0xdd, 0x10, 0x23, 0x0c, 0x64, 0x21, 0x0c, 0x62, 0x61, - 0x0c, 0xbc, 0x21, 0x46, 0x18, 0xc8, 0x42, 0x18, 0xc4, 0xc2, 0x18, 0x6c, - 0x43, 0x8c, 0x30, 0x90, 0x85, 0x30, 0x88, 0x85, 0x31, 0x00, 0x83, 0x21, - 0x46, 0x18, 0xc8, 0x42, 0x18, 0xc4, 0xc2, 0x18, 0x84, 0xc1, 0x10, 0x23, - 0x0c, 0x64, 0x21, 0x0c, 0x62, 0x61, 0x0c, 0xc4, 0x60, 0x88, 0x11, 0x06, - 0xb2, 0x10, 0x06, 0xb1, 0x30, 0x06, 0xdc, 0x10, 0x23, 0x0c, 0x64, 0x21, - 0x0c, 0x62, 0x61, 0x0c, 0xbe, 0x11, 0x11, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, - 0x83, 0x1b, 0xb4, 0xc3, 0x3b, 0x90, 0x43, 0x3d, 0xb0, 0x43, 0x39, 0xb8, - 0x81, 0x39, 0xb0, 0x43, 0x38, 0x9c, 0xc3, 0x3c, 0x4c, 0x11, 0x82, 0x61, - 0x84, 0xc2, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xe9, 0x40, 0x0e, - 0xe5, 0xe0, 0x0e, 0xf4, 0x30, 0x25, 0x28, 0x46, 0x2c, 0xe1, 0x90, 0x0e, - 0xf2, 0xe0, 0x06, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, - 0xee, 0x30, 0x25, 0x30, 0x46, 0x50, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, - 0xec, 0x10, 0x0e, 0xee, 0x70, 0x0e, 0xf5, 0x10, 0x0e, 0xe7, 0x50, 0x0e, - 0xbf, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, - 0x53, 0x02, 0x64, 0xc4, 0x14, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x30, 0x0e, - 0xef, 0xd0, 0x0e, 0xf0, 0x90, 0x0e, 0xec, 0x50, 0x0e, 0xbf, 0xf0, 0x0e, - 0xf0, 0x40, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x0f, 0x53, 0x06, 0x85, - 0x71, 0x46, 0x30, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe6, 0x20, 0x0f, - 0xe1, 0x70, 0x0e, 0xed, 0x50, 0x0e, 0xee, 0x40, 0x0f, 0x53, 0x82, 0x55, + 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d, + 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, + 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58, + 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0, + 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, + 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f, + 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d, + 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, + 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x18, 0x02, 0x01, 0x2c, 0x40, + 0xb5, 0xc1, 0x18, 0x0a, 0x60, 0x01, 0x2a, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, + 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, + 0x76, 0x08, 0x41, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87, + 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07, + 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07, + 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x62, 0x0c, + 0x11, 0x84, 0x31, 0x74, 0x06, 0x02, 0xe6, 0x08, 0xc0, 0x20, 0x05, 0xd4, + 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x04, 0xc2, 0x30, 0x02, 0xa1, 0x8c, 0x00, + 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, + 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x76, 0x08, 0x87, + 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80, 0x03, 0x37, 0x88, 0x83, + 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, + 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, + 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, + 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, + 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, + 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, + 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, + 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20, + 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, + 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10, + 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, + 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, + 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20, + 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, + 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, + 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50, + 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, + 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40, + 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, + 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x41, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, + 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, + 0x47, 0xc6, 0x04, 0x43, 0x52, 0x25, 0x50, 0x04, 0x23, 0x00, 0x05, 0x18, + 0x50, 0x08, 0x65, 0x50, 0x20, 0x05, 0x41, 0x6c, 0x04, 0x80, 0xd6, 0x58, + 0xc2, 0x23, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xea, 0x00, 0x00, + 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, + 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x86, 0x22, 0x24, 0xc0, 0xa2, 0x50, + 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, + 0x28, 0x41, 0x22, 0x28, 0x05, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, + 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, + 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x06, + 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, + 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88, 0x90, 0x10, 0x43, + 0x0c, 0x25, 0x50, 0x10, 0x65, 0x60, 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36, + 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, 0x65, 0xe0, 0x16, 0x96, 0x26, 0xe7, + 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6, + 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36, + 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, + 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x64, 0x61, + 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, + 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9, + 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x91, 0xa5, 0xcd, 0x85, 0x89, + 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, 0x58, 0x9a, 0x9c, 0x0b, 0xdc, + 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, 0xa3, 0xb0, 0x34, 0x39, 0x97, + 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f, 0xb7, 0xb0, 0xb6, + 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x64, 0xc2, 0xd2, 0xe4, + 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, 0xda, 0xca, 0x88, 0xc0, 0xbd, + 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, 0x51, 0x92, 0x27, 0x81, 0x92, + 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, 0x9c, 0x8b, 0x5d, 0x99, 0x1c, + 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, 0x1d, 0xad, 0xb3, + 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32, 0x94, 0x9a, 0xb1, 0x37, + 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, 0xb3, 0x14, 0x16, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, 0xac, 0x04, 0x4a, 0xa2, 0x44, + 0x4a, 0x2e, 0x66, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x44, 0x76, + 0x32, 0x5f, 0x66, 0x29, 0x34, 0xcc, 0xd8, 0xde, 0xc2, 0xe8, 0x64, 0x88, + 0xd0, 0x95, 0xe1, 0x8d, 0xbd, 0xbd, 0xc9, 0x91, 0x0d, 0x61, 0x92, 0x2a, + 0xc9, 0x12, 0x28, 0xd1, 0x12, 0x29, 0xd9, 0x86, 0x18, 0x09, 0x95, 0x60, + 0x09, 0x47, 0x28, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x8e, 0xae, 0x0c, + 0xef, 0x2b, 0xcd, 0x0d, 0xae, 0x8e, 0x8e, 0x52, 0x58, 0x9a, 0x9c, 0x0b, + 0xdb, 0xdb, 0x58, 0x18, 0x5d, 0xda, 0x9b, 0xdb, 0x57, 0x9a, 0x1b, 0x59, + 0x19, 0x1e, 0xbd, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32, + 0x94, 0xaf, 0xaf, 0xb0, 0x34, 0xb9, 0x2f, 0x38, 0xb6, 0xb0, 0xb1, 0x32, + 0xb4, 0x37, 0x36, 0xb2, 0x32, 0xb9, 0xaf, 0xaf, 0x94, 0x21, 0x94, 0x32, + 0x24, 0x5e, 0xf2, 0x29, 0x83, 0x12, 0x24, 0x60, 0x90, 0x40, 0x89, 0x96, + 0x48, 0xc9, 0x34, 0x84, 0x52, 0x82, 0xc4, 0x4b, 0x3e, 0x25, 0x50, 0x82, + 0x04, 0x0c, 0x12, 0x28, 0x89, 0x12, 0x29, 0xb9, 0x86, 0x50, 0x8a, 0x90, + 0x78, 0xc9, 0xa7, 0x08, 0x4a, 0x90, 0x80, 0x41, 0x02, 0x25, 0x5a, 0x22, + 0x25, 0x1b, 0x95, 0xb0, 0x34, 0x39, 0x17, 0xb1, 0x3a, 0x33, 0xb3, 0x32, + 0x39, 0x3e, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x44, 0xc2, 0xd2, 0xe4, 0x5c, 0xe4, 0xca, + 0xc2, 0xc8, 0x18, 0x85, 0xa5, 0xc9, 0xb9, 0x84, 0xc9, 0x9d, 0x7d, 0xd1, + 0xe5, 0xc1, 0x95, 0x7d, 0xcd, 0xa5, 0xe9, 0x95, 0xf1, 0x0a, 0x4b, 0x93, + 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x0a, 0x63, + 0x4b, 0x3b, 0x73, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x23, 0x62, 0xc6, 0xf6, + 0x16, 0x46, 0x47, 0x83, 0x47, 0x43, 0x05, 0x4e, 0xee, 0x4d, 0xad, 0x6c, + 0x8c, 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0x18, 0x28, 0x46, 0x42, 0x06, 0x49, + 0x19, 0x28, 0x44, 0xf2, 0x29, 0x82, 0x12, 0x24, 0x66, 0x90, 0x9c, 0x81, + 0x42, 0x24, 0x68, 0xa0, 0x1c, 0x09, 0x94, 0xa4, 0x41, 0x22, 0x25, 0x6a, + 0xc0, 0x84, 0x4e, 0x2e, 0xcc, 0x6d, 0xce, 0xec, 0x4d, 0xae, 0x6d, 0x08, + 0x18, 0x28, 0x45, 0x42, 0x06, 0x49, 0x19, 0x28, 0x44, 0xf2, 0x29, 0x86, + 0x12, 0x24, 0x66, 0x90, 0x9c, 0x81, 0x42, 0x24, 0x68, 0xa0, 0x1c, 0x09, + 0x94, 0xa4, 0x41, 0x22, 0x25, 0x6c, 0x30, 0x44, 0x49, 0xc2, 0x20, 0x11, + 0x83, 0x64, 0x0c, 0x92, 0x35, 0x48, 0xda, 0x60, 0x88, 0x81, 0x00, 0x49, + 0x97, 0xb8, 0x01, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, 0x37, 0xba, 0x32, + 0x37, 0x3a, 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x43, + 0x84, 0x24, 0x0e, 0x86, 0x18, 0x09, 0x1c, 0x24, 0x72, 0xc0, 0x24, 0x43, + 0x8c, 0x64, 0x0e, 0x92, 0x39, 0x60, 0x92, 0x11, 0x11, 0x3b, 0xb0, 0x83, + 0x3d, 0xb4, 0x83, 0x1b, 0xb4, 0xc3, 0x3b, 0x90, 0x43, 0x3d, 0xb0, 0x43, + 0x39, 0xb8, 0x81, 0x39, 0xb0, 0x43, 0x38, 0x9c, 0xc3, 0x3c, 0x4c, 0x11, + 0x82, 0x61, 0x84, 0xc2, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xe9, + 0x40, 0x0e, 0xe5, 0xe0, 0x0e, 0xf4, 0x30, 0x25, 0x28, 0x46, 0x2c, 0xe1, + 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, + 0xf0, 0x0e, 0xee, 0x30, 0x25, 0x30, 0x46, 0x50, 0xe1, 0x90, 0x0e, 0xf2, + 0xe0, 0x06, 0xec, 0x10, 0x0e, 0xee, 0x70, 0x0e, 0xf5, 0x10, 0x0e, 0xe7, + 0x50, 0x0e, 0xbf, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, + 0xe0, 0x0e, 0x53, 0x02, 0x64, 0xc4, 0x14, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, + 0x30, 0x0e, 0xef, 0xd0, 0x0e, 0xf0, 0x90, 0x0e, 0xec, 0x50, 0x0e, 0xbf, + 0xf0, 0x0e, 0xf0, 0x40, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x0f, 0x53, + 0x06, 0x85, 0x71, 0x46, 0x28, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xf6, + 0x50, 0x0e, 0xf2, 0x40, 0x0f, 0xe5, 0x80, 0x0f, 0x53, 0x82, 0x37, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, @@ -1448,216 +565,296 @@ const unsigned char sdl_metallib[] = { 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x29, 0x00, 0x00, 0x00, 0x46, 0xd0, 0x00, 0x48, 0xe4, 0x0f, 0xce, - 0xe4, 0x57, 0x77, 0x71, 0xdb, 0x96, 0xb0, 0x01, 0x48, 0xe4, 0x4b, 0x00, - 0xf3, 0x2c, 0xc4, 0x3f, 0x11, 0xd7, 0x44, 0x45, 0xc4, 0x6f, 0x0f, 0x7e, - 0x85, 0x17, 0xb7, 0x6d, 0x07, 0x13, 0x80, 0x44, 0x7e, 0x01, 0x48, 0xd3, - 0x5f, 0x00, 0x81, 0xe4, 0x57, 0x77, 0x71, 0xdb, 0x16, 0x40, 0x01, 0x48, - 0xe4, 0x17, 0x80, 0x34, 0xfd, 0xc2, 0x02, 0x30, 0x8f, 0x5f, 0xdd, 0xc5, - 0x6d, 0x9b, 0x00, 0x04, 0x20, 0x91, 0x5f, 0x00, 0xd2, 0xf4, 0x3f, 0x8e, - 0xe5, 0x17, 0xb7, 0x6d, 0x08, 0x13, 0x80, 0x44, 0x7e, 0x01, 0x48, 0xd3, - 0x5f, 0x30, 0xc0, 0xe5, 0x57, 0x77, 0x71, 0xdb, 0x06, 0x50, 0xb1, 0x5d, - 0xf9, 0x6b, 0x43, 0x05, 0x34, 0x02, 0x31, 0xfc, 0x45, 0x04, 0x18, 0x0c, - 0xd1, 0x4c, 0x36, 0x10, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, - 0x10, 0x48, 0x7e, 0x71, 0xdb, 0x56, 0x10, 0x01, 0x48, 0xe4, 0x17, 0x80, - 0x34, 0xfd, 0x05, 0x03, 0x5c, 0x7e, 0x71, 0xdb, 0x66, 0x20, 0x01, 0x48, - 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x8f, 0x63, 0xf9, 0xd5, 0x5d, 0xdc, 0x36, - 0x00, 0x61, 0x20, 0x00, 0x00, 0x28, 0x02, 0x00, 0x00, 0x13, 0x04, 0x79, - 0x10, 0x0b, 0x04, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0xb4, 0x8e, 0x45, - 0x00, 0x81, 0x70, 0xcc, 0x41, 0x28, 0x8b, 0x73, 0x07, 0x74, 0x8e, 0x35, - 0x00, 0x03, 0x31, 0xc7, 0xa0, 0x2c, 0x77, 0x30, 0xc7, 0xa0, 0xdc, 0xc1, - 0x1d, 0x8c, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0x63, 0x11, 0x94, 0x00, - 0x79, 0x63, 0x09, 0x01, 0x30, 0x02, 0x40, 0xdd, 0x0c, 0x00, 0x71, 0x23, - 0x00, 0x35, 0x40, 0xc0, 0x18, 0x01, 0x08, 0x82, 0x20, 0x09, 0x06, 0x14, - 0xcc, 0x00, 0xcc, 0x00, 0xcc, 0x41, 0xcc, 0xc2, 0x2c, 0xcc, 0x82, 0x2e, - 0x8c, 0x45, 0x80, 0x20, 0x08, 0xe2, 0x1f, 0x08, 0x82, 0x20, 0xfe, 0x81, - 0x20, 0x08, 0xe2, 0x1f, 0x08, 0x82, 0x20, 0xfe, 0x8d, 0x45, 0x80, 0x20, - 0x08, 0xe2, 0x1f, 0x00, 0x80, 0x20, 0x08, 0xe2, 0x1f, 0x09, 0x33, 0x00, - 0x54, 0xcc, 0x00, 0x8c, 0x00, 0xcc, 0x00, 0x8c, 0x35, 0x80, 0x20, 0x08, - 0xe2, 0x1f, 0x08, 0x82, 0x20, 0xfe, 0x81, 0x20, 0x08, 0xe2, 0xdf, 0x58, - 0x03, 0xdb, 0xce, 0x3f, 0xe9, 0xb1, 0xed, 0xfc, 0x93, 0x1e, 0xdb, 0xce, - 0x3f, 0xe9, 0x8d, 0x35, 0x80, 0x20, 0xc8, 0xd6, 0xbf, 0x00, 0x82, 0x20, - 0x5b, 0xff, 0x02, 0x08, 0x82, 0x6c, 0xfd, 0x0b, 0x63, 0x0d, 0x20, 0x08, - 0xae, 0x39, 0x18, 0x80, 0x20, 0xb8, 0xe6, 0x60, 0x00, 0x82, 0xe0, 0x9a, - 0x83, 0xc1, 0x58, 0x03, 0x08, 0xd2, 0x6d, 0x0e, 0x06, 0x20, 0x48, 0xb7, - 0x39, 0x18, 0x80, 0x20, 0xdd, 0xe6, 0x60, 0x30, 0xd6, 0xb0, 0x8e, 0x78, - 0xcc, 0x82, 0xc1, 0x3a, 0xe2, 0x31, 0x0b, 0x06, 0xeb, 0x88, 0xc7, 0x2c, - 0x18, 0x8c, 0x35, 0x80, 0x20, 0x8c, 0x87, 0x63, 0x00, 0x82, 0x30, 0x1e, - 0x8e, 0x01, 0x08, 0xc2, 0x78, 0x38, 0x06, 0x63, 0x0d, 0x62, 0x2e, 0xa6, - 0xfd, 0x07, 0x96, 0x3c, 0x1b, 0xff, 0xc2, 0x98, 0xae, 0x6a, 0xee, 0x0b, - 0x63, 0x0d, 0xff, 0x4c, 0xfa, 0xbf, 0x2f, 0xd0, 0x35, 0x28, 0xe6, 0x5f, - 0x0b, 0xc7, 0x31, 0xe8, 0x0b, 0x63, 0x0d, 0x73, 0xdf, 0xa6, 0xa9, 0x2f, - 0xb4, 0x6e, 0xc8, 0xf3, 0xbe, 0xc0, 0xe7, 0xac, 0x8f, 0x7f, 0x04, 0x8c, - 0x11, 0xe8, 0xac, 0x39, 0x87, 0x60, 0x30, 0x46, 0xf0, 0xee, 0x69, 0x79, - 0x7f, 0x63, 0x04, 0x6e, 0x1f, 0x8b, 0xb6, 0x37, 0x46, 0x10, 0xf3, 0x60, - 0x9f, 0x7b, 0x63, 0x04, 0xe6, 0xbd, 0xae, 0xb2, 0x37, 0x03, 0x30, 0x46, - 0x00, 0x82, 0x20, 0x08, 0x82, 0xc1, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, - 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba, 0xf8, 0x37, 0x46, 0x50, 0xab, 0xb5, - 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8, 0xf6, 0x34, 0x18, 0x8c, 0x11, 0xf0, - 0xf0, 0xaa, 0xd3, 0xdd, 0x18, 0x01, 0x08, 0x82, 0x20, 0xfe, 0x8d, 0x00, - 0x00, 0xe3, 0x0d, 0x75, 0x00, 0x0a, 0xb1, 0x40, 0xc1, 0x18, 0x6e, 0x08, - 0x86, 0x60, 0x96, 0xe1, 0x08, 0x82, 0xe1, 0x06, 0xa1, 0x08, 0x66, 0x19, - 0x84, 0x21, 0x18, 0x31, 0x50, 0x88, 0xe0, 0x16, 0xee, 0xa0, 0x0e, 0xf4, - 0xe0, 0x0c, 0xd4, 0x00, 0x0d, 0x8a, 0x59, 0x82, 0x63, 0xb8, 0x81, 0x68, - 0x82, 0x59, 0x06, 0xa2, 0x08, 0x46, 0x0c, 0x14, 0x22, 0xc8, 0x85, 0x3c, - 0xb8, 0x03, 0x3e, 0x48, 0x03, 0x36, 0x50, 0x83, 0x63, 0xc4, 0x40, 0x21, - 0x02, 0x5d, 0xc8, 0x03, 0x3c, 0xe8, 0x03, 0x35, 0x68, 0x83, 0x35, 0x40, - 0x06, 0x19, 0x04, 0x34, 0xa0, 0x83, 0x41, 0x06, 0x41, 0x0d, 0xec, 0x60, - 0x90, 0x41, 0x08, 0xf0, 0xe0, 0xfe, 0x00, 0x5d, 0x0a, 0xca, 0x20, 0x43, - 0xe0, 0x06, 0x77, 0x60, 0x44, 0x00, 0x9f, 0xf1, 0x86, 0x51, 0x78, 0x05, - 0x70, 0xb8, 0x00, 0x5d, 0x0a, 0xca, 0x20, 0x43, 0x30, 0x07, 0x7c, 0x30, - 0x62, 0x50, 0x14, 0xc1, 0x3a, 0x14, 0xc1, 0x78, 0x05, 0x2a, 0xd0, 0x42, - 0x39, 0x98, 0x03, 0x1f, 0x5c, 0x80, 0x2e, 0x05, 0x65, 0x90, 0x21, 0xc0, - 0x83, 0x50, 0x18, 0x31, 0x28, 0x8a, 0x00, 0x1e, 0x94, 0x60, 0xbc, 0xa2, - 0x15, 0x72, 0x41, 0x1d, 0xd6, 0x41, 0x14, 0x2e, 0x40, 0x97, 0x82, 0x32, - 0xc8, 0x10, 0xf4, 0x81, 0x29, 0x8c, 0x18, 0x14, 0x45, 0x50, 0x0f, 0x4f, - 0x30, 0xc7, 0xd0, 0x07, 0x0b, 0x3c, 0xcc, 0x31, 0x04, 0x07, 0x3c, 0xcc, - 0x31, 0x04, 0x83, 0x3b, 0xcc, 0x12, 0x1c, 0xc3, 0x0d, 0x60, 0x30, 0x0a, - 0xc1, 0x2c, 0x83, 0x71, 0x04, 0x23, 0x06, 0x0a, 0x11, 0xd4, 0x43, 0x2d, - 0xcc, 0x02, 0x2e, 0x94, 0x02, 0x2a, 0x98, 0xc2, 0x18, 0x8c, 0x18, 0x28, - 0x44, 0x60, 0x0f, 0xb5, 0x40, 0x0b, 0xb9, 0x60, 0x0a, 0xa9, 0x70, 0x0a, - 0x64, 0x30, 0xc8, 0x10, 0x94, 0xc2, 0x2a, 0x0c, 0x32, 0x0c, 0xa5, 0x10, - 0x0b, 0x83, 0x0c, 0x82, 0x28, 0xcc, 0xc2, 0x20, 0x83, 0x10, 0xd4, 0xc2, - 0xf1, 0x02, 0xba, 0x14, 0x94, 0x41, 0x86, 0x60, 0x15, 0x68, 0xc1, 0x88, - 0x00, 0x3e, 0xe3, 0x0d, 0xe0, 0xc0, 0x0e, 0xfd, 0x70, 0x01, 0xba, 0x14, - 0x94, 0x41, 0x86, 0x00, 0x16, 0x72, 0x61, 0xc4, 0xa0, 0x28, 0x02, 0x94, - 0x28, 0x82, 0xf1, 0x8a, 0x72, 0x88, 0x07, 0x91, 0x18, 0x89, 0x5c, 0xb8, - 0x00, 0x5d, 0x0a, 0xca, 0x20, 0x43, 0x50, 0x0b, 0xbe, 0x30, 0x62, 0x50, - 0x14, 0x41, 0x4b, 0x28, 0xc1, 0x78, 0x85, 0x3a, 0xd8, 0xc3, 0x49, 0xa0, - 0xc4, 0x2f, 0x5c, 0x80, 0x2e, 0x05, 0x65, 0x90, 0x21, 0xd0, 0x85, 0x71, - 0x18, 0x31, 0x28, 0x8a, 0x40, 0x26, 0x9e, 0x60, 0x8e, 0x41, 0x17, 0x96, - 0x96, 0x98, 0x63, 0x08, 0x8e, 0x96, 0x98, 0x63, 0x08, 0x86, 0x95, 0x98, - 0x25, 0x38, 0x06, 0x5a, 0x02, 0x7a, 0x10, 0xf8, 0x80, 0x10, 0x0c, 0xbc, - 0x00, 0xec, 0xa2, 0x18, 0x6f, 0xa0, 0x87, 0x7f, 0x68, 0x09, 0x0a, 0xc6, - 0x70, 0x43, 0x30, 0x0e, 0xc1, 0x2c, 0x03, 0x92, 0x04, 0x83, 0x0c, 0xc4, - 0x38, 0xb0, 0xc3, 0x78, 0x03, 0x3e, 0x8c, 0x44, 0x49, 0x50, 0x30, 0x46, - 0x0c, 0x88, 0x22, 0xd0, 0x89, 0x61, 0xc4, 0xa0, 0x28, 0x02, 0x9e, 0x08, - 0x7a, 0xc1, 0x82, 0x5e, 0x80, 0xcf, 0x88, 0x41, 0x51, 0x04, 0x3c, 0x11, - 0x88, 0x83, 0x0d, 0xbe, 0x20, 0x1f, 0xf3, 0x85, 0x20, 0x3e, 0x36, 0x04, - 0xf4, 0x19, 0x31, 0x20, 0x8a, 0x20, 0x2c, 0x82, 0x11, 0x83, 0xa2, 0x08, - 0xc6, 0x22, 0x00, 0x07, 0x0b, 0xc0, 0x41, 0x3e, 0x73, 0x0c, 0xea, 0xb0, - 0x84, 0xc5, 0x20, 0x43, 0xb0, 0x0e, 0xfb, 0x60, 0x43, 0x40, 0x9f, 0x41, - 0x86, 0xa0, 0x1d, 0x42, 0x62, 0x90, 0x21, 0xa8, 0x46, 0x62, 0x96, 0x20, - 0x19, 0xa8, 0x08, 0x04, 0x84, 0x0d, 0x8e, 0xf1, 0x06, 0x95, 0xa8, 0x89, - 0xb2, 0xa0, 0x60, 0x0c, 0x37, 0x04, 0xb8, 0xe0, 0xcc, 0x32, 0x28, 0x50, - 0x30, 0xc8, 0x40, 0xe4, 0x83, 0x48, 0x8c, 0x37, 0xb8, 0x44, 0x4e, 0xf4, - 0x04, 0x05, 0x63, 0xbc, 0x01, 0x26, 0x76, 0xc2, 0x27, 0x28, 0x18, 0x83, - 0x0c, 0x89, 0x3f, 0xb0, 0xc4, 0x70, 0x03, 0x02, 0x0e, 0xc1, 0x2c, 0xc3, - 0xc2, 0x04, 0x73, 0x0c, 0xfa, 0x50, 0xc4, 0xc5, 0x20, 0x43, 0xb0, 0x0f, - 0x2b, 0x61, 0x41, 0x22, 0x9f, 0x41, 0x86, 0xa0, 0x1f, 0x62, 0x62, 0x96, - 0xe0, 0x19, 0x6e, 0x68, 0xd6, 0x21, 0x98, 0x65, 0x68, 0x9e, 0x60, 0x0c, - 0x01, 0xb2, 0x8b, 0x31, 0x84, 0xc8, 0x2e, 0xc6, 0x10, 0x24, 0xba, 0x18, - 0x31, 0x28, 0x8a, 0xc0, 0x2f, 0x84, 0x60, 0xc4, 0xa0, 0x28, 0x82, 0xbf, - 0x20, 0x82, 0xe1, 0x86, 0x40, 0x1d, 0x84, 0x59, 0x06, 0xe7, 0x09, 0x4c, - 0x80, 0xe4, 0x63, 0x41, 0x3b, 0xc0, 0xc7, 0x08, 0x48, 0x3e, 0x16, 0xbc, - 0x03, 0x7c, 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0xa0, 0x12, 0x41, 0x68, 0x0c, - 0x32, 0x04, 0x2b, 0xb1, 0x13, 0x16, 0x64, 0xf2, 0x19, 0x64, 0x08, 0x5a, - 0x22, 0x2c, 0x66, 0x09, 0x9e, 0x81, 0x92, 0x40, 0x0c, 0x16, 0x36, 0x60, - 0x04, 0x87, 0x0d, 0x9a, 0x41, 0x86, 0x00, 0x0c, 0xc8, 0x62, 0x96, 0x00, - 0x1a, 0xa8, 0x08, 0x84, 0x47, 0x14, 0x92, 0xe1, 0x06, 0x3b, 0xc0, 0x87, - 0x60, 0x96, 0x21, 0xea, 0x82, 0xf1, 0x06, 0xb6, 0xb8, 0x8b, 0xd4, 0xa0, - 0x60, 0x8c, 0x37, 0xb8, 0x45, 0x5e, 0x8c, 0x06, 0x05, 0x63, 0x90, 0xc1, - 0xe0, 0x09, 0xb5, 0x18, 0x6e, 0x20, 0xfa, 0xc1, 0x99, 0x65, 0x90, 0xb8, - 0x60, 0x0c, 0x01, 0x79, 0x8d, 0xe1, 0x86, 0x00, 0x25, 0x94, 0x59, 0x06, - 0x6a, 0x0a, 0x4c, 0x50, 0x09, 0xf9, 0xcc, 0x12, 0x54, 0x36, 0xb0, 0x04, - 0x7c, 0x46, 0x0c, 0x88, 0x22, 0xd0, 0x8d, 0xc0, 0x82, 0x97, 0x90, 0xcf, - 0x88, 0x41, 0x51, 0x04, 0xbd, 0x11, 0xc4, 0xc4, 0x2c, 0x41, 0x35, 0x50, - 0x01, 0x28, 0x93, 0x40, 0xcd, 0x31, 0x94, 0x45, 0x70, 0x1b, 0x63, 0x08, - 0xd1, 0x6d, 0x0c, 0x37, 0x04, 0x31, 0xa1, 0xcc, 0x32, 0x5c, 0x56, 0x60, - 0xc2, 0x4c, 0xc8, 0x67, 0x96, 0x00, 0xb3, 0xa1, 0x26, 0xe0, 0x33, 0x62, - 0x40, 0x14, 0xc1, 0x78, 0x04, 0x16, 0xe0, 0x84, 0x7c, 0x46, 0x0c, 0x8a, - 0x22, 0x30, 0x8f, 0x40, 0x27, 0x66, 0x09, 0xb0, 0x81, 0x0a, 0x40, 0xb1, - 0x84, 0x6b, 0x8e, 0x21, 0x09, 0x7e, 0x63, 0x0c, 0x41, 0xeb, 0x8d, 0xe1, - 0x86, 0x40, 0x27, 0x94, 0x59, 0x06, 0x2d, 0x0b, 0x4c, 0xe0, 0x09, 0xf9, - 0xcc, 0x12, 0x6c, 0x36, 0xf8, 0x04, 0x7c, 0x46, 0x0c, 0x88, 0x22, 0x60, - 0x8f, 0xc0, 0x82, 0xb0, 0x90, 0xcf, 0x88, 0x41, 0x51, 0x04, 0xef, 0x11, - 0x8c, 0xc5, 0x2c, 0xc1, 0x36, 0x50, 0x01, 0x28, 0x99, 0xa0, 0xcd, 0x31, - 0x24, 0x41, 0x79, 0xcc, 0x12, 0x70, 0x03, 0x15, 0x81, 0xb0, 0xe9, 0x41, - 0x34, 0xc8, 0x10, 0xe8, 0xc5, 0x68, 0xcc, 0x31, 0xd4, 0x05, 0x18, 0xb0, - 0xc7, 0x20, 0x43, 0x60, 0x17, 0xa6, 0x61, 0x43, 0x20, 0x9f, 0x41, 0x86, - 0x00, 0x2f, 0x58, 0x63, 0x90, 0x21, 0x48, 0x03, 0xd7, 0x98, 0x25, 0xc0, - 0x83, 0xe1, 0x86, 0x5f, 0x38, 0x8b, 0x60, 0x96, 0xc1, 0x53, 0x83, 0x60, - 0x90, 0x61, 0x0d, 0x42, 0x43, 0x35, 0xc6, 0x1b, 0x6c, 0x23, 0x3c, 0xe6, - 0x83, 0x82, 0x31, 0xde, 0x80, 0x1b, 0xe3, 0xd1, 0x1e, 0x14, 0x8c, 0x39, - 0x06, 0xd0, 0x08, 0xee, 0x63, 0x90, 0x21, 0x08, 0x8d, 0xd8, 0xb0, 0xe0, - 0x90, 0xcf, 0x20, 0x43, 0x30, 0x1a, 0xb7, 0x31, 0xdc, 0x70, 0xa8, 0x85, - 0x33, 0xcb, 0x90, 0x06, 0x5f, 0x30, 0x86, 0x30, 0xf0, 0xc7, 0x70, 0x43, - 0xe0, 0x16, 0xca, 0x2c, 0x43, 0x18, 0x80, 0x41, 0x60, 0x02, 0x5c, 0xc8, - 0x67, 0x96, 0x40, 0x0c, 0x46, 0x0c, 0x88, 0x22, 0x30, 0x91, 0x61, 0xc4, - 0xa0, 0x28, 0x02, 0x14, 0x09, 0xe6, 0xc2, 0x82, 0xba, 0x90, 0x8f, 0x05, - 0x77, 0x01, 0x9f, 0x59, 0x02, 0x31, 0x18, 0xa8, 0x00, 0x14, 0x30, 0x10, - 0xc2, 0x60, 0x8e, 0x61, 0x35, 0x02, 0x12, 0x19, 0x43, 0x60, 0x48, 0x64, - 0xb8, 0x21, 0xb8, 0x0b, 0x65, 0x96, 0x81, 0x0c, 0xc6, 0x20, 0x30, 0x21, - 0x2f, 0xe4, 0x33, 0x4b, 0x50, 0x06, 0x23, 0x06, 0x44, 0x11, 0xbc, 0xc8, - 0x30, 0x62, 0x50, 0x14, 0x41, 0x8c, 0x04, 0x7c, 0x61, 0x81, 0x5f, 0xc8, - 0xc7, 0x02, 0xd0, 0x80, 0xcf, 0x2c, 0x41, 0x19, 0x0c, 0x54, 0x00, 0xca, - 0x18, 0x08, 0x64, 0x30, 0xc7, 0x90, 0x04, 0x2c, 0x32, 0x86, 0x50, 0xa9, - 0xc8, 0x70, 0x43, 0x00, 0x1a, 0xca, 0x2c, 0xc3, 0x19, 0x98, 0x41, 0x60, - 0x82, 0x68, 0xc8, 0x67, 0x96, 0x00, 0x0d, 0x46, 0x0c, 0x88, 0x22, 0xc0, - 0x91, 0x61, 0xc4, 0xa0, 0x28, 0x02, 0x1d, 0x09, 0x4a, 0xc3, 0x82, 0xd3, - 0x90, 0x8f, 0x05, 0xa9, 0x01, 0x9f, 0x59, 0x02, 0x34, 0x18, 0xa8, 0x00, - 0x14, 0x33, 0x10, 0xce, 0x60, 0x8e, 0x21, 0x09, 0x64, 0x64, 0xc4, 0xc0, - 0x28, 0x02, 0x30, 0x09, 0x7e, 0xa3, 0x37, 0x06, 0x19, 0x82, 0xf0, 0xa8, - 0x8f, 0x59, 0x82, 0x34, 0x18, 0xa8, 0x08, 0xfc, 0xc0, 0x13, 0xd0, 0x60, - 0x90, 0x21, 0x98, 0x05, 0xfc, 0x98, 0x25, 0xc0, 0x83, 0x59, 0x86, 0x35, - 0xb8, 0x03, 0x94, 0x18, 0x64, 0xa0, 0x05, 0xf5, 0x98, 0x8f, 0x11, 0x83, - 0xa2, 0x08, 0xc4, 0x24, 0xd8, 0x8d, 0x39, 0x06, 0xf2, 0x08, 0x7a, 0x64, - 0xc4, 0xa0, 0x28, 0x02, 0x32, 0x19, 0x78, 0x63, 0x8e, 0x41, 0x08, 0x7c, - 0x64, 0xc4, 0xa0, 0x28, 0x02, 0x33, 0x29, 0x7a, 0x63, 0x8e, 0x41, 0x08, - 0x7a, 0x64, 0xbc, 0xa1, 0x44, 0x60, 0x44, 0x4c, 0x28, 0x18, 0xe3, 0x0d, - 0x27, 0x22, 0x23, 0x3c, 0x42, 0xc1, 0x98, 0x63, 0x78, 0x8f, 0xc0, 0x4c, - 0x06, 0x19, 0x02, 0xf8, 0x00, 0x11, 0x0b, 0x0e, 0xf9, 0x0c, 0x32, 0x04, - 0xf2, 0x61, 0x22, 0xc3, 0x0d, 0x47, 0x6e, 0x38, 0xb3, 0x0c, 0x76, 0xc0, - 0x06, 0xc1, 0x18, 0xc2, 0xb0, 0x26, 0xc3, 0x0d, 0x41, 0x6f, 0x28, 0xb3, - 0x0c, 0x6e, 0xd0, 0x06, 0x81, 0x09, 0xbf, 0x21, 0x9f, 0x59, 0x82, 0x37, - 0x18, 0x31, 0x20, 0x8a, 0xa0, 0x4e, 0x86, 0x11, 0x83, 0xa2, 0x08, 0xee, - 0x24, 0x10, 0x0f, 0x0b, 0xc8, 0x43, 0x3e, 0x16, 0x98, 0x07, 0x7c, 0x66, - 0x09, 0xde, 0x60, 0xa0, 0x02, 0x50, 0xda, 0x40, 0x70, 0x83, 0x39, 0x06, - 0xfd, 0x08, 0xe6, 0x64, 0x0c, 0x81, 0x99, 0x93, 0xe1, 0x86, 0xc0, 0x3c, - 0x94, 0x59, 0x86, 0x38, 0x80, 0x83, 0xc0, 0x04, 0xf4, 0x90, 0xcf, 0x2c, - 0x81, 0x1c, 0x8c, 0x18, 0x10, 0x45, 0xe0, 0x27, 0xc3, 0x88, 0x41, 0x51, - 0x04, 0xa0, 0x12, 0xac, 0x87, 0x05, 0xed, 0x21, 0x1f, 0x0b, 0xde, 0x03, - 0x3e, 0xb3, 0x04, 0x72, 0x30, 0x50, 0x01, 0x28, 0x70, 0x20, 0xc4, 0xc1, - 0x1c, 0x43, 0x12, 0xec, 0xc9, 0x18, 0x42, 0x95, 0x27, 0xc3, 0x0d, 0xc1, - 0x7b, 0x28, 0xb3, 0x0c, 0x74, 0x30, 0x07, 0x81, 0x09, 0xf1, 0x21, 0x9f, - 0x59, 0x82, 0x3a, 0x18, 0x31, 0x20, 0x8a, 0xe0, 0x54, 0x86, 0x11, 0x83, - 0xa2, 0x08, 0x52, 0x25, 0xa0, 0x0f, 0x0b, 0xec, 0x43, 0x3e, 0x16, 0xe0, - 0x07, 0x7c, 0x66, 0x09, 0xea, 0x60, 0xa0, 0x02, 0x50, 0xe6, 0x40, 0xa0, - 0x83, 0x39, 0x86, 0x24, 0x08, 0x95, 0x11, 0x03, 0xa3, 0x08, 0x5e, 0x25, - 0x70, 0x11, 0x16, 0x19, 0x64, 0x08, 0x60, 0x84, 0x4c, 0x66, 0x09, 0xec, - 0x60, 0xa0, 0x22, 0xf0, 0x83, 0x35, 0x10, 0xea, 0x60, 0x90, 0x21, 0x10, - 0x89, 0x33, 0x99, 0x25, 0xc0, 0x83, 0xf1, 0x86, 0x36, 0xc1, 0x13, 0x51, - 0xa1, 0x60, 0x0c, 0x32, 0x94, 0xc4, 0x8e, 0x90, 0xc9, 0x1c, 0x83, 0x8d, - 0x08, 0xad, 0x32, 0xc8, 0x10, 0xdc, 0xc8, 0x99, 0x58, 0x30, 0xc8, 0x67, - 0x90, 0x21, 0xc8, 0x91, 0x36, 0x19, 0x64, 0x08, 0x54, 0xe2, 0x4d, 0x66, - 0x09, 0xf0, 0x60, 0xa0, 0x24, 0x20, 0x0d, 0x0e, 0x1e, 0xd2, 0x40, 0xb2, - 0x03, 0xe1, 0x0e, 0x2c, 0xc0, 0x13, 0xf9, 0x64, 0x10, 0x0e, 0x04, 0x00, - 0x00, 0x15, 0x00, 0x00, 0x00, 0x77, 0xb0, 0x0e, 0xff, 0x5c, 0xdf, 0x20, - 0x31, 0x89, 0xcd, 0x43, 0x4d, 0x9c, 0xb3, 0x38, 0x51, 0x57, 0xd9, 0x7f, - 0x51, 0xac, 0x6e, 0x5d, 0x9b, 0x6d, 0x29, 0x38, 0x8d, 0x34, 0x01, 0xcd, - 0x44, 0xf6, 0xb2, 0xfb, 0x76, 0x84, 0xe0, 0x0c, 0xc4, 0x99, 0x33, 0xc4, - 0x04, 0x2c, 0xfd, 0x44, 0x5c, 0x13, 0x15, 0x11, 0xf6, 0x20, 0x16, 0xe5, - 0xc9, 0xde, 0xbf, 0x0e, 0x08, 0x02, 0x21, 0x49, 0x1e, 0xed, 0x55, 0x9e, - 0xc7, 0xea, 0xff, 0xc9, 0xde, 0xff, 0x2e, 0x01, 0xcc, 0xb3, 0x10, 0x91, - 0xe7, 0x13, 0x17, 0x32, 0x01, 0x01, 0x31, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x00, 0x5b, 0x86, 0x20, 0x98, 0x85, 0x2d, 0xc3, 0x29, 0x04, 0xb4, 0xb0, - 0x65, 0x60, 0x85, 0xa0, 0x16, 0xb6, 0x0c, 0xbf, 0x10, 0xd8, 0xc2, 0x96, - 0x81, 0x1c, 0x82, 0x5b, 0xd8, 0x32, 0x98, 0x43, 0x80, 0x0b, 0x5b, 0x86, - 0x94, 0x08, 0x72, 0x61, 0xcb, 0xb0, 0x12, 0x81, 0x2e, 0x6c, 0x19, 0x40, - 0x23, 0xc8, 0x85, 0x2d, 0x83, 0x68, 0x04, 0xba, 0xb0, 0x65, 0xe0, 0x8f, - 0x20, 0x17, 0xb6, 0x0c, 0xfe, 0x11, 0xe8, 0xc2, 0x96, 0x01, 0x4e, 0x02, - 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0xf0, 0xb0, 0x5d, 0xf9, 0x73, 0xce, + 0x83, 0xfd, 0x15, 0x11, 0x4d, 0xc4, 0x05, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x52, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x00, 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6, + 0x22, 0x04, 0x41, 0x10, 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88, + 0x95, 0x40, 0x19, 0x14, 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14, + 0x66, 0x00, 0x66, 0x00, 0x00, 0xe3, 0x11, 0x8c, 0x84, 0x49, 0x14, 0x94, + 0xf1, 0x88, 0x87, 0xd2, 0x28, 0x0a, 0xca, 0x20, 0xc3, 0x60, 0x30, 0x26, + 0x04, 0xf2, 0x19, 0x8f, 0x98, 0x30, 0xaf, 0xa1, 0xa0, 0x0c, 0x32, 0x1c, + 0x49, 0x64, 0x42, 0x20, 0x1f, 0x0b, 0x0a, 0xf8, 0x8c, 0x47, 0x60, 0xdd, + 0x18, 0x40, 0x14, 0x94, 0x41, 0x06, 0xc6, 0xb9, 0x4c, 0x08, 0xe4, 0x63, + 0x45, 0x00, 0x9f, 0xf1, 0x88, 0x4e, 0x0c, 0xd0, 0xc0, 0xa2, 0xa0, 0x0c, + 0x32, 0x44, 0x53, 0x67, 0x42, 0x20, 0x1f, 0x2b, 0x02, 0xf8, 0x8c, 0x47, + 0x84, 0xc1, 0x19, 0xb4, 0x01, 0x47, 0x41, 0x19, 0x64, 0x08, 0xb2, 0xcf, + 0x82, 0x4a, 0x3e, 0x83, 0x0c, 0x83, 0x26, 0x06, 0x16, 0x4c, 0xf2, 0xb1, + 0x21, 0x80, 0xcf, 0x20, 0x83, 0xd1, 0x99, 0x81, 0x05, 0x91, 0x7c, 0x6c, + 0x08, 0xe0, 0x33, 0xc8, 0x90, 0x80, 0x81, 0x1a, 0x58, 0xf0, 0xc8, 0xc7, + 0x86, 0x00, 0x3e, 0xe3, 0x11, 0x6e, 0x40, 0x07, 0x7a, 0x80, 0x06, 0x14, + 0x94, 0x41, 0x86, 0xc0, 0x0c, 0xd8, 0xc0, 0x02, 0x31, 0x90, 0xcf, 0x20, + 0xc3, 0x70, 0x06, 0x6f, 0x60, 0x01, 0x18, 0xc8, 0x67, 0x90, 0xa1, 0x48, + 0x03, 0x39, 0xb0, 0xa0, 0x93, 0xcf, 0x20, 0xc3, 0xb1, 0x06, 0x75, 0x60, + 0x81, 0x26, 0x9f, 0x41, 0x06, 0x3e, 0x78, 0x03, 0x3a, 0xb0, 0x2c, 0x90, + 0xcf, 0x20, 0x83, 0x1f, 0xc4, 0xc1, 0x1d, 0x98, 0x13, 0xc8, 0xc7, 0x92, + 0x01, 0x3e, 0x16, 0x30, 0xf0, 0xb1, 0x20, 0x81, 0x8f, 0x05, 0x08, 0x7c, + 0x2c, 0x28, 0xe0, 0x33, 0xdb, 0x90, 0x07, 0x01, 0x30, 0xdb, 0x10, 0x94, + 0x42, 0x30, 0xdb, 0x10, 0x94, 0x82, 0x90, 0x41, 0x40, 0x0c, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x00, 0x00, 0x5b, 0x86, 0x20, 0xa0, 0x83, 0x2d, 0xc3, + 0x10, 0xd0, 0xc1, 0x96, 0xe1, 0x08, 0xe8, 0x60, 0xcb, 0xc0, 0x04, 0x74, + 0xb0, 0x65, 0x88, 0x02, 0x3a, 0xd8, 0x32, 0x58, 0x01, 0x1d, 0x6c, 0x19, + 0xc6, 0x20, 0xa0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x98, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xe3, 0x02, 0x00, + 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, + 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, + 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32, + 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, + 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, + 0x08, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, + 0x00, 0x51, 0x18, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x8a, 0x08, 0x07, 0x78, + 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, + 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, + 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, + 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, + 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, + 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, + 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, + 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, + 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, + 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, + 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, + 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, + 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, + 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, + 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, + 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, + 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, + 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, + 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, + 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, + 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, + 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, + 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, + 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, + 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, + 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, + 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, + 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, + 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, + 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, + 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, + 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x18, + 0xc2, 0x00, 0x2c, 0x40, 0x05, 0x49, 0x18, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x13, 0x84, 0x40, 0x00, 0x89, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x32, 0x22, 0x08, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4, + 0x84, 0x04, 0x13, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x88, + 0x8c, 0x0b, 0x84, 0x84, 0x4c, 0x10, 0x3c, 0x33, 0x00, 0xc3, 0x08, 0x04, + 0x30, 0x8c, 0x20, 0x00, 0x67, 0x49, 0x53, 0x44, 0x09, 0x93, 0xcf, 0x1e, + 0xc0, 0x40, 0x44, 0x9c, 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x12, 0x42, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x11, 0x06, 0xa1, 0x10, 0x21, 0x41, 0x54, 0x03, + 0x01, 0x73, 0x04, 0x60, 0x90, 0x02, 0x38, 0x47, 0x00, 0x0a, 0x83, 0x08, + 0x80, 0x30, 0x8c, 0x30, 0x00, 0xc3, 0x08, 0x04, 0x32, 0x02, 0x00, 0x00, + 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, + 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x76, 0x08, 0x87, + 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80, 0x03, 0x37, 0x88, 0x83, + 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, + 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, + 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, + 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, + 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, + 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, + 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, + 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20, + 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, + 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10, + 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, + 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, + 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20, + 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, + 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, + 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50, + 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, + 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40, + 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, + 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x31, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0x01, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, + 0x47, 0xc6, 0x04, 0x43, 0xc2, 0x11, 0x80, 0x42, 0x28, 0x81, 0x22, 0x28, + 0x88, 0x02, 0x2a, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0xd2, 0xc2, + 0x19, 0x01, 0x28, 0x8c, 0x42, 0x28, 0x88, 0x02, 0x29, 0x94, 0x82, 0xa1, + 0x1c, 0x4b, 0x78, 0x04, 0x00, 0x79, 0x18, 0x00, 0x00, 0x13, 0x01, 0x00, + 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, + 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0x42, 0x1c, 0x40, 0x42, 0x51, + 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, + 0x20, 0xc3, 0x21, 0x20, 0x02, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, + 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, + 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x06, + 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, + 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88, 0x70, 0x10, 0x43, + 0x0c, 0x64, 0x40, 0x0a, 0x24, 0x60, 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36, + 0x04, 0x39, 0x0e, 0x64, 0x40, 0x06, 0x24, 0xe0, 0x16, 0x96, 0x26, 0xe7, + 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6, + 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36, + 0x44, 0x38, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, + 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x63, 0x61, + 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, + 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9, + 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x91, 0xa5, 0xcd, 0x85, 0x89, + 0xb1, 0x95, 0x0d, 0x11, 0x8e, 0x86, 0x51, 0x58, 0x9a, 0x9c, 0x8b, 0x5c, + 0x99, 0x1b, 0x59, 0x99, 0xdc, 0x17, 0x5d, 0x98, 0xdc, 0x59, 0x19, 0x1d, + 0xa3, 0xb0, 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, + 0xb2, 0x2f, 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x34, 0x43, 0x90, 0xe3, 0x41, 0x82, 0x03, 0x3a, 0xa2, 0x21, 0xc2, 0x21, + 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x31, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, 0x73, + 0xa3, 0xfb, 0x4a, 0x73, 0x83, 0xab, 0xa3, 0x63, 0x76, 0x56, 0xe6, 0x56, + 0x26, 0x17, 0x46, 0x57, 0x46, 0x86, 0x82, 0x03, 0xf7, 0x36, 0x97, 0x46, + 0x97, 0xf6, 0xe6, 0x46, 0x64, 0x27, 0xf3, 0x65, 0x96, 0x42, 0x25, 0x2c, + 0x4d, 0xce, 0x65, 0xac, 0xcc, 0x8d, 0xae, 0x4c, 0x8e, 0x4f, 0x58, 0x9a, + 0x9c, 0x0b, 0x5c, 0x99, 0xdc, 0x1c, 0x5c, 0xd9, 0x18, 0x5d, 0x9a, 0x5d, + 0x19, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x32, 0x61, 0x69, 0x72, + 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0xe0, 0xde, + 0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0x86, 0x48, 0x48, 0x70, 0x50, 0x47, + 0x75, 0x58, 0xc7, 0x75, 0x40, 0x07, 0x76, 0x64, 0x87, 0x46, 0xeb, 0xac, + 0xcc, 0xad, 0x4c, 0x2e, 0x8c, 0xae, 0x8c, 0x0c, 0xa5, 0x66, 0xec, 0x8d, + 0xed, 0x4d, 0x8e, 0xc8, 0x8e, 0xe6, 0xcb, 0x2c, 0x85, 0xc5, 0xd8, 0x1b, + 0xdb, 0x9b, 0xdc, 0x10, 0x09, 0x19, 0x0e, 0xea, 0xe0, 0x0e, 0xeb, 0xb8, + 0x0e, 0xe8, 0x88, 0x8e, 0xec, 0xe8, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x88, + 0xd5, 0x99, 0x99, 0x95, 0xc9, 0xf1, 0x09, 0x4b, 0x93, 0x73, 0x11, 0xab, + 0x33, 0x33, 0x2b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0xa3, 0x14, 0x96, + 0x26, 0xe7, 0xc2, 0xf6, 0x36, 0x16, 0x46, 0x97, 0xf6, 0xe6, 0xf6, 0x95, + 0xe6, 0x46, 0x56, 0x86, 0x47, 0x24, 0x2c, 0x4d, 0xce, 0x45, 0xae, 0x2c, + 0x8c, 0x8c, 0x54, 0x58, 0x9a, 0x9c, 0xcb, 0x1c, 0x9d, 0x5c, 0xdd, 0x18, + 0xdd, 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x9a, 0x9b, 0xd9, 0x1b, 0x0b, + 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x32, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x64, 0xe8, 0xca, 0xf0, 0xe8, 0xea, + 0xe4, 0xca, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, 0xa8, 0xa4, 0xb9, 0xc1, 0xd5, + 0xd1, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x71, 0x19, 0x7b, 0x63, 0x7b, 0x93, + 0xfb, 0x9a, 0x1b, 0x0b, 0x63, 0x2b, 0xa3, 0x43, 0xf7, 0xe6, 0x56, 0xd6, + 0x16, 0x06, 0xf7, 0xd5, 0x56, 0x46, 0x87, 0xf6, 0x46, 0xc6, 0x87, 0xee, + 0xcd, 0xad, 0xac, 0x2d, 0x0c, 0xee, 0xcb, 0x2c, 0x6c, 0x8c, 0xee, 0x4d, + 0x2e, 0x86, 0x0f, 0xdd, 0x9b, 0x5b, 0x59, 0x5b, 0x18, 0xdc, 0x97, 0x59, + 0xd8, 0x18, 0xdd, 0x9b, 0x9c, 0x0c, 0x9f, 0x39, 0x32, 0xb9, 0xaf, 0x3b, + 0xb4, 0x34, 0xba, 0xb2, 0x2f, 0xb8, 0xb7, 0x34, 0x37, 0xba, 0x21, 0xb0, + 0x80, 0x04, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x65, 0x80, 0x08, 0x88, + 0x80, 0x04, 0x07, 0x19, 0x1c, 0x66, 0x80, 0x14, 0x88, 0x80, 0x04, 0x07, + 0x19, 0x1c, 0x67, 0x80, 0x1c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x68, + 0x80, 0x20, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x69, 0x80, 0x24, 0x88, + 0x80, 0x04, 0x07, 0x19, 0x1c, 0x6a, 0x80, 0x28, 0x88, 0x80, 0x04, 0x07, + 0x19, 0x1c, 0x6b, 0x80, 0x2c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x6c, + 0xc0, 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, 0xec, 0x8b, 0x2e, 0x0f, + 0xae, 0xec, 0x6b, 0x2e, 0x4d, 0xaf, 0x8c, 0x57, 0x58, 0x9a, 0x9c, 0x4b, + 0x98, 0xdc, 0xd9, 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x18, 0x5b, 0xda, + 0x99, 0xdb, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x9f, 0x29, 0xb4, 0x30, 0xb2, + 0x32, 0xb9, 0xa1, 0x37, 0xb7, 0x39, 0xba, 0x30, 0x37, 0xba, 0x39, 0x06, + 0x63, 0x43, 0xc8, 0x00, 0x21, 0x8e, 0xef, 0x00, 0x03, 0xc4, 0x38, 0xc2, + 0x00, 0x09, 0x90, 0xe1, 0x10, 0x83, 0x63, 0x0c, 0x8e, 0x36, 0x38, 0xdc, + 0x00, 0x31, 0x8e, 0x37, 0x40, 0x84, 0x03, 0x3a, 0xe0, 0xe0, 0xc8, 0x8e, + 0x38, 0x18, 0x62, 0x1c, 0xdb, 0xe1, 0x1d, 0x72, 0x30, 0xc4, 0x30, 0x80, + 0x63, 0x3a, 0xe6, 0x80, 0xd5, 0x97, 0x16, 0xd5, 0x54, 0x4c, 0xcd, 0x14, + 0x5a, 0x18, 0x59, 0x99, 0xdc, 0xd0, 0x9b, 0xdb, 0x1c, 0x5d, 0x98, 0x1b, + 0xdd, 0x1c, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, 0x37, 0xba, 0x32, 0x37, + 0x3a, 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, 0x69, 0x6d, 0x70, 0x6c, + 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x43, 0x84, + 0xe3, 0x0e, 0x86, 0x18, 0x87, 0x1d, 0x1c, 0x78, 0xa0, 0x34, 0x43, 0x8c, + 0x83, 0x0c, 0x8e, 0x3c, 0x50, 0x9a, 0x21, 0x62, 0x70, 0xd4, 0xc1, 0xa1, + 0x07, 0x4a, 0x73, 0xe8, 0x81, 0xf2, 0x1c, 0x7a, 0xa0, 0x40, 0x87, 0x1e, + 0x28, 0xce, 0xa1, 0x07, 0x4a, 0x74, 0xe8, 0x81, 0x22, 0x1d, 0x7a, 0xa0, + 0x4c, 0x87, 0x1e, 0x28, 0xcc, 0x10, 0xe3, 0xd8, 0x83, 0x43, 0x0f, 0x14, + 0x67, 0x44, 0xc4, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xed, 0xf0, + 0x0e, 0xe4, 0x50, 0x0f, 0xec, 0x50, 0x0e, 0x6e, 0x60, 0x0e, 0xec, 0x10, + 0x0e, 0xe7, 0x30, 0x0f, 0x53, 0x84, 0x60, 0x18, 0xa1, 0xb0, 0x03, 0x3b, + 0xd8, 0x43, 0x3b, 0xb8, 0x41, 0x3a, 0x90, 0x43, 0x39, 0xb8, 0x03, 0x3d, + 0x4c, 0x09, 0x8a, 0x11, 0x4b, 0x38, 0xa4, 0x83, 0x3c, 0xb8, 0x81, 0x3d, + 0x94, 0x83, 0x3c, 0xcc, 0x43, 0x3a, 0xbc, 0x83, 0x3b, 0x4c, 0x09, 0x8c, + 0x11, 0x54, 0x38, 0xa4, 0x83, 0x3c, 0xb8, 0x01, 0x3b, 0x84, 0x83, 0x3b, + 0x9c, 0x43, 0x3d, 0x84, 0xc3, 0x39, 0x94, 0xc3, 0x2f, 0xd8, 0x43, 0x39, + 0xc8, 0xc3, 0x3c, 0xa4, 0xc3, 0x3b, 0xb8, 0xc3, 0x94, 0x00, 0x19, 0x31, + 0x85, 0x43, 0x3a, 0xc8, 0x83, 0x1b, 0x8c, 0xc3, 0x3b, 0xb4, 0x03, 0x3c, + 0xa4, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x03, 0x3c, 0xd0, 0x43, 0x3a, + 0xbc, 0x83, 0x3b, 0xcc, 0xc3, 0x94, 0x41, 0x61, 0x9c, 0x11, 0x4c, 0x38, + 0xa4, 0x83, 0x3c, 0xb8, 0x81, 0x39, 0xc8, 0x43, 0x38, 0x9c, 0x43, 0x3b, + 0x94, 0x83, 0x3b, 0xd0, 0xc3, 0x94, 0x80, 0x0e, 0x00, 0x79, 0x18, 0x00, + 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, + 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, + 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, + 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, + 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, + 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, + 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, + 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, + 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, + 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, + 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, + 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, + 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, + 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, + 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, + 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, + 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, + 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, + 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, + 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, + 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, + 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, + 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, + 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, + 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, + 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, + 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, + 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, + 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, + 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, + 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, + 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, + 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, + 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, + 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, + 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, + 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, + 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, + 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, + 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, + 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, + 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, + 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, + 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, + 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, + 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, + 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, + 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, + 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, + 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, + 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, + 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, + 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, + 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, + 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x06, 0x20, 0xb1, 0x5d, 0xf9, 0xb3, 0xce, 0x82, 0x0c, 0x7f, 0x11, + 0x01, 0x06, 0x43, 0x34, 0x13, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0xd4, 0x73, 0x10, 0x41, 0x10, 0x68, 0x84, + 0x65, 0x30, 0x03, 0x40, 0x3c, 0x03, 0x40, 0x30, 0x46, 0x00, 0x82, 0x20, + 0x88, 0x7f, 0x00, 0x00, 0x00, 0xe3, 0x0d, 0x06, 0x44, 0x50, 0x30, 0xe6, + 0x18, 0x88, 0xc0, 0x1b, 0x64, 0x08, 0x0a, 0x64, 0x8e, 0x21, 0x28, 0x10, + 0x0b, 0x18, 0xf9, 0x64, 0x10, 0x10, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x5b, 0x86, 0x20, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xf0, 0x10, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x50, 0x18, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, - 0x00, 0x39, 0x04, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x11, 0x06, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, - 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, @@ -1694,212 +891,236 @@ const unsigned char sdl_metallib[] = { 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0x83, 0x21, 0x10, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0xa1, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x10, 0x06, 0xb0, 0x00, 0xd5, 0x06, - 0xa3, 0x40, 0x80, 0x05, 0xa8, 0x36, 0x18, 0xc6, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0x80, 0x04, 0x50, 0x1b, 0x90, 0xe3, 0xff, 0xff, 0xff, 0xff, 0x07, - 0x80, 0x01, 0x24, 0xa0, 0xda, 0x60, 0x20, 0x01, 0xb0, 0x00, 0xd5, 0x06, - 0x23, 0x11, 0x80, 0x05, 0xa8, 0x36, 0x20, 0xca, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0x00, 0x03, 0x48, 0x40, 0xb5, 0xc1, 0x58, 0xfe, 0xff, 0xff, 0xff, - 0x7f, 0x00, 0x24, 0x80, 0x02, 0x49, 0x18, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x13, 0x8a, 0x40, 0x18, 0x88, 0x62, 0x42, 0x60, 0x4c, 0x18, 0x0e, - 0x24, 0x99, 0x30, 0x28, 0x48, 0x32, 0x21, 0x58, 0x00, 0x89, 0x20, 0x00, - 0x00, 0x47, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, - 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, - 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xa8, 0xc1, - 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, - 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, - 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, - 0x41, 0x18, 0x46, 0x18, 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, - 0xe4, 0xa1, 0x1e, 0xc6, 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, - 0xc2, 0x81, 0x1d, 0xf4, 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, - 0xd2, 0x01, 0x1f, 0x50, 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, - 0xec, 0xbe, 0x1d, 0x21, 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, - 0x84, 0xa3, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, - 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0x38, - 0x4d, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, - 0xdf, 0x1e, 0x7e, 0x20, 0x8a, 0x00, 0xec, 0x9f, 0xc6, 0x08, 0x80, 0x41, - 0x04, 0x26, 0xb8, 0x48, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, - 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00, 0x06, 0x11, 0x1c, 0xa1, 0x24, - 0x41, 0x10, 0x08, 0x44, 0xb2, 0x34, 0x0f, 0x41, 0x65, 0x00, 0x00, 0x80, - 0xa4, 0x22, 0x00, 0x00, 0x51, 0x65, 0x00, 0x8a, 0x82, 0xac, 0x39, 0x02, - 0x30, 0x98, 0x23, 0x08, 0x86, 0x11, 0x04, 0xac, 0x24, 0x41, 0xf3, 0x08, - 0x58, 0xa6, 0x65, 0x00, 0x6d, 0x05, 0x09, 0x96, 0x47, 0xc8, 0xb4, 0x0c, - 0xa0, 0x6e, 0x20, 0x20, 0x05, 0xb0, 0x61, 0x84, 0x01, 0x1b, 0x44, 0x08, - 0x84, 0x39, 0x02, 0x50, 0x18, 0x44, 0x38, 0x84, 0x41, 0x84, 0x42, 0x18, - 0x44, 0x00, 0x84, 0x29, 0x80, 0x11, 0x80, 0x61, 0x04, 0x02, 0x03, 0x00, - 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, - 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x76, 0x08, 0x87, - 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80, 0x03, 0x37, 0x88, 0x83, - 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0, - 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, - 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, - 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, - 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, - 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, - 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, - 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, - 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, - 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, - 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, - 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30, - 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20, - 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, - 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, - 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, - 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10, - 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, - 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, - 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20, - 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, - 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, - 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50, - 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, - 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40, - 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, - 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, - 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x89, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x4c, 0x40, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0c, 0x61, 0x2a, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x86, 0x30, 0x17, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x43, 0x18, 0x0e, 0x08, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x21, 0x8c, 0x07, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x16, - 0x08, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, - 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xc2, 0x46, 0x00, 0x4a, - 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80, 0x0a, 0x30, 0xa0, 0x0c, - 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, - 0x68, 0x2c, 0x9c, 0x11, 0x80, 0xc2, 0x28, 0x84, 0x82, 0x28, 0x90, 0x42, - 0x29, 0x18, 0x02, 0xc7, 0x12, 0x1c, 0x01, 0x00, 0x00, 0x79, 0x18, 0x00, - 0x00, 0x8b, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, - 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0xa6, - 0x7c, 0x00, 0x18, 0x7c, 0x54, 0xee, 0xc6, 0xd0, 0xc2, 0xe4, 0xbe, 0xe6, - 0xd2, 0xf4, 0xca, 0x86, 0x18, 0xd8, 0xf1, 0x09, 0x18, 0xc2, 0x38, 0x08, - 0x82, 0x83, 0x63, 0x2b, 0x03, 0x69, 0x2b, 0xa3, 0x0b, 0x63, 0x03, 0xb1, - 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x03, 0x99, 0x91, 0x81, 0x91, 0x99, - 0x71, 0x89, 0x81, 0x89, 0x01, 0x41, 0x69, 0x2b, 0xa3, 0x0b, 0x63, 0x33, - 0x2b, 0x6b, 0x99, 0x91, 0x81, 0x91, 0x99, 0x71, 0x89, 0x81, 0x89, 0x49, - 0x19, 0x22, 0x7c, 0xc4, 0x10, 0x03, 0x3b, 0xb0, 0x05, 0x33, 0x58, 0x34, - 0x95, 0xd1, 0x85, 0xb1, 0x0d, 0x41, 0xbe, 0x03, 0x3b, 0xb0, 0x03, 0x33, - 0xb8, 0x85, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, - 0xb9, 0x90, 0x95, 0xb9, 0xbd, 0xc9, 0xb5, 0xcd, 0x7d, 0x91, 0xa5, 0xcd, - 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0xbe, 0x84, 0x5c, 0x58, 0x9a, 0x9c, - 0xcb, 0xd8, 0x5b, 0x1b, 0x5c, 0x1a, 0x5b, 0x99, 0x8b, 0x59, 0xd8, 0x1c, - 0xdd, 0x57, 0x5b, 0x18, 0x1d, 0xda, 0x57, 0x99, 0x5b, 0x98, 0x18, 0x5b, - 0xd9, 0x10, 0xe1, 0x5b, 0x58, 0x06, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0xaf, 0x61, 0x14, - 0x96, 0x26, 0xe7, 0x22, 0x57, 0xe6, 0x46, 0x56, 0x26, 0xf7, 0x45, 0x17, - 0x26, 0x77, 0x56, 0x46, 0xc7, 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, - 0xec, 0x8b, 0x2e, 0x0f, 0xae, 0xec, 0xcb, 0x2d, 0xac, 0xad, 0x8c, 0x86, - 0x19, 0xdb, 0x5b, 0x18, 0x1d, 0xcd, 0x10, 0xe4, 0x7b, 0x30, 0xe3, 0x83, - 0xbe, 0x68, 0x88, 0xf0, 0x49, 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xde, - 0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, - 0x95, 0xb9, 0xd1, 0x95, 0xc9, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x71, 0x7b, - 0xfb, 0x82, 0x2b, 0x93, 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3, 0x2b, - 0x23, 0x13, 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0xe5, 0x16, 0xd6, - 0x56, 0x46, 0x04, 0xee, 0x6d, 0x2e, 0x8d, 0x2e, 0xed, 0xcd, 0x6d, 0x08, - 0x84, 0x19, 0x1f, 0xf5, 0x55, 0x9f, 0xf5, 0x41, 0x5f, 0xf4, 0x5d, 0x1f, - 0x46, 0x29, 0x2c, 0x4d, 0xce, 0xc5, 0x4c, 0x2e, 0xec, 0xac, 0xad, 0xcc, - 0x8d, 0xee, 0x2b, 0xcd, 0x0d, 0xae, 0x8e, 0x8e, 0xd6, 0x59, 0x99, 0x5b, - 0x99, 0x5c, 0x18, 0x5d, 0x19, 0x19, 0x4a, 0xcd, 0xd8, 0x1b, 0xdb, 0x9b, - 0x1c, 0x91, 0x1d, 0xcd, 0x97, 0x59, 0x0a, 0x9f, 0xb0, 0x34, 0x39, 0x17, - 0xb8, 0x32, 0xb9, 0x39, 0xb8, 0xb2, 0x31, 0xba, 0x34, 0xbb, 0x32, 0x16, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x24, 0xec, 0xf8, 0xb4, 0x6f, 0xfb, - 0xaa, 0x8f, 0xfb, 0xa0, 0x2f, 0xfa, 0xae, 0xaf, 0x63, 0x76, 0x56, 0xe6, - 0x56, 0x26, 0x17, 0x46, 0x57, 0x46, 0x86, 0x82, 0x43, 0x57, 0x86, 0x37, - 0xf6, 0xf6, 0x26, 0x47, 0x46, 0x64, 0x27, 0xf3, 0x65, 0x96, 0x42, 0xc3, - 0x8c, 0xed, 0x2d, 0x8c, 0x4e, 0x86, 0x08, 0x5d, 0x19, 0xde, 0xd8, 0xdb, - 0x9b, 0x1c, 0xd9, 0x10, 0x09, 0x53, 0x3e, 0xed, 0xfb, 0xbe, 0xea, 0xe3, - 0x3e, 0xe8, 0x03, 0x83, 0xef, 0xfa, 0xc2, 0x80, 0x4a, 0x58, 0x9a, 0x9c, - 0x8b, 0x58, 0x9d, 0x99, 0x59, 0x99, 0x1c, 0x9f, 0xb0, 0x34, 0x39, 0x17, - 0xb1, 0x3a, 0x33, 0xb3, 0x32, 0xb9, 0xaf, 0xb9, 0x34, 0xbd, 0x32, 0x4a, - 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x44, 0xc2, 0xd2, 0xe4, 0x5c, 0xe4, - 0xca, 0xc2, 0xc8, 0x48, 0x85, 0xa5, 0xc9, 0xb9, 0xcc, 0xd1, 0xc9, 0xd5, - 0x8d, 0xd1, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0xa5, 0xb9, 0x99, 0xbd, - 0xb1, 0x30, 0x63, 0x7b, 0x0b, 0xa3, 0x23, 0x33, 0x37, 0x26, 0x75, 0x24, - 0xf4, 0xf5, 0x56, 0x47, 0x07, 0x57, 0x47, 0x47, 0x86, 0xae, 0x0c, 0x8f, - 0xae, 0x4e, 0xae, 0xec, 0x8b, 0x2e, 0x0f, 0xae, 0x8c, 0x4a, 0x9a, 0x1b, - 0x5c, 0x1d, 0xdd, 0x17, 0x5d, 0x1e, 0x5c, 0x19, 0x97, 0xb1, 0x37, 0xb6, - 0x37, 0xb9, 0xaf, 0xb9, 0xb1, 0x30, 0xb6, 0x32, 0x3a, 0x74, 0x6f, 0x6e, - 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x7c, - 0xe8, 0xde, 0xdc, 0xca, 0xda, 0xc2, 0xe0, 0xbe, 0xcc, 0xc2, 0xc6, 0xe8, - 0xde, 0xe4, 0x62, 0xf8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, - 0x99, 0x85, 0x8d, 0xd1, 0xbd, 0xc9, 0xc9, 0xf0, 0x99, 0x23, 0x93, 0xfb, - 0xba, 0x43, 0x4b, 0xa3, 0x2b, 0xfb, 0x82, 0x7b, 0x4b, 0x73, 0xa3, 0x1b, - 0x02, 0x0b, 0x98, 0x81, 0x21, 0x98, 0xf1, 0xa1, 0xc1, 0x97, 0x06, 0x18, - 0x82, 0x21, 0x98, 0xf1, 0xa1, 0xc1, 0xa7, 0x06, 0xd8, 0x82, 0x21, 0x98, - 0xf1, 0xa1, 0xc1, 0xb7, 0x06, 0xd8, 0x83, 0x21, 0x98, 0xf1, 0xa1, 0xc1, - 0xc7, 0x06, 0x58, 0x82, 0x21, 0x98, 0xf1, 0xa1, 0xc1, 0xd7, 0x06, 0x18, - 0x84, 0x21, 0x98, 0xf1, 0xa1, 0xc1, 0xe7, 0x06, 0x58, 0x84, 0x21, 0x98, - 0xf1, 0xa1, 0xc1, 0xf7, 0x06, 0x98, 0x84, 0x21, 0x98, 0xf1, 0xa1, 0xc1, - 0x07, 0x07, 0x8c, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xe8, - 0xf2, 0xe0, 0xca, 0xbe, 0xe6, 0xd2, 0xf4, 0xca, 0x78, 0x85, 0xa5, 0xc9, - 0xb9, 0x84, 0xc9, 0x9d, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0x85, 0xb1, - 0xa5, 0x9d, 0xb9, 0x7d, 0xcd, 0xa5, 0xe9, 0x95, 0xf1, 0x99, 0x42, 0x0b, - 0x23, 0x2b, 0x93, 0x1b, 0x7a, 0x73, 0x9b, 0xa3, 0x0b, 0x73, 0xa3, 0x9b, - 0x63, 0x30, 0x36, 0x84, 0x0c, 0x30, 0xe7, 0x1b, 0x83, 0x8f, 0x0c, 0x30, - 0xe6, 0x2b, 0x03, 0xcc, 0xc0, 0x8e, 0xcf, 0x0c, 0xbe, 0x33, 0xf8, 0xe2, - 0xe0, 0x93, 0x03, 0x8c, 0xf9, 0xe6, 0x00, 0x43, 0x3e, 0xe8, 0xa3, 0x83, - 0xef, 0xfa, 0xea, 0x80, 0x86, 0x19, 0xdb, 0x5b, 0x18, 0xdd, 0x0c, 0x8d, - 0x37, 0x33, 0xb3, 0xb9, 0x32, 0x3a, 0x22, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x33, 0x78, 0x33, 0x34, 0xda, 0xc2, 0xe8, 0xe4, 0xd2, 0xf0, 0x86, 0x50, - 0x98, 0x81, 0x25, 0x98, 0xf1, 0xdd, 0xc1, 0x87, 0x07, 0x58, 0x82, 0x4d, - 0x98, 0xf1, 0xe5, 0xc1, 0xa7, 0x07, 0x4c, 0xb2, 0xaa, 0xac, 0x88, 0xca, - 0xc6, 0xde, 0xc8, 0xca, 0x68, 0x90, 0x95, 0x8d, 0xbd, 0x91, 0x95, 0x0d, - 0x21, 0x03, 0x0c, 0xf9, 0xc6, 0xe0, 0x23, 0x03, 0xac, 0xf9, 0xca, 0x00, - 0x3b, 0xb0, 0xe3, 0x33, 0x83, 0xef, 0x0c, 0xbe, 0x3d, 0xf8, 0xe4, 0x00, - 0x6b, 0xbe, 0x39, 0xc0, 0x92, 0x0f, 0xfa, 0xf8, 0xe0, 0xbb, 0xbe, 0x3e, - 0xe0, 0x12, 0x96, 0x26, 0xe7, 0x42, 0x57, 0x86, 0x47, 0x57, 0x27, 0x57, - 0x46, 0x25, 0x2c, 0x4d, 0xce, 0x65, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x8c, - 0x18, 0x5d, 0x19, 0x1e, 0x5d, 0x9d, 0x5c, 0x99, 0x0c, 0x19, 0x8f, 0x19, - 0xdb, 0x5b, 0x18, 0x1d, 0x0b, 0xc8, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, - 0x0f, 0x09, 0xba, 0x32, 0xbc, 0xac, 0x21, 0x14, 0x46, 0x7d, 0x7f, 0xf0, - 0x95, 0x01, 0x66, 0x60, 0xc7, 0x07, 0x0a, 0x1f, 0xf4, 0x85, 0xc2, 0x77, - 0x7d, 0xa2, 0x40, 0x8f, 0xae, 0x0c, 0x8f, 0xae, 0x4e, 0xae, 0x4c, 0x86, - 0xec, 0x2b, 0x4c, 0x4e, 0x2e, 0x2c, 0x8f, 0xc7, 0x8c, 0xed, 0x2d, 0x8c, - 0x8e, 0x05, 0x64, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0xcc, 0x87, 0x05, 0x5d, - 0x19, 0x5e, 0x95, 0xd5, 0x10, 0x0a, 0xab, 0xbe, 0x3f, 0xf8, 0xca, 0x00, - 0x3b, 0xb0, 0xe3, 0x03, 0x85, 0x0f, 0xfa, 0x48, 0xe1, 0xbb, 0xbe, 0x52, - 0xe0, 0x12, 0x96, 0x26, 0xe7, 0x32, 0x17, 0xd6, 0x06, 0xc7, 0x56, 0x26, - 0xc7, 0x63, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x4c, 0x8e, 0xc1, 0xdc, 0x10, - 0x09, 0xb3, 0xbe, 0x53, 0xf8, 0xca, 0x00, 0x33, 0xb0, 0xe3, 0x83, 0x3e, - 0x54, 0xf8, 0xae, 0x2f, 0x15, 0x86, 0x40, 0x5f, 0xf6, 0x79, 0x9f, 0x18, - 0x7c, 0x76, 0xf0, 0xf9, 0xc1, 0x37, 0x0a, 0x9f, 0x29, 0x7c, 0xaa, 0x30, - 0xc4, 0x88, 0x80, 0x6f, 0xfa, 0x56, 0x81, 0x62, 0x10, 0x96, 0x26, 0xd7, - 0x12, 0xc6, 0x96, 0x16, 0x36, 0xd7, 0x32, 0x37, 0xf6, 0x06, 0x57, 0x36, - 0x87, 0x32, 0x45, 0xc4, 0xf4, 0x95, 0x55, 0x65, 0xf5, 0x65, 0x26, 0x17, - 0x76, 0xd6, 0x56, 0xe6, 0x46, 0x97, 0x32, 0x84, 0xf8, 0x5c, 0xe1, 0x6b, - 0x05, 0x62, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x43, 0x8c, 0x0f, 0x16, 0x3e, 0x57, 0xf8, 0x5e, 0x81, 0x58, - 0x58, 0x9a, 0x5c, 0x4b, 0x18, 0x5b, 0x5a, 0xd8, 0x5c, 0xcb, 0xdc, 0xd8, - 0x1b, 0x5c, 0x59, 0xcb, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0xdc, 0xdc, - 0x10, 0xe3, 0x93, 0x85, 0xcf, 0x15, 0xbe, 0x58, 0x18, 0x42, 0x7c, 0xb0, - 0xf0, 0xc9, 0x02, 0xab, 0x2f, 0x2d, 0xaa, 0xa9, 0x98, 0x9a, 0x29, 0xb4, - 0x30, 0xb2, 0x32, 0xb9, 0xa1, 0x37, 0xb7, 0x39, 0xba, 0x30, 0x37, 0xba, - 0x39, 0x3e, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, - 0x20, 0x63, 0x68, 0x61, 0x72, 0x7c, 0xa6, 0xd2, 0xda, 0xe0, 0xd8, 0xca, - 0x40, 0x86, 0x56, 0x56, 0x40, 0xa8, 0x84, 0x82, 0x82, 0x86, 0x08, 0x9f, - 0x2d, 0x0c, 0x31, 0xbe, 0x5a, 0xf8, 0x6e, 0x61, 0x0c, 0xb0, 0x21, 0xc6, - 0x87, 0x06, 0x1f, 0x2e, 0x8c, 0x01, 0x36, 0x44, 0x0c, 0x3e, 0x5a, 0xf8, - 0x72, 0x61, 0x0c, 0xb0, 0x2f, 0x17, 0xc6, 0x40, 0xfb, 0x72, 0x61, 0x0c, - 0xb6, 0x2f, 0x17, 0xc6, 0x20, 0xfb, 0x72, 0x61, 0x0c, 0xb8, 0x2f, 0x17, - 0xc6, 0xa0, 0xfb, 0x72, 0x61, 0x0c, 0xbc, 0x2f, 0x17, 0xc6, 0xe0, 0x1a, - 0x62, 0x7c, 0xba, 0xf0, 0xe5, 0xc2, 0x18, 0x60, 0x43, 0x8c, 0x4f, 0x17, - 0xbe, 0x5c, 0x18, 0x83, 0x6c, 0x44, 0xc4, 0x0e, 0xec, 0x60, 0x0f, 0xed, - 0xe0, 0x06, 0xed, 0xf0, 0x0e, 0xe4, 0x50, 0x0f, 0xec, 0x50, 0x0e, 0x6e, - 0x60, 0x0e, 0xec, 0x10, 0x0e, 0xe7, 0x30, 0x0f, 0x53, 0x84, 0x60, 0x18, - 0xa1, 0xb0, 0x03, 0x3b, 0xd8, 0x43, 0x3b, 0xb8, 0x41, 0x3a, 0x90, 0x43, - 0x39, 0xb8, 0x03, 0x3d, 0x4c, 0x09, 0x8a, 0x11, 0x4b, 0x38, 0xa4, 0x83, - 0x3c, 0xb8, 0x81, 0x3d, 0x94, 0x83, 0x3c, 0xcc, 0x43, 0x3a, 0xbc, 0x83, - 0x3b, 0x4c, 0x09, 0x8c, 0x11, 0x54, 0x38, 0xa4, 0x83, 0x3c, 0xb8, 0x01, - 0x3b, 0x84, 0x83, 0x3b, 0x9c, 0x43, 0x3d, 0x84, 0xc3, 0x39, 0x94, 0xc3, - 0x2f, 0xd8, 0x43, 0x39, 0xc8, 0xc3, 0x3c, 0xa4, 0xc3, 0x3b, 0xb8, 0xc3, - 0x94, 0x00, 0x19, 0x31, 0x85, 0x43, 0x3a, 0xc8, 0x83, 0x1b, 0x8c, 0xc3, - 0x3b, 0xb4, 0x03, 0x3c, 0xa4, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x03, - 0x3c, 0xd0, 0x43, 0x3a, 0xbc, 0x83, 0x3b, 0xcc, 0xc3, 0x94, 0x41, 0x61, - 0x9c, 0x11, 0x4c, 0x38, 0xa4, 0x83, 0x3c, 0xb8, 0x81, 0x39, 0xc8, 0x43, - 0x38, 0x9c, 0x43, 0x3b, 0x94, 0x83, 0x3b, 0xd0, 0xc3, 0x94, 0x80, 0x15, + 0xa3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0x83, 0x8f, + 0x18, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00, + 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0, + 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, + 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b, + 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b, + 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b, + 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03, 0x90, 0x07, 0x76, 0x00, + 0x0c, 0xee, 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5, 0x90, 0x0e, 0xec, 0x40, + 0x0f, 0xe9, 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x60, + 0x0e, 0xf2, 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0xef, 0x90, + 0x0e, 0xee, 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d, 0x50, 0x0e, 0xec, 0x90, + 0x0e, 0xed, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, + 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94, 0x43, 0x1b, + 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, 0x43, 0x1b, + 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81, 0x3b, 0xbc, 0x83, 0x3b, + 0xb4, 0x01, 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03, 0x40, 0x0f, 0xf2, 0x50, + 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x90, 0x0e, 0xee, 0x60, + 0x0e, 0xf3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, + 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, + 0xbc, 0x43, 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3, 0x3c, 0xb4, 0x81, 0x39, + 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, + 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xf3, 0x90, + 0x0e, 0xe7, 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d, 0xa0, 0x0f, 0xe5, 0x20, + 0x0f, 0xef, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, + 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, + 0xb8, 0xc3, 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43, 0x38, 0xc0, 0x03, 0x3c, + 0xa4, 0x83, 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, + 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0x31, 0x0f, 0xf4, 0x10, + 0x0e, 0xe3, 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2, 0xf0, 0x0e, 0xf4, 0x50, + 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d, 0x20, 0x0e, 0xf5, 0x60, + 0x0e, 0xe6, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xfa, 0x50, + 0x0e, 0x00, 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3, 0x3c, 0x84, 0x83, 0x39, + 0x94, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, + 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x6c, 0x40, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x06, 0x90, 0x80, 0x6a, 0x83, 0x81, + 0x04, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x44, 0x00, 0x16, 0xa0, 0xda, 0x80, + 0x28, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x0c, 0x20, 0x01, 0xd5, 0x06, + 0x63, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0xc3, 0xc4, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x28, 0x80, 0x34, 0xb8, 0xc3, 0x3b, + 0xb4, 0x81, 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03, 0x3d, 0xa4, 0x83, 0x3b, + 0xcc, 0x03, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x41, 0x31, 0x21, 0x30, 0x26, + 0x0c, 0x07, 0x92, 0x4c, 0x18, 0x14, 0x24, 0x99, 0x10, 0x2c, 0x13, 0x02, + 0x06, 0x89, 0x20, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, + 0x4c, 0x10, 0x9c, 0xc1, 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, + 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, + 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x41, 0x84, 0x41, 0x38, 0x4a, 0x9a, 0x22, 0x4a, 0x98, 0xfc, + 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, 0xdf, 0x1e, 0xfe, 0x69, 0x8c, 0x00, + 0x18, 0x44, 0x28, 0x82, 0x8b, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x25, + 0x80, 0x79, 0x16, 0x22, 0xfa, 0xa7, 0x31, 0x02, 0x60, 0x10, 0xe1, 0x10, + 0xca, 0x11, 0x04, 0x81, 0x40, 0x18, 0x08, 0x25, 0xc3, 0x08, 0x03, 0x50, + 0x88, 0x65, 0x59, 0x16, 0x62, 0xca, 0x00, 0x00, 0x00, 0x39, 0x45, 0x00, + 0x00, 0x82, 0xca, 0x00, 0x2c, 0x0b, 0x49, 0xc5, 0x58, 0x16, 0x00, 0x00, + 0x00, 0xa2, 0xca, 0xb0, 0x2c, 0x0b, 0x59, 0x45, 0x58, 0x16, 0xc2, 0xe6, + 0x08, 0x82, 0x39, 0x02, 0x30, 0x18, 0x46, 0x10, 0xb6, 0x82, 0x04, 0x06, + 0x22, 0x68, 0x9c, 0x06, 0x50, 0x37, 0x10, 0x90, 0x02, 0xdb, 0x1c, 0x01, + 0x28, 0x0c, 0x22, 0x00, 0xc2, 0x14, 0xc0, 0x08, 0xc0, 0x30, 0xc2, 0xb0, + 0x0d, 0x23, 0x10, 0x1b, 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0, + 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, + 0x83, 0x76, 0x08, 0x87, 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80, + 0x03, 0x37, 0x88, 0x83, 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5, + 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, + 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, + 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, + 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, + 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, + 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, + 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, + 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, + 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, + 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, + 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, + 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, + 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, + 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, + 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, + 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, + 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, + 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, + 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, + 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, + 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, + 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, + 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, + 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, + 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, + 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, + 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x51, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x34, 0x40, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x61, 0x1e, 0x20, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x30, 0x11, 0x10, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x98, 0x09, 0x08, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x21, 0x4c, 0x85, 0x00, 0xc3, 0x00, 0x00, 0x00, + 0x10, 0x00, 0xc0, 0x10, 0xe6, 0x01, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x08, 0x73, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x84, 0xc9, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0xc2, 0x5c, 0x40, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x61, + 0x3c, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb2, 0x40, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, + 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xda, 0x46, 0x00, 0x0a, + 0xa1, 0x04, 0x8a, 0xa0, 0x20, 0x0a, 0xa8, 0x0c, 0x0a, 0xa3, 0x40, 0x0a, + 0xa5, 0x60, 0x0a, 0xa7, 0x14, 0x28, 0x2c, 0x9c, 0x11, 0x80, 0x42, 0x28, + 0x88, 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x02, 0xc7, 0x12, 0x1e, 0x01, + 0x00, 0x79, 0x18, 0x00, 0x00, 0x6f, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, + 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, + 0xb7, 0x21, 0xc6, 0xe6, 0x7c, 0x00, 0x18, 0x80, 0x01, 0x95, 0xbb, 0x31, + 0xb4, 0x30, 0xb9, 0xaf, 0xb9, 0x34, 0xbd, 0xb2, 0x21, 0xc6, 0xd6, 0x7c, + 0xc2, 0xc6, 0x30, 0x0e, 0x82, 0xe0, 0xe0, 0xd8, 0xca, 0x40, 0xda, 0xca, + 0xe8, 0xc2, 0xd8, 0x40, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0x40, + 0x66, 0x64, 0x60, 0x64, 0x66, 0x5c, 0x68, 0x60, 0x68, 0x40, 0x50, 0xda, + 0xca, 0xe8, 0xc2, 0xd8, 0xcc, 0xca, 0x5a, 0x66, 0x64, 0x60, 0x64, 0x66, + 0x5c, 0x68, 0x60, 0x68, 0x52, 0x86, 0x08, 0x1f, 0x31, 0xc4, 0xd8, 0x9a, + 0xed, 0xd9, 0x16, 0x16, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x43, 0x90, 0xef, + 0xd8, 0x9a, 0xad, 0xd9, 0x16, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, + 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x2f, + 0x21, 0x17, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, + 0xe6, 0x62, 0x16, 0x36, 0x47, 0xf7, 0xd5, 0x16, 0x46, 0x87, 0xf6, 0x55, + 0xe6, 0x16, 0x26, 0xc6, 0x56, 0x36, 0x44, 0xf8, 0x16, 0x96, 0x41, 0x58, + 0x9a, 0x9c, 0xcb, 0xd8, 0x5b, 0x1b, 0x5c, 0x1a, 0x5b, 0x99, 0x8b, 0x99, + 0x5c, 0x58, 0x5b, 0x99, 0x58, 0x9d, 0x99, 0x59, 0x99, 0xdc, 0x97, 0x59, + 0x19, 0xdd, 0x18, 0xda, 0x17, 0x59, 0xda, 0x5c, 0x98, 0x18, 0x5b, 0xd9, + 0x10, 0xe1, 0x6b, 0x18, 0x85, 0xa5, 0xc9, 0xb9, 0xc8, 0x95, 0xb9, 0x91, + 0x95, 0xc9, 0x7d, 0xd1, 0x85, 0xc9, 0x9d, 0x95, 0xd1, 0x31, 0x0a, 0x4b, + 0x93, 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x72, + 0x0b, 0x6b, 0x2b, 0xa3, 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x33, 0x04, + 0xf9, 0x9e, 0x6d, 0xf9, 0xa0, 0x2f, 0x1a, 0x22, 0x7c, 0x12, 0x99, 0xb0, + 0x34, 0x39, 0x17, 0xb8, 0xb7, 0xb9, 0x34, 0xba, 0xb4, 0x37, 0x37, 0x2a, + 0x61, 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x94, 0xc2, + 0xd2, 0xe4, 0x5c, 0xdc, 0xde, 0xbe, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca, + 0xc6, 0xe8, 0xd2, 0xec, 0xca, 0xc8, 0x84, 0xa5, 0xc9, 0xb9, 0x84, 0xc9, + 0x9d, 0x7d, 0xb9, 0x85, 0xb5, 0x95, 0x11, 0x81, 0x7b, 0x9b, 0x4b, 0xa3, + 0x4b, 0x7b, 0x73, 0x1b, 0x02, 0x6d, 0xcb, 0x47, 0x7d, 0xd5, 0x67, 0x7d, + 0xd0, 0x17, 0x7d, 0xd7, 0x87, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x31, 0x93, + 0x0b, 0x3b, 0x6b, 0x2b, 0x73, 0xa3, 0xfb, 0x4a, 0x73, 0x83, 0xab, 0xa3, + 0xa3, 0x75, 0x56, 0xe6, 0x56, 0x26, 0x17, 0x46, 0x57, 0x46, 0x86, 0x52, + 0x33, 0xf6, 0xc6, 0xf6, 0x26, 0x47, 0x64, 0x47, 0xf3, 0x65, 0x96, 0xc2, + 0x27, 0x2c, 0x4d, 0xce, 0x05, 0xae, 0x4c, 0x6e, 0x0e, 0xae, 0x6c, 0x8c, + 0x2e, 0xcd, 0xae, 0x8c, 0xc5, 0xd8, 0x1b, 0xdb, 0x9b, 0xdc, 0x10, 0x69, + 0x6b, 0x3e, 0xed, 0xdb, 0xbe, 0xea, 0xe3, 0x3e, 0xe8, 0x8b, 0xbe, 0xeb, + 0xeb, 0x98, 0x9d, 0x95, 0xb9, 0x95, 0xc9, 0x85, 0xd1, 0x95, 0x91, 0xa1, + 0xe0, 0xd0, 0x95, 0xe1, 0x8d, 0xbd, 0xbd, 0xc9, 0x91, 0x11, 0xd9, 0xc9, + 0x7c, 0x99, 0xa5, 0xd0, 0x30, 0x63, 0x7b, 0x0b, 0xa3, 0x93, 0x21, 0x42, + 0x57, 0x86, 0x37, 0xf6, 0xf6, 0x26, 0x47, 0x36, 0x44, 0xda, 0x9c, 0x4f, + 0xfb, 0xbe, 0xaf, 0xfa, 0xb8, 0x0f, 0xfa, 0xc0, 0xe0, 0xbb, 0xbe, 0x30, + 0xa0, 0x12, 0x96, 0x26, 0xe7, 0x22, 0x56, 0x67, 0x66, 0x56, 0x26, 0xc7, + 0x27, 0x2c, 0x4d, 0xce, 0x45, 0xac, 0xce, 0xcc, 0xac, 0x4c, 0xee, 0x6b, + 0x2e, 0x4d, 0xaf, 0x8c, 0x52, 0x58, 0x9a, 0x9c, 0x0b, 0xdb, 0xdb, 0x58, + 0x18, 0x5d, 0xda, 0x9b, 0xdb, 0x57, 0x9a, 0x1b, 0x59, 0x19, 0x1e, 0x91, + 0xb0, 0x34, 0x39, 0x17, 0xb9, 0xb2, 0x30, 0x32, 0x52, 0x61, 0x69, 0x72, + 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0xcc, 0xd8, 0xde, 0xc2, 0xe8, 0xc8, + 0xcc, 0x8d, 0x49, 0x1d, 0x09, 0x7d, 0xbd, 0xd5, 0xd1, 0xc1, 0xd5, 0xd1, + 0x91, 0xa1, 0x2b, 0xc3, 0xa3, 0xab, 0x93, 0x2b, 0xfb, 0xa2, 0xcb, 0x83, + 0x2b, 0xa3, 0x92, 0xe6, 0x06, 0x57, 0x47, 0xf7, 0x45, 0x97, 0x07, 0x57, + 0xc6, 0x65, 0xec, 0x8d, 0xed, 0x4d, 0xee, 0x6b, 0x6e, 0x2c, 0x8c, 0xad, + 0x8c, 0x0e, 0xdd, 0x9b, 0x5b, 0x59, 0x5b, 0x18, 0xdc, 0x57, 0x5b, 0x19, + 0x1d, 0xda, 0x1b, 0x19, 0x1f, 0xba, 0x37, 0xb7, 0xb2, 0xb6, 0x30, 0xb8, + 0x2f, 0xb3, 0xb0, 0x31, 0xba, 0x37, 0xb9, 0x18, 0x3e, 0x74, 0x6f, 0x6e, + 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, + 0x7c, 0xe6, 0xc8, 0xe4, 0xbe, 0xee, 0xd0, 0xd2, 0xe8, 0xca, 0xbe, 0xe0, + 0xde, 0xd2, 0xdc, 0xe8, 0x86, 0xc0, 0xc2, 0xb6, 0x6c, 0xcc, 0xb6, 0x7c, + 0x68, 0xf0, 0xa5, 0xc1, 0xc6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xa9, + 0xc1, 0xf6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xad, 0xc1, 0x26, 0x6d, + 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xb1, 0xc1, 0x36, 0x6d, 0xcc, 0xb6, 0x7c, + 0x68, 0xf0, 0xb5, 0xc1, 0x46, 0x6d, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xb9, + 0xc1, 0x56, 0x6d, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xbd, 0xc1, 0x66, 0x6d, + 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xc1, 0x01, 0xa3, 0xb0, 0x34, 0x39, 0x97, + 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0xaf, 0xb9, 0x34, 0xbd, + 0x32, 0x5e, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x7c, 0xa6, 0xd0, 0xc2, 0xc8, 0xca, 0xe4, 0x86, 0xde, 0xdc, 0xe6, + 0xe8, 0xc2, 0xdc, 0xe8, 0xe6, 0x18, 0x8c, 0x0d, 0x21, 0x83, 0x2d, 0xfa, + 0xc6, 0xe0, 0x23, 0x83, 0x0d, 0xfa, 0xca, 0x60, 0x5b, 0xb6, 0xe6, 0x33, + 0x83, 0xef, 0x0c, 0xbe, 0x38, 0xf8, 0xe4, 0x60, 0x83, 0xbe, 0x39, 0xd8, + 0x98, 0x0f, 0xfa, 0xe8, 0xe0, 0xbb, 0xbe, 0x3a, 0xe0, 0x12, 0x96, 0x26, + 0xe7, 0x42, 0x57, 0x86, 0x47, 0x57, 0x27, 0x57, 0x46, 0x25, 0x2c, 0x4d, + 0xce, 0x65, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x8c, 0x18, 0x5d, 0x19, 0x1e, + 0x5d, 0x9d, 0x5c, 0x99, 0x0c, 0x19, 0x8f, 0x19, 0xdb, 0x5b, 0x18, 0x1d, + 0x0b, 0xc8, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0x0f, 0x07, 0xba, 0x32, + 0xbc, 0x21, 0xd4, 0xc6, 0x7c, 0x77, 0xf0, 0x95, 0xc1, 0xb6, 0x6c, 0xcd, + 0x87, 0x07, 0x1f, 0xf4, 0xe5, 0xc1, 0x77, 0x7d, 0x7a, 0xc0, 0x25, 0x2c, + 0x4d, 0xce, 0x65, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x4c, 0x8e, 0xc7, 0x5c, + 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0x1c, 0x83, 0xb9, 0x21, 0xd2, 0x76, 0x7d, + 0x7c, 0xf0, 0x95, 0xc1, 0xb6, 0x6c, 0xcd, 0x07, 0x7d, 0x7d, 0xf0, 0x5d, + 0x9f, 0x1f, 0x0c, 0x61, 0xbe, 0xec, 0xf3, 0x3e, 0x31, 0xf8, 0xec, 0xe0, + 0xdb, 0x83, 0xef, 0x0f, 0x86, 0x18, 0x0a, 0xf0, 0x4d, 0x1f, 0x28, 0x70, + 0x0c, 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8, 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, + 0xc6, 0xde, 0xe0, 0xca, 0xe6, 0x50, 0xa6, 0x88, 0x98, 0xbe, 0x86, 0xde, + 0xe0, 0xf2, 0xbe, 0xcc, 0xe4, 0xc2, 0xce, 0xda, 0xca, 0xdc, 0xe8, 0x52, + 0x86, 0x10, 0xdf, 0x28, 0x7c, 0xa2, 0x40, 0x2c, 0x2c, 0x4d, 0xae, 0x25, + 0x8c, 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, 0x85, + 0xae, 0x0c, 0x8f, 0xae, 0x4e, 0xae, 0x6c, 0x6e, 0x88, 0xf1, 0x95, 0xc2, + 0x37, 0x0a, 0x1f, 0x29, 0x10, 0x0b, 0x4b, 0x93, 0x6b, 0x09, 0x63, 0x4b, + 0x0b, 0x9b, 0x6b, 0x99, 0x1b, 0x7b, 0x83, 0x2b, 0x6b, 0x99, 0x0b, 0x6b, + 0x83, 0x63, 0x2b, 0x93, 0x9b, 0x1b, 0x62, 0x7c, 0xa7, 0xf0, 0x8d, 0xc2, + 0x67, 0x0a, 0x43, 0x88, 0xaf, 0x14, 0xbe, 0x53, 0x60, 0xf5, 0xa5, 0x45, + 0x35, 0x15, 0x53, 0x33, 0x85, 0x16, 0x46, 0x56, 0x26, 0x37, 0xf4, 0xe6, + 0x36, 0x47, 0x17, 0xe6, 0x46, 0x37, 0xc7, 0xe7, 0xad, 0xcd, 0x2d, 0x0d, + 0xee, 0x8d, 0xae, 0xcc, 0x8d, 0x0e, 0x64, 0x0c, 0x2d, 0x4c, 0x8e, 0xcf, + 0x54, 0x5a, 0x1b, 0x1c, 0x5b, 0x19, 0xc8, 0xd0, 0xca, 0x0a, 0x08, 0x95, + 0x50, 0x50, 0xd0, 0x10, 0xe1, 0x5b, 0x85, 0x21, 0xc6, 0xa7, 0x0a, 0x1f, + 0x2b, 0x84, 0x41, 0x36, 0xc4, 0xf8, 0xd0, 0xe0, 0x6b, 0x85, 0x30, 0xc8, + 0x86, 0x88, 0xc1, 0x97, 0x0a, 0x9f, 0x2b, 0x84, 0x41, 0xf6, 0xb9, 0x42, + 0x18, 0x68, 0x9f, 0x2b, 0x84, 0xc1, 0xf6, 0xb9, 0x42, 0x18, 0x70, 0x9f, + 0x2b, 0x84, 0x41, 0xf7, 0xb9, 0x42, 0x18, 0x78, 0x9f, 0x2b, 0x84, 0xc1, + 0xf7, 0xb9, 0x42, 0x18, 0x60, 0x43, 0x8c, 0xef, 0x15, 0x3e, 0x57, 0x08, + 0x83, 0x6d, 0x88, 0xf1, 0xbd, 0xc2, 0xe7, 0x0a, 0x61, 0x80, 0x0d, 0x31, + 0xbe, 0x57, 0xf8, 0x5c, 0x21, 0x0c, 0xba, 0x21, 0xc6, 0xf7, 0x0a, 0x9f, + 0x2b, 0x84, 0x81, 0x37, 0xc4, 0xf8, 0x5e, 0xe1, 0x73, 0x85, 0x30, 0xf8, + 0x86, 0x18, 0xdf, 0x2b, 0x7c, 0xae, 0x10, 0x06, 0xda, 0x10, 0xe3, 0x7b, + 0x85, 0xcf, 0x15, 0xc2, 0x80, 0x1b, 0x62, 0x7c, 0xaf, 0xf0, 0xb9, 0x42, + 0x18, 0x64, 0x23, 0x22, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, + 0x87, 0x77, 0x20, 0x87, 0x7a, 0x60, 0x87, 0x72, 0x70, 0x03, 0x73, 0x60, + 0x87, 0x70, 0x38, 0x87, 0x79, 0x98, 0x22, 0x04, 0xc3, 0x08, 0x85, 0x1d, + 0xd8, 0xc1, 0x1e, 0xda, 0xc1, 0x0d, 0xd2, 0x81, 0x1c, 0xca, 0xc1, 0x1d, + 0xe8, 0x61, 0x4a, 0x50, 0x8c, 0x58, 0xc2, 0x21, 0x1d, 0xe4, 0xc1, 0x0d, + 0xec, 0xa1, 0x1c, 0xe4, 0x61, 0x1e, 0xd2, 0xe1, 0x1d, 0xdc, 0x61, 0x4a, + 0x60, 0x8c, 0xa0, 0xc2, 0x21, 0x1d, 0xe4, 0xc1, 0x0d, 0xd8, 0x21, 0x1c, + 0xdc, 0xe1, 0x1c, 0xea, 0x21, 0x1c, 0xce, 0xa1, 0x1c, 0x7e, 0xc1, 0x1e, + 0xca, 0x41, 0x1e, 0xe6, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0xa6, 0x04, 0xc8, + 0x88, 0x29, 0x1c, 0xd2, 0x41, 0x1e, 0xdc, 0x60, 0x1c, 0xde, 0xa1, 0x1d, + 0xe0, 0x21, 0x1d, 0xd8, 0xa1, 0x1c, 0x7e, 0xe1, 0x1d, 0xe0, 0x81, 0x1e, + 0xd2, 0xe1, 0x1d, 0xdc, 0x61, 0x1e, 0xa6, 0x0c, 0x0a, 0xe3, 0x8c, 0x60, + 0xc2, 0x21, 0x1d, 0xe4, 0xc1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xe1, 0x1c, + 0xda, 0xa1, 0x1c, 0xdc, 0x81, 0x1e, 0xa6, 0x04, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, @@ -1956,61 +1177,1356 @@ const unsigned char sdl_metallib[] = { 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x1b, 0x00, 0x00, 0x00, 0x46, 0x10, 0x06, 0x00, 0x12, 0xf9, 0x12, - 0xc0, 0x3c, 0x0b, 0xf1, 0x4f, 0xc4, 0x35, 0x51, 0x11, 0xf1, 0xdb, 0xc3, - 0x0f, 0x44, 0x11, 0x80, 0xf9, 0x15, 0x5e, 0xdc, 0xb6, 0x0d, 0x34, 0x00, - 0x12, 0xf9, 0x83, 0x33, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x15, 0x6c, 0x00, - 0x12, 0xf9, 0x12, 0xc0, 0x3c, 0x0b, 0xf1, 0x4f, 0xc4, 0x35, 0x51, 0x11, - 0xf1, 0xdb, 0x83, 0x5f, 0xe1, 0xc5, 0x6d, 0x5b, 0x00, 0x04, 0x20, 0x91, - 0x5f, 0x00, 0xd2, 0xf4, 0x3f, 0x8e, 0xe5, 0x17, 0xb7, 0x6d, 0x00, 0x10, - 0xdb, 0x95, 0xbf, 0xec, 0xbe, 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34, 0x93, - 0x09, 0x44, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0x7f, 0x01, 0x04, 0x92, - 0x5f, 0xdc, 0x36, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x85, 0x00, 0x00, - 0x00, 0x13, 0x04, 0x4c, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, - 0x00, 0x94, 0xce, 0x41, 0x18, 0x87, 0x12, 0x07, 0x34, 0x16, 0x41, 0x09, - 0x50, 0x38, 0x02, 0x30, 0xc7, 0x60, 0xc4, 0x41, 0x1c, 0x8c, 0x35, 0x00, - 0x81, 0x40, 0xda, 0x08, 0x00, 0x65, 0x23, 0x00, 0x35, 0x40, 0xd8, 0x0c, - 0x00, 0x15, 0x33, 0x00, 0x14, 0xcc, 0x00, 0xcc, 0x00, 0x10, 0x30, 0x46, - 0x00, 0x82, 0x20, 0x88, 0x7f, 0x63, 0x04, 0x3a, 0x6b, 0xce, 0x21, 0x18, - 0x8c, 0x11, 0xbc, 0x7b, 0x5a, 0xde, 0xdf, 0x18, 0x81, 0xdb, 0xc7, 0xa2, - 0xed, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0x79, 0xaf, - 0xab, 0xec, 0x8d, 0x00, 0x00, 0x23, 0x06, 0x0a, 0x11, 0xdc, 0xc1, 0x55, - 0x69, 0x8c, 0xd3, 0x04, 0x23, 0x06, 0x0b, 0x11, 0xe4, 0xc1, 0x65, 0x6d, - 0x77, 0xd0, 0x3c, 0x8e, 0x30, 0x86, 0x10, 0xe0, 0xc1, 0x20, 0xc3, 0xc0, - 0x4c, 0x73, 0x0c, 0x81, 0x90, 0x07, 0x23, 0x06, 0x0b, 0x11, 0xf4, 0xc1, - 0xa6, 0x7d, 0x7a, 0x10, 0x4d, 0x92, 0x31, 0x86, 0x10, 0xf0, 0xc1, 0x1c, - 0xc3, 0x10, 0xe4, 0xc1, 0x81, 0x81, 0xb8, 0x14, 0x94, 0x41, 0x86, 0x40, - 0xca, 0x8c, 0x08, 0xe0, 0x33, 0xde, 0x40, 0x06, 0x70, 0x10, 0x0a, 0x17, - 0x88, 0x4b, 0x41, 0x19, 0x64, 0x08, 0x2e, 0x6f, 0xc4, 0xa0, 0x28, 0x82, - 0x54, 0x28, 0x82, 0x39, 0x06, 0x2d, 0x38, 0x85, 0xf1, 0x0a, 0x35, 0xb0, - 0x83, 0x53, 0x40, 0x05, 0x32, 0xb8, 0x40, 0x5c, 0x0a, 0xca, 0x20, 0x43, - 0xd0, 0x91, 0xc1, 0x88, 0x41, 0x51, 0x04, 0xaf, 0xb0, 0x04, 0x73, 0x0c, - 0x46, 0xc0, 0x0a, 0xe3, 0x15, 0x70, 0xc0, 0x07, 0xad, 0xe0, 0x0a, 0x6b, - 0x70, 0x81, 0xb8, 0x14, 0x94, 0x41, 0x86, 0x60, 0x0c, 0xd4, 0x60, 0xc4, - 0xa0, 0x28, 0x82, 0x5a, 0x88, 0x82, 0x39, 0x06, 0x23, 0x78, 0x85, 0xf1, - 0x86, 0x3b, 0x10, 0x05, 0x5a, 0xa0, 0x60, 0x8c, 0x37, 0xe4, 0x01, 0x29, - 0xb8, 0x02, 0x05, 0x63, 0xb8, 0x61, 0x18, 0x03, 0x67, 0x96, 0x21, 0x58, - 0x82, 0xe1, 0x86, 0xa9, 0x0c, 0x94, 0x59, 0x86, 0x41, 0x08, 0x8c, 0x3a, - 0x03, 0xf9, 0xcc, 0x12, 0x10, 0x56, 0xa5, 0x01, 0x7c, 0x46, 0x0c, 0x88, - 0x22, 0x00, 0x87, 0xc0, 0x02, 0x36, 0x90, 0xcf, 0x88, 0x41, 0x51, 0x04, - 0xe3, 0x10, 0xb8, 0xc1, 0x2c, 0x01, 0x31, 0x50, 0x01, 0x28, 0x82, 0x30, - 0xcc, 0x31, 0xcc, 0x41, 0x00, 0x0e, 0xc3, 0x0d, 0x55, 0x1b, 0x28, 0xb3, - 0x0c, 0x46, 0x11, 0x98, 0xf5, 0x06, 0xf2, 0x99, 0x25, 0x38, 0xec, 0x8a, - 0x03, 0xf8, 0x8c, 0x18, 0x10, 0x45, 0x80, 0x0e, 0x81, 0x05, 0x74, 0x20, - 0x9f, 0x11, 0x83, 0xa2, 0x08, 0xd6, 0x21, 0xb0, 0x83, 0x59, 0x82, 0x63, - 0xa0, 0x02, 0x50, 0x0a, 0xc1, 0x98, 0x63, 0x40, 0x82, 0x73, 0x18, 0x6e, - 0xb8, 0xea, 0x40, 0x99, 0x65, 0x48, 0x90, 0xc0, 0xb0, 0x3b, 0x90, 0xcf, - 0x2c, 0x81, 0x62, 0x59, 0x1e, 0xc0, 0x67, 0xc4, 0x80, 0x28, 0x02, 0x78, - 0x08, 0x2c, 0xe0, 0x03, 0xf9, 0x8c, 0x18, 0x14, 0x45, 0x30, 0x0f, 0x81, - 0x1f, 0xcc, 0x12, 0x28, 0x03, 0x15, 0x80, 0x82, 0x08, 0xc9, 0x1c, 0x03, - 0x12, 0xb0, 0xc3, 0x2c, 0xc1, 0x32, 0x50, 0x11, 0x08, 0x0a, 0x1f, 0x00, - 0x83, 0x0c, 0x01, 0x29, 0xac, 0xc2, 0x1c, 0xc3, 0x29, 0x70, 0xf3, 0x30, - 0xc8, 0x10, 0xa0, 0xc2, 0x2b, 0xd8, 0x10, 0xc8, 0x67, 0x90, 0x21, 0x50, - 0x05, 0x5a, 0x98, 0x63, 0x08, 0x50, 0xe1, 0x1d, 0x2c, 0xe8, 0x05, 0xf9, - 0x64, 0x10, 0x10, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x5b, 0x06, 0xe0, - 0x98, 0x85, 0x2d, 0x43, 0x70, 0xcc, 0xc2, 0x96, 0xa1, 0x38, 0x66, 0x61, - 0xcb, 0xf0, 0x05, 0xbb, 0xb0, 0x65, 0x08, 0x83, 0x80, 0x17, 0x00, 0x00, + 0x00, 0x2e, 0x00, 0x00, 0x00, 0x06, 0x10, 0xb1, 0x5d, 0xf9, 0x73, 0xce, + 0x83, 0xfd, 0x45, 0x04, 0x18, 0x0c, 0xd1, 0x4c, 0x56, 0x90, 0xfd, 0x73, + 0x6d, 0x6b, 0xcf, 0xb3, 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74, 0xd5, + 0xfd, 0x17, 0x45, 0x51, 0x14, 0x46, 0xd0, 0x00, 0x48, 0xe4, 0x0f, 0xce, + 0xe4, 0x57, 0x77, 0x71, 0xdb, 0xa6, 0xb0, 0x01, 0x48, 0xe4, 0x4b, 0x00, + 0xf3, 0x2c, 0xc4, 0x3f, 0x11, 0xd7, 0x44, 0x45, 0xc4, 0x6f, 0x0f, 0x7e, + 0x85, 0x17, 0xb7, 0x6d, 0x08, 0x13, 0x80, 0x44, 0x7e, 0x01, 0x48, 0xd3, + 0x5f, 0x00, 0x81, 0xe4, 0x57, 0x77, 0x71, 0xdb, 0x16, 0x40, 0x01, 0x48, + 0xe4, 0x17, 0x80, 0x34, 0xfd, 0xc2, 0x02, 0x30, 0x8f, 0x5f, 0xdd, 0xc5, + 0x6d, 0x5b, 0xc2, 0x04, 0x20, 0x91, 0x5f, 0x00, 0xd2, 0xf4, 0x17, 0x0c, + 0x70, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x09, 0x40, 0x00, 0x12, 0xf9, 0x05, + 0x20, 0x4d, 0xff, 0xe3, 0x58, 0x7e, 0x71, 0xdb, 0x36, 0x10, 0x01, 0x48, + 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, 0x10, 0x48, 0x7e, 0x71, 0xdb, 0x66, + 0x10, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, 0x03, 0x5c, 0x7e, + 0x71, 0xdb, 0x76, 0x20, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x8f, + 0x63, 0xf9, 0xd5, 0x5d, 0xdc, 0x36, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x99, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00, + 0x00, 0x51, 0x00, 0x00, 0x00, 0x64, 0x8e, 0x45, 0x00, 0x81, 0x70, 0xcc, + 0x41, 0x2c, 0x8d, 0xd3, 0x06, 0x54, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, + 0x40, 0xdc, 0x08, 0x00, 0x6d, 0xc5, 0x30, 0x03, 0x50, 0x0e, 0xa4, 0x8d, + 0x00, 0xd4, 0x00, 0x01, 0x63, 0x04, 0xef, 0x9e, 0x96, 0xf7, 0x37, 0x46, + 0xa0, 0xb3, 0xe6, 0x1c, 0x82, 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x09, + 0x06, 0x63, 0x04, 0x20, 0x08, 0x82, 0x20, 0x18, 0xcc, 0x00, 0x50, 0x30, + 0x03, 0x30, 0x03, 0x30, 0x07, 0x91, 0x0a, 0xaf, 0x90, 0x0a, 0x75, 0x40, + 0xcb, 0x0c, 0xc0, 0x08, 0xc0, 0x0c, 0xc0, 0x58, 0x03, 0x08, 0x82, 0x20, + 0xfe, 0x81, 0x20, 0x08, 0xe2, 0x1f, 0x08, 0x82, 0x20, 0xfe, 0x8d, 0x35, + 0xb0, 0xed, 0xfc, 0x93, 0x1e, 0xdb, 0xce, 0x3f, 0xe9, 0xb1, 0xed, 0xfc, + 0x93, 0xde, 0x58, 0x03, 0x08, 0x82, 0x6c, 0xfd, 0x0b, 0x20, 0x08, 0xb2, + 0xf5, 0x2f, 0x80, 0x20, 0xc8, 0xd6, 0xbf, 0x30, 0xd6, 0x00, 0x82, 0xe0, + 0x9a, 0x83, 0x01, 0x08, 0x82, 0x6b, 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, + 0x18, 0x8c, 0x35, 0x80, 0x20, 0xdd, 0xe6, 0x60, 0x00, 0x82, 0x74, 0x9b, + 0x83, 0x01, 0x08, 0xd2, 0x6d, 0x0e, 0x06, 0x63, 0x0d, 0xeb, 0x88, 0xc7, + 0x2c, 0x18, 0xac, 0x23, 0x1e, 0xb3, 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, + 0xc1, 0x58, 0x03, 0x08, 0xc2, 0x78, 0x38, 0x06, 0x20, 0x08, 0xe3, 0xe1, + 0x18, 0x80, 0x20, 0x8c, 0x87, 0x63, 0x30, 0xd6, 0x20, 0xe6, 0x62, 0xda, + 0x7f, 0x60, 0xc9, 0xb3, 0xf1, 0x2f, 0x8c, 0xe9, 0xaa, 0xe6, 0xbe, 0x30, + 0xd6, 0xf0, 0xcf, 0xa4, 0xff, 0xfb, 0x02, 0x5d, 0x83, 0x62, 0xfe, 0xb5, + 0x70, 0x1c, 0x83, 0xbe, 0x30, 0xd6, 0x30, 0xf7, 0x6d, 0x9a, 0xfa, 0x42, + 0xeb, 0x86, 0x3c, 0xef, 0x0b, 0x7c, 0xce, 0xfa, 0xf8, 0x47, 0xc0, 0x18, + 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, + 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0x80, 0x20, 0x08, 0xe2, + 0xdf, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c, + 0xba, 0xf8, 0x37, 0x46, 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2, + 0xe8, 0xf6, 0x34, 0x18, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x06, 0x4a, 0x11, 0x98, 0xc2, 0x1a, + 0xa8, 0x41, 0x1b, 0x80, 0x41, 0x19, 0x84, 0x41, 0x30, 0xde, 0xd0, 0x06, + 0x78, 0x30, 0x0a, 0x14, 0x8c, 0xe1, 0x86, 0x00, 0x0c, 0x82, 0x59, 0x86, + 0x40, 0x08, 0x06, 0x19, 0x08, 0x4f, 0x0d, 0xc6, 0x1b, 0xe2, 0x80, 0x0f, + 0xce, 0x80, 0x82, 0x31, 0x62, 0x40, 0x18, 0xc1, 0x2b, 0x0c, 0x23, 0x06, + 0x85, 0x11, 0xc4, 0x42, 0xb0, 0x59, 0xb0, 0xc1, 0x67, 0xc4, 0xa0, 0x30, + 0x82, 0x58, 0x08, 0xc0, 0xc0, 0x06, 0x4e, 0x3e, 0xc6, 0x05, 0xf1, 0xb1, + 0x21, 0xa0, 0xcf, 0x88, 0x01, 0x61, 0x04, 0xb6, 0x10, 0x8c, 0x18, 0x14, + 0x46, 0x80, 0x0b, 0x81, 0x67, 0x81, 0x27, 0x9f, 0x39, 0x06, 0x34, 0x58, + 0x6c, 0x61, 0x90, 0x21, 0x48, 0x83, 0x3c, 0xb0, 0x21, 0xa0, 0xcf, 0x20, + 0x43, 0xb0, 0x06, 0x7c, 0x30, 0xc8, 0x10, 0x54, 0x7e, 0x30, 0x4b, 0x20, + 0x0c, 0x54, 0x04, 0x42, 0xc0, 0x06, 0xc0, 0x78, 0xc3, 0x28, 0xb8, 0xc2, + 0x2e, 0x50, 0x30, 0x86, 0x1b, 0x02, 0xcd, 0x99, 0x65, 0x18, 0x88, 0x60, + 0x90, 0x81, 0xa0, 0x03, 0x50, 0x18, 0x6f, 0x38, 0x05, 0x59, 0xa0, 0x05, + 0x0a, 0xc6, 0x78, 0x43, 0x2a, 0xd0, 0x42, 0x28, 0x50, 0x30, 0x46, 0x0c, + 0x90, 0x23, 0x52, 0x87, 0xa2, 0x3b, 0x86, 0x60, 0x90, 0x21, 0xb8, 0x03, + 0x54, 0x18, 0x64, 0x08, 0x16, 0x55, 0x98, 0x25, 0x20, 0x06, 0x2a, 0x02, + 0x61, 0xc0, 0x84, 0xe1, 0x86, 0x30, 0x50, 0x83, 0x60, 0x96, 0xa1, 0x98, + 0x82, 0xf1, 0x06, 0x58, 0xd8, 0x85, 0x73, 0xa0, 0x60, 0x0c, 0x37, 0x04, + 0x6d, 0x10, 0xcc, 0x32, 0x18, 0x47, 0x30, 0xc8, 0x50, 0x84, 0x42, 0x2b, + 0x8c, 0x37, 0xd0, 0xc2, 0x2f, 0x9c, 0x03, 0x05, 0x63, 0x8e, 0x21, 0x14, + 0x82, 0x77, 0x18, 0x64, 0x08, 0x44, 0x41, 0x16, 0x2c, 0x28, 0xe4, 0x33, + 0xc8, 0x10, 0x90, 0x42, 0x2d, 0xcc, 0x12, 0xb4, 0xc1, 0x78, 0x83, 0x2e, + 0x94, 0xc3, 0x3c, 0x50, 0x30, 0xc6, 0x1b, 0x78, 0xe1, 0x1c, 0xde, 0x81, + 0x82, 0x31, 0xc8, 0x00, 0xb1, 0x82, 0x2e, 0x0c, 0x37, 0x10, 0x74, 0xe0, + 0xcc, 0x32, 0x20, 0x52, 0x30, 0x86, 0x20, 0xe5, 0xc3, 0x70, 0x43, 0xd0, + 0x07, 0xca, 0x2c, 0x83, 0x92, 0x04, 0x26, 0xfc, 0x81, 0x7c, 0x66, 0x09, + 0x16, 0x1b, 0x42, 0x01, 0x3e, 0x23, 0x06, 0x84, 0x11, 0x94, 0x44, 0x60, + 0x01, 0x2e, 0xc8, 0x67, 0xc4, 0xa0, 0x30, 0x02, 0x94, 0x08, 0x70, 0x61, + 0x96, 0x60, 0x19, 0xa8, 0x00, 0x94, 0x44, 0x50, 0xe6, 0x18, 0x6a, 0x21, + 0x08, 0x89, 0x31, 0x84, 0x0d, 0x24, 0x86, 0x1b, 0x02, 0x53, 0x50, 0x66, + 0x19, 0x1a, 0x26, 0x30, 0x01, 0x15, 0xe4, 0x33, 0x4b, 0xe0, 0xd8, 0xa0, + 0x0a, 0xf0, 0x19, 0x31, 0x20, 0x8c, 0xc0, 0x25, 0x02, 0x0b, 0xc2, 0x41, + 0x3e, 0x23, 0x06, 0x85, 0x11, 0xc4, 0x44, 0x10, 0x0e, 0xb3, 0x04, 0xce, + 0x40, 0x05, 0xa0, 0x30, 0x42, 0x33, 0xc7, 0x90, 0x04, 0x28, 0x31, 0x86, + 0x40, 0x06, 0x28, 0x31, 0xdc, 0x10, 0xbc, 0x82, 0x32, 0xcb, 0x00, 0x3d, + 0x81, 0x09, 0xb1, 0x20, 0x9f, 0x59, 0x82, 0xc8, 0x86, 0x59, 0x80, 0xcf, + 0x88, 0x01, 0x61, 0x04, 0x37, 0x11, 0x58, 0xa0, 0x0e, 0xf2, 0x19, 0x31, + 0x28, 0x8c, 0x40, 0x27, 0x02, 0x75, 0x98, 0x25, 0x88, 0x06, 0x2a, 0x00, + 0xe5, 0x11, 0xa0, 0x39, 0x86, 0x24, 0x80, 0x89, 0x59, 0x02, 0x69, 0xa0, + 0x22, 0x10, 0x22, 0x3d, 0x38, 0x06, 0x19, 0x02, 0x75, 0xb0, 0x87, 0x39, + 0x06, 0x74, 0x00, 0x03, 0x9b, 0x18, 0x64, 0x08, 0xd2, 0x21, 0x1f, 0x6c, + 0x08, 0xe4, 0x33, 0xc8, 0x10, 0xac, 0x03, 0x3f, 0xcc, 0x12, 0xb4, 0xc1, + 0x70, 0xc3, 0x2c, 0xc4, 0x43, 0x30, 0xcb, 0x40, 0x81, 0x41, 0x30, 0xc8, + 0x40, 0x07, 0xf0, 0xc0, 0x0f, 0xe3, 0x0d, 0x23, 0xe1, 0x12, 0x3c, 0x41, + 0xc1, 0x18, 0x6f, 0x28, 0x09, 0x98, 0xc0, 0x09, 0x0a, 0xc6, 0x1c, 0x83, + 0x3c, 0x04, 0x60, 0x31, 0xc8, 0x10, 0xcc, 0xc3, 0x48, 0x58, 0x70, 0xc8, + 0x67, 0x90, 0x21, 0xa8, 0x07, 0x93, 0x18, 0x6e, 0x38, 0xc0, 0xc1, 0x99, + 0x65, 0xf8, 0xaa, 0x60, 0x0c, 0x61, 0x28, 0x8b, 0xe1, 0x86, 0x60, 0x1c, + 0x94, 0x59, 0x86, 0xcb, 0x0a, 0x4c, 0x28, 0x07, 0xf9, 0xcc, 0x12, 0x60, + 0x23, 0x06, 0x84, 0x11, 0xc0, 0xc5, 0x30, 0x62, 0x50, 0x18, 0x81, 0x5c, + 0x04, 0xe8, 0x60, 0x81, 0x3a, 0xc8, 0xc7, 0x02, 0x76, 0x80, 0xcf, 0x2c, + 0x01, 0x36, 0x50, 0x01, 0x28, 0x96, 0x70, 0xcd, 0x31, 0xf4, 0x43, 0xd0, + 0x16, 0x63, 0x08, 0x0c, 0x5b, 0x0c, 0x37, 0x04, 0xec, 0xa0, 0xcc, 0x32, + 0x68, 0x59, 0x60, 0x82, 0x3b, 0xc8, 0x67, 0x96, 0x60, 0x1b, 0x31, 0x20, + 0x8c, 0x20, 0x2f, 0x86, 0x11, 0x83, 0xc2, 0x08, 0xf6, 0x22, 0x88, 0x07, + 0x0b, 0xe6, 0x41, 0x3e, 0x16, 0xd4, 0x03, 0x7c, 0x66, 0x09, 0xb6, 0x81, + 0x0a, 0x40, 0xc9, 0x04, 0x6d, 0x8e, 0x21, 0x09, 0xe8, 0x62, 0x0c, 0xa1, + 0xa2, 0x8b, 0xe1, 0x86, 0xa0, 0x1e, 0x94, 0x59, 0x86, 0x8e, 0x0b, 0x4c, + 0xb8, 0x07, 0xf9, 0xcc, 0x12, 0x78, 0x23, 0x06, 0x84, 0x11, 0x88, 0xc6, + 0x30, 0x62, 0x50, 0x18, 0x01, 0x69, 0x04, 0xfa, 0x60, 0x01, 0x3f, 0xc8, + 0xc7, 0x02, 0x7f, 0x80, 0xcf, 0x2c, 0x81, 0x37, 0x50, 0x01, 0x28, 0x9c, + 0xd0, 0xcd, 0x31, 0x24, 0x01, 0x5f, 0x8c, 0x18, 0x18, 0x46, 0xa0, 0x1a, + 0x41, 0x4c, 0xbc, 0xc4, 0x20, 0x43, 0x30, 0x13, 0x64, 0x31, 0x4b, 0xf0, + 0x0d, 0x54, 0x04, 0x7e, 0x40, 0x09, 0xde, 0x20, 0x43, 0x80, 0x13, 0x66, + 0x31, 0x4b, 0xd0, 0x06, 0xb3, 0x0c, 0x61, 0xd0, 0x06, 0xfc, 0x30, 0xc8, + 0xd0, 0x0b, 0x39, 0x51, 0x16, 0x23, 0x06, 0x85, 0x11, 0xb0, 0x46, 0xd0, + 0x12, 0x73, 0x0c, 0x36, 0x11, 0x98, 0xc6, 0x88, 0x41, 0x61, 0x04, 0xae, + 0x31, 0xb8, 0xc4, 0x1c, 0x83, 0x10, 0x98, 0xc6, 0x88, 0x41, 0x61, 0x04, + 0xb0, 0x51, 0xbc, 0xc4, 0x1c, 0x83, 0x10, 0x9c, 0xc6, 0x20, 0x43, 0xd0, + 0x13, 0x6e, 0x31, 0xc8, 0x10, 0x94, 0x03, 0x5c, 0x8c, 0x37, 0xd0, 0xc5, + 0x5f, 0xb4, 0x06, 0x05, 0x63, 0xbc, 0xc1, 0x2e, 0x42, 0x23, 0x35, 0x28, + 0x18, 0x73, 0x0c, 0x63, 0x11, 0xc4, 0xc6, 0x20, 0x43, 0x40, 0x16, 0x74, + 0x61, 0x41, 0x22, 0x9f, 0x41, 0x86, 0xc0, 0x2c, 0xee, 0x62, 0xb8, 0xe1, + 0x88, 0x09, 0x67, 0x96, 0x81, 0x0d, 0xc4, 0x20, 0x18, 0x43, 0x18, 0x6c, + 0x63, 0xb8, 0x21, 0xa0, 0x09, 0x65, 0x96, 0x81, 0x0c, 0xc6, 0x20, 0x30, + 0xc1, 0x26, 0xe4, 0x33, 0x4b, 0x50, 0x06, 0x23, 0x06, 0x84, 0x11, 0x84, + 0xc7, 0x30, 0x62, 0x50, 0x18, 0xc1, 0x78, 0x04, 0x39, 0x61, 0xc1, 0x4e, + 0xc8, 0xc7, 0x82, 0x9e, 0x80, 0xcf, 0x2c, 0x41, 0x19, 0x0c, 0x54, 0x00, + 0xca, 0x18, 0x08, 0x64, 0x30, 0xc7, 0xe0, 0x16, 0x81, 0x6f, 0x8c, 0x21, + 0x30, 0xbd, 0x31, 0xdc, 0x10, 0xf4, 0x84, 0x32, 0xcb, 0x70, 0x06, 0x66, + 0x10, 0x98, 0xf0, 0x13, 0xf2, 0x99, 0x25, 0x40, 0x83, 0x11, 0x03, 0xc2, + 0x08, 0xd4, 0x63, 0x18, 0x31, 0x28, 0x8c, 0x80, 0x3d, 0x02, 0xb1, 0xb0, + 0x80, 0x2c, 0xe4, 0x63, 0x81, 0x59, 0xc0, 0x67, 0x96, 0x00, 0x0d, 0x06, + 0x2a, 0x00, 0xc5, 0x0c, 0x84, 0x33, 0x98, 0x63, 0x48, 0x82, 0xf2, 0x18, + 0x43, 0xa8, 0xca, 0x63, 0xb8, 0x21, 0x30, 0x0b, 0x65, 0x96, 0x41, 0x0d, + 0xd2, 0x20, 0x30, 0x01, 0x2d, 0xe4, 0x33, 0x4b, 0xb0, 0x06, 0x23, 0x06, + 0x84, 0x11, 0xcc, 0xc7, 0x30, 0x62, 0x50, 0x18, 0x41, 0x7d, 0x04, 0x6b, + 0x61, 0x41, 0x5b, 0xc8, 0xc7, 0x82, 0xb7, 0x80, 0xcf, 0x2c, 0xc1, 0x1a, + 0x0c, 0x54, 0x00, 0x4a, 0x1a, 0x08, 0x6a, 0x30, 0xc7, 0x90, 0x04, 0xed, + 0x31, 0x62, 0x60, 0x18, 0xc1, 0x7e, 0x04, 0xa2, 0x01, 0x1a, 0x83, 0x0c, + 0x01, 0x69, 0xd4, 0xc6, 0x2c, 0x01, 0x1b, 0x0c, 0x54, 0x04, 0x7e, 0x10, + 0x06, 0xc2, 0x1a, 0x0c, 0x32, 0x04, 0xa9, 0x71, 0x1b, 0xb3, 0x04, 0x6d, + 0x30, 0xd0, 0x12, 0xf0, 0x88, 0xc1, 0x23, 0x12, 0x8f, 0x7c, 0xb2, 0xc0, + 0x06, 0x3c, 0x02, 0x06, 0x03, 0x2d, 0x01, 0x8a, 0x18, 0x7a, 0x21, 0x99, + 0xc3, 0x47, 0xb0, 0x81, 0xcc, 0x80, 0xc1, 0x20, 0x43, 0x20, 0xec, 0x86, + 0x05, 0xe1, 0x21, 0x9f, 0x0c, 0xc2, 0x81, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0xd7, 0xd2, 0x07, 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4, + 0x50, 0x13, 0xe7, 0x2c, 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d, + 0x9b, 0x6d, 0x29, 0x38, 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b, + 0x00, 0x03, 0x11, 0x71, 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71, + 0x21, 0x13, 0x00, 0x00, 0x00, 0x01, 0x31, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0x5b, 0x06, 0xe0, 0x40, 0x85, 0x2d, 0x83, 0x10, 0xc0, 0xc2, 0x96, + 0xe1, 0x08, 0x62, 0x61, 0xcb, 0xa0, 0x05, 0xb2, 0xb0, 0x65, 0xf8, 0x82, + 0x59, 0xd8, 0x32, 0x84, 0x41, 0x40, 0x0b, 0x5b, 0x06, 0x35, 0x08, 0x6a, + 0x61, 0xcb, 0xf0, 0x06, 0x81, 0x2d, 0x6c, 0x19, 0xec, 0x20, 0xb8, 0x85, + 0x2d, 0x03, 0x1e, 0x04, 0xb6, 0xb0, 0x65, 0x60, 0x87, 0xe0, 0x16, 0xb6, + 0x0c, 0xee, 0x10, 0xd8, 0xc2, 0x96, 0x41, 0x2d, 0x82, 0x5b, 0xd8, 0x32, + 0xb0, 0x45, 0x60, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x64, 0xce, 0x41, 0x2c, 0x8d, 0x93, 0x06, + 0x54, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xdb, 0x0c, 0x00, 0x05, + 0x33, 0x00, 0xb4, 0xcc, 0x00, 0x8c, 0x35, 0xb0, 0xec, 0x19, 0xca, 0x1f, + 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce, 0xde, 0x58, 0x83, 0x5e, + 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf, 0xdb, 0xa7, 0xf4, 0xe8, + 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a, 0xc2, 0xe8, 0xee, 0xdd, + 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25, + 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f, + 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c, + 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2, + 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05, 0x33, 0x00, 0x04, 0x8c, + 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82, + 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5, 0x02, 0x0d, 0x37, 0x50, + 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43, 0x43, 0xb5, 0xc1, 0x20, + 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64, 0x08, 0xa0, 0x6a, 0x96, + 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61, 0x48, 0x82, 0xe1, 0x86, + 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31, 0x28, 0x8c, 0x40, 0x0f, + 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xe8, 0x60, 0xc4, 0xa0, 0x30, 0x02, 0x3e, + 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xa0, 0x83, 0x11, 0x83, 0xc2, 0x08, 0xfc, + 0x20, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xa8, 0x83, 0x59, 0x82, 0x62, 0xa0, + 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xf4, 0x60, 0x0c, 0x41, 0xc8, + 0x83, 0x31, 0x84, 0x21, 0x0f, 0x46, 0x0c, 0x0a, 0x23, 0x10, 0x05, 0x21, + 0x18, 0x31, 0x28, 0x8c, 0x60, 0x14, 0x88, 0x60, 0xb8, 0x21, 0xb8, 0x84, + 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c, 0x0c, 0x6c, 0x40, 0x03, + 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90, 0x8f, 0x05, 0x1a, 0x7c, + 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81, 0x29, 0x0c, 0x32, 0x04, + 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64, 0x08, 0xd2, 0xc0, 0x0d, + 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4, 0xa0, 0x98, 0x65, 0x40, + 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18, 0x31, 0x28, 0x8c, 0x60, + 0x16, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0xa0, 0x15, 0x46, 0x0c, 0x0a, + 0x23, 0xa8, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84, 0xa0, 0x15, 0x46, 0x0c, + 0x0a, 0x23, 0xb8, 0x85, 0x42, 0x0d, 0xe6, 0x18, 0x84, 0xc0, 0x15, 0x66, + 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57, 0x10, 0x04, 0x04, 0x3a, + 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x0c, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, + 0xde, 0x21, 0x0c, 0x00, 0x00, 0xc0, 0x06, 0x00, 0x00, 0x0b, 0x82, 0x20, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, + 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, + 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, + 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, + 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, + 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8, + 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, + 0x00, 0xea, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90, + 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68, + 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, + 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, 0x1d, 0xd2, 0xc1, 0x1d, + 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, 0x1d, 0xda, 0xc0, 0x1e, + 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, 0xee, 0x21, 0x1d, + 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, 0xc0, 0x03, 0x60, 0x70, + 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48, + 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90, + 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70, + 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68, + 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, + 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, + 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, + 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d, + 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, + 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98, + 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, + 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, + 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, + 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, + 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38, + 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78, + 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, + 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, + 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d, + 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, + 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18, + 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18, + 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30, + 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00, + 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c, + 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, + 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0x83, 0x21, 0x10, 0xc0, + 0x02, 0x54, 0x1b, 0x8c, 0xa1, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x10, 0x06, + 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0x40, 0x80, 0x05, 0xa8, 0x36, 0x18, 0xc6, + 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50, 0x1b, 0x7c, 0xe4, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, 0x80, + 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, 0x18, + 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, + 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, 0x1d, + 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, 0x0d, + 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, 0x1e, + 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x3c, 0xb0, 0x03, 0x60, 0x70, + 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48, + 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90, + 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70, + 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68, + 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, + 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, + 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, + 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d, + 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, + 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98, + 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, + 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, + 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, + 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, + 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38, + 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78, + 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, + 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, + 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d, + 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, + 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18, + 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18, + 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30, + 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00, + 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c, + 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, + 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0x03, 0x82, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x30, 0x80, 0x04, 0x54, 0x1b, 0x8c, 0x24, 0x00, + 0x16, 0xa0, 0xda, 0x60, 0x28, 0x02, 0xb0, 0x00, 0xd5, 0x06, 0x64, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x36, 0x18, 0xcc, + 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50, 0x1b, 0xa6, 0xe6, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x40, 0x01, 0xa4, 0xc1, 0x1d, 0xde, 0xa1, 0x0d, + 0xc4, 0xa1, 0x1e, 0xd2, 0x81, 0x1d, 0xe8, 0x21, 0x1d, 0xdc, 0x61, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x13, 0x8a, 0x40, 0x18, 0x88, 0x62, 0x42, 0x60, 0x4c, 0x08, 0x8e, + 0x09, 0x03, 0x92, 0x28, 0x13, 0x86, 0x25, 0x51, 0x26, 0x04, 0xcc, 0x84, + 0xa0, 0x01, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x4d, 0x00, 0x00, + 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, + 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, + 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xc8, 0xc1, 0x0c, 0xc0, 0x30, 0x02, + 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, + 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18, + 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6, + 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4, + 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50, + 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21, + 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29, + 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1, + 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0x38, 0x4d, 0x9a, 0x22, 0x4a, + 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, 0xdf, 0x1e, 0x7e, 0x20, + 0x8a, 0x00, 0xec, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x26, 0xb8, 0x48, + 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f, + 0x1a, 0x23, 0x00, 0x06, 0x11, 0x1c, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44, + 0xb2, 0x34, 0x0f, 0x41, 0x85, 0x28, 0x8a, 0xa2, 0x20, 0xa9, 0x0c, 0x00, + 0x00, 0x10, 0x55, 0x04, 0x00, 0x20, 0xab, 0x0c, 0x40, 0x51, 0x10, 0x56, + 0x8c, 0xa2, 0x00, 0x00, 0x00, 0x20, 0xad, 0x0c, 0x45, 0x51, 0x10, 0x57, + 0x84, 0xa2, 0x20, 0x6f, 0x8e, 0x00, 0x0c, 0xe6, 0x08, 0x82, 0x61, 0x04, + 0x01, 0x0c, 0x4a, 0x12, 0x34, 0x8f, 0x00, 0x86, 0x62, 0x08, 0xd0, 0x58, + 0x90, 0x60, 0x79, 0x84, 0x50, 0x0c, 0x01, 0x2a, 0x07, 0x02, 0x52, 0x00, + 0x1c, 0x46, 0x18, 0xc0, 0x60, 0x10, 0x21, 0x10, 0xe6, 0x08, 0x40, 0x61, + 0x10, 0xe1, 0x10, 0x06, 0x11, 0x0a, 0x61, 0x10, 0x01, 0x10, 0xa6, 0x00, + 0x46, 0x00, 0x86, 0x11, 0x08, 0x30, 0x00, 0x00, 0x00, 0x13, 0xb2, 0x70, + 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, + 0x60, 0x87, 0x72, 0x68, 0x83, 0x76, 0x08, 0x87, 0x71, 0x78, 0x87, 0x79, + 0xc0, 0x87, 0x38, 0x80, 0x03, 0x37, 0x88, 0x83, 0x38, 0x70, 0x03, 0x38, + 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, 0x07, + 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, 0x0e, + 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, 0x07, + 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, + 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, 0x0e, + 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, + 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, + 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, + 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, 0x07, + 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, + 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, + 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, + 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, + 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, 0x07, + 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, + 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, + 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, + 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, 0x07, + 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, + 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, 0x07, + 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, + 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, + 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, 0x07, + 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, + 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, + 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, + 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, + 0x72, 0x30, 0x84, 0x89, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0xc2, 0x4c, 0x40, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x61, 0x2a, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x30, + 0x17, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x98, 0x0c, + 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0xcc, 0x86, 0x00, + 0xc3, 0x00, 0x00, 0x00, 0x10, 0x00, 0xc0, 0x10, 0xa6, 0x02, 0x02, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0xd3, 0x01, 0x01, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xf9, 0x80, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0xc2, 0x74, 0x40, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x61, 0xc8, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x21, 0x8c, 0x19, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x90, 0x05, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, + 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, + 0x02, 0x47, 0x00, 0x4a, 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80, + 0x0a, 0x30, 0xa0, 0x0c, 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac, + 0x14, 0x8a, 0xa1, 0x1c, 0x68, 0x2d, 0x9c, 0x11, 0x80, 0x42, 0x28, 0x88, + 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x42, 0xc7, 0x12, 0x1e, 0x01, 0x00, + 0x00, 0x79, 0x18, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, + 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, + 0xb7, 0x21, 0x06, 0x18, 0x40, 0x67, 0x00, 0xa0, 0x41, 0x19, 0x50, 0xb9, + 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, 0x80, + 0x41, 0x73, 0x06, 0x02, 0x18, 0x38, 0x8c, 0x83, 0x20, 0x38, 0x38, 0xb6, + 0x32, 0x90, 0xb6, 0x32, 0xba, 0x30, 0x36, 0x10, 0xbb, 0x32, 0xb9, 0xb9, + 0xb4, 0x37, 0x37, 0x90, 0x19, 0x19, 0x18, 0x99, 0x19, 0x17, 0x1a, 0x18, + 0x1a, 0x10, 0x94, 0xb6, 0x32, 0xba, 0x30, 0x36, 0xb3, 0xb2, 0x96, 0x19, + 0x19, 0x18, 0x99, 0x19, 0x17, 0x1a, 0x18, 0x9a, 0x94, 0x21, 0xc2, 0x19, + 0x10, 0x43, 0x0c, 0x30, 0x68, 0xc0, 0x20, 0x02, 0x03, 0x86, 0x45, 0x53, + 0x19, 0x5d, 0x18, 0xdb, 0x10, 0xe4, 0x0c, 0x0e, 0x30, 0x68, 0xc0, 0xa0, + 0x01, 0x03, 0x86, 0x5b, 0x58, 0x9a, 0x9c, 0xcb, 0xd8, 0x5b, 0x1b, 0x5c, + 0x1a, 0x5b, 0x99, 0x0b, 0x59, 0x99, 0xdb, 0x9b, 0x5c, 0xdb, 0xdc, 0x17, + 0x59, 0xda, 0x5c, 0x98, 0x18, 0x5b, 0xd9, 0x10, 0xe1, 0x0c, 0x12, 0x72, + 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, + 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x33, 0x58, 0x58, 0x06, 0x61, 0x69, + 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, + 0x74, 0x63, 0x68, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, + 0x84, 0x33, 0x68, 0x18, 0x85, 0xa5, 0xc9, 0xb9, 0xc8, 0x95, 0xb9, 0x91, + 0x95, 0xc9, 0x7d, 0xd1, 0x85, 0xc9, 0x9d, 0x95, 0xd1, 0x31, 0x0a, 0x4b, + 0x93, 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x72, + 0x0b, 0x6b, 0x2b, 0xa3, 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x33, 0x04, + 0x39, 0x83, 0x07, 0x0c, 0x98, 0x33, 0x80, 0xce, 0x20, 0x1a, 0x22, 0x9c, + 0x81, 0x44, 0x26, 0x2c, 0x4d, 0xce, 0x05, 0xee, 0x6d, 0x2e, 0x8d, 0x2e, + 0xed, 0xcd, 0x8d, 0x4a, 0x58, 0x9a, 0x9c, 0xcb, 0x58, 0x99, 0x1b, 0x5d, + 0x99, 0x1c, 0xa5, 0xb0, 0x34, 0x39, 0x17, 0xb7, 0xb7, 0x2f, 0xb8, 0x32, + 0xb9, 0x39, 0xb8, 0xb2, 0x31, 0xba, 0x34, 0xbb, 0x32, 0x32, 0x61, 0x69, + 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0xe0, + 0xde, 0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0x86, 0x40, 0x60, 0xc0, 0x9c, + 0x01, 0x75, 0x06, 0xd5, 0x19, 0x58, 0x67, 0x00, 0x9d, 0x41, 0x74, 0x06, + 0xd7, 0x19, 0x60, 0x94, 0xc2, 0xd2, 0xe4, 0x5c, 0xcc, 0xe4, 0xc2, 0xce, + 0xda, 0xca, 0xdc, 0xe8, 0xbe, 0xd2, 0xdc, 0xe0, 0xea, 0xe8, 0x68, 0x9d, + 0x95, 0xb9, 0x95, 0xc9, 0x85, 0xd1, 0x95, 0x91, 0xa1, 0xd4, 0x8c, 0xbd, + 0xb1, 0xbd, 0xc9, 0x11, 0xd9, 0xd1, 0x7c, 0x99, 0xa5, 0xf0, 0x09, 0x4b, + 0x93, 0x73, 0x81, 0x2b, 0x93, 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3, + 0x2b, 0x63, 0x31, 0xf6, 0xc6, 0xf6, 0x26, 0x37, 0x44, 0x02, 0x83, 0xe6, + 0x0c, 0xb4, 0x33, 0xd8, 0xce, 0xa0, 0x3a, 0x03, 0xee, 0x0c, 0xa0, 0x33, + 0x88, 0xce, 0xe0, 0x3a, 0x83, 0x8e, 0xd9, 0x59, 0x99, 0x5b, 0x99, 0x5c, + 0x18, 0x5d, 0x19, 0x19, 0x0a, 0x0e, 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b, + 0x1c, 0x19, 0x91, 0x9d, 0xcc, 0x97, 0x59, 0x0a, 0x0d, 0x33, 0xb6, 0xb7, + 0x30, 0x3a, 0x19, 0x22, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, + 0x43, 0x24, 0x30, 0x80, 0xce, 0x40, 0x3b, 0x83, 0xef, 0x0c, 0xaa, 0x33, + 0xe0, 0xce, 0x00, 0x3a, 0x03, 0x30, 0x38, 0x83, 0xeb, 0x0c, 0xc2, 0x80, + 0x4a, 0x58, 0x9a, 0x9c, 0x8b, 0x58, 0x9d, 0x99, 0x59, 0x99, 0x1c, 0x9f, + 0xb0, 0x34, 0x39, 0x17, 0xb1, 0x3a, 0x33, 0xb3, 0x32, 0xb9, 0xaf, 0xb9, + 0x34, 0xbd, 0x32, 0x4a, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x44, 0xc2, + 0xd2, 0xe4, 0x5c, 0xe4, 0xca, 0xc2, 0xc8, 0x48, 0x85, 0xa5, 0xc9, 0xb9, + 0xcc, 0xd1, 0xc9, 0xd5, 0x8d, 0xd1, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, + 0xa5, 0xb9, 0x99, 0xbd, 0xb1, 0x30, 0x63, 0x7b, 0x0b, 0xa3, 0x23, 0x33, + 0x37, 0x26, 0x75, 0x24, 0xf4, 0xf5, 0x56, 0x47, 0x07, 0x57, 0x47, 0x47, + 0x86, 0xae, 0x0c, 0x8f, 0xae, 0x4e, 0xae, 0xec, 0x8b, 0x2e, 0x0f, 0xae, + 0x8c, 0x4a, 0x9a, 0x1b, 0x5c, 0x1d, 0xdd, 0x17, 0x5d, 0x1e, 0x5c, 0x19, + 0x97, 0xb1, 0x37, 0xb6, 0x37, 0xb9, 0xaf, 0xb9, 0xb1, 0x30, 0xb6, 0x32, + 0x3a, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x7c, 0xe8, 0xde, 0xdc, 0xca, 0xda, 0xc2, 0xe0, 0xbe, + 0xcc, 0xc2, 0xc6, 0xe8, 0xde, 0xe4, 0x62, 0xf8, 0xd0, 0xbd, 0xb9, 0x95, + 0xb5, 0x85, 0xc1, 0x7d, 0x99, 0x85, 0x8d, 0xd1, 0xbd, 0xc9, 0xc9, 0xf0, + 0x99, 0x23, 0x93, 0xfb, 0xba, 0x43, 0x4b, 0xa3, 0x2b, 0xfb, 0x82, 0x7b, + 0x4b, 0x73, 0xa3, 0x1b, 0x02, 0x0b, 0x60, 0xc0, 0x80, 0x81, 0x03, 0x06, + 0xcc, 0x19, 0xa0, 0xc1, 0x19, 0xa4, 0x01, 0x18, 0x38, 0x60, 0xe0, 0x80, + 0x01, 0x73, 0x06, 0x68, 0x70, 0x06, 0x6a, 0x00, 0x06, 0x11, 0x18, 0x38, + 0x60, 0xc0, 0x9c, 0x01, 0x1a, 0x9c, 0xc1, 0x1a, 0x80, 0x41, 0x05, 0x06, + 0x0e, 0x18, 0x30, 0x67, 0x80, 0x06, 0x67, 0xc0, 0x06, 0x60, 0xf0, 0x80, + 0x81, 0x03, 0x06, 0xcc, 0x19, 0xa0, 0xc1, 0x19, 0xb4, 0x01, 0x18, 0x58, + 0x60, 0xe0, 0x80, 0x01, 0x73, 0x06, 0x68, 0x70, 0x06, 0x6e, 0x00, 0x06, + 0x17, 0x18, 0x38, 0x60, 0xc0, 0x9c, 0x01, 0x1a, 0x9c, 0xc1, 0x1b, 0x80, + 0x01, 0x06, 0x06, 0x0e, 0x18, 0x30, 0x67, 0x80, 0x06, 0x67, 0x00, 0x07, + 0x8c, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xe8, 0xf2, 0xe0, + 0xca, 0xbe, 0xe6, 0xd2, 0xf4, 0xca, 0x78, 0x85, 0xa5, 0xc9, 0xb9, 0x84, + 0xc9, 0x9d, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0x85, 0xb1, 0xa5, 0x9d, + 0xb9, 0x7d, 0xcd, 0xa5, 0xe9, 0x95, 0xf1, 0x99, 0x42, 0x0b, 0x23, 0x2b, + 0x93, 0x1b, 0x7a, 0x73, 0x9b, 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0x63, 0x30, + 0x36, 0x84, 0x0c, 0xc0, 0x80, 0x3a, 0x83, 0x31, 0x38, 0x03, 0x32, 0x00, + 0x03, 0xe9, 0x0c, 0xca, 0x00, 0x0c, 0x18, 0x30, 0x68, 0xce, 0xc0, 0x0c, + 0xce, 0xe0, 0x0c, 0xce, 0x20, 0x0e, 0xce, 0x40, 0x0e, 0xc0, 0x40, 0x3a, + 0x83, 0x39, 0x00, 0x03, 0xe7, 0x0c, 0xa0, 0x33, 0xa0, 0x83, 0x33, 0xb8, + 0xce, 0xa0, 0x0e, 0x68, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xcd, 0xd0, 0x78, + 0x33, 0x33, 0x9b, 0x2b, 0xa3, 0x23, 0x62, 0xc6, 0xf6, 0x16, 0x46, 0x37, + 0x83, 0x37, 0x43, 0xa3, 0x2d, 0x8c, 0x4e, 0x2e, 0x0d, 0x6f, 0x08, 0x05, + 0x06, 0x0c, 0x18, 0x3c, 0x60, 0xc0, 0x9c, 0xc1, 0x1d, 0x9c, 0x01, 0x1e, + 0x80, 0xc1, 0x03, 0x06, 0x19, 0x18, 0x30, 0x67, 0x90, 0x07, 0x67, 0xa0, + 0x07, 0x4c, 0xb2, 0xaa, 0xac, 0x88, 0xca, 0xc6, 0xde, 0xc8, 0xca, 0x68, + 0x90, 0x95, 0x8d, 0xbd, 0x91, 0x95, 0x0d, 0x21, 0x03, 0x30, 0x70, 0xce, + 0x60, 0x0c, 0xce, 0x80, 0x0c, 0xc0, 0x60, 0x3a, 0x83, 0x32, 0x00, 0x83, + 0x06, 0x0c, 0x9a, 0x33, 0x30, 0x83, 0x33, 0x38, 0x83, 0x33, 0xd8, 0x83, + 0x33, 0x90, 0x03, 0x30, 0x98, 0xce, 0x60, 0x0e, 0xc0, 0xe0, 0x39, 0x03, + 0xe8, 0x0c, 0xf8, 0xe0, 0x0c, 0xae, 0x33, 0xe8, 0x03, 0x2e, 0x61, 0x69, + 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x54, 0xc2, 0xd2, + 0xe4, 0x5c, 0xe6, 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0x88, 0xd1, 0x95, 0xe1, + 0xd1, 0xd5, 0xc9, 0x95, 0xc9, 0x90, 0xf1, 0x98, 0xb1, 0xbd, 0x85, 0xd1, + 0xb1, 0x80, 0xcc, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xf9, 0x90, 0xa0, 0x2b, + 0xc3, 0xcb, 0x1a, 0x42, 0x81, 0x81, 0x76, 0x06, 0x7f, 0x70, 0x06, 0x65, + 0x00, 0x06, 0x0c, 0x18, 0x34, 0x67, 0x00, 0x0a, 0x67, 0x00, 0x9d, 0x41, + 0x28, 0x9c, 0xc1, 0x75, 0x06, 0xa2, 0x40, 0x8f, 0xae, 0x0c, 0x8f, 0xae, + 0x4e, 0xae, 0x4c, 0x86, 0xec, 0x2b, 0x4c, 0x4e, 0x2e, 0x2c, 0x8f, 0xc7, + 0x8c, 0xed, 0x2d, 0x8c, 0x8e, 0x05, 0x64, 0x2e, 0xac, 0x0d, 0x8e, 0xad, + 0xcc, 0x87, 0x05, 0x5d, 0x19, 0x5e, 0x95, 0xd5, 0x10, 0x0a, 0x0c, 0xb6, + 0x33, 0xf8, 0x83, 0x33, 0x28, 0x03, 0x30, 0x68, 0xc0, 0xa0, 0x39, 0x03, + 0x50, 0x38, 0x03, 0xe8, 0x0c, 0x48, 0xe1, 0x0c, 0xae, 0x33, 0x28, 0x05, + 0x2e, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, + 0x3c, 0xe6, 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0xe4, 0x18, 0xcc, 0x0d, 0x91, + 0xc0, 0x80, 0x3b, 0x83, 0x53, 0x38, 0x83, 0x32, 0x00, 0x03, 0x06, 0x0c, + 0x9a, 0x33, 0x80, 0xce, 0x00, 0x15, 0xce, 0xe0, 0x3a, 0x83, 0x54, 0x18, + 0x02, 0x9d, 0x41, 0x76, 0x06, 0xde, 0x19, 0x88, 0xc1, 0x19, 0xd8, 0xc1, + 0x19, 0xf8, 0xc1, 0x19, 0x8c, 0xc2, 0x19, 0x98, 0xc2, 0x19, 0xa8, 0xc2, + 0x10, 0x23, 0x02, 0xce, 0x60, 0x3a, 0x83, 0x55, 0xa0, 0x18, 0x84, 0xa5, + 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, + 0x95, 0xcd, 0xa1, 0x4c, 0x11, 0x31, 0x7d, 0x65, 0x55, 0x59, 0x7d, 0x99, + 0xc9, 0x85, 0x9d, 0xb5, 0x95, 0xb9, 0xd1, 0xa5, 0x0c, 0x21, 0xce, 0xc0, + 0x15, 0xce, 0xa0, 0x15, 0x88, 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, + 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0xd0, 0x95, 0xe1, + 0xd1, 0xd5, 0xc9, 0x95, 0xcd, 0x0d, 0x31, 0xce, 0x00, 0x16, 0xce, 0xc0, + 0x15, 0xce, 0xe0, 0x15, 0x88, 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, + 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0xcc, 0x85, 0xb5, + 0xc1, 0xb1, 0x95, 0xc9, 0xcd, 0x0d, 0x31, 0xce, 0x40, 0x16, 0xce, 0xc0, + 0x15, 0xce, 0x20, 0x16, 0x86, 0x10, 0x67, 0x00, 0x0b, 0x67, 0x20, 0x0b, + 0xac, 0xbe, 0xb4, 0xa8, 0xa6, 0x62, 0x6a, 0xa6, 0xd0, 0xc2, 0xc8, 0xca, + 0xe4, 0x86, 0xde, 0xdc, 0xe6, 0xe8, 0xc2, 0xdc, 0xe8, 0xe6, 0xf8, 0xbc, + 0xb5, 0xb9, 0xa5, 0xc1, 0xbd, 0xd1, 0x95, 0xb9, 0xd1, 0x81, 0x8c, 0xa1, + 0x85, 0xc9, 0xf1, 0x99, 0x4a, 0x6b, 0x83, 0x63, 0x2b, 0x03, 0x19, 0x5a, + 0x59, 0x01, 0xa1, 0x12, 0x0a, 0x0a, 0x1a, 0x22, 0x9c, 0x81, 0x2d, 0x0c, + 0x31, 0xce, 0xa0, 0x16, 0xce, 0xe0, 0x16, 0xd6, 0xc0, 0x1b, 0x62, 0x9c, + 0x01, 0x1a, 0x9c, 0x01, 0x2e, 0xac, 0x81, 0x37, 0x44, 0x0c, 0xce, 0x80, + 0x16, 0xce, 0x20, 0x17, 0xd6, 0xc0, 0x3b, 0x83, 0x5c, 0x58, 0x83, 0xef, + 0x0c, 0x72, 0x61, 0x0d, 0xc0, 0xe0, 0x0c, 0x72, 0x61, 0x0d, 0xc2, 0xe0, + 0x0c, 0x72, 0x61, 0x0d, 0xc4, 0xe0, 0x0c, 0x72, 0x61, 0x0d, 0xc6, 0xe0, + 0x0c, 0x72, 0x61, 0x0d, 0xc8, 0xe0, 0x0c, 0x72, 0x61, 0x0d, 0xba, 0x21, + 0xc6, 0x19, 0xe8, 0xc2, 0x19, 0xe4, 0xc2, 0x1a, 0x80, 0xc1, 0x10, 0xe3, + 0x0c, 0x74, 0xe1, 0x0c, 0x72, 0x61, 0x0d, 0xba, 0x21, 0xc6, 0x19, 0xe8, + 0xc2, 0x19, 0xe4, 0xc2, 0x1a, 0x88, 0xc1, 0x10, 0xe3, 0x0c, 0x74, 0xe1, + 0x0c, 0x72, 0x61, 0x0d, 0xc6, 0x60, 0x88, 0x71, 0x06, 0xba, 0x70, 0x06, + 0xb9, 0xb0, 0x06, 0x64, 0x30, 0xc4, 0x38, 0x03, 0x5d, 0x38, 0x83, 0x5c, + 0x58, 0x83, 0x6f, 0x88, 0x71, 0x06, 0xba, 0x70, 0x06, 0xb9, 0xb0, 0x06, + 0x61, 0x30, 0xc4, 0x38, 0x03, 0x5d, 0x38, 0x83, 0x5c, 0x58, 0x03, 0x6f, + 0x44, 0xc4, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xed, 0xf0, 0x0e, + 0xe4, 0x50, 0x0f, 0xec, 0x50, 0x0e, 0x6e, 0x60, 0x0e, 0xec, 0x10, 0x0e, + 0xe7, 0x30, 0x0f, 0x53, 0x84, 0x60, 0x18, 0xa1, 0xb0, 0x03, 0x3b, 0xd8, + 0x43, 0x3b, 0xb8, 0x41, 0x3a, 0x90, 0x43, 0x39, 0xb8, 0x03, 0x3d, 0x4c, + 0x09, 0x8a, 0x11, 0x4b, 0x38, 0xa4, 0x83, 0x3c, 0xb8, 0x81, 0x3d, 0x94, + 0x83, 0x3c, 0xcc, 0x43, 0x3a, 0xbc, 0x83, 0x3b, 0x4c, 0x09, 0x8c, 0x11, + 0x54, 0x38, 0xa4, 0x83, 0x3c, 0xb8, 0x01, 0x3b, 0x84, 0x83, 0x3b, 0x9c, + 0x43, 0x3d, 0x84, 0xc3, 0x39, 0x94, 0xc3, 0x2f, 0xd8, 0x43, 0x39, 0xc8, + 0xc3, 0x3c, 0xa4, 0xc3, 0x3b, 0xb8, 0xc3, 0x94, 0x00, 0x19, 0x31, 0x85, + 0x43, 0x3a, 0xc8, 0x83, 0x1b, 0x8c, 0xc3, 0x3b, 0xb4, 0x03, 0x3c, 0xa4, + 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x03, 0x3c, 0xd0, 0x43, 0x3a, 0xbc, + 0x83, 0x3b, 0xcc, 0xc3, 0x94, 0x41, 0x61, 0x9c, 0x11, 0x4c, 0x38, 0xa4, + 0x83, 0x3c, 0xb8, 0x81, 0x39, 0xc8, 0x43, 0x38, 0x9c, 0x43, 0x3b, 0x94, + 0x83, 0x3b, 0xd0, 0xc3, 0x94, 0x80, 0x15, 0x00, 0x00, 0x79, 0x18, 0x00, + 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, + 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, + 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, + 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, + 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, + 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, + 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, + 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, + 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, + 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, + 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, + 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, + 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, + 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, + 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, + 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, + 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, + 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, + 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, + 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, + 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, + 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, + 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, + 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, + 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, + 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, + 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, + 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, + 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, + 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, + 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, + 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, + 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, + 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, + 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, + 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, + 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, + 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, + 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, + 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, + 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, + 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, + 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, + 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, + 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, + 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, + 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, + 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, + 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, + 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, + 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, + 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, + 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, + 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, + 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x35, 0x00, 0x00, + 0x00, 0x56, 0x90, 0xfd, 0x73, 0x6d, 0x6b, 0xcf, 0xb3, 0x60, 0xad, 0xd3, + 0x10, 0x0c, 0xf0, 0x74, 0xd5, 0xfd, 0x17, 0x45, 0x51, 0x14, 0x96, 0x30, + 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, 0x03, 0x5c, 0x7e, 0x75, + 0x17, 0xb7, 0x6d, 0x01, 0x14, 0x80, 0x44, 0x7e, 0x01, 0x48, 0xd3, 0x2f, + 0x2c, 0x00, 0xf3, 0xf8, 0xd5, 0x5d, 0xdc, 0xb6, 0x09, 0x40, 0x00, 0x12, + 0xf9, 0x05, 0x20, 0x4d, 0xff, 0xe3, 0x58, 0x7e, 0x71, 0xdb, 0x36, 0x10, + 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, 0x10, 0x48, 0x7e, 0x71, + 0xdb, 0x76, 0x20, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x8f, 0x63, + 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x29, 0x84, 0x01, 0x80, 0x44, 0xbe, 0x04, + 0x30, 0xcf, 0x42, 0xfc, 0x13, 0x71, 0x4d, 0x54, 0x44, 0xfc, 0xf6, 0xf0, + 0x03, 0x51, 0x04, 0x60, 0x7e, 0x85, 0x17, 0xb7, 0x6d, 0x04, 0x0d, 0x80, + 0x44, 0xfe, 0xe0, 0x4c, 0x7e, 0x75, 0x17, 0xb7, 0x6d, 0x0b, 0x1b, 0x80, + 0x44, 0xbe, 0x04, 0x30, 0xcf, 0x42, 0xfc, 0x13, 0x71, 0x4d, 0x54, 0x44, + 0xfc, 0xf6, 0xe0, 0x57, 0x78, 0x71, 0xdb, 0x86, 0x30, 0x01, 0x48, 0xe4, + 0x17, 0x80, 0x34, 0xfd, 0x05, 0x10, 0x48, 0x7e, 0x75, 0x17, 0xb7, 0x6d, + 0x00, 0x10, 0xdb, 0x95, 0xbf, 0xec, 0xbe, 0x7f, 0x11, 0x01, 0x06, 0x43, + 0x34, 0x93, 0x19, 0x44, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0x7f, 0xc1, + 0x00, 0x97, 0x5f, 0xdc, 0x36, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0xcb, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00, + 0x00, 0x55, 0x00, 0x00, 0x00, 0x14, 0x8f, 0x45, 0x00, 0x81, 0x70, 0xcc, + 0x41, 0x30, 0x0d, 0x84, 0x07, 0xb4, 0x16, 0x41, 0x09, 0x50, 0x3a, 0xc7, + 0xc0, 0xe0, 0x01, 0x1e, 0x8c, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xe2, + 0x08, 0x00, 0x85, 0x23, 0x00, 0x35, 0x40, 0xe0, 0x0c, 0x00, 0x01, 0x63, + 0x04, 0xef, 0x9e, 0x96, 0xf7, 0x37, 0x46, 0xa0, 0xb3, 0xe6, 0x1c, 0x82, + 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x09, 0x06, 0x63, 0x04, 0x20, 0x08, + 0x82, 0x20, 0x18, 0xcc, 0x00, 0x50, 0x30, 0x03, 0x30, 0x03, 0x30, 0x07, + 0x21, 0x0b, 0xb2, 0x20, 0x0b, 0xb3, 0x30, 0x07, 0x31, 0x0b, 0xb9, 0x30, + 0x0b, 0x7d, 0x40, 0xc5, 0x0c, 0xc0, 0x08, 0xc0, 0x0c, 0xc0, 0x58, 0x03, + 0x08, 0x82, 0x20, 0xfe, 0x81, 0x20, 0x08, 0xe2, 0x1f, 0x08, 0x82, 0x20, + 0xfe, 0x8d, 0x35, 0xb0, 0xed, 0xfc, 0x93, 0x1e, 0xdb, 0xce, 0x3f, 0xe9, + 0xb1, 0xed, 0xfc, 0x93, 0xde, 0x58, 0x03, 0x08, 0x82, 0x6c, 0xfd, 0x0b, + 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, 0xc8, 0xd6, 0xbf, 0x30, 0xd6, + 0x00, 0x82, 0xe0, 0x9a, 0x83, 0x01, 0x08, 0x82, 0x6b, 0x0e, 0x06, 0x20, + 0x08, 0xae, 0x39, 0x18, 0x8c, 0x35, 0x80, 0x20, 0xdd, 0xe6, 0x60, 0x00, + 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, 0x6d, 0x0e, 0x06, 0x63, 0x0d, + 0xeb, 0x88, 0xc7, 0x2c, 0x18, 0xac, 0x23, 0x1e, 0xb3, 0x60, 0xb0, 0x8e, + 0x78, 0xcc, 0x82, 0xc1, 0x58, 0x03, 0x08, 0xc2, 0x78, 0x38, 0x06, 0x20, + 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, 0x87, 0x63, 0x30, 0xd6, 0x20, + 0xe6, 0x62, 0xda, 0x7f, 0x60, 0xc9, 0xb3, 0xf1, 0x2f, 0x8c, 0xe9, 0xaa, + 0xe6, 0xbe, 0x30, 0xd6, 0xf0, 0xcf, 0xa4, 0xff, 0xfb, 0x02, 0x5d, 0x83, + 0x62, 0xfe, 0xb5, 0x70, 0x1c, 0x83, 0xbe, 0x30, 0xd6, 0x30, 0xf7, 0x6d, + 0x9a, 0xfa, 0x42, 0xeb, 0x86, 0x3c, 0xef, 0x0b, 0x7c, 0xce, 0xfa, 0xf8, + 0x47, 0xc0, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xc4, 0x3c, + 0xd8, 0xe7, 0xde, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0xcd, 0x00, 0x8c, + 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, + 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba, 0xf8, 0x37, 0x46, 0x50, 0xab, 0xb5, + 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8, 0xf6, 0x34, 0x18, 0x8c, 0x11, 0xf0, + 0xf0, 0xaa, 0xd3, 0xdd, 0x08, 0x00, 0x00, 0x00, 0x00, 0x23, 0x06, 0x4a, + 0x11, 0xbc, 0xc2, 0x1b, 0xb4, 0x81, 0x1c, 0x8c, 0x41, 0x19, 0x90, 0x41, + 0x30, 0x62, 0xb0, 0x14, 0x41, 0x2c, 0xbc, 0x81, 0x1b, 0xcc, 0xc1, 0x2b, + 0x90, 0x81, 0x19, 0x94, 0x81, 0x30, 0x86, 0x10, 0xc0, 0xc2, 0x20, 0xc3, + 0xe0, 0xad, 0xc1, 0x1c, 0x43, 0x20, 0xc4, 0xc2, 0x88, 0xc1, 0x52, 0x04, + 0xb5, 0x30, 0x07, 0x72, 0x70, 0x07, 0xb2, 0x80, 0x06, 0x6a, 0x90, 0x06, + 0xc6, 0x18, 0x42, 0x40, 0x0b, 0x73, 0x0c, 0x43, 0x10, 0x0b, 0x87, 0x07, + 0xea, 0x52, 0x50, 0x06, 0x19, 0x02, 0x33, 0x80, 0x03, 0x23, 0x02, 0xf8, + 0x8c, 0x37, 0xf0, 0x01, 0x2a, 0xe4, 0xc2, 0x05, 0xea, 0x52, 0x50, 0x06, + 0x19, 0x82, 0x35, 0xa8, 0x83, 0x11, 0x83, 0xc2, 0x08, 0xcc, 0xa1, 0x08, + 0xc6, 0x2b, 0x42, 0xa1, 0x15, 0x7c, 0xe1, 0x17, 0xf4, 0xe0, 0x02, 0x75, + 0x29, 0x28, 0x83, 0x0c, 0x01, 0x1c, 0xe8, 0xc1, 0x88, 0x41, 0x61, 0x04, + 0xeb, 0xa0, 0x04, 0xe3, 0x15, 0xa6, 0x20, 0x0b, 0xe3, 0x40, 0x0e, 0xa0, + 0x70, 0x81, 0xba, 0x14, 0x94, 0x41, 0x86, 0xa0, 0x0e, 0xfe, 0x60, 0xc4, + 0xa0, 0x30, 0x02, 0x78, 0x78, 0x82, 0x39, 0x86, 0x3a, 0x58, 0xd2, 0x61, + 0x8e, 0x21, 0x38, 0xd2, 0x61, 0x8e, 0x21, 0x18, 0xce, 0x61, 0xbc, 0xe1, + 0x15, 0x74, 0x01, 0x1d, 0x28, 0x18, 0xc3, 0x0d, 0xc1, 0x1f, 0x04, 0xb3, + 0x0c, 0x81, 0x10, 0x0c, 0x32, 0x10, 0x7d, 0x70, 0x0a, 0xe3, 0x0d, 0xb3, + 0xe0, 0x0b, 0xe0, 0x40, 0xc1, 0x18, 0x31, 0x20, 0x8c, 0xc0, 0x1e, 0x86, + 0x11, 0x83, 0xc2, 0x08, 0xf0, 0x21, 0xc8, 0x03, 0x0b, 0xf2, 0x00, 0x3e, + 0x23, 0x06, 0x85, 0x11, 0xe0, 0x43, 0xe0, 0x07, 0x36, 0xe8, 0x81, 0x7c, + 0x4c, 0x0f, 0x82, 0xf8, 0xd8, 0x10, 0xd0, 0x67, 0xc4, 0x80, 0x30, 0x82, + 0x7e, 0x08, 0x46, 0x0c, 0x0a, 0x23, 0xf8, 0x87, 0x80, 0x0f, 0x2c, 0xe0, + 0x03, 0xf9, 0xcc, 0x31, 0x98, 0xc2, 0xc2, 0x0f, 0x83, 0x0c, 0xc1, 0x29, + 0xd8, 0x82, 0x0d, 0x01, 0x7d, 0x06, 0x19, 0x82, 0x54, 0xe0, 0x85, 0x41, + 0x86, 0xa0, 0xf2, 0x85, 0x59, 0x02, 0x61, 0xa0, 0x22, 0x10, 0x02, 0x36, + 0x00, 0xc6, 0x1b, 0xca, 0x01, 0x1e, 0x40, 0x82, 0x82, 0x31, 0xdc, 0x10, + 0xdc, 0x81, 0x33, 0xcb, 0x30, 0x10, 0xc1, 0x20, 0x03, 0x31, 0x0b, 0xbd, + 0x30, 0xde, 0x90, 0x0e, 0xf4, 0x80, 0x0f, 0x14, 0x8c, 0xf1, 0x86, 0x75, + 0xb0, 0x87, 0x7c, 0xa0, 0x60, 0x8c, 0x18, 0x20, 0x47, 0x14, 0x13, 0x45, + 0x77, 0x0c, 0xc1, 0x20, 0x43, 0x50, 0x0b, 0xe8, 0x30, 0xc8, 0x10, 0x2c, + 0xea, 0x30, 0x4b, 0x40, 0x0c, 0x54, 0x04, 0xc2, 0x80, 0x09, 0xc3, 0x0d, + 0x61, 0x70, 0x0a, 0xc1, 0x2c, 0x43, 0x31, 0x05, 0xe3, 0x0d, 0xf2, 0xd0, + 0x0f, 0x2e, 0x41, 0xc1, 0x18, 0x6e, 0x08, 0x54, 0x21, 0x98, 0x65, 0x30, + 0x8e, 0x60, 0x90, 0xa1, 0x00, 0x07, 0x75, 0x18, 0x6f, 0xb0, 0x87, 0x90, + 0x58, 0x09, 0x0a, 0xc6, 0x1c, 0xc3, 0x2f, 0x04, 0x35, 0x31, 0xc8, 0x10, + 0x80, 0xc3, 0x3b, 0x58, 0x50, 0xc8, 0x67, 0x90, 0x21, 0x10, 0x87, 0x7a, + 0x98, 0x25, 0x68, 0x83, 0xf1, 0x06, 0x7e, 0x38, 0x89, 0x9c, 0xa0, 0x60, + 0x8c, 0x37, 0xf8, 0x43, 0x4a, 0xcc, 0x04, 0x05, 0x63, 0x90, 0x01, 0x5a, + 0x07, 0x7d, 0x18, 0x6e, 0x20, 0x62, 0xc1, 0x99, 0x65, 0x40, 0xa4, 0x60, + 0x0c, 0x41, 0xfa, 0x89, 0xe1, 0x86, 0x60, 0x17, 0x94, 0x59, 0x06, 0x25, + 0x09, 0x4c, 0xe8, 0x05, 0xf9, 0xcc, 0x12, 0x2c, 0x36, 0xfc, 0x02, 0x7c, + 0x46, 0x0c, 0x08, 0x23, 0x60, 0x8b, 0xc0, 0x82, 0x7b, 0x90, 0xcf, 0x88, + 0x41, 0x61, 0x04, 0x6f, 0x11, 0xdc, 0xc3, 0x2c, 0xc1, 0x32, 0x50, 0x01, + 0x28, 0x89, 0xa0, 0xcc, 0x31, 0xd0, 0x43, 0x70, 0x16, 0x63, 0x08, 0xdb, + 0x59, 0x0c, 0x37, 0x04, 0xe4, 0xa0, 0xcc, 0x32, 0x34, 0x4c, 0x60, 0x82, + 0x39, 0xc8, 0x67, 0x96, 0xc0, 0xb1, 0x01, 0x1d, 0xe0, 0x33, 0x62, 0x40, + 0x18, 0x41, 0x5d, 0x04, 0x16, 0x80, 0x84, 0x7c, 0x46, 0x0c, 0x0a, 0x23, + 0xc0, 0x8b, 0x00, 0x24, 0x66, 0x09, 0x9c, 0x81, 0x0a, 0x40, 0x61, 0x84, + 0x66, 0x8e, 0x21, 0x09, 0xde, 0x62, 0x0c, 0x81, 0x0c, 0xda, 0x62, 0xb8, + 0x21, 0x68, 0x07, 0x65, 0x96, 0x01, 0x7a, 0x02, 0x13, 0xde, 0x41, 0x3e, + 0xb3, 0x04, 0x91, 0x0d, 0xf1, 0x00, 0x9f, 0x11, 0x03, 0xc2, 0x08, 0xfc, + 0x22, 0xb0, 0x20, 0x25, 0xe4, 0x33, 0x62, 0x50, 0x18, 0x41, 0x68, 0x04, + 0x29, 0x31, 0x4b, 0x10, 0x0d, 0x54, 0x00, 0xca, 0x23, 0x40, 0x73, 0x0c, + 0x49, 0x50, 0x17, 0xb3, 0x04, 0xd2, 0x40, 0x45, 0x20, 0x44, 0x7a, 0x70, + 0x0c, 0x32, 0x04, 0x29, 0x31, 0x13, 0x73, 0x0c, 0x26, 0x01, 0x06, 0x7c, + 0x31, 0xc8, 0x10, 0x9c, 0x84, 0x4d, 0xd8, 0x10, 0xc8, 0x67, 0x90, 0x21, + 0x48, 0x09, 0x9e, 0x98, 0x25, 0x68, 0x83, 0xe1, 0x86, 0x59, 0x80, 0x89, + 0x60, 0x96, 0x81, 0x02, 0x83, 0x60, 0x90, 0x81, 0x0e, 0x5e, 0x22, 0x27, + 0xc6, 0x1b, 0xca, 0x02, 0x2e, 0x44, 0x83, 0x82, 0x31, 0xde, 0x70, 0x16, + 0x72, 0xc1, 0x17, 0x14, 0x8c, 0x39, 0x06, 0x98, 0x08, 0x4c, 0x63, 0x90, + 0x21, 0x88, 0x09, 0xb0, 0xb0, 0xe0, 0x90, 0xcf, 0x20, 0x43, 0x30, 0x13, + 0x66, 0x31, 0xdc, 0x70, 0xf4, 0x83, 0x33, 0xcb, 0xf0, 0x55, 0xc1, 0x18, + 0xc2, 0xb0, 0x1a, 0xc3, 0x0d, 0x01, 0x48, 0x28, 0xb3, 0x0c, 0x97, 0x15, + 0x98, 0x20, 0x12, 0xf2, 0x99, 0x25, 0xc0, 0x46, 0x0c, 0x08, 0x23, 0xb8, + 0x8d, 0x61, 0xc4, 0xa0, 0x30, 0x82, 0xdc, 0x08, 0x4a, 0xc2, 0x82, 0x93, + 0x90, 0x8f, 0x05, 0x29, 0x01, 0x9f, 0x59, 0x02, 0x6c, 0xa0, 0x02, 0x50, + 0x2c, 0xe1, 0x9a, 0x63, 0xd8, 0x89, 0x60, 0x36, 0xc6, 0x10, 0x98, 0xd9, + 0x18, 0x6e, 0x08, 0x52, 0x42, 0x99, 0x65, 0xd0, 0xb2, 0xc0, 0x84, 0x95, + 0x90, 0xcf, 0x2c, 0xc1, 0x36, 0x62, 0x40, 0x18, 0x01, 0x78, 0x0c, 0x23, + 0x06, 0x85, 0x11, 0x88, 0x47, 0xe0, 0x12, 0x16, 0xc0, 0x84, 0x7c, 0x2c, + 0x90, 0x09, 0xf8, 0xcc, 0x12, 0x6c, 0x03, 0x15, 0x80, 0x92, 0x09, 0xda, + 0x1c, 0x43, 0x12, 0xec, 0xc6, 0x18, 0x42, 0x95, 0x1b, 0xc3, 0x0d, 0x81, + 0x4c, 0x28, 0xb3, 0x0c, 0x1d, 0x17, 0x98, 0x40, 0x13, 0xf2, 0x99, 0x25, + 0xf0, 0x46, 0x0c, 0x08, 0x23, 0x48, 0x8f, 0x61, 0xc4, 0xa0, 0x30, 0x82, + 0xf5, 0x08, 0x6e, 0xc2, 0x82, 0x9c, 0x90, 0x8f, 0x05, 0x3b, 0x01, 0x9f, + 0x59, 0x02, 0x6f, 0xa0, 0x02, 0x50, 0x38, 0xa1, 0x9b, 0x63, 0x48, 0x82, + 0xf0, 0x18, 0x31, 0x30, 0x8c, 0x20, 0x3e, 0x82, 0xb7, 0x68, 0x8b, 0x41, + 0x86, 0x20, 0x2e, 0x48, 0x63, 0x96, 0xe0, 0x1b, 0xa8, 0x08, 0xfc, 0x80, + 0x12, 0xbc, 0x41, 0x86, 0xe0, 0x2e, 0x4c, 0x63, 0x96, 0xa0, 0x0d, 0x66, + 0x19, 0xc2, 0xa0, 0x0d, 0xf8, 0x61, 0x90, 0xa1, 0x17, 0xf0, 0x42, 0x34, + 0x46, 0x0c, 0x0a, 0x23, 0x98, 0x8f, 0x60, 0x2d, 0xe6, 0x18, 0xe8, 0x22, + 0x60, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0xea, 0x63, 0x60, 0x8b, 0x39, 0x06, + 0x21, 0x68, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0xee, 0xa3, 0x68, 0x8b, 0x39, + 0x06, 0x21, 0x60, 0x8f, 0x41, 0x86, 0x60, 0x2f, 0x5c, 0x63, 0x90, 0x21, + 0x28, 0x07, 0xd8, 0x18, 0x6f, 0xb0, 0x8d, 0xf0, 0x98, 0x0f, 0x0a, 0xc6, + 0x78, 0x03, 0x6e, 0x8c, 0x47, 0x7b, 0x50, 0x30, 0xe6, 0x18, 0x42, 0x23, + 0xb8, 0x8f, 0x41, 0x86, 0x40, 0x34, 0x62, 0xc3, 0x82, 0x44, 0x3e, 0x83, + 0x0c, 0x01, 0x69, 0xdc, 0xc6, 0x70, 0xc3, 0xe1, 0x16, 0xce, 0x2c, 0x03, + 0x1b, 0x88, 0x41, 0x30, 0x86, 0x30, 0xf0, 0xc7, 0x70, 0x43, 0x10, 0x17, + 0xca, 0x2c, 0x03, 0x19, 0x8c, 0x41, 0x60, 0xc2, 0x5c, 0xc8, 0x67, 0x96, + 0xa0, 0x0c, 0x46, 0x0c, 0x08, 0x23, 0x40, 0x91, 0x61, 0xc4, 0xa0, 0x30, + 0x02, 0x15, 0x09, 0xec, 0xc2, 0x02, 0xbc, 0x90, 0x8f, 0x05, 0x7a, 0x01, + 0x9f, 0x59, 0x82, 0x32, 0x18, 0xa8, 0x00, 0x94, 0x31, 0x10, 0xc8, 0x60, + 0x8e, 0x81, 0x35, 0x02, 0x12, 0x19, 0x43, 0x60, 0x48, 0x64, 0xb8, 0x21, + 0xd0, 0x0b, 0x65, 0x96, 0xe1, 0x0c, 0xcc, 0x20, 0x30, 0x81, 0x2f, 0xe4, + 0x33, 0x4b, 0x80, 0x06, 0x23, 0x06, 0x84, 0x11, 0xc4, 0xc8, 0x30, 0x62, + 0x50, 0x18, 0xc1, 0x8c, 0x04, 0x7f, 0x61, 0x41, 0x68, 0xc8, 0xc7, 0x82, + 0xd1, 0x80, 0xcf, 0x2c, 0x01, 0x1a, 0x0c, 0x54, 0x00, 0x8a, 0x19, 0x08, + 0x67, 0x30, 0xc7, 0x90, 0x04, 0x2c, 0x32, 0x86, 0x50, 0xa9, 0xc8, 0x70, + 0x43, 0x30, 0x1a, 0xca, 0x2c, 0x83, 0x1a, 0xa4, 0x41, 0x60, 0x42, 0x69, + 0xc8, 0x67, 0x96, 0x60, 0x0d, 0x46, 0x0c, 0x08, 0x23, 0xd0, 0x91, 0x61, + 0xc4, 0xa0, 0x30, 0x02, 0x1e, 0x09, 0x50, 0xc3, 0x02, 0xd5, 0x90, 0x8f, + 0x05, 0xac, 0x01, 0x9f, 0x59, 0x82, 0x35, 0x18, 0xa8, 0x00, 0x94, 0x34, + 0x10, 0xd4, 0x60, 0x8e, 0x21, 0x09, 0x64, 0x64, 0xc4, 0xc0, 0x30, 0x02, + 0x31, 0x09, 0xc0, 0xc3, 0x37, 0x06, 0x19, 0x02, 0xf1, 0xa8, 0x8f, 0x59, + 0x02, 0x36, 0x18, 0xa8, 0x08, 0xfc, 0x20, 0x0c, 0x84, 0x35, 0x18, 0x64, + 0x08, 0xd0, 0xe3, 0x3e, 0x66, 0x09, 0xda, 0x60, 0xa0, 0x25, 0xe0, 0x11, + 0x83, 0x47, 0x24, 0x1e, 0xf9, 0x64, 0x81, 0x0d, 0x78, 0x04, 0x0c, 0x06, + 0x5a, 0x02, 0x14, 0x31, 0xf4, 0x42, 0x32, 0x87, 0x8f, 0x60, 0x03, 0xd7, + 0x01, 0x83, 0x41, 0x86, 0x40, 0xd8, 0x0f, 0x0b, 0x46, 0x44, 0x3e, 0x19, + 0x84, 0x03, 0x01, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xd7, 0xd2, 0x07, + 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4, 0x50, 0x13, 0xe7, 0x2c, + 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d, 0x9b, 0x6d, 0x29, 0x38, + 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b, 0x00, 0x03, 0x11, 0x71, + 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71, 0x21, 0x13, 0x00, 0x00, + 0x00, 0x01, 0x31, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x5b, 0x06, 0xe0, + 0x98, 0x85, 0x2d, 0x43, 0x70, 0xcc, 0xc2, 0x96, 0xa1, 0x38, 0x66, 0x61, + 0xcb, 0xf0, 0x05, 0xbb, 0xb0, 0x65, 0x20, 0x83, 0x80, 0x17, 0xb6, 0x0c, + 0x77, 0x10, 0xf4, 0xc2, 0x96, 0x81, 0x0f, 0x02, 0x5f, 0xd8, 0x32, 0xf8, + 0x41, 0xf0, 0x0b, 0x5b, 0x86, 0x53, 0x08, 0xc0, 0x61, 0xcb, 0xc0, 0x0a, + 0x41, 0x38, 0x6c, 0x19, 0x66, 0x21, 0x10, 0x87, 0x2d, 0x43, 0x2d, 0x04, + 0xe1, 0xb0, 0x65, 0x48, 0x89, 0x40, 0x1c, 0xb6, 0x0c, 0x2b, 0x11, 0x84, + 0xc3, 0x96, 0xe1, 0x34, 0x02, 0x71, 0xd8, 0x32, 0xa4, 0x46, 0x10, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x67, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x14, 0xcf, 0x41, 0x30, 0x0d, 0xe4, 0x06, 0x94, 0x8e, 0x00, 0x8c, + 0x35, 0x00, 0x81, 0x40, 0xe0, 0x0c, 0x00, 0x05, 0x33, 0x00, 0x54, 0xcc, + 0x00, 0x8c, 0x35, 0xb0, 0xec, 0x19, 0xca, 0x1f, 0xea, 0x97, 0xb1, 0xfa, + 0xe5, 0xa7, 0x2e, 0xce, 0xde, 0x58, 0x83, 0x5e, 0x83, 0x3b, 0xee, 0xa9, + 0x78, 0x6e, 0xdb, 0xdf, 0xdb, 0xa7, 0xf4, 0xe8, 0x8d, 0x35, 0xac, 0x73, + 0xcc, 0xa2, 0x5e, 0x1a, 0xc2, 0xe8, 0xee, 0xdd, 0x6d, 0xac, 0xda, 0xdf, + 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25, 0xcf, 0xc6, 0xbf, 0x30, + 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f, 0x93, 0xfe, 0xef, 0x0b, + 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, 0x58, 0xc3, + 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2, 0xbc, 0x2f, 0xf0, 0x39, + 0xeb, 0xe3, 0x1f, 0x05, 0x33, 0x00, 0x04, 0x8c, 0x00, 0x8c, 0x11, 0x80, + 0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x00, + 0x00, 0x83, 0x0c, 0xd5, 0x02, 0x0d, 0x37, 0x50, 0x42, 0x30, 0xcb, 0x10, + 0x08, 0xc1, 0x1c, 0x43, 0x43, 0xc5, 0xc1, 0x20, 0x43, 0xe0, 0x48, 0x16, + 0x64, 0xf2, 0x19, 0x64, 0x08, 0xa0, 0x6a, 0x96, 0x20, 0x19, 0x6e, 0xc8, + 0x90, 0x60, 0x96, 0x61, 0x48, 0x82, 0xe1, 0x86, 0x2d, 0x09, 0x66, 0x19, + 0x88, 0x22, 0x18, 0x31, 0x28, 0x8c, 0xe0, 0x0f, 0x3a, 0x69, 0x8e, 0xa1, + 0x0a, 0xf0, 0x60, 0xc4, 0xa0, 0x30, 0x82, 0x50, 0xf8, 0xa6, 0x39, 0x06, + 0x21, 0xc8, 0x83, 0x11, 0x83, 0xc2, 0x08, 0x46, 0x21, 0x0c, 0xa8, 0x39, + 0x06, 0x21, 0xc0, 0x83, 0x59, 0x82, 0x62, 0xa0, 0x22, 0x10, 0x08, 0x6e, + 0x18, 0x43, 0x08, 0xfc, 0x60, 0x0c, 0x41, 0xf0, 0x83, 0x31, 0x84, 0x81, + 0x0f, 0x46, 0x0c, 0x0a, 0x23, 0x38, 0x05, 0x21, 0x18, 0x31, 0x28, 0x8c, + 0x00, 0x15, 0x88, 0x60, 0xb8, 0x21, 0xb8, 0x84, 0x59, 0x06, 0xe3, 0x08, + 0x06, 0x19, 0x8e, 0x6c, 0x0c, 0x6c, 0x40, 0x03, 0xf9, 0x58, 0x80, 0xc1, + 0xc7, 0x8a, 0x34, 0x90, 0x8f, 0x05, 0x1a, 0x7c, 0x6c, 0x08, 0xe8, 0x33, + 0xc7, 0x60, 0x06, 0x81, 0x2a, 0x0c, 0x32, 0x04, 0x67, 0xb0, 0x06, 0x16, + 0x20, 0xf2, 0x19, 0x64, 0x08, 0xd2, 0xc0, 0x0d, 0x66, 0x09, 0x8e, 0x81, + 0x8a, 0x40, 0x30, 0xc4, 0xa0, 0x98, 0x65, 0x40, 0x92, 0x6c, 0x90, 0x21, + 0x20, 0x03, 0x37, 0x18, 0x31, 0x28, 0x8c, 0x00, 0x17, 0x02, 0x34, 0x98, + 0x63, 0x70, 0x83, 0x20, 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xd0, 0x85, 0x21, + 0x0d, 0xe6, 0x18, 0x84, 0x40, 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xe0, 0x85, + 0x42, 0x0d, 0xe6, 0x18, 0x84, 0x20, 0x16, 0x66, 0x09, 0x92, 0x81, 0x92, + 0x80, 0x14, 0x02, 0x57, 0x10, 0x04, 0x04, 0x3a, 0x06, 0x19, 0x02, 0x36, + 0xb0, 0x83, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x30, 0x1b, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, + 0x00, 0xc9, 0x06, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, + 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, + 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, + 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, + 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, + 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, + 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, 0x00, 0xe8, 0x00, 0x00, + 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, + 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, + 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, + 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, + 0xa1, 0x1c, 0x00, 0xa2, 0x1d, 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, + 0xe1, 0x1c, 0xc2, 0x81, 0x1d, 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, + 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0, + 0x01, 0x88, 0x03, 0x39, 0xc0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, + 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, + 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, + 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, + 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, + 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, + 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, + 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, + 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, + 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, + 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, + 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, + 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, + 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, + 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, + 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, + 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, + 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, + 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, + 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, + 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, + 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, + 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, + 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, + 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, + 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, + 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, + 0x7a, 0x28, 0x07, 0x60, 0x83, 0x21, 0x10, 0xc0, 0x02, 0x54, 0x1b, 0x8c, + 0xa1, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x10, 0x08, 0xb0, 0x00, 0xd5, 0x06, + 0xa3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0x83, 0x8f, + 0x18, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00, + 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0, + 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, + 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b, + 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b, + 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b, + 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03, 0x90, 0x07, 0x76, 0x00, + 0x0c, 0xee, 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5, 0x90, 0x0e, 0xec, 0x40, + 0x0f, 0xe9, 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x60, + 0x0e, 0xf2, 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0xef, 0x90, + 0x0e, 0xee, 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d, 0x50, 0x0e, 0xec, 0x90, + 0x0e, 0xed, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, + 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94, 0x43, 0x1b, + 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, 0x43, 0x1b, + 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81, 0x3b, 0xbc, 0x83, 0x3b, + 0xb4, 0x01, 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03, 0x40, 0x0f, 0xf2, 0x50, + 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x90, 0x0e, 0xee, 0x60, + 0x0e, 0xf3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, + 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, + 0xbc, 0x43, 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3, 0x3c, 0xb4, 0x81, 0x39, + 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, + 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xf3, 0x90, + 0x0e, 0xe7, 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d, 0xa0, 0x0f, 0xe5, 0x20, + 0x0f, 0xef, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, + 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, + 0xb8, 0xc3, 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43, 0x38, 0xc0, 0x03, 0x3c, + 0xa4, 0x83, 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, + 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0x31, 0x0f, 0xf4, 0x10, + 0x0e, 0xe3, 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2, 0xf0, 0x0e, 0xf4, 0x50, + 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d, 0x20, 0x0e, 0xf5, 0x60, + 0x0e, 0xe6, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xfa, 0x50, + 0x0e, 0x00, 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3, 0x3c, 0x84, 0x83, 0x39, + 0x94, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, + 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x6c, 0x40, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x06, 0x90, 0x80, 0x6a, 0x83, 0x81, + 0x04, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x44, 0x00, 0x16, 0xa0, 0xda, 0x80, + 0x28, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x0c, 0x20, 0x01, 0xd5, 0x06, + 0x63, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0xc3, 0xc4, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x28, 0x80, 0x34, 0xb8, 0xc3, 0x3b, + 0xb4, 0x81, 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03, 0x3d, 0xa4, 0x83, 0x3b, + 0xcc, 0x03, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x41, 0x31, 0x21, 0x30, 0x26, + 0x0c, 0x07, 0x92, 0x4c, 0x18, 0x14, 0x24, 0x99, 0x10, 0x2c, 0x13, 0x02, + 0x06, 0x89, 0x20, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, + 0x4c, 0x10, 0xb8, 0xc1, 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, + 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, + 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18, 0x80, 0x1c, 0x28, 0x66, + 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6, 0x81, 0x1e, 0xdc, 0xa0, + 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4, 0x40, 0x0f, 0xda, 0x21, + 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50, 0x60, 0x1c, 0x24, 0x4d, + 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21, 0x38, 0x03, 0x81, 0x84, + 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, + 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80, + 0x41, 0x04, 0x25, 0xb8, 0x48, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, + 0x98, 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00, 0x06, 0x11, 0x18, 0xa1, + 0x24, 0x41, 0x10, 0x08, 0x44, 0xb2, 0x2c, 0x0d, 0x39, 0x85, 0x28, 0x8a, + 0xa2, 0x20, 0xa8, 0x0c, 0x00, 0x00, 0x90, 0x54, 0x04, 0x00, 0x20, 0xaa, + 0x0c, 0x40, 0x51, 0x90, 0x55, 0x8c, 0xa2, 0x00, 0x00, 0x00, 0x20, 0xac, + 0x0c, 0x45, 0x51, 0x90, 0x56, 0x84, 0xa2, 0x20, 0x6e, 0x8e, 0x20, 0x98, + 0x23, 0x00, 0x83, 0x61, 0x04, 0xe1, 0x2b, 0x48, 0xb0, 0x34, 0x82, 0x07, + 0x7a, 0x00, 0x85, 0x03, 0x01, 0x29, 0xf0, 0xcd, 0x11, 0x80, 0xc2, 0x20, + 0x02, 0x20, 0x4c, 0x01, 0x8c, 0x00, 0x0c, 0x23, 0x0c, 0xdf, 0x20, 0x42, + 0x20, 0x0c, 0x22, 0x1c, 0xc2, 0x20, 0x42, 0x21, 0x0c, 0x23, 0x10, 0x1f, + 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, + 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x76, 0x08, 0x87, + 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80, 0x03, 0x37, 0x88, 0x83, + 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, + 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, + 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, + 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, + 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, + 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, + 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, + 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20, + 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, + 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10, + 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, + 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, + 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20, + 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, + 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, + 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50, + 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, + 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40, + 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, + 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x79, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x44, 0x40, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x61, 0x26, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x86, 0x30, 0x15, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x43, 0x98, 0x0b, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x21, 0x4c, 0x86, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x10, 0x00, 0xc0, 0x10, + 0x66, 0x02, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0xb3, + 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xe9, 0x80, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x6c, 0x40, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x61, 0xc4, 0x00, 0x08, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, + 0x47, 0xc6, 0x04, 0x43, 0xfa, 0x46, 0x00, 0x4a, 0xa0, 0x10, 0x0a, 0xa4, + 0x08, 0x0a, 0xa2, 0x80, 0x0a, 0x30, 0xa0, 0x0c, 0x0a, 0xa3, 0x50, 0x0a, + 0xa6, 0x70, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, 0xa8, 0x2c, 0x9c, 0x11, + 0x80, 0x42, 0x28, 0x88, 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x22, 0xc7, + 0x12, 0x1e, 0x01, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xae, 0x01, 0x00, + 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, + 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0xc6, 0xf7, 0x8c, 0x01, 0x40, 0x06, + 0x64, 0x40, 0xe5, 0x6e, 0x0c, 0x2d, 0x4c, 0xee, 0x6b, 0x2e, 0x4d, 0xaf, + 0x6c, 0x88, 0xf1, 0x31, 0x63, 0x20, 0x7c, 0x0d, 0xe3, 0x20, 0x08, 0x0e, + 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, + 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, + 0x06, 0x86, 0x06, 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, + 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88, + 0x30, 0x06, 0xc4, 0x10, 0xe3, 0x63, 0x3e, 0xe8, 0x5b, 0x58, 0x34, 0x95, + 0xd1, 0x85, 0xb1, 0x0d, 0x41, 0xc6, 0xe0, 0xf8, 0x98, 0x8f, 0xf9, 0x16, + 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x31, 0x48, 0xc8, 0x85, 0xa5, 0xc9, + 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0x85, 0xcd, + 0xd1, 0x7d, 0xb5, 0x85, 0xd1, 0xa1, 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1, + 0x95, 0x0d, 0x11, 0xc6, 0x60, 0x61, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, + 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, + 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, + 0x7d, 0x91, 0xa5, 0xcd, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0xc6, 0xa0, + 0x61, 0x14, 0x96, 0x26, 0xe7, 0x22, 0x57, 0xe6, 0x46, 0x56, 0x26, 0xf7, + 0x45, 0x17, 0x26, 0x77, 0x56, 0x46, 0xc7, 0x28, 0x2c, 0x4d, 0xce, 0x25, + 0x4c, 0xee, 0xec, 0x8b, 0x2e, 0x0f, 0xae, 0xec, 0xcb, 0x2d, 0xac, 0xad, + 0x8c, 0x86, 0x19, 0xdb, 0x5b, 0x18, 0x1d, 0xcd, 0x10, 0x64, 0x0c, 0x9e, + 0x6f, 0x19, 0x03, 0x68, 0x0c, 0xa2, 0x21, 0xc2, 0x18, 0x48, 0x64, 0xc2, + 0xd2, 0xe4, 0x5c, 0xe0, 0xde, 0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0xa8, + 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0x95, 0xb9, 0xd1, 0x95, 0xc9, 0x51, 0x0a, + 0x4b, 0x93, 0x73, 0x71, 0x7b, 0xfb, 0x82, 0x2b, 0x93, 0x9b, 0x83, 0x2b, + 0x1b, 0xa3, 0x4b, 0xb3, 0x2b, 0x23, 0x13, 0x96, 0x26, 0xe7, 0x12, 0x26, + 0x77, 0xf6, 0xe5, 0x16, 0xd6, 0x56, 0x46, 0x04, 0xee, 0x6d, 0x2e, 0x8d, + 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0xf4, 0x2d, 0x63, 0x40, 0x8d, 0x41, 0x35, + 0x06, 0xd6, 0x18, 0x40, 0x63, 0x10, 0x8d, 0xc1, 0x35, 0x06, 0x18, 0xa5, + 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, + 0xaf, 0x34, 0x37, 0xb8, 0x3a, 0x3a, 0x5a, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, + 0x76, 0x34, 0x5f, 0x66, 0x29, 0x7c, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xca, + 0xe4, 0xe6, 0xe0, 0xca, 0xc6, 0xe8, 0xd2, 0xec, 0xca, 0x58, 0x8c, 0xbd, + 0xb1, 0xbd, 0xc9, 0x0d, 0x91, 0x3e, 0x66, 0x0c, 0xb4, 0x31, 0xd8, 0xc6, + 0xa0, 0x1a, 0x03, 0x6e, 0x0c, 0xa0, 0x31, 0x88, 0xc6, 0xe0, 0x1a, 0x83, + 0x8e, 0xd9, 0x59, 0x99, 0x5b, 0x99, 0x5c, 0x18, 0x5d, 0x19, 0x19, 0x0a, + 0x0e, 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b, 0x1c, 0x19, 0x91, 0x9d, 0xcc, + 0x97, 0x59, 0x0a, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x22, 0x74, + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x43, 0xa4, 0xef, 0x19, 0x03, + 0x6d, 0x0c, 0xbe, 0x31, 0xa8, 0xc6, 0x80, 0x1b, 0x03, 0x68, 0x0c, 0xc0, + 0x60, 0x0c, 0xae, 0x31, 0x08, 0x03, 0x2a, 0x61, 0x69, 0x72, 0x2e, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x7c, 0xc2, 0xd2, 0xe4, 0x5c, 0xc4, 0xea, + 0xcc, 0xcc, 0xca, 0xe4, 0xbe, 0xe6, 0xd2, 0xf4, 0xca, 0x28, 0x85, 0xa5, + 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, 0x85, 0xd1, 0xa5, 0xbd, 0xb9, 0x7d, 0xa5, + 0xb9, 0x91, 0x95, 0xe1, 0x11, 0x09, 0x4b, 0x93, 0x73, 0x91, 0x2b, 0x0b, + 0x23, 0x23, 0x15, 0x96, 0x26, 0xe7, 0x32, 0x47, 0x27, 0x57, 0x37, 0x46, + 0xf7, 0x45, 0x97, 0x07, 0x57, 0xf6, 0x95, 0xe6, 0x66, 0xf6, 0xc6, 0xc2, + 0x8c, 0xed, 0x2d, 0x8c, 0x8e, 0xcc, 0xdc, 0x98, 0xd4, 0x91, 0xd0, 0xd7, + 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, 0x1d, 0x19, 0xba, 0x32, 0x3c, 0xba, 0x3a, + 0xb9, 0xb2, 0x2f, 0xba, 0x3c, 0xb8, 0x32, 0x2a, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5c, 0xc6, 0xde, 0xd8, 0xde, 0xe4, + 0xbe, 0xe6, 0xc6, 0xc2, 0xd8, 0xca, 0xe8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5, + 0x85, 0xc1, 0x7d, 0xb5, 0x95, 0xd1, 0xa1, 0xbd, 0x91, 0xf1, 0xa1, 0x7b, + 0x73, 0x2b, 0x6b, 0x0b, 0x83, 0xfb, 0x32, 0x0b, 0x1b, 0xa3, 0x7b, 0x93, + 0x8b, 0xe1, 0x43, 0xf7, 0xe6, 0x56, 0xd6, 0x16, 0x06, 0xf7, 0x65, 0x16, + 0x36, 0x46, 0xf7, 0x26, 0x27, 0xc3, 0x67, 0x8e, 0x4c, 0xee, 0xeb, 0x0e, + 0x2d, 0x8d, 0xae, 0xec, 0x0b, 0xee, 0x2d, 0xcd, 0x8d, 0x6e, 0x08, 0x2c, + 0x7c, 0xcb, 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1, 0x18, 0xa4, 0xc1, 0xd7, + 0x7c, 0xcd, 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x81, 0x1a, 0x7c, 0xd0, 0xd7, + 0x7c, 0xcb, 0x18, 0xa0, 0xc1, 0x18, 0xac, 0xc1, 0x47, 0x7d, 0xcd, 0xb7, + 0x8c, 0x01, 0x1a, 0x8c, 0x01, 0x1b, 0x7c, 0xce, 0xd7, 0x7c, 0xcb, 0x18, + 0xa0, 0xc1, 0x18, 0xb4, 0xc1, 0x57, 0x7d, 0xcd, 0xb7, 0x8c, 0x01, 0x1a, + 0x8c, 0x81, 0x1b, 0x7c, 0xd6, 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1, 0x18, + 0xbc, 0xc1, 0x77, 0x7d, 0xcd, 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x01, 0x1c, + 0x30, 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, + 0x2b, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0xe3, 0x15, 0x96, 0x26, 0xe7, 0x12, + 0x26, 0x77, 0xf6, 0x45, 0x97, 0x07, 0x57, 0xf6, 0x15, 0xc6, 0x96, 0x76, + 0xe6, 0xf6, 0x35, 0x97, 0xa6, 0x57, 0xc6, 0x67, 0x0a, 0x2d, 0x8c, 0xac, + 0x4c, 0x6e, 0xe8, 0xcd, 0x6d, 0x8e, 0x2e, 0xcc, 0x8d, 0x6e, 0x8e, 0xc1, + 0xd8, 0x10, 0x32, 0xf8, 0xa6, 0x31, 0x18, 0x83, 0x31, 0x20, 0x83, 0x2f, + 0x1a, 0x83, 0x32, 0xf8, 0x96, 0x8f, 0x19, 0x03, 0x33, 0x18, 0x83, 0x33, + 0x18, 0x83, 0x38, 0x18, 0x03, 0x39, 0xf8, 0xa2, 0x31, 0x98, 0x83, 0xaf, + 0x19, 0x03, 0x68, 0x0c, 0xe8, 0x60, 0x0c, 0xae, 0x31, 0xa8, 0x03, 0x1a, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x34, 0xde, 0xcc, 0xcc, 0xe6, 0xca, + 0xe8, 0x88, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xcd, 0xe0, 0xcd, 0xd0, 0x68, + 0x0b, 0xa3, 0x93, 0x4b, 0xc3, 0x1b, 0x42, 0x7d, 0xcb, 0xe7, 0x7c, 0xcb, + 0x18, 0xdc, 0xc1, 0x18, 0xe0, 0xc1, 0xe7, 0x7c, 0xd8, 0xb7, 0x8c, 0x41, + 0x1e, 0x8c, 0x81, 0x1e, 0x30, 0xc9, 0xaa, 0xb2, 0x22, 0x2a, 0x1b, 0x7b, + 0x23, 0x2b, 0xa3, 0x41, 0x56, 0x36, 0xf6, 0x46, 0x56, 0x36, 0x84, 0x0c, + 0xbe, 0x66, 0x0c, 0xc6, 0x60, 0x0c, 0xc8, 0xe0, 0x93, 0xc6, 0xa0, 0x0c, + 0x3e, 0xe6, 0x63, 0xc6, 0xc0, 0x0c, 0xc6, 0xe0, 0x0c, 0xc6, 0x60, 0x0f, + 0xc6, 0x40, 0x0e, 0x3e, 0x69, 0x0c, 0xe6, 0xe0, 0x73, 0xc6, 0x00, 0x1a, + 0x03, 0x3e, 0x18, 0x83, 0x6b, 0x0c, 0xfa, 0x80, 0x4b, 0x58, 0x9a, 0x9c, + 0x0b, 0x5d, 0x19, 0x1e, 0x5d, 0x9d, 0x5c, 0x19, 0x95, 0xb0, 0x34, 0x39, + 0x97, 0xb9, 0xb0, 0x36, 0x38, 0xb6, 0x32, 0x62, 0x74, 0x65, 0x78, 0x74, + 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, + 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x24, 0xe8, 0xca, 0xf0, + 0xb2, 0x86, 0x50, 0x5f, 0x36, 0x06, 0x7f, 0x30, 0x06, 0x65, 0xf0, 0x2d, + 0x1f, 0x33, 0x06, 0xa0, 0x30, 0x06, 0xd0, 0x18, 0x84, 0xc2, 0x18, 0x5c, + 0x63, 0x20, 0x0a, 0x2c, 0xe8, 0xca, 0xf0, 0xaa, 0xac, 0x86, 0x50, 0x9f, + 0x36, 0x06, 0x7f, 0x30, 0x06, 0x65, 0xf0, 0x31, 0x1f, 0x33, 0x06, 0xa0, + 0x30, 0x06, 0xd0, 0x18, 0x84, 0xc2, 0x18, 0x5c, 0x63, 0x40, 0x0a, 0x5c, + 0xc2, 0xd2, 0xe4, 0x5c, 0xe6, 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0xe4, 0x78, + 0xcc, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0x31, 0x98, 0x1b, 0x22, 0x7d, + 0xdb, 0x18, 0x98, 0xc2, 0x18, 0x94, 0xc1, 0xb7, 0x7c, 0xcc, 0x18, 0x40, + 0x63, 0x70, 0x0a, 0x63, 0x70, 0x8d, 0x01, 0x2a, 0x0c, 0x81, 0xc6, 0x20, + 0x1b, 0x03, 0x6f, 0x0c, 0xc4, 0x60, 0x0c, 0xec, 0x60, 0x0c, 0xfc, 0x60, + 0x0c, 0x46, 0x61, 0x0c, 0x4a, 0x61, 0x0c, 0x52, 0x61, 0x88, 0xf1, 0x00, + 0x63, 0x30, 0x8d, 0x81, 0x2a, 0xb0, 0xfa, 0xd2, 0xa2, 0x9a, 0x8a, 0xa9, + 0x99, 0x42, 0x0b, 0x23, 0x2b, 0x93, 0x1b, 0x7a, 0x73, 0x9b, 0xa3, 0x0b, + 0x73, 0xa3, 0x9b, 0xe3, 0xf3, 0xd6, 0xe6, 0x96, 0x06, 0xf7, 0x46, 0x57, + 0xe6, 0x46, 0x07, 0x32, 0x86, 0x16, 0x26, 0xc7, 0x67, 0x2a, 0xad, 0x0d, + 0x8e, 0xad, 0x0c, 0x64, 0x68, 0x65, 0x05, 0x84, 0x4a, 0x28, 0x28, 0x68, + 0x88, 0x30, 0x06, 0xae, 0x30, 0xc4, 0x18, 0x83, 0x56, 0x18, 0x83, 0x57, + 0x28, 0x83, 0x6e, 0x88, 0x31, 0x06, 0x68, 0x30, 0x06, 0xb0, 0x50, 0x06, + 0xdd, 0x10, 0x31, 0x18, 0x03, 0x56, 0x18, 0x83, 0x58, 0x28, 0x83, 0x6e, + 0x0c, 0x62, 0xa1, 0x0c, 0xbc, 0x31, 0x88, 0x85, 0x32, 0xf8, 0xc6, 0x20, + 0x16, 0xca, 0x00, 0x0c, 0xc6, 0x20, 0x16, 0xca, 0x20, 0x0c, 0xc6, 0x20, + 0x16, 0xca, 0x40, 0x0c, 0xc6, 0x20, 0x16, 0xca, 0x60, 0x0c, 0xc6, 0x20, + 0x16, 0xca, 0x80, 0x1b, 0x62, 0x8c, 0x81, 0x2c, 0x8c, 0x41, 0x2c, 0x94, + 0x81, 0xc7, 0x31, 0x08, 0x4b, 0x93, 0x6b, 0x09, 0x63, 0x4b, 0x0b, 0x9b, + 0x6b, 0x99, 0x1b, 0x7b, 0x83, 0x2b, 0x9b, 0x43, 0x99, 0x22, 0x62, 0xfa, + 0x72, 0xb2, 0x8a, 0x91, 0xf9, 0x32, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, 0x73, + 0xa3, 0x4b, 0x19, 0x42, 0x8c, 0x41, 0x2d, 0x8c, 0x01, 0x2d, 0x10, 0x0b, + 0x4b, 0x93, 0x6b, 0x09, 0x63, 0x4b, 0x0b, 0x9b, 0x6b, 0x99, 0x1b, 0x7b, + 0x83, 0x2b, 0x6b, 0xa1, 0x2b, 0xc3, 0xa3, 0xab, 0x93, 0x2b, 0x9b, 0x1b, + 0x62, 0x8c, 0xc1, 0x2d, 0x8c, 0x41, 0x2d, 0x8c, 0x81, 0x2d, 0x10, 0x0b, + 0x4b, 0x93, 0x6b, 0x09, 0x63, 0x4b, 0x0b, 0x9b, 0x6b, 0x99, 0x1b, 0x7b, + 0x83, 0x2b, 0x6b, 0x99, 0x0b, 0x6b, 0x83, 0x63, 0x2b, 0x93, 0x9b, 0x1b, + 0x62, 0x8c, 0x41, 0x2e, 0x8c, 0x41, 0x2d, 0x8c, 0x01, 0x2e, 0x0c, 0x21, + 0xc6, 0xe0, 0x16, 0xc6, 0x20, 0x17, 0x86, 0x18, 0x63, 0x20, 0x0b, 0x63, + 0x10, 0x0b, 0x65, 0xf0, 0x0d, 0x31, 0xc6, 0x40, 0x16, 0xc6, 0x20, 0x16, + 0xca, 0x80, 0x1b, 0x62, 0x8c, 0x81, 0x2c, 0x8c, 0x41, 0x2c, 0x94, 0x41, + 0x18, 0x0c, 0x31, 0xc6, 0x40, 0x16, 0xc6, 0x20, 0x16, 0xca, 0x40, 0x0c, + 0x86, 0x18, 0x63, 0x20, 0x0b, 0x63, 0x10, 0x0b, 0x65, 0x30, 0x06, 0x43, + 0x8c, 0x31, 0x90, 0x85, 0x31, 0x88, 0x85, 0x32, 0x00, 0x83, 0x21, 0xc6, + 0x18, 0xc8, 0xc2, 0x18, 0xc4, 0x42, 0x19, 0x74, 0x23, 0x22, 0x76, 0x60, + 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x77, 0x20, 0x87, 0x7a, 0x60, + 0x87, 0x72, 0x70, 0x03, 0x73, 0x60, 0x87, 0x70, 0x38, 0x87, 0x79, 0x98, + 0x22, 0x04, 0xc3, 0x08, 0x85, 0x1d, 0xd8, 0xc1, 0x1e, 0xda, 0xc1, 0x0d, + 0xd2, 0x81, 0x1c, 0xca, 0xc1, 0x1d, 0xe8, 0x61, 0x4a, 0x50, 0x8c, 0x58, + 0xc2, 0x21, 0x1d, 0xe4, 0xc1, 0x0d, 0xec, 0xa1, 0x1c, 0xe4, 0x61, 0x1e, + 0xd2, 0xe1, 0x1d, 0xdc, 0x61, 0x4a, 0x60, 0x8c, 0xa0, 0xc2, 0x21, 0x1d, + 0xe4, 0xc1, 0x0d, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xea, 0x21, 0x1c, + 0xce, 0xa1, 0x1c, 0x7e, 0xc1, 0x1e, 0xca, 0x41, 0x1e, 0xe6, 0x21, 0x1d, + 0xde, 0xc1, 0x1d, 0xa6, 0x04, 0xc8, 0x88, 0x29, 0x1c, 0xd2, 0x41, 0x1e, + 0xdc, 0x60, 0x1c, 0xde, 0xa1, 0x1d, 0xe0, 0x21, 0x1d, 0xd8, 0xa1, 0x1c, + 0x7e, 0xe1, 0x1d, 0xe0, 0x81, 0x1e, 0xd2, 0xe1, 0x1d, 0xdc, 0x61, 0x1e, + 0xa6, 0x0c, 0x0a, 0xe3, 0x8c, 0x60, 0xc2, 0x21, 0x1d, 0xe4, 0xc1, 0x0d, + 0xcc, 0x41, 0x1e, 0xc2, 0xe1, 0x1c, 0xda, 0xa1, 0x1c, 0xdc, 0x81, 0x1e, + 0xa6, 0x04, 0xab, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, + 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, + 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, + 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, + 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, + 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, + 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, + 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, + 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, + 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, + 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, + 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, + 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, + 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, + 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, + 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, + 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, + 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, + 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, + 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, + 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, + 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, + 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, + 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, + 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, + 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, + 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, + 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, + 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, + 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, + 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, + 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, + 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, + 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, + 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, + 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, + 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, + 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, + 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, + 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, + 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, + 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, + 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, + 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, + 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, + 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, + 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, + 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, + 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, + 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, + 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, + 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, + 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, + 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, + 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, + 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x71, 0x20, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x56, 0x90, 0xfd, + 0x73, 0x6d, 0x6b, 0xcf, 0xb3, 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74, + 0xd5, 0xfd, 0x17, 0x45, 0x51, 0x14, 0x76, 0x20, 0x01, 0x48, 0xe4, 0x17, + 0x80, 0x34, 0xfd, 0x8f, 0x63, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x11, 0x34, + 0x00, 0x12, 0xf9, 0x83, 0x33, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x29, 0x6c, + 0x00, 0x12, 0xf9, 0x12, 0xc0, 0x3c, 0x0b, 0xf1, 0x4f, 0xc4, 0x35, 0x51, + 0x11, 0xf1, 0xdb, 0x83, 0x5f, 0xe1, 0xc5, 0x6d, 0x1b, 0xc2, 0x04, 0x20, + 0x91, 0x5f, 0x00, 0xd2, 0xf4, 0x17, 0x40, 0x20, 0xf9, 0xd5, 0x5d, 0xdc, + 0xb6, 0x05, 0x50, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0xbf, 0xb0, 0x00, + 0xcc, 0xe3, 0x57, 0x77, 0x71, 0xdb, 0x96, 0x30, 0x01, 0x48, 0xe4, 0x17, + 0x80, 0x34, 0xfd, 0x05, 0x03, 0x5c, 0x7e, 0x75, 0x17, 0xb7, 0x6d, 0x02, + 0x10, 0x80, 0x44, 0x7e, 0x01, 0x48, 0xd3, 0xff, 0x38, 0x96, 0x5f, 0xdc, + 0xb6, 0x01, 0x44, 0x6c, 0x57, 0xfe, 0xe7, 0x5b, 0xdb, 0x7f, 0x11, 0x01, + 0x06, 0x43, 0x34, 0x93, 0x0d, 0x44, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, + 0x7f, 0x01, 0x04, 0x92, 0x5f, 0xdc, 0xb6, 0x19, 0x44, 0x00, 0x12, 0xf9, + 0x05, 0x20, 0x4d, 0x7f, 0xc1, 0x00, 0x97, 0x5f, 0xdc, 0x36, 0x00, 0x00, + 0x00, 0x61, 0x20, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x13, 0x04, 0x72, + 0x10, 0x0b, 0x04, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0xd4, 0x8e, 0x45, + 0x00, 0x81, 0x70, 0xcc, 0x41, 0x2c, 0xcc, 0x83, 0x07, 0x94, 0x8e, 0x35, + 0x00, 0x03, 0x31, 0xc7, 0xb0, 0x30, 0x78, 0x30, 0xc7, 0xb0, 0xe0, 0x01, + 0x1e, 0x8c, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0x65, 0x11, 0x94, 0x00, + 0x81, 0x63, 0x09, 0x01, 0x30, 0x02, 0x40, 0xdf, 0x0c, 0x00, 0x79, 0x23, + 0x00, 0x35, 0x40, 0xc0, 0x0c, 0x00, 0x05, 0x33, 0x00, 0x33, 0x00, 0x73, + 0x10, 0xb4, 0xa0, 0x0b, 0xb4, 0xb0, 0x07, 0x24, 0xcc, 0x00, 0x50, 0x31, + 0x03, 0x30, 0x02, 0x30, 0x03, 0x30, 0xd6, 0x00, 0x82, 0x20, 0x88, 0x7f, + 0x20, 0x08, 0x82, 0xf8, 0x07, 0x82, 0x20, 0x88, 0x7f, 0x63, 0x0d, 0x6c, + 0x3b, 0xff, 0xa4, 0xc7, 0xb6, 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4, + 0x37, 0xd6, 0x00, 0x82, 0x20, 0x5b, 0xff, 0x02, 0x08, 0x82, 0x6c, 0xfd, + 0x0b, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x8c, 0x35, 0x80, 0x20, 0xb8, 0xe6, + 0x60, 0x00, 0x82, 0xe0, 0x9a, 0x83, 0x01, 0x08, 0x82, 0x6b, 0x0e, 0x06, + 0x63, 0x0d, 0x20, 0x48, 0xb7, 0x39, 0x18, 0x80, 0x20, 0xdd, 0xe6, 0x60, + 0x00, 0x82, 0x74, 0x9b, 0x83, 0xc1, 0x58, 0xc3, 0x3a, 0xe2, 0x31, 0x0b, + 0x06, 0xeb, 0x88, 0xc7, 0x2c, 0x18, 0xac, 0x23, 0x1e, 0xb3, 0x60, 0x30, + 0xd6, 0x00, 0x82, 0x30, 0x1e, 0x8e, 0x01, 0x08, 0xc2, 0x78, 0x38, 0x06, + 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x8c, 0x35, 0x88, 0xb9, 0x98, 0xf6, 0x1f, + 0x58, 0xf2, 0x6c, 0xfc, 0x0b, 0x63, 0xba, 0xaa, 0xb9, 0x2f, 0x8c, 0x35, + 0xfc, 0x33, 0xe9, 0xff, 0xbe, 0x40, 0xd7, 0xa0, 0x98, 0x7f, 0x2d, 0x1c, + 0xc7, 0xa0, 0x2f, 0x8c, 0x35, 0xcc, 0x7d, 0x9b, 0xa6, 0xbe, 0xd0, 0xba, + 0x21, 0xcf, 0xfb, 0x02, 0x9f, 0xb3, 0x3e, 0xfe, 0x11, 0x30, 0x46, 0x00, + 0x82, 0x20, 0x48, 0x82, 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, + 0x63, 0x04, 0x3a, 0x6b, 0xce, 0x21, 0x18, 0x8c, 0x11, 0xbc, 0x7b, 0x5a, + 0xde, 0xdf, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xc4, 0x3c, + 0xd8, 0xe7, 0xde, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0x80, + 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x0b, 0x63, + 0x04, 0x7d, 0x2c, 0xba, 0xf8, 0x37, 0x46, 0x50, 0xab, 0xb5, 0xda, 0x7e, + 0x63, 0x04, 0xb2, 0xe8, 0xf6, 0x34, 0x18, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, + 0xd3, 0xdd, 0x08, 0x00, 0x00, 0xe3, 0x0d, 0x73, 0xe0, 0x07, 0xaf, 0x40, + 0xc1, 0x18, 0x6e, 0x08, 0x9e, 0x60, 0x96, 0x21, 0x10, 0x82, 0x11, 0x03, + 0xa5, 0x08, 0x68, 0x81, 0x0e, 0xe4, 0xe0, 0x0e, 0xc8, 0xe0, 0x0c, 0xca, + 0x80, 0x18, 0x31, 0x50, 0x8a, 0xa0, 0x16, 0xe8, 0x60, 0x0e, 0xf0, 0xa0, + 0x0c, 0xd0, 0xc0, 0x0c, 0x8a, 0x41, 0x06, 0x61, 0x0c, 0xde, 0x60, 0x90, + 0x41, 0x28, 0x83, 0x38, 0x18, 0x64, 0x10, 0x82, 0x39, 0x38, 0x3d, 0x50, + 0x97, 0x82, 0x32, 0xc8, 0x10, 0xa4, 0x81, 0x1c, 0x18, 0x11, 0xc0, 0x67, + 0xbc, 0xc1, 0x0f, 0x54, 0x61, 0x17, 0x2e, 0x50, 0x97, 0x82, 0x32, 0xc8, + 0x10, 0xb8, 0xc1, 0x1d, 0x8c, 0x18, 0x14, 0x46, 0x70, 0x0e, 0x45, 0x30, + 0xc7, 0xf0, 0x06, 0x41, 0x38, 0x8c, 0x57, 0x90, 0x02, 0x2c, 0x84, 0x83, + 0x38, 0xe0, 0xc1, 0x05, 0xea, 0x52, 0x50, 0x06, 0x19, 0x02, 0x3a, 0xe8, + 0x83, 0x11, 0x83, 0xc2, 0x08, 0xda, 0x61, 0x09, 0xe6, 0x18, 0x8c, 0xc0, + 0x1c, 0xc6, 0x2b, 0x54, 0xc1, 0x16, 0xce, 0x01, 0x1d, 0xfe, 0xe0, 0x02, + 0x75, 0x29, 0x28, 0x83, 0x0c, 0x81, 0x1e, 0x8c, 0xc2, 0x88, 0x41, 0x61, + 0x04, 0xf3, 0x10, 0x05, 0x73, 0x0c, 0x46, 0x90, 0x0e, 0xb3, 0x04, 0xc4, + 0x70, 0x43, 0xc7, 0x06, 0xc1, 0x2c, 0xc3, 0x40, 0x04, 0x23, 0x06, 0x4a, + 0x11, 0xc0, 0x03, 0x2c, 0xb8, 0xc2, 0x2c, 0x80, 0xc2, 0x28, 0x84, 0x02, + 0x18, 0x8c, 0x18, 0x28, 0x45, 0x10, 0x0f, 0xb0, 0xf0, 0x0a, 0xb4, 0x10, + 0x0a, 0xa4, 0x20, 0x0a, 0x61, 0x30, 0xc8, 0x10, 0x80, 0x82, 0x29, 0x0c, + 0x32, 0x0c, 0xa0, 0xc0, 0x0a, 0x83, 0x0c, 0xc2, 0x1f, 0xb8, 0xc2, 0x20, + 0x83, 0x10, 0xc0, 0xc2, 0xdd, 0x82, 0xba, 0x14, 0x94, 0x41, 0x86, 0xc0, + 0x14, 0x5e, 0xc1, 0x88, 0x00, 0x3e, 0xe3, 0x0d, 0xbb, 0x70, 0x0e, 0xf8, + 0x70, 0x81, 0xba, 0x14, 0x94, 0x41, 0x86, 0x60, 0x15, 0x68, 0x61, 0xc4, + 0xa0, 0x30, 0x02, 0x92, 0x28, 0x82, 0x39, 0x06, 0x56, 0x08, 0xfc, 0x61, + 0xbc, 0x22, 0x1c, 0xda, 0xc1, 0x1f, 0xfe, 0xa1, 0x16, 0x2e, 0x50, 0x97, + 0x82, 0x32, 0xc8, 0x10, 0xc4, 0x82, 0x2e, 0x8c, 0x18, 0x14, 0x46, 0xa0, + 0x12, 0x4b, 0x30, 0xc7, 0x60, 0x04, 0x23, 0x31, 0x5e, 0x71, 0x0e, 0xf3, + 0x40, 0x12, 0x25, 0xc1, 0x0b, 0x17, 0xa8, 0x4b, 0x41, 0x19, 0x64, 0x08, + 0x6e, 0x01, 0x1c, 0x46, 0x0c, 0x0a, 0x23, 0x80, 0x89, 0x28, 0x98, 0x63, + 0x30, 0x02, 0x93, 0x98, 0x25, 0x20, 0x06, 0x3a, 0x02, 0x3e, 0x08, 0x84, + 0x01, 0x2e, 0x84, 0x39, 0x86, 0x60, 0x14, 0x48, 0x62, 0xbc, 0x01, 0x1e, + 0xf6, 0x21, 0x25, 0x28, 0x18, 0xc3, 0x0d, 0x41, 0x2b, 0x04, 0xb3, 0x0c, + 0x85, 0x11, 0x0c, 0x32, 0x10, 0xbf, 0x80, 0x0e, 0xe3, 0x0d, 0xf4, 0xf0, + 0x0f, 0x21, 0x41, 0xc1, 0x18, 0x31, 0x20, 0x8c, 0xc0, 0x26, 0x86, 0x11, + 0x83, 0xc2, 0x08, 0x70, 0x22, 0xd8, 0x05, 0x0b, 0x76, 0x01, 0x3e, 0x23, + 0x06, 0x85, 0x11, 0xe0, 0x44, 0x00, 0x0e, 0x36, 0xf0, 0x82, 0x7c, 0x8c, + 0x17, 0x82, 0xf8, 0xd8, 0x10, 0xd0, 0x67, 0xc4, 0x80, 0x30, 0x82, 0x9e, + 0x08, 0x46, 0x0c, 0x0a, 0x23, 0xf8, 0x89, 0xc0, 0x17, 0x2c, 0xf0, 0x05, + 0xf9, 0xcc, 0x31, 0xa0, 0xc3, 0xd2, 0x13, 0x83, 0x0c, 0x41, 0x3a, 0xdc, + 0x83, 0x0d, 0x01, 0x7d, 0x06, 0x19, 0x82, 0x75, 0xe8, 0x87, 0x41, 0x86, + 0xa0, 0xfa, 0x87, 0x59, 0x02, 0x63, 0xa0, 0x22, 0x10, 0x0a, 0x36, 0x20, + 0xc6, 0x1b, 0x4c, 0x22, 0x26, 0xc2, 0x82, 0x82, 0x31, 0xdc, 0x10, 0xd8, + 0x82, 0x33, 0xcb, 0x70, 0x20, 0xc1, 0x20, 0x03, 0x51, 0x0f, 0xfe, 0x30, + 0xde, 0xa0, 0x12, 0x35, 0x91, 0x13, 0x14, 0x8c, 0xf1, 0x06, 0x96, 0xb8, + 0x09, 0x9d, 0xa0, 0x60, 0x8c, 0x18, 0x20, 0x47, 0x14, 0x17, 0x45, 0x77, + 0x0c, 0xc1, 0x20, 0x43, 0x70, 0x0f, 0x29, 0x31, 0xc8, 0x10, 0x2c, 0x2b, + 0x31, 0x4b, 0x80, 0x0c, 0x54, 0x04, 0xc2, 0x81, 0x19, 0xc3, 0x0d, 0x61, + 0x60, 0x0e, 0xc1, 0x2c, 0x43, 0x72, 0x05, 0xe3, 0x0d, 0x33, 0xe1, 0x13, + 0x6f, 0x41, 0xc1, 0x18, 0x6e, 0x08, 0xd2, 0x21, 0x98, 0x65, 0x50, 0x96, + 0x60, 0x90, 0xa1, 0x10, 0x89, 0x95, 0x18, 0x6f, 0xb8, 0x09, 0xb1, 0x60, + 0x0b, 0x0a, 0xc6, 0x1c, 0x43, 0x48, 0x04, 0x76, 0x31, 0xc8, 0x10, 0x88, + 0x04, 0x4c, 0x58, 0x50, 0xc8, 0x67, 0x90, 0x21, 0x20, 0x09, 0x9b, 0x98, + 0x25, 0x88, 0x83, 0xf1, 0x86, 0x9e, 0x40, 0x0b, 0xbd, 0xa0, 0x60, 0x8c, + 0x37, 0xfc, 0x84, 0x5a, 0xd0, 0x05, 0x05, 0x63, 0x90, 0x01, 0x6a, 0x89, + 0x9d, 0x18, 0x6e, 0x20, 0xe0, 0xc1, 0x99, 0x65, 0x60, 0xac, 0x60, 0x0c, + 0x41, 0x02, 0x8d, 0xe1, 0x86, 0x20, 0x1f, 0x94, 0x59, 0x06, 0xa7, 0x09, + 0x4c, 0xd8, 0x07, 0xf9, 0xcc, 0x12, 0x3c, 0x36, 0xf4, 0x03, 0x7c, 0x46, + 0x0c, 0x08, 0x23, 0x60, 0x8d, 0xc0, 0x02, 0x90, 0x90, 0xcf, 0x88, 0x41, + 0x61, 0x04, 0xaf, 0x11, 0x88, 0xc4, 0x2c, 0xc1, 0x33, 0x50, 0x01, 0x28, + 0x8d, 0xe0, 0xcc, 0x31, 0xd8, 0x44, 0x80, 0x1a, 0x63, 0x08, 0x1b, 0x6a, + 0x0c, 0x37, 0x04, 0x22, 0xa1, 0xcc, 0x32, 0x44, 0x50, 0x60, 0x02, 0x49, + 0xc8, 0x67, 0x96, 0x40, 0xb2, 0xc1, 0x24, 0xe0, 0x33, 0x62, 0x40, 0x18, + 0x41, 0x6d, 0x04, 0x16, 0xa4, 0x84, 0x7c, 0x46, 0x0c, 0x0a, 0x23, 0xc0, + 0x8d, 0x60, 0x25, 0x66, 0x09, 0xa4, 0x81, 0x0a, 0x40, 0x81, 0x84, 0x68, + 0x8e, 0x21, 0x09, 0x60, 0x63, 0x0c, 0x81, 0x0c, 0x5c, 0x63, 0xb8, 0x21, + 0x58, 0x09, 0x65, 0x96, 0x81, 0x9a, 0x02, 0x13, 0x5a, 0x42, 0x3e, 0xb3, + 0x04, 0x95, 0x0d, 0x2f, 0x01, 0x9f, 0x11, 0x03, 0xc2, 0x08, 0x7c, 0x23, + 0xb0, 0x40, 0x26, 0xe4, 0x33, 0x62, 0x50, 0x18, 0x41, 0x78, 0x04, 0x34, + 0x31, 0x4b, 0x50, 0x0d, 0x54, 0x00, 0xca, 0x24, 0x50, 0x73, 0x0c, 0x49, + 0x60, 0x1b, 0xb3, 0x04, 0xd6, 0x40, 0x45, 0x20, 0x54, 0x7a, 0xb0, 0x0c, + 0x32, 0x04, 0x6b, 0x41, 0x17, 0x73, 0x0c, 0x68, 0x01, 0x06, 0xbd, 0x31, + 0xc8, 0x10, 0xa4, 0xc5, 0x5d, 0xd8, 0x10, 0xc8, 0x67, 0x90, 0x21, 0x58, + 0x8b, 0xbe, 0x98, 0x25, 0x88, 0x83, 0xe1, 0x86, 0x59, 0xf0, 0x89, 0x60, + 0x96, 0x01, 0x23, 0x83, 0x60, 0x90, 0x81, 0x0e, 0xe2, 0x42, 0x2f, 0xc6, + 0x1b, 0x4c, 0x23, 0x36, 0xc6, 0x83, 0x82, 0x31, 0xde, 0x80, 0x1a, 0xb3, + 0xd1, 0x1b, 0x14, 0x8c, 0x39, 0x06, 0xb9, 0x08, 0xce, 0x63, 0x90, 0x21, + 0x98, 0x8b, 0xd0, 0xb0, 0xe0, 0x90, 0xcf, 0x20, 0x43, 0x50, 0x17, 0xa7, + 0x31, 0xdc, 0x70, 0xf0, 0x84, 0x33, 0xcb, 0x30, 0x06, 0x59, 0x30, 0x86, + 0x30, 0xb0, 0xc7, 0x70, 0x43, 0xf0, 0x13, 0xca, 0x2c, 0xc3, 0xa6, 0x05, + 0x26, 0x84, 0x85, 0x7c, 0x66, 0x09, 0xb8, 0x11, 0x03, 0xc2, 0x08, 0xee, + 0x63, 0x18, 0x31, 0x28, 0x8c, 0x20, 0x3f, 0x02, 0xb2, 0xb0, 0xc0, 0x2c, + 0xe4, 0x63, 0x01, 0x5a, 0xc0, 0x67, 0x96, 0x80, 0x1b, 0xa8, 0x00, 0x14, + 0x4d, 0xd8, 0xe6, 0x18, 0xfa, 0x22, 0xa0, 0x8f, 0x31, 0x04, 0x86, 0x3e, + 0x86, 0x1b, 0x02, 0xb4, 0x50, 0x66, 0x19, 0xbc, 0x2e, 0x30, 0x41, 0x2d, + 0xe4, 0x33, 0x4b, 0xf0, 0x8d, 0x18, 0x10, 0x46, 0x00, 0x22, 0xc3, 0x88, + 0x41, 0x61, 0x04, 0x22, 0x12, 0xb4, 0x85, 0x05, 0x6f, 0x21, 0x1f, 0x0b, + 0xe2, 0x02, 0x3e, 0xb3, 0x04, 0xdf, 0x40, 0x05, 0xa0, 0x74, 0x82, 0x37, + 0xc7, 0x90, 0x04, 0xfc, 0x31, 0x86, 0x50, 0xe9, 0xc7, 0x70, 0x43, 0x10, + 0x17, 0xca, 0x2c, 0x43, 0x18, 0x80, 0x41, 0x60, 0xc2, 0x5c, 0xc8, 0x67, + 0x96, 0x40, 0x0c, 0x46, 0x0c, 0x08, 0x23, 0x48, 0x91, 0x61, 0xc4, 0xa0, + 0x30, 0x82, 0x15, 0x09, 0xec, 0xc2, 0x02, 0xbc, 0x90, 0x8f, 0x05, 0x7a, + 0x01, 0x9f, 0x59, 0x02, 0x31, 0x18, 0xa8, 0x00, 0x14, 0x30, 0x10, 0xc2, + 0x60, 0x8e, 0x21, 0x09, 0x44, 0x64, 0xc4, 0xc0, 0x30, 0x82, 0x18, 0x09, + 0x62, 0xe3, 0x35, 0x06, 0x19, 0x82, 0xd9, 0x28, 0x8f, 0x59, 0x82, 0x31, + 0x18, 0xa8, 0x08, 0xfc, 0x00, 0x13, 0xc4, 0x60, 0x90, 0x21, 0xc8, 0x8d, + 0xf3, 0x98, 0x25, 0x88, 0x83, 0x59, 0x86, 0x32, 0x88, 0x03, 0x7e, 0x18, + 0x64, 0xe8, 0x05, 0xdd, 0x18, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0x66, 0x24, + 0x68, 0x8d, 0x39, 0x06, 0xdb, 0x08, 0x5a, 0x64, 0xc4, 0xa0, 0x30, 0x82, + 0x1a, 0x19, 0x5c, 0x63, 0x8e, 0x41, 0x08, 0x5c, 0x64, 0xc4, 0xa0, 0x30, + 0x82, 0x1b, 0x29, 0x5e, 0x63, 0x8e, 0x41, 0x08, 0x5a, 0x64, 0x90, 0x21, + 0xe8, 0x8d, 0xf7, 0x18, 0x64, 0x08, 0xca, 0x21, 0x3e, 0xc6, 0x1b, 0xee, + 0x43, 0x44, 0x68, 0x84, 0x82, 0x31, 0xde, 0x90, 0x1f, 0x24, 0xe2, 0x22, + 0x14, 0x8c, 0x39, 0x86, 0xf1, 0x08, 0x70, 0x64, 0x90, 0x21, 0x20, 0x0f, + 0xf9, 0xb0, 0x20, 0x91, 0xcf, 0x20, 0x43, 0x60, 0x1e, 0xf8, 0x31, 0xdc, + 0x70, 0xb4, 0x86, 0x33, 0xcb, 0x00, 0x07, 0x66, 0x10, 0x8c, 0x21, 0x0c, + 0x3d, 0x32, 0xdc, 0x10, 0xc0, 0x86, 0x32, 0xcb, 0x80, 0x06, 0x67, 0x10, + 0x98, 0x20, 0x1b, 0xf2, 0x99, 0x25, 0x48, 0x83, 0x11, 0x03, 0xc2, 0x08, + 0xd0, 0x64, 0x18, 0x31, 0x28, 0x8c, 0x40, 0x4d, 0x82, 0xda, 0xb0, 0xe0, + 0x36, 0xe4, 0x63, 0x41, 0x6e, 0xc0, 0x67, 0x96, 0x20, 0x0d, 0x06, 0x2a, + 0x00, 0xe5, 0x0c, 0x04, 0x34, 0x98, 0x63, 0x70, 0x8f, 0xa0, 0x4c, 0xc6, + 0x10, 0x98, 0x32, 0x19, 0x6e, 0x08, 0x72, 0x43, 0x99, 0x65, 0x58, 0x03, + 0x35, 0x08, 0x4c, 0xd8, 0x0d, 0xf9, 0xcc, 0x12, 0xb0, 0xc1, 0x88, 0x01, + 0x61, 0x04, 0x71, 0x32, 0x8c, 0x18, 0x14, 0x46, 0x30, 0x27, 0x81, 0x6f, + 0x58, 0x00, 0x1e, 0xf2, 0xb1, 0x40, 0x3c, 0xe0, 0x33, 0x4b, 0xc0, 0x06, + 0x03, 0x15, 0x80, 0xa2, 0x06, 0xc2, 0x1a, 0xcc, 0x31, 0x24, 0x41, 0x9b, + 0x8c, 0x21, 0x54, 0x6b, 0x32, 0xdc, 0x10, 0x88, 0x87, 0x32, 0xcb, 0xe0, + 0x06, 0x6d, 0x10, 0x98, 0x40, 0x1e, 0xf2, 0x99, 0x25, 0x78, 0x83, 0x11, + 0x03, 0xc2, 0x08, 0xf4, 0x64, 0x18, 0x31, 0x28, 0x8c, 0x80, 0x4f, 0x82, + 0xf3, 0xb0, 0x20, 0x3d, 0xe4, 0x63, 0xc1, 0x7a, 0xc0, 0x67, 0x96, 0xe0, + 0x0d, 0x06, 0x2a, 0x00, 0xa5, 0x0d, 0x04, 0x37, 0x98, 0x63, 0x48, 0x82, + 0x39, 0x19, 0x31, 0x30, 0x8c, 0x40, 0x54, 0x02, 0x11, 0x01, 0x91, 0x41, + 0x86, 0x80, 0x44, 0x6c, 0x64, 0x96, 0x00, 0x0e, 0x06, 0x2a, 0x02, 0x3f, + 0x28, 0x03, 0xe1, 0x0d, 0x06, 0x19, 0x02, 0x15, 0xc1, 0x91, 0x59, 0x82, + 0x38, 0x18, 0x68, 0x09, 0x78, 0x44, 0xe1, 0x11, 0x8b, 0x47, 0xc6, 0x40, + 0x16, 0xe0, 0x80, 0x47, 0xc8, 0x60, 0xa0, 0x25, 0x40, 0x11, 0x45, 0x2f, + 0x2c, 0x73, 0x18, 0x03, 0x02, 0x0e, 0x68, 0x88, 0x0c, 0x06, 0x19, 0x02, + 0x81, 0x47, 0x2c, 0x20, 0x13, 0xf9, 0x64, 0x10, 0x0e, 0x04, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x17, 0xd3, 0x07, 0xff, 0x5c, 0xe3, 0x20, + 0x31, 0xa1, 0xd4, 0xf4, 0x50, 0x13, 0xe7, 0x2c, 0x4e, 0xd4, 0x55, 0xf8, + 0x5f, 0xac, 0x6e, 0x5d, 0x9b, 0x6d, 0x29, 0x38, 0x8d, 0x34, 0x01, 0xcd, + 0x44, 0xd6, 0x39, 0x7b, 0x00, 0x03, 0x11, 0x71, 0x4e, 0x23, 0x4d, 0x40, + 0x33, 0x49, 0x3e, 0x71, 0x21, 0x13, 0x00, 0x00, 0x00, 0x01, 0x31, 0x00, + 0x00, 0x19, 0x00, 0x00, 0x00, 0x5b, 0x86, 0x20, 0x98, 0x85, 0x2d, 0x03, + 0x71, 0xe8, 0xc2, 0x96, 0xa1, 0x38, 0x74, 0x61, 0xcb, 0x20, 0x06, 0x87, + 0x2e, 0x6c, 0x19, 0xc6, 0xe0, 0xd0, 0x85, 0x2d, 0x83, 0x28, 0x04, 0xbb, + 0xb0, 0x65, 0x38, 0x85, 0x80, 0x17, 0xb6, 0x0c, 0xba, 0x10, 0xf4, 0xc2, + 0x96, 0xe1, 0x17, 0x02, 0x5f, 0xd8, 0x32, 0x84, 0x43, 0xf0, 0x0b, 0x5b, + 0x06, 0x75, 0x08, 0x66, 0x61, 0xcb, 0xf0, 0x0e, 0x01, 0x38, 0x6c, 0x19, + 0xec, 0x21, 0x08, 0x87, 0x2d, 0x03, 0x3e, 0x04, 0xe0, 0xb0, 0x65, 0x60, + 0x8b, 0x20, 0x1c, 0xb6, 0x0c, 0x6e, 0x11, 0x80, 0xc3, 0x96, 0x41, 0x3d, + 0x82, 0x70, 0xd8, 0x32, 0xb0, 0x47, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x61, 0x20, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, + 0x2c, 0x10, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0xd4, 0xce, 0x41, + 0x2c, 0xcc, 0xd3, 0x06, 0x94, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, + 0xdf, 0x0c, 0x00, 0x05, 0x33, 0x00, 0x54, 0xcc, 0x00, 0x8c, 0x35, 0xb0, + 0xec, 0x19, 0xca, 0x1f, 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce, + 0xde, 0x58, 0x83, 0x5e, 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf, + 0xdb, 0xa7, 0xf4, 0xe8, 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a, + 0xc2, 0xe8, 0xee, 0xdd, 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b, + 0x69, 0xff, 0x81, 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, + 0xc2, 0x58, 0xc3, 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, + 0xd7, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, + 0x0b, 0xad, 0x1b, 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05, + 0x33, 0x00, 0x04, 0x8c, 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, + 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5, + 0x02, 0x0d, 0x37, 0x50, 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43, + 0x43, 0xc5, 0xc1, 0x20, 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64, + 0x08, 0xa0, 0x6a, 0x96, 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61, + 0x48, 0x82, 0xe1, 0x86, 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31, + 0x28, 0x8c, 0xc0, 0x0f, 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xf0, 0x60, 0xc4, + 0xa0, 0x30, 0x02, 0x50, 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xc8, 0x83, 0x11, + 0x83, 0xc2, 0x08, 0x44, 0x21, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xc0, 0x83, + 0x59, 0x82, 0x62, 0xa0, 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xfc, + 0x60, 0x0c, 0x41, 0xf0, 0x83, 0x31, 0x84, 0x81, 0x0f, 0x46, 0x0c, 0x0a, + 0x23, 0x30, 0x05, 0x21, 0x18, 0x31, 0x28, 0x8c, 0xe0, 0x14, 0x88, 0x60, + 0xb8, 0x21, 0xb8, 0x84, 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c, + 0x0c, 0x6c, 0x40, 0x03, 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90, + 0x8f, 0x05, 0x1a, 0x7c, 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81, + 0x2a, 0x0c, 0x32, 0x04, 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64, + 0x08, 0xd2, 0xc0, 0x0d, 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4, + 0xa0, 0x98, 0x65, 0x40, 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18, + 0x31, 0x28, 0x8c, 0xe0, 0x16, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0x20, + 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xc8, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84, + 0x40, 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xd8, 0x85, 0x42, 0x0d, 0xe6, 0x18, + 0x84, 0x20, 0x16, 0x66, 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57, + 0x10, 0x04, 0x04, 0x3a, 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 }; -const unsigned int sdl_metallib_len = 24153; +const unsigned int sdl_metallib_len = 30341; diff --git a/libs/SDL3/src/render/metal/SDL_shaders_metal_tvos.h b/libs/SDL3/src/render/metal/SDL_shaders_metal_tvos.h index a8791dd4..5d041188 100644 --- a/libs/SDL3/src/render/metal/SDL_shaders_metal_tvos.h +++ b/libs/SDL3/src/render/metal/SDL_shaders_metal_tvos.h @@ -1,28 +1,28 @@ const unsigned char sdl_metallib[] = { 0x4d, 0x54, 0x4c, 0x42, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x89, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x45, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe9, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x5e, 0x00, 0x00, + 0xe5, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, - 0xa2, 0x58, 0x53, 0x0c, 0xa2, 0xbd, 0xbe, 0x39, 0x59, 0x6d, 0xe1, 0x89, - 0x1b, 0xfd, 0xec, 0x1f, 0xf0, 0xd0, 0x05, 0x05, 0xd7, 0x8c, 0x1a, 0x18, - 0x5d, 0x16, 0x2d, 0xfd, 0xc1, 0xfe, 0xf3, 0x3e, 0x4f, 0x46, 0x46, 0x54, + 0x60, 0x7a, 0x81, 0x65, 0xda, 0xf6, 0x14, 0xc4, 0x56, 0x47, 0x0b, 0x7a, + 0x77, 0x81, 0xf4, 0xc0, 0x01, 0xee, 0xcd, 0x26, 0x7c, 0x2d, 0x8d, 0x7b, + 0x28, 0x66, 0x63, 0x5c, 0x85, 0xe9, 0xdd, 0xb9, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x77, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54, 0x59, - 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0xf3, - 0xed, 0xbb, 0xe2, 0xa1, 0x3c, 0xb5, 0x2d, 0x0d, 0x39, 0x81, 0x8e, 0xd7, - 0xe4, 0x50, 0x35, 0xbf, 0x66, 0xba, 0xd9, 0x56, 0xa7, 0x02, 0xbe, 0x98, - 0x3d, 0xa3, 0x53, 0x01, 0x51, 0xed, 0x87, 0x4f, 0x46, 0x46, 0x54, 0x18, + 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0x6e, + 0xc3, 0x21, 0x35, 0x82, 0x00, 0x01, 0xe8, 0xa4, 0x27, 0xe1, 0xec, 0x73, + 0xf1, 0xe9, 0x58, 0x2e, 0x4a, 0x0d, 0xc0, 0x5a, 0x63, 0x1e, 0x7f, 0x35, + 0xf1, 0x6e, 0x35, 0x4e, 0xbf, 0x18, 0xae, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, @@ -30,9 +30,9 @@ const unsigned char sdl_metallib[] = { 0x41, 0x4d, 0x45, 0x13, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, - 0x00, 0x10, 0x25, 0x8a, 0x79, 0xfe, 0xbb, 0x3e, 0x0b, 0x61, 0x6d, 0x8e, - 0xc4, 0xad, 0xe2, 0x4e, 0xb2, 0x86, 0x8d, 0xdb, 0x4e, 0x58, 0xa3, 0xbf, - 0xc1, 0x08, 0x34, 0x33, 0x64, 0x47, 0x0d, 0x9f, 0x11, 0x4f, 0x46, 0x46, + 0x00, 0x6a, 0x1d, 0x1d, 0x45, 0x2a, 0x6b, 0x07, 0x82, 0x0a, 0x87, 0xce, + 0x97, 0xa1, 0xfe, 0x31, 0x9c, 0x83, 0x91, 0x37, 0x14, 0x18, 0x48, 0x21, + 0x09, 0xd8, 0x88, 0xe6, 0x6a, 0xd7, 0xa1, 0x43, 0x12, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, @@ -40,651 +40,110 @@ const unsigned char sdl_metallib[] = { 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, - 0x20, 0x00, 0x94, 0xc1, 0x60, 0x70, 0xdb, 0xf1, 0xf4, 0x9a, 0xca, 0xaf, - 0x43, 0x1f, 0xe8, 0x1f, 0xb8, 0x88, 0xba, 0xf9, 0x36, 0x17, 0x12, 0x31, - 0x5d, 0x14, 0xe5, 0xb4, 0x2a, 0x16, 0x1b, 0x3d, 0x3d, 0x78, 0x4f, 0x46, + 0x20, 0x00, 0xc3, 0xd6, 0x7b, 0x88, 0x85, 0xf9, 0x2a, 0x82, 0x3a, 0xbd, + 0x11, 0xe6, 0x1e, 0x52, 0xa3, 0x10, 0xbc, 0xf6, 0x87, 0xcf, 0x2b, 0x30, + 0xb1, 0x9a, 0xa7, 0x8c, 0xf0, 0x69, 0xee, 0x5a, 0x25, 0x8c, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, - 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x7d, 0x00, - 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x16, 0x00, 0x53, 0x44, 0x4c, 0x5f, - 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, - 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0x0e, 0xe5, 0x18, 0xdc, 0x79, - 0x00, 0x1d, 0x4a, 0xc4, 0x46, 0x65, 0x48, 0xfc, 0x83, 0x39, 0x79, 0xb7, - 0xcd, 0xc2, 0x06, 0xd2, 0x92, 0x3c, 0x41, 0xd6, 0x17, 0x8d, 0x1b, 0xa5, - 0xc0, 0x50, 0x26, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x76, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, - 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, - 0x4e, 0x44, 0x54, 0x78, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, - 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, - 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0xc7, 0xf3, 0x6a, 0x2a, 0xa1, - 0x13, 0x6b, 0xf5, 0x77, 0xfa, 0xbf, 0xe9, 0x16, 0x2c, 0x61, 0x59, 0x38, - 0x9c, 0x83, 0x65, 0xe0, 0x9d, 0xc3, 0x82, 0x66, 0x2d, 0xce, 0xb1, 0x73, - 0x50, 0x6b, 0x7d, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x7e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xd0, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, - 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, - 0x4e, 0x44, 0x54, 0x29, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x15, - 0x00, 0x02, 0x00, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, - 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x56, 0x41, - 0x54, 0x59, 0x04, 0x00, 0x02, 0x00, 0x04, 0x06, 0x45, 0x4e, 0x44, 0x54, - 0x35, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x20, 0x00, 0x03, 0x00, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, - 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x74, 0x65, 0x78, 0x63, 0x6f, - 0x6f, 0x72, 0x64, 0x00, 0x02, 0x80, 0x56, 0x41, 0x54, 0x59, 0x05, 0x00, - 0x03, 0x00, 0x04, 0x06, 0x04, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, - 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, + 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x78, 0x00, + 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, + 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, + 0x20, 0x00, 0x9f, 0x6c, 0xde, 0x3a, 0x59, 0x77, 0x6a, 0xd2, 0x35, 0x5f, + 0x27, 0x58, 0x9c, 0x4b, 0xdb, 0x9c, 0x88, 0xf7, 0xdf, 0x70, 0x9e, 0x17, + 0x60, 0xc0, 0xe8, 0x92, 0xf3, 0x9d, 0xc8, 0x6a, 0x12, 0x45, 0x4f, 0x46, + 0x46, 0x54, 0x18, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x3e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, + 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x79, 0x00, + 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f, + 0x4e, 0x56, 0x31, 0x32, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, + 0x48, 0x20, 0x00, 0xa0, 0xfa, 0x0c, 0x39, 0x0e, 0x54, 0xa2, 0xb2, 0x34, + 0x03, 0x53, 0x34, 0x18, 0x63, 0x46, 0x2e, 0x1a, 0x02, 0x79, 0x8d, 0x88, + 0x29, 0x32, 0xb9, 0xcc, 0xcd, 0x6b, 0xaa, 0xd8, 0x7a, 0x01, 0xd6, 0x4f, + 0x46, 0x46, 0x54, 0x18, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x5a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x29, + 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x15, 0x00, 0x02, 0x00, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x56, 0x41, 0x54, 0x59, 0x04, 0x00, + 0x02, 0x00, 0x04, 0x06, 0x45, 0x4e, 0x44, 0x54, 0x35, 0x00, 0x00, 0x00, + 0x56, 0x41, 0x54, 0x54, 0x20, 0x00, 0x03, 0x00, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x00, 0x01, 0x80, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x00, + 0x02, 0x80, 0x56, 0x41, 0x54, 0x59, 0x05, 0x00, 0x03, 0x00, 0x04, 0x06, + 0x04, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, - 0x00, 0x45, 0x4e, 0x44, 0x54, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0xac, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x28, 0x03, 0x00, - 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, - 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, - 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, - 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, - 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, - 0x48, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, - 0x00, 0x51, 0x18, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, - 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, - 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, - 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, - 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, - 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, - 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, - 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, - 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, - 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, - 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, - 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, - 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, - 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, - 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, - 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, - 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, - 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, - 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, - 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, - 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, - 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, - 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, - 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, - 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, - 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, - 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, - 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, - 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, - 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, - 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, - 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, - 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c, - 0xc2, 0x00, 0x2c, 0x40, 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, - 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, - 0x43, 0x1b, 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0x61, - 0x1b, 0x08, 0x60, 0x01, 0xaa, 0x21, 0x1c, 0xd2, 0x41, 0x1e, 0xda, 0x40, - 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xdc, 0xe1, - 0x1d, 0xda, 0x20, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x00, 0x00, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, - 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, - 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, - 0x60, 0x87, 0x10, 0xc0, 0x30, 0x82, 0x00, 0x24, 0x41, 0x98, 0xc9, 0x9a, - 0x07, 0x7a, 0x90, 0x87, 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, - 0x07, 0x7a, 0x08, 0x07, 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, - 0x07, 0x79, 0x48, 0x07, 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, - 0x28, 0x84, 0x52, 0x88, 0x11, 0x8c, 0xa1, 0x33, 0x10, 0x30, 0x47, 0x00, - 0x06, 0x29, 0xa0, 0xe6, 0x08, 0x40, 0x61, 0x10, 0x21, 0x10, 0x86, 0x11, - 0x08, 0x65, 0x04, 0x00, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, - 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, - 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, - 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, - 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, - 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, - 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, - 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, - 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, - 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, - 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, - 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, - 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, - 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, - 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, - 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, - 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x43, 0x18, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x2c, 0x10, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, - 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, - 0x52, 0x25, 0x30, 0x02, 0x50, 0x80, 0x01, 0x45, 0x50, 0x20, 0x65, 0x50, - 0x08, 0x05, 0x41, 0x6c, 0x04, 0x80, 0xd6, 0x58, 0x42, 0x24, 0x00, 0x00, - 0x00, 0x79, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, - 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, - 0xb7, 0x21, 0x86, 0x42, 0x24, 0xc0, 0xa2, 0x50, 0xb9, 0x1b, 0x43, 0x0b, - 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, 0x28, 0x41, 0x22, 0x28, - 0x07, 0xdf, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, - 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, - 0x06, 0x46, 0x66, 0xc6, 0x25, 0x07, 0x07, 0x04, 0xa5, 0xad, 0x8c, 0x2e, - 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x25, 0x07, - 0x27, 0x65, 0x88, 0x90, 0x10, 0x43, 0x0c, 0x25, 0x50, 0x10, 0x45, 0x60, - 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36, 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, - 0x45, 0xe0, 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, - 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, - 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36, 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, - 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, - 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x84, 0x64, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, - 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, - 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, - 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, - 0x58, 0x9a, 0x9c, 0x0b, 0xdc, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, - 0xa3, 0xb0, 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, - 0xb2, 0x2f, 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x34, 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, - 0xda, 0xca, 0x88, 0xc0, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, - 0x51, 0x92, 0x27, 0x81, 0x92, 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, - 0x9c, 0x8b, 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, - 0x5c, 0x1d, 0x1d, 0xad, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, - 0x32, 0x94, 0x9a, 0xb1, 0x37, 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, - 0xb3, 0x14, 0x16, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, - 0xac, 0x04, 0x4a, 0xa2, 0x44, 0x4a, 0x2e, 0x3a, 0x61, 0x69, 0x72, 0x2e, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xcc, - 0xd8, 0xde, 0xc2, 0xe8, 0x98, 0xc0, 0xbd, 0xa5, 0xb9, 0xd1, 0x4d, 0xa5, - 0xe9, 0x95, 0x0d, 0x51, 0x92, 0x2c, 0x81, 0x12, 0x2d, 0x91, 0x92, 0x6d, - 0x88, 0x91, 0x50, 0x09, 0x96, 0x70, 0x84, 0xc2, 0xd2, 0xe4, 0x5c, 0xec, - 0xca, 0xe4, 0xe8, 0xca, 0xf0, 0xbe, 0xd2, 0xdc, 0xe0, 0xea, 0xe8, 0x28, - 0x85, 0xa5, 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, 0x85, 0xd1, 0xa5, 0xbd, 0xb9, - 0x7d, 0xa5, 0xb9, 0x91, 0x95, 0xe1, 0xd1, 0x3b, 0x2b, 0x73, 0x2b, 0x93, - 0x0b, 0xa3, 0x2b, 0x23, 0x43, 0xf9, 0xfa, 0x0a, 0x4b, 0x93, 0xfb, 0x82, - 0x63, 0x0b, 0x1b, 0x2b, 0x43, 0x7b, 0x63, 0x23, 0x2b, 0x93, 0xfb, 0xfa, - 0x4a, 0xa1, 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x27, 0x33, 0x84, 0x52, 0x84, - 0xc4, 0x4b, 0x3e, 0x45, 0x50, 0x82, 0x04, 0x0c, 0x12, 0x28, 0x09, 0x83, - 0x44, 0x4a, 0xa6, 0x21, 0x94, 0x12, 0x24, 0x5e, 0xf2, 0x29, 0x81, 0x12, - 0x24, 0x60, 0x90, 0x40, 0x49, 0x94, 0x48, 0xc9, 0x45, 0x25, 0x2c, 0x4d, - 0xce, 0x45, 0xac, 0xce, 0xcc, 0xac, 0x4c, 0x8e, 0x4f, 0x58, 0x9a, 0x9c, - 0x8b, 0x58, 0x9d, 0x99, 0x59, 0x99, 0xdc, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, - 0x91, 0xb0, 0x34, 0x39, 0x17, 0xb9, 0xb2, 0x30, 0x32, 0x46, 0x61, 0x69, - 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0xbc, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, - 0xe8, 0xf2, 0xe0, 0xca, 0xbe, 0xc2, 0xd8, 0xd2, 0xce, 0xdc, 0xbe, 0xe6, - 0xd2, 0xf4, 0xca, 0x88, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xd1, 0xe0, 0xd1, - 0x50, 0x81, 0x93, 0x7b, 0x53, 0x2b, 0x1b, 0xa3, 0x4b, 0x7b, 0x73, 0x1b, - 0x02, 0x06, 0x0a, 0x91, 0x90, 0x41, 0x52, 0x06, 0xca, 0x90, 0x7c, 0x0a, - 0xa1, 0x04, 0x89, 0x19, 0x24, 0x67, 0xa0, 0x0c, 0x09, 0x1a, 0x28, 0x45, - 0x02, 0x25, 0x69, 0x90, 0x48, 0x89, 0x1a, 0x30, 0xa1, 0x93, 0x0b, 0x73, - 0x9b, 0x33, 0x7b, 0x93, 0x6b, 0x1b, 0x02, 0x06, 0x8a, 0x91, 0x90, 0x41, - 0x52, 0x06, 0xca, 0x90, 0x7c, 0x8a, 0xa1, 0x04, 0x89, 0x19, 0x24, 0x67, - 0xa0, 0x0c, 0x09, 0x1a, 0x28, 0x45, 0x02, 0x25, 0x69, 0x90, 0x48, 0x09, - 0x1b, 0x0c, 0x41, 0x12, 0x31, 0x48, 0xc6, 0x20, 0x59, 0x83, 0xa4, 0x0d, - 0x86, 0x18, 0x08, 0x90, 0x74, 0x89, 0x1b, 0xf0, 0x79, 0x6b, 0x73, 0x4b, - 0x83, 0x7b, 0xa3, 0x2b, 0x73, 0xa3, 0x03, 0x19, 0x43, 0x0b, 0x93, 0xe3, - 0x33, 0x95, 0xd6, 0x06, 0xc7, 0x56, 0x06, 0x32, 0xb4, 0xb2, 0x02, 0x42, - 0x25, 0x14, 0x14, 0x34, 0x44, 0x48, 0xe2, 0x60, 0x88, 0x91, 0xc0, 0x41, - 0x22, 0x07, 0x4c, 0x32, 0xc4, 0x48, 0xe6, 0x20, 0x99, 0x03, 0x26, 0xa1, - 0x18, 0x84, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, - 0x8d, 0xbd, 0xc1, 0x95, 0xcd, 0xa1, 0x4c, 0x11, 0x31, 0x7d, 0x4d, 0xbd, - 0xb1, 0xa5, 0x91, 0x7d, 0xd9, 0x95, 0xc9, 0xd1, 0x95, 0xe1, 0xa5, 0x0c, - 0x21, 0x12, 0x3b, 0x48, 0xea, 0x80, 0x56, 0x58, 0x9a, 0x5c, 0x4b, 0x18, - 0x5b, 0x5a, 0xd8, 0x5c, 0xcb, 0xdc, 0xd8, 0x1b, 0x5c, 0x59, 0x4b, 0x98, - 0xdc, 0x19, 0xca, 0x4c, 0xca, 0x10, 0x23, 0xc1, 0x83, 0xc4, 0x0e, 0x92, - 0x3b, 0x18, 0x22, 0x24, 0x78, 0x40, 0x2b, 0x2c, 0x4d, 0xae, 0x25, 0x8c, - 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, 0x25, 0x4c, - 0xee, 0x0c, 0x45, 0x26, 0x65, 0x88, 0x91, 0xec, 0x41, 0x62, 0x07, 0x89, - 0x1e, 0x0c, 0x11, 0x92, 0x3d, 0x18, 0x11, 0xb1, 0x03, 0x3b, 0xd8, 0x43, - 0x3b, 0xb8, 0x41, 0x3b, 0xbc, 0x03, 0x39, 0xd4, 0x03, 0x3b, 0x94, 0x83, - 0x1b, 0x98, 0x03, 0x3b, 0x84, 0xc3, 0x39, 0xcc, 0xc3, 0x14, 0x21, 0x18, - 0x46, 0x28, 0xec, 0xc0, 0x0e, 0xf6, 0xd0, 0x0e, 0x6e, 0x90, 0x0e, 0xe4, - 0x50, 0x0e, 0xee, 0x40, 0x0f, 0x53, 0x82, 0x62, 0xc4, 0x12, 0x0e, 0xe9, - 0x20, 0x0f, 0x6e, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, - 0xe0, 0x0e, 0x53, 0x02, 0x63, 0x04, 0x15, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, - 0xc0, 0x0e, 0xe1, 0xe0, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x70, 0x0e, 0xe5, - 0xf0, 0x0b, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, - 0x30, 0x25, 0x40, 0x46, 0x4c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe3, - 0xf0, 0x0e, 0xed, 0x00, 0x0f, 0xe9, 0xc0, 0x0e, 0xe5, 0xf0, 0x0b, 0xef, - 0x00, 0x0f, 0xf4, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0xf3, 0x30, 0x65, 0x50, - 0x18, 0x67, 0x84, 0x12, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0f, 0xe5, - 0x20, 0x0f, 0xf4, 0x50, 0x0e, 0xf8, 0x30, 0x25, 0x78, 0x03, 0x00, 0x00, - 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, - 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, - 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, - 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, - 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, - 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, - 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, - 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, - 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, - 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, - 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, - 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, - 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, - 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, - 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, - 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, - 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, - 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, - 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, - 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, - 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, - 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, - 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, - 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, - 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, - 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, - 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, - 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, - 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, - 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, - 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, - 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, - 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, - 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, - 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, - 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, - 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, - 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, - 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, - 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, - 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, - 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, - 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, - 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, - 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, - 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, - 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, - 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, - 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, - 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, - 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, - 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, - 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, - 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, - 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb1, 0x5d, 0xf9, 0xb3, 0xce, - 0x82, 0x0c, 0x7f, 0x45, 0x44, 0x13, 0x71, 0x01, 0x00, 0x61, 0x20, 0x00, - 0x00, 0x5c, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, - 0x00, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6, - 0x22, 0x04, 0x41, 0x10, 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88, - 0x15, 0x41, 0x09, 0x94, 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14, - 0x66, 0x00, 0x66, 0x00, 0x08, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0x1f, - 0x00, 0xe3, 0x11, 0x8d, 0x94, 0x49, 0x14, 0x94, 0xf1, 0x08, 0x88, 0xda, - 0x28, 0x0a, 0xca, 0x20, 0xc3, 0x70, 0x34, 0x26, 0x04, 0xf2, 0x19, 0x8f, - 0xa0, 0xb0, 0xaf, 0xa1, 0xa0, 0x0c, 0x32, 0x1c, 0x8a, 0x64, 0x42, 0x20, - 0x1f, 0x0b, 0x0a, 0xf8, 0x8c, 0x47, 0x64, 0x1d, 0x19, 0x4c, 0x14, 0x94, - 0x41, 0x06, 0xe6, 0xc1, 0x4c, 0x08, 0xe4, 0x63, 0x45, 0x00, 0x9f, 0xf1, - 0x08, 0x4f, 0x0c, 0xd2, 0xc0, 0xa2, 0xa0, 0x0c, 0x32, 0x44, 0x94, 0x67, - 0x42, 0x20, 0x1f, 0x2b, 0x02, 0xf8, 0x8c, 0x47, 0x88, 0xc1, 0x19, 0xb8, - 0x01, 0x47, 0x41, 0x19, 0x64, 0x08, 0x34, 0x30, 0xb0, 0xa0, 0x92, 0xcf, - 0x20, 0xc3, 0xb0, 0x8d, 0x81, 0x05, 0x93, 0x7c, 0x6c, 0x08, 0xe0, 0x33, - 0xc8, 0x60, 0x78, 0x67, 0x60, 0x41, 0x24, 0x1f, 0x1b, 0x02, 0xf8, 0x0c, - 0x32, 0x24, 0x61, 0xb0, 0x06, 0x16, 0x3c, 0xf2, 0xb1, 0x21, 0x80, 0xcf, - 0x78, 0xc4, 0x1b, 0xd0, 0xc1, 0x1e, 0xa0, 0x01, 0x05, 0x65, 0x90, 0x21, - 0x38, 0x83, 0x36, 0xb0, 0x40, 0x0c, 0xe4, 0x33, 0xc8, 0x30, 0xa0, 0x01, - 0x1c, 0x58, 0x00, 0x06, 0xf2, 0x19, 0x64, 0x28, 0xd4, 0x60, 0x0e, 0x2c, - 0xe8, 0xe4, 0x33, 0xc8, 0x70, 0xb0, 0x81, 0x1d, 0x58, 0xa0, 0xc9, 0x67, - 0x90, 0x81, 0x0f, 0xe2, 0xa0, 0x0e, 0x2c, 0x0b, 0xe4, 0x33, 0xc8, 0xe0, - 0x07, 0x73, 0x80, 0x07, 0xe6, 0x04, 0xf2, 0xb1, 0x64, 0x80, 0x8f, 0x05, - 0x0c, 0x7c, 0x2c, 0x48, 0xe0, 0x63, 0x01, 0x02, 0x1f, 0x0b, 0x0a, 0xf8, - 0xcc, 0x36, 0xe4, 0x41, 0x00, 0xcc, 0x36, 0x04, 0xa5, 0x10, 0xcc, 0x36, - 0x04, 0x78, 0x20, 0x64, 0x10, 0x10, 0x03, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x5b, 0x8e, 0x20, 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0xd8, 0x72, - 0x0c, 0x01, 0x1d, 0x1c, 0x7c, 0x80, 0xe4, 0xc1, 0x96, 0xe3, 0x08, 0xe8, - 0xe0, 0xe0, 0x03, 0x24, 0x0f, 0xb6, 0x1c, 0x4c, 0x40, 0x07, 0x07, 0x1f, - 0x20, 0x79, 0xb0, 0xe5, 0x88, 0x02, 0x3a, 0x38, 0xf8, 0x00, 0xc9, 0x83, - 0x2d, 0x87, 0x15, 0xd0, 0xc1, 0x91, 0x07, 0x08, 0x1f, 0x6c, 0x39, 0xc6, - 0x20, 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0xbc, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x2c, 0x03, 0x00, - 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, - 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, - 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, - 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, - 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, - 0x48, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, - 0x00, 0x51, 0x18, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, - 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, - 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, - 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, - 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, - 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, - 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, - 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, - 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, - 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, - 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, - 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, - 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, - 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, - 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, - 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, - 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, - 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, - 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, - 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, - 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, - 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, - 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, - 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, - 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, - 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, - 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, - 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, - 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, - 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, - 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, - 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, - 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c, - 0x02, 0x01, 0x2c, 0x40, 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, - 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, - 0x43, 0x1b, 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0x61, - 0x1b, 0x0a, 0x60, 0x01, 0xaa, 0x21, 0x1c, 0xd2, 0x41, 0x1e, 0xda, 0x40, - 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xdc, 0xe1, - 0x1d, 0xda, 0x20, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x00, 0x00, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, - 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, - 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, - 0x30, 0x8c, 0x20, 0x00, 0x76, 0x08, 0x41, 0x24, 0x41, 0x98, 0xc9, 0x9a, - 0x07, 0x7a, 0x90, 0x87, 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, - 0x07, 0x7a, 0x08, 0x07, 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, - 0x07, 0x79, 0x48, 0x07, 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, - 0x28, 0x84, 0x62, 0x0c, 0x11, 0x84, 0x31, 0x74, 0x06, 0x02, 0xe6, 0x08, - 0xc0, 0x20, 0x05, 0xd4, 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x04, 0xc2, 0x30, - 0x02, 0xa1, 0x8c, 0x00, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, - 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, - 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, - 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, - 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, - 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, - 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, - 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, - 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, - 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, - 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, - 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, - 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, - 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, - 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, - 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, - 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x43, 0x18, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x2c, 0x10, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, - 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, - 0x52, 0x25, 0x50, 0x04, 0x23, 0x00, 0x05, 0x18, 0x50, 0x08, 0x65, 0x50, - 0x20, 0x05, 0x41, 0x6c, 0x04, 0x80, 0xd6, 0x58, 0x42, 0x24, 0x00, 0x00, - 0x00, 0x79, 0x18, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, - 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, - 0xb7, 0x21, 0x86, 0x22, 0x24, 0xc0, 0xa2, 0x50, 0xb9, 0x1b, 0x43, 0x0b, - 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, 0x28, 0x41, 0x22, 0x28, - 0x05, 0xdf, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, - 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, - 0x06, 0x46, 0x66, 0xc6, 0x25, 0x07, 0x07, 0x04, 0xa5, 0xad, 0x8c, 0x2e, - 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x25, 0x07, - 0x27, 0x65, 0x88, 0x90, 0x10, 0x43, 0x0c, 0x25, 0x50, 0x10, 0x65, 0x60, - 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36, 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, - 0x65, 0xe0, 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, - 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, - 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36, 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, - 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, - 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x84, 0x64, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, - 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, - 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, - 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, - 0x58, 0x9a, 0x9c, 0x0b, 0xdc, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, - 0xa3, 0xb0, 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, - 0xb2, 0x2f, 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x34, 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, - 0xda, 0xca, 0x88, 0xc0, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, - 0x51, 0x92, 0x27, 0x81, 0x92, 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, - 0x9c, 0x8b, 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, - 0x5c, 0x1d, 0x1d, 0xad, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, - 0x32, 0x94, 0x9a, 0xb1, 0x37, 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, - 0xb3, 0x14, 0x16, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, - 0xac, 0x04, 0x4a, 0xa2, 0x44, 0x4a, 0x2e, 0x66, 0x67, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, - 0x6f, 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x34, 0xcc, 0xd8, - 0xde, 0xc2, 0xe8, 0x64, 0x88, 0xd0, 0x95, 0xe1, 0x8d, 0xbd, 0xbd, 0xc9, - 0x91, 0x0d, 0x61, 0x92, 0x2a, 0xc9, 0x12, 0x28, 0xd1, 0x12, 0x29, 0xd9, - 0x86, 0x18, 0x09, 0x95, 0x60, 0x09, 0x47, 0x28, 0x2c, 0x4d, 0xce, 0xc5, - 0xae, 0x4c, 0x8e, 0xae, 0x0c, 0xef, 0x2b, 0xcd, 0x0d, 0xae, 0x8e, 0x8e, - 0x52, 0x58, 0x9a, 0x9c, 0x0b, 0xdb, 0xdb, 0x58, 0x18, 0x5d, 0xda, 0x9b, - 0xdb, 0x57, 0x9a, 0x1b, 0x59, 0x19, 0x1e, 0xbd, 0xb3, 0x32, 0xb7, 0x32, - 0xb9, 0x30, 0xba, 0x32, 0x32, 0x94, 0xaf, 0xaf, 0xb0, 0x34, 0xb9, 0x2f, - 0x38, 0xb6, 0xb0, 0xb1, 0x32, 0xb4, 0x37, 0x36, 0xb2, 0x32, 0xb9, 0xaf, - 0xaf, 0x94, 0x21, 0x94, 0x32, 0x24, 0x5e, 0xf2, 0x29, 0x83, 0x12, 0x24, - 0x60, 0x90, 0x40, 0x89, 0x96, 0x48, 0xc9, 0x34, 0x84, 0x52, 0x82, 0xc4, - 0x4b, 0x3e, 0x25, 0x50, 0x82, 0x04, 0x0c, 0x12, 0x28, 0x89, 0x12, 0x29, - 0xb9, 0x86, 0x50, 0x8a, 0x90, 0x78, 0xc9, 0xa7, 0x08, 0x4a, 0x90, 0x80, - 0x41, 0x02, 0x25, 0x5a, 0x22, 0x25, 0x1b, 0x95, 0xb0, 0x34, 0x39, 0x17, - 0xb1, 0x3a, 0x33, 0xb3, 0x32, 0x39, 0x3e, 0x61, 0x69, 0x72, 0x2e, 0x62, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x44, 0xc2, - 0xd2, 0xe4, 0x5c, 0xe4, 0xca, 0xc2, 0xc8, 0x18, 0x85, 0xa5, 0xc9, 0xb9, - 0x84, 0xc9, 0x9d, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0xcd, 0xa5, 0xe9, - 0x95, 0xf1, 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, - 0x83, 0x2b, 0xfb, 0x0a, 0x63, 0x4b, 0x3b, 0x73, 0xfb, 0x9a, 0x4b, 0xd3, - 0x2b, 0x23, 0x62, 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x83, 0x47, 0x43, 0x05, - 0x4e, 0xee, 0x4d, 0xad, 0x6c, 0x8c, 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0x18, - 0x28, 0x46, 0x42, 0x06, 0x49, 0x19, 0x28, 0x44, 0xf2, 0x29, 0x82, 0x12, - 0x24, 0x66, 0x90, 0x9c, 0x81, 0x42, 0x24, 0x68, 0xa0, 0x1c, 0x09, 0x94, - 0xa4, 0x41, 0x22, 0x25, 0x6a, 0xc0, 0x84, 0x4e, 0x2e, 0xcc, 0x6d, 0xce, - 0xec, 0x4d, 0xae, 0x6d, 0x08, 0x18, 0x28, 0x45, 0x42, 0x06, 0x49, 0x19, - 0x28, 0x44, 0xf2, 0x29, 0x86, 0x12, 0x24, 0x66, 0x90, 0x9c, 0x81, 0x42, - 0x24, 0x68, 0xa0, 0x1c, 0x09, 0x94, 0xa4, 0x41, 0x22, 0x25, 0x6c, 0x30, - 0x44, 0x49, 0xc2, 0x20, 0x11, 0x83, 0x64, 0x0c, 0x92, 0x35, 0x48, 0xda, - 0x60, 0x88, 0x81, 0x00, 0x49, 0x97, 0xb8, 0x01, 0x9f, 0xb7, 0x36, 0xb7, - 0x34, 0xb8, 0x37, 0xba, 0x32, 0x37, 0x3a, 0x90, 0x31, 0xb4, 0x30, 0x39, - 0x3e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, - 0x54, 0x42, 0x41, 0x41, 0x43, 0x84, 0x24, 0x0e, 0x86, 0x18, 0x09, 0x1c, - 0x24, 0x72, 0xc0, 0x24, 0x43, 0x8c, 0x64, 0x0e, 0x92, 0x39, 0x60, 0x12, - 0x86, 0x41, 0x58, 0x9a, 0x5c, 0x4b, 0x18, 0x5b, 0x5a, 0xd8, 0x5c, 0xcb, - 0xdc, 0xd8, 0x1b, 0x5c, 0xd9, 0x1c, 0xca, 0x14, 0x11, 0xd3, 0xd7, 0xd0, - 0x1b, 0x5c, 0xde, 0x97, 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0x5e, 0xca, 0x10, - 0x22, 0xb1, 0x83, 0xa4, 0x0e, 0x68, 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, - 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0x84, 0xc9, - 0x9d, 0xa1, 0xd0, 0xa4, 0x0c, 0x31, 0x12, 0x3c, 0x48, 0xec, 0x20, 0xb9, - 0x83, 0x21, 0x42, 0x82, 0x07, 0xb4, 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8, - 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a, 0xc2, 0xe4, - 0xce, 0x50, 0x66, 0x52, 0x86, 0x18, 0xc9, 0x1e, 0x24, 0x76, 0x90, 0xe8, - 0xc1, 0x10, 0x21, 0xd9, 0x83, 0x11, 0x11, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, - 0x83, 0x1b, 0xb4, 0xc3, 0x3b, 0x90, 0x43, 0x3d, 0xb0, 0x43, 0x39, 0xb8, - 0x81, 0x39, 0xb0, 0x43, 0x38, 0x9c, 0xc3, 0x3c, 0x4c, 0x11, 0x82, 0x61, - 0x84, 0xc2, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xe9, 0x40, 0x0e, - 0xe5, 0xe0, 0x0e, 0xf4, 0x30, 0x25, 0x28, 0x46, 0x2c, 0xe1, 0x90, 0x0e, - 0xf2, 0xe0, 0x06, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, - 0xee, 0x30, 0x25, 0x30, 0x46, 0x50, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, - 0xec, 0x10, 0x0e, 0xee, 0x70, 0x0e, 0xf5, 0x10, 0x0e, 0xe7, 0x50, 0x0e, - 0xbf, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, - 0x53, 0x02, 0x64, 0xc4, 0x14, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x30, 0x0e, - 0xef, 0xd0, 0x0e, 0xf0, 0x90, 0x0e, 0xec, 0x50, 0x0e, 0xbf, 0xf0, 0x0e, - 0xf0, 0x40, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x0f, 0x53, 0x06, 0x85, - 0x71, 0x46, 0x28, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xf6, 0x50, 0x0e, - 0xf2, 0x40, 0x0f, 0xe5, 0x80, 0x0f, 0x53, 0x82, 0x37, 0x00, 0x00, 0x00, - 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, - 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, - 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, - 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, - 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, - 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, - 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, - 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, - 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, - 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, - 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, - 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, - 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, - 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, - 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, - 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, - 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, - 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, - 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, - 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, - 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, - 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, - 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, - 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, - 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, - 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, - 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, - 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, - 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, - 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, - 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, - 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, - 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, - 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, - 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, - 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, - 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, - 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, - 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, - 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, - 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, - 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, - 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, - 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, - 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, - 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, - 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, - 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, - 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, - 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, - 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, - 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, - 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, - 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, - 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0xf0, 0xb0, 0x5d, 0xf9, 0x73, 0xce, - 0x83, 0xfd, 0x15, 0x11, 0x4d, 0xc4, 0x05, 0x00, 0x00, 0x61, 0x20, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, - 0x00, 0x09, 0x00, 0x00, 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6, - 0x22, 0x04, 0x41, 0x10, 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88, - 0x95, 0x40, 0x19, 0x14, 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14, - 0x66, 0x00, 0x66, 0x00, 0x00, 0xe3, 0x11, 0x8c, 0x84, 0x49, 0x14, 0x94, - 0xf1, 0x88, 0x87, 0xd2, 0x28, 0x0a, 0xca, 0x20, 0xc3, 0x60, 0x30, 0x26, - 0x04, 0xf2, 0x19, 0x8f, 0x98, 0x30, 0xaf, 0xa1, 0xa0, 0x0c, 0x32, 0x1c, - 0x49, 0x64, 0x42, 0x20, 0x1f, 0x0b, 0x0a, 0xf8, 0x8c, 0x47, 0x60, 0xdd, - 0x18, 0x40, 0x14, 0x94, 0x41, 0x06, 0xc6, 0xb9, 0x4c, 0x08, 0xe4, 0x63, - 0x45, 0x00, 0x9f, 0xf1, 0x88, 0x4e, 0x0c, 0xd0, 0xc0, 0xa2, 0xa0, 0x0c, - 0x32, 0x44, 0x53, 0x67, 0x42, 0x20, 0x1f, 0x2b, 0x02, 0xf8, 0x8c, 0x47, - 0x84, 0xc1, 0x19, 0xb4, 0x01, 0x47, 0x41, 0x19, 0x64, 0x08, 0xb2, 0xcf, - 0x82, 0x4a, 0x3e, 0x83, 0x0c, 0x83, 0x26, 0x06, 0x16, 0x4c, 0xf2, 0xb1, - 0x21, 0x80, 0xcf, 0x20, 0x83, 0xd1, 0x99, 0x81, 0x05, 0x91, 0x7c, 0x6c, - 0x08, 0xe0, 0x33, 0xc8, 0x90, 0x80, 0x81, 0x1a, 0x58, 0xf0, 0xc8, 0xc7, - 0x86, 0x00, 0x3e, 0xe3, 0x11, 0x6e, 0x40, 0x07, 0x7a, 0x80, 0x06, 0x14, - 0x94, 0x41, 0x86, 0xc0, 0x0c, 0xd8, 0xc0, 0x02, 0x31, 0x90, 0xcf, 0x20, - 0xc3, 0x70, 0x06, 0x6f, 0x60, 0x01, 0x18, 0xc8, 0x67, 0x90, 0xa1, 0x48, - 0x03, 0x39, 0xb0, 0xa0, 0x93, 0xcf, 0x20, 0xc3, 0xb1, 0x06, 0x75, 0x60, - 0x81, 0x26, 0x9f, 0x41, 0x06, 0x3e, 0x78, 0x03, 0x3a, 0xb0, 0x2c, 0x90, - 0xcf, 0x20, 0x83, 0x1f, 0xc4, 0xc1, 0x1d, 0x98, 0x13, 0xc8, 0xc7, 0x92, - 0x01, 0x3e, 0x16, 0x30, 0xf0, 0xb1, 0x20, 0x81, 0x8f, 0x05, 0x08, 0x7c, - 0x2c, 0x28, 0xe0, 0x33, 0xdb, 0x90, 0x07, 0x01, 0x30, 0xdb, 0x10, 0x94, - 0x42, 0x30, 0xdb, 0x10, 0x94, 0x82, 0x90, 0x41, 0x40, 0x0c, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, 0xa0, 0x83, 0x23, 0x0f, - 0x10, 0x3e, 0xd8, 0x72, 0x0c, 0x01, 0x1d, 0x1c, 0x7c, 0x80, 0xe4, 0xc1, - 0x96, 0xe3, 0x08, 0xe8, 0xe0, 0xe0, 0x03, 0x24, 0x0f, 0xb6, 0x1c, 0x4c, - 0x40, 0x07, 0x07, 0x1f, 0x20, 0x79, 0xb0, 0xe5, 0x88, 0x02, 0x3a, 0x38, - 0xf8, 0x00, 0xc9, 0x83, 0x2d, 0x87, 0x15, 0xd0, 0xc1, 0x91, 0x07, 0x08, - 0x1f, 0x6c, 0x39, 0xc6, 0x20, 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, - 0x00, 0xfd, 0x02, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, - 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, - 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, - 0x42, 0x84, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, - 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, - 0x72, 0x24, 0x07, 0xc8, 0x08, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, - 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, - 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, - 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, - 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, - 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, - 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, - 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, - 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, - 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, - 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, - 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, - 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, - 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, - 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, - 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, - 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, - 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, - 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, - 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, - 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, - 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, - 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, - 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, - 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, - 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, - 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, - 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, - 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, - 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, - 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, - 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, - 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, - 0x72, 0x00, 0x36, 0x6c, 0xc2, 0x00, 0x2c, 0x40, 0x35, 0x84, 0x43, 0x3a, - 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, - 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, - 0xcc, 0x03, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x13, 0x84, 0x40, 0x00, 0x89, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x08, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4, - 0x84, 0x04, 0x13, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x88, - 0x8c, 0x0b, 0x84, 0x84, 0x4c, 0x10, 0x3c, 0x33, 0x00, 0xc3, 0x08, 0x04, - 0x30, 0x8c, 0x20, 0x00, 0x67, 0x49, 0x53, 0x44, 0x09, 0x93, 0xcf, 0x1e, - 0xc0, 0x40, 0x44, 0x9c, 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x12, 0x42, 0x00, - 0x00, 0x00, 0x00, 0x06, 0x11, 0x06, 0xa1, 0x10, 0x21, 0x41, 0x54, 0x03, - 0x01, 0x73, 0x04, 0x60, 0x90, 0x02, 0x38, 0x47, 0x00, 0x0a, 0x83, 0x08, - 0x80, 0x30, 0x8c, 0x30, 0x00, 0xc3, 0x08, 0x04, 0x32, 0x02, 0x00, 0x00, + 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, + 0x54, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0xac, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, + 0xde, 0x21, 0x0c, 0x00, 0x00, 0x28, 0x03, 0x00, 0x00, 0x0b, 0x82, 0x20, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, + 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, + 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, + 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, + 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, + 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x48, 0x11, 0x62, 0xa8, + 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, + 0x00, 0x79, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, + 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, + 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, + 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, + 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, + 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, + 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78, + 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70, + 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, + 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, + 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00, + 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, + 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d, + 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d, + 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d, + 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, + 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68, + 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, + 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, + 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, + 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, + 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70, + 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98, + 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, + 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, + 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d, + 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, + 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58, + 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0, + 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, + 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f, + 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d, + 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, + 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c, 0xc2, 0x00, 0x2c, 0x40, + 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83, + 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, 0x84, 0x03, + 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0x61, 0x1b, 0x08, 0x60, 0x01, + 0xaa, 0x21, 0x1c, 0xd2, 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, + 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xda, 0x20, 0x1c, + 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, + 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x60, 0x87, 0x10, 0xc0, + 0x30, 0x82, 0x00, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87, + 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07, + 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07, + 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x52, 0x88, + 0x11, 0x8c, 0xa1, 0x33, 0x10, 0x30, 0x47, 0x00, 0x06, 0x29, 0xa0, 0xe6, + 0x08, 0x40, 0x61, 0x10, 0x21, 0x10, 0x86, 0x11, 0x08, 0x65, 0x04, 0x00, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51, @@ -715,111 +174,97 @@ const unsigned char sdl_metallib[] = { 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18, - 0x03, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, - 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xc2, 0x11, 0x80, 0x42, - 0x28, 0x81, 0x22, 0x28, 0x88, 0x02, 0x2a, 0x8c, 0x02, 0x29, 0x94, 0x82, - 0x29, 0x1c, 0xd2, 0xc2, 0x19, 0x01, 0x28, 0x8c, 0x42, 0x28, 0x88, 0x02, - 0x29, 0x94, 0x82, 0xa1, 0x1c, 0x4b, 0x88, 0x04, 0x00, 0x79, 0x18, 0x00, - 0x00, 0x27, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, - 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0x42, - 0x1c, 0x40, 0x42, 0x51, 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, - 0xd3, 0x2b, 0x1b, 0x62, 0x20, 0xc3, 0x21, 0x20, 0x02, 0xdf, 0x20, 0x08, + 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00, + 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, + 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x52, 0x25, 0x30, 0x02, + 0x50, 0x80, 0x01, 0x45, 0x50, 0x20, 0x65, 0x50, 0x08, 0x05, 0x41, 0x6c, + 0x04, 0x80, 0xd6, 0x58, 0x82, 0x24, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, + 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x86, 0x42, + 0x24, 0xc0, 0xa2, 0x50, 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, + 0xd3, 0x2b, 0x1b, 0x62, 0x28, 0x41, 0x22, 0x28, 0x07, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, - 0x25, 0x07, 0x07, 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, - 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x25, 0x07, 0x27, 0x65, 0x88, 0x70, - 0x10, 0x43, 0x0c, 0x64, 0x40, 0x0a, 0x24, 0x60, 0xd1, 0x54, 0x46, 0x17, - 0xc6, 0x36, 0x04, 0x39, 0x0e, 0x64, 0x40, 0x06, 0x24, 0xe0, 0x16, 0x96, - 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, 0x42, 0x56, - 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, 0x26, 0xc6, - 0x56, 0x36, 0x44, 0x38, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, - 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, - 0x63, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, - 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, - 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, 0xb9, 0x85, - 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x8e, 0x86, 0x51, 0x58, 0x9a, 0x9c, 0x8b, - 0x5c, 0x99, 0x1b, 0x59, 0x99, 0xdc, 0x17, 0x5d, 0x98, 0xdc, 0x59, 0x19, - 0x1d, 0xa3, 0xb0, 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, - 0xb8, 0xb2, 0x2f, 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, - 0x74, 0x34, 0x43, 0x90, 0xe3, 0x41, 0x82, 0x03, 0x3a, 0xa2, 0x21, 0xc2, - 0x21, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x31, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, - 0x73, 0xa3, 0xfb, 0x4a, 0x73, 0x83, 0xab, 0xa3, 0x63, 0x76, 0x56, 0xe6, - 0x56, 0x26, 0x17, 0x46, 0x57, 0x46, 0x86, 0x82, 0x03, 0xf7, 0x36, 0x97, - 0x46, 0x97, 0xf6, 0xe6, 0x46, 0x64, 0x27, 0xf3, 0x65, 0x96, 0x42, 0x25, - 0x2c, 0x4d, 0xce, 0x65, 0xac, 0xcc, 0x8d, 0xae, 0x4c, 0x8e, 0x4f, 0x58, - 0x9a, 0x9c, 0x0b, 0x5c, 0x99, 0xdc, 0x1c, 0x5c, 0xd9, 0x18, 0x5d, 0x9a, - 0x5d, 0x19, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x32, 0x61, 0x69, - 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0xe0, - 0xde, 0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0x86, 0x48, 0x48, 0x70, 0x50, - 0x47, 0x75, 0x58, 0xc7, 0x75, 0x40, 0x07, 0x76, 0x64, 0x87, 0x46, 0xeb, - 0xac, 0xcc, 0xad, 0x4c, 0x2e, 0x8c, 0xae, 0x8c, 0x0c, 0xa5, 0x66, 0xec, - 0x8d, 0xed, 0x4d, 0x8e, 0xc8, 0x8e, 0xe6, 0xcb, 0x2c, 0x85, 0xc5, 0xd8, - 0x1b, 0xdb, 0x9b, 0xdc, 0x10, 0x09, 0x19, 0x0e, 0xea, 0xe0, 0x0e, 0xeb, - 0xb8, 0x0e, 0xe8, 0x88, 0x8e, 0xec, 0xe8, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, - 0x88, 0xd5, 0x99, 0x99, 0x95, 0xc9, 0xf1, 0x09, 0x4b, 0x93, 0x73, 0x11, - 0xab, 0x33, 0x33, 0x2b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0xa3, 0x14, - 0x96, 0x26, 0xe7, 0xc2, 0xf6, 0x36, 0x16, 0x46, 0x97, 0xf6, 0xe6, 0xf6, - 0x95, 0xe6, 0x46, 0x56, 0x86, 0x47, 0x24, 0x2c, 0x4d, 0xce, 0x45, 0xae, - 0x2c, 0x8c, 0x8c, 0x54, 0x58, 0x9a, 0x9c, 0xcb, 0x1c, 0x9d, 0x5c, 0xdd, - 0x18, 0xdd, 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x9a, 0x9b, 0xd9, 0x1b, - 0x0b, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x32, 0x73, 0x63, 0x52, 0x47, 0x42, - 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x64, 0xe8, 0xca, 0xf0, 0xe8, - 0xea, 0xe4, 0xca, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, 0xa8, 0xa4, 0xb9, 0xc1, - 0xd5, 0xd1, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x71, 0x19, 0x7b, 0x63, 0x7b, - 0x93, 0xfb, 0x9a, 0x1b, 0x0b, 0x63, 0x2b, 0xa3, 0x43, 0xf7, 0xe6, 0x56, - 0xd6, 0x16, 0x06, 0xf7, 0xd5, 0x56, 0x46, 0x87, 0xf6, 0x46, 0xc6, 0x87, - 0xee, 0xcd, 0xad, 0xac, 0x2d, 0x0c, 0xee, 0xcb, 0x2c, 0x6c, 0x8c, 0xee, - 0x4d, 0x2e, 0x86, 0x0f, 0xdd, 0x9b, 0x5b, 0x59, 0x5b, 0x18, 0xdc, 0x97, - 0x59, 0xd8, 0x18, 0xdd, 0x9b, 0x9c, 0x0c, 0x9f, 0x39, 0x32, 0xb9, 0xaf, - 0x3b, 0xb4, 0x34, 0xba, 0xb2, 0x2f, 0xb8, 0xb7, 0x34, 0x37, 0xba, 0x21, - 0xb0, 0x80, 0x04, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x65, 0x80, 0x08, - 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x66, 0x80, 0x14, 0x88, 0x80, 0x04, - 0x07, 0x19, 0x1c, 0x67, 0x80, 0x1c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, - 0x68, 0x80, 0x20, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x69, 0x80, 0x24, - 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x6a, 0x80, 0x28, 0x88, 0x80, 0x04, - 0x07, 0x19, 0x1c, 0x6b, 0x80, 0x2c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, - 0x6c, 0xc0, 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, 0xec, 0x8b, 0x2e, - 0x0f, 0xae, 0xec, 0x6b, 0x2e, 0x4d, 0xaf, 0x8c, 0x57, 0x58, 0x9a, 0x9c, - 0x4b, 0x98, 0xdc, 0xd9, 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x18, 0x5b, - 0xda, 0x99, 0xdb, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x9f, 0x29, 0xb4, 0x30, - 0xb2, 0x32, 0xb9, 0xa1, 0x37, 0xb7, 0x39, 0xba, 0x30, 0x37, 0xba, 0x39, - 0x06, 0x63, 0x43, 0xc8, 0x00, 0x21, 0x8e, 0xef, 0x00, 0x03, 0xc4, 0x38, - 0xc2, 0x00, 0x09, 0x90, 0xe1, 0x10, 0x83, 0x63, 0x0c, 0x8e, 0x36, 0x38, - 0xdc, 0x00, 0x31, 0x8e, 0x37, 0x40, 0x84, 0x03, 0x3a, 0xe0, 0xe0, 0xc8, - 0x8e, 0x38, 0x18, 0x62, 0x1c, 0xdb, 0xe1, 0x1d, 0x72, 0x30, 0xc4, 0x30, - 0x80, 0x63, 0x3a, 0xe6, 0x80, 0xd5, 0x97, 0x16, 0xd5, 0x54, 0x4c, 0xcd, - 0x14, 0x5a, 0x18, 0x59, 0x99, 0xdc, 0xd0, 0x9b, 0xdb, 0x1c, 0x5d, 0x98, - 0x1b, 0xdd, 0x1c, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, 0x37, 0xba, 0x32, - 0x37, 0x3a, 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, 0x69, 0x6d, 0x70, - 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x43, - 0x84, 0xe3, 0x0e, 0x86, 0x18, 0x87, 0x1d, 0x1c, 0x78, 0xa0, 0x34, 0x43, - 0x8c, 0x83, 0x0c, 0x8e, 0x3c, 0x50, 0x9a, 0x21, 0x62, 0x70, 0xd4, 0xc1, - 0xa1, 0x07, 0x4a, 0x73, 0xe8, 0x81, 0xf2, 0x1c, 0x7a, 0xa0, 0x40, 0x87, - 0x1e, 0x28, 0xce, 0xa1, 0x07, 0x4a, 0x74, 0xe8, 0x81, 0x22, 0x1d, 0x7a, - 0xa0, 0x4c, 0x87, 0x1e, 0x28, 0xcc, 0x10, 0xe3, 0xd8, 0x83, 0x43, 0x0f, - 0x14, 0x87, 0x64, 0x10, 0x96, 0x26, 0xd7, 0x12, 0xc6, 0x96, 0x16, 0x36, - 0xd7, 0x32, 0x37, 0xf6, 0x06, 0x57, 0x36, 0x87, 0x32, 0x45, 0xc4, 0xf4, - 0x35, 0xf5, 0xc6, 0x96, 0x46, 0xf6, 0x65, 0x26, 0x17, 0x76, 0xd6, 0x56, - 0xe6, 0x46, 0x97, 0x32, 0x84, 0x38, 0xfc, 0xe0, 0xe8, 0x03, 0x5a, 0x61, - 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x32, 0x29, 0x43, 0x8c, 0x03, - 0x14, 0x0e, 0x3f, 0x38, 0xfe, 0x60, 0x88, 0x70, 0x80, 0xc2, 0x88, 0x88, - 0x1d, 0xd8, 0xc1, 0x1e, 0xda, 0xc1, 0x0d, 0xda, 0xe1, 0x1d, 0xc8, 0xa1, - 0x1e, 0xd8, 0xa1, 0x1c, 0xdc, 0xc0, 0x1c, 0xd8, 0x21, 0x1c, 0xce, 0x61, - 0x1e, 0xa6, 0x08, 0xc1, 0x30, 0x42, 0x61, 0x07, 0x76, 0xb0, 0x87, 0x76, - 0x70, 0x83, 0x74, 0x20, 0x87, 0x72, 0x70, 0x07, 0x7a, 0x98, 0x12, 0x14, - 0x23, 0x96, 0x70, 0x48, 0x07, 0x79, 0x70, 0x03, 0x7b, 0x28, 0x07, 0x79, - 0x98, 0x87, 0x74, 0x78, 0x07, 0x77, 0x98, 0x12, 0x18, 0x23, 0xa8, 0x70, - 0x48, 0x07, 0x79, 0x70, 0x03, 0x76, 0x08, 0x07, 0x77, 0x38, 0x87, 0x7a, - 0x08, 0x87, 0x73, 0x28, 0x87, 0x5f, 0xb0, 0x87, 0x72, 0x90, 0x87, 0x79, - 0x48, 0x87, 0x77, 0x70, 0x87, 0x29, 0x01, 0x32, 0x62, 0x0a, 0x87, 0x74, - 0x90, 0x07, 0x37, 0x18, 0x87, 0x77, 0x68, 0x07, 0x78, 0x48, 0x07, 0x76, - 0x28, 0x87, 0x5f, 0x78, 0x07, 0x78, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, - 0x98, 0x87, 0x29, 0x83, 0xc2, 0x38, 0x23, 0x98, 0x70, 0x48, 0x07, 0x79, - 0x70, 0x03, 0x73, 0x90, 0x87, 0x70, 0x38, 0x87, 0x76, 0x28, 0x07, 0x77, - 0xa0, 0x87, 0x29, 0x01, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, + 0x85, 0x06, 0x86, 0x06, 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, + 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, + 0x88, 0x90, 0x10, 0x43, 0x0c, 0x25, 0x50, 0x10, 0x45, 0x60, 0xd1, 0x54, + 0x46, 0x17, 0xc6, 0x36, 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, 0x45, 0xe0, + 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, + 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, + 0x26, 0xc6, 0x56, 0x36, 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, + 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x84, 0x64, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, + 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, + 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, + 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, 0x58, 0x9a, + 0x9c, 0x0b, 0xdc, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, 0xa3, 0xb0, + 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f, + 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x64, + 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, 0xda, 0xca, + 0x88, 0xc0, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, 0x51, 0x92, + 0x27, 0x81, 0x92, 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, 0x9c, 0x8b, + 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, + 0x1d, 0xad, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32, 0x94, + 0x9a, 0xb1, 0x37, 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, 0xb3, 0x14, + 0x16, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, 0xac, 0x04, + 0x4a, 0xa2, 0x44, 0x4a, 0x2e, 0x3a, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xcc, 0xd8, 0xde, + 0xc2, 0xe8, 0x98, 0xc0, 0xbd, 0xa5, 0xb9, 0xd1, 0x4d, 0xa5, 0xe9, 0x95, + 0x0d, 0x51, 0x92, 0x2c, 0x81, 0x12, 0x2d, 0x91, 0x92, 0x6d, 0x88, 0x91, + 0x50, 0x09, 0x96, 0x70, 0x84, 0xc2, 0xd2, 0xe4, 0x5c, 0xec, 0xca, 0xe4, + 0xe8, 0xca, 0xf0, 0xbe, 0xd2, 0xdc, 0xe0, 0xea, 0xe8, 0x28, 0x85, 0xa5, + 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, 0x85, 0xd1, 0xa5, 0xbd, 0xb9, 0x7d, 0xa5, + 0xb9, 0x91, 0x95, 0xe1, 0xd1, 0x3b, 0x2b, 0x73, 0x2b, 0x93, 0x0b, 0xa3, + 0x2b, 0x23, 0x43, 0xf9, 0xfa, 0x0a, 0x4b, 0x93, 0xfb, 0x82, 0x63, 0x0b, + 0x1b, 0x2b, 0x43, 0x7b, 0x63, 0x23, 0x2b, 0x93, 0xfb, 0xfa, 0x4a, 0xa1, + 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x27, 0x33, 0x84, 0x52, 0x84, 0xc4, 0x4b, + 0x3e, 0x45, 0x50, 0x82, 0x04, 0x0c, 0x12, 0x28, 0x09, 0x83, 0x44, 0x4a, + 0xa6, 0x21, 0x94, 0x12, 0x24, 0x5e, 0xf2, 0x29, 0x81, 0x12, 0x24, 0x60, + 0x90, 0x40, 0x49, 0x94, 0x48, 0xc9, 0x45, 0x25, 0x2c, 0x4d, 0xce, 0x45, + 0xac, 0xce, 0xcc, 0xac, 0x4c, 0x8e, 0x4f, 0x58, 0x9a, 0x9c, 0x8b, 0x58, + 0x9d, 0x99, 0x59, 0x99, 0xdc, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x91, 0xb0, + 0x34, 0x39, 0x17, 0xb9, 0xb2, 0x30, 0x32, 0x46, 0x61, 0x69, 0x72, 0x2e, + 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0xbc, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xe8, 0xf2, + 0xe0, 0xca, 0xbe, 0xc2, 0xd8, 0xd2, 0xce, 0xdc, 0xbe, 0xe6, 0xd2, 0xf4, + 0xca, 0x88, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xd1, 0xe0, 0xd1, 0x50, 0x81, + 0x93, 0x7b, 0x53, 0x2b, 0x1b, 0xa3, 0x4b, 0x7b, 0x73, 0x1b, 0x02, 0x06, + 0x0a, 0x91, 0x90, 0x41, 0x52, 0x06, 0xca, 0x90, 0x7c, 0x0a, 0xa1, 0x04, + 0x89, 0x19, 0x24, 0x67, 0xa0, 0x0c, 0x09, 0x1a, 0x28, 0x45, 0x02, 0x25, + 0x69, 0x90, 0x48, 0x89, 0x1a, 0x30, 0xa1, 0x93, 0x0b, 0x73, 0x9b, 0x33, + 0x7b, 0x93, 0x6b, 0x1b, 0x02, 0x06, 0x8a, 0x91, 0x90, 0x41, 0x52, 0x06, + 0xca, 0x90, 0x7c, 0x8a, 0xa1, 0x04, 0x89, 0x19, 0x24, 0x67, 0xa0, 0x0c, + 0x09, 0x1a, 0x28, 0x45, 0x02, 0x25, 0x69, 0x90, 0x48, 0x09, 0x1b, 0x0c, + 0x41, 0x12, 0x31, 0x48, 0xc6, 0x20, 0x59, 0x83, 0xa4, 0x0d, 0x86, 0x18, + 0x08, 0x90, 0x74, 0x89, 0x1b, 0xf0, 0x79, 0x6b, 0x73, 0x4b, 0x83, 0x7b, + 0xa3, 0x2b, 0x73, 0xa3, 0x03, 0x19, 0x43, 0x0b, 0x93, 0xe3, 0x33, 0x95, + 0xd6, 0x06, 0xc7, 0x56, 0x06, 0x32, 0xb4, 0xb2, 0x02, 0x42, 0x25, 0x14, + 0x14, 0x34, 0x44, 0x48, 0xe2, 0x60, 0x88, 0x91, 0xc0, 0x41, 0x22, 0x07, + 0x4c, 0x32, 0xc4, 0x48, 0xe6, 0x20, 0x99, 0x03, 0x26, 0xa1, 0x18, 0x84, + 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, + 0xc1, 0x95, 0xcd, 0xa1, 0x4c, 0x11, 0x31, 0x7d, 0x4d, 0xbd, 0xb1, 0xa5, + 0x91, 0x7d, 0xd9, 0x95, 0xc9, 0xd1, 0x95, 0xe1, 0xa5, 0x0c, 0x21, 0x12, + 0x3b, 0x48, 0xea, 0x80, 0x56, 0x58, 0x9a, 0x5c, 0x4b, 0x18, 0x5b, 0x5a, + 0xd8, 0x5c, 0xcb, 0xdc, 0xd8, 0x1b, 0x5c, 0x59, 0x4b, 0x98, 0xdc, 0x19, + 0xca, 0x4c, 0xca, 0x10, 0x23, 0xc1, 0x83, 0xc4, 0x0e, 0x92, 0x3b, 0x18, + 0x22, 0x24, 0x78, 0x40, 0x2b, 0x2c, 0x4d, 0xae, 0x25, 0x8c, 0x2d, 0x2d, + 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, 0x25, 0x4c, 0xee, 0x0c, + 0x45, 0x26, 0x65, 0x88, 0x91, 0xec, 0x41, 0x62, 0x07, 0x89, 0x1e, 0x0c, + 0x11, 0x92, 0x3d, 0x18, 0x11, 0xb1, 0x03, 0x3b, 0xd8, 0x43, 0x3b, 0xb8, + 0x41, 0x3b, 0xbc, 0x03, 0x39, 0xd4, 0x03, 0x3b, 0x94, 0x83, 0x1b, 0x98, + 0x03, 0x3b, 0x84, 0xc3, 0x39, 0xcc, 0xc3, 0x14, 0x21, 0x18, 0x46, 0x28, + 0xec, 0xc0, 0x0e, 0xf6, 0xd0, 0x0e, 0x6e, 0x90, 0x0e, 0xe4, 0x50, 0x0e, + 0xee, 0x40, 0x0f, 0x53, 0x82, 0x62, 0xc4, 0x12, 0x0e, 0xe9, 0x20, 0x0f, + 0x6e, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, + 0x53, 0x02, 0x63, 0x04, 0x15, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0xc0, 0x0e, + 0xe1, 0xe0, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x70, 0x0e, 0xe5, 0xf0, 0x0b, + 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x25, + 0x40, 0x46, 0x4c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe3, 0xf0, 0x0e, + 0xed, 0x00, 0x0f, 0xe9, 0xc0, 0x0e, 0xe5, 0xf0, 0x0b, 0xef, 0x00, 0x0f, + 0xf4, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0xf3, 0x30, 0x65, 0x50, 0x18, 0x67, + 0x84, 0x12, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0f, 0xe5, 0x20, 0x0f, + 0xf4, 0x50, 0x0e, 0xf8, 0x30, 0x25, 0x78, 0x03, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, @@ -875,396 +320,102 @@ const unsigned char sdl_metallib[] = { 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x06, 0x20, 0xb1, 0x5d, 0xf9, 0xb3, 0xce, 0x82, 0x0c, 0x7f, 0x11, - 0x01, 0x06, 0x43, 0x34, 0x13, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, - 0x00, 0x06, 0x00, 0x00, 0x00, 0xd4, 0x73, 0x10, 0x41, 0x10, 0x68, 0x84, - 0x65, 0x30, 0x03, 0x40, 0x3c, 0x03, 0x40, 0x30, 0x46, 0x00, 0x82, 0x20, - 0x88, 0x7f, 0x00, 0x00, 0x00, 0xe3, 0x0d, 0x06, 0x44, 0x50, 0x30, 0xe6, - 0x18, 0x88, 0xc0, 0x1b, 0x64, 0x08, 0x0a, 0x64, 0x8e, 0x21, 0x28, 0x10, - 0x0b, 0x18, 0xf9, 0x64, 0x10, 0x10, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x5b, 0x8a, 0x20, 0xe0, 0x83, 0x23, 0x14, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0xd0, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x71, 0x03, 0x00, - 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, - 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, - 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, - 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, - 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, - 0x48, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, - 0x00, 0x51, 0x18, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, - 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, - 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, - 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, - 0x1d, 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, - 0x1d, 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, - 0x0d, 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, - 0xc0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, - 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, - 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, - 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, - 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, - 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, - 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, - 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, - 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, - 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, - 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, - 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, - 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, - 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, - 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, - 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, - 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, - 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, - 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, - 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, - 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, - 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, - 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, - 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, - 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, - 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, - 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, - 0xc3, 0x26, 0x10, 0xc0, 0x02, 0x54, 0x43, 0x38, 0xa4, 0x83, 0x3c, 0xb4, - 0x81, 0x38, 0xd4, 0x83, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0xb8, - 0xc3, 0x3b, 0xb4, 0x41, 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00, - 0x1b, 0x8c, 0xa1, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x10, 0x06, 0xb0, 0x00, - 0xd5, 0x06, 0xa4, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, - 0xa8, 0x36, 0x18, 0x46, 0x00, 0x2c, 0x40, 0xb5, 0xc1, 0x38, 0x04, 0x60, - 0x01, 0xaa, 0x0d, 0x08, 0xf2, 0xff, 0xff, 0xff, 0xff, 0x03, 0xc0, 0x00, - 0x12, 0x50, 0x01, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x43, 0x61, 0x1c, 0x13, 0x06, - 0xc4, 0x38, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x28, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, - 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, - 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x60, 0x33, 0x00, 0xc3, 0x08, 0x04, - 0x30, 0x8c, 0x20, 0x00, 0x67, 0x49, 0x53, 0x44, 0x09, 0x93, 0xcf, 0x1e, - 0xc0, 0x40, 0x44, 0x9c, 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x12, 0x42, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x11, 0x06, 0xe1, 0x28, 0x69, 0x8a, 0x28, - 0x61, 0xf2, 0xff, 0x89, 0xb8, 0x26, 0x2a, 0x22, 0x7e, 0x7b, 0xf8, 0xa7, - 0x31, 0x02, 0x60, 0x10, 0xa1, 0x08, 0x2e, 0x92, 0xa6, 0x88, 0x12, 0x26, - 0xff, 0x97, 0x00, 0xe6, 0x59, 0x88, 0xe8, 0x9f, 0xc6, 0x08, 0x80, 0x41, - 0x84, 0x43, 0x28, 0x47, 0x08, 0x41, 0x10, 0x83, 0x28, 0xcd, 0x11, 0x04, - 0x73, 0x04, 0x60, 0x30, 0x8c, 0x20, 0x30, 0x05, 0x09, 0x06, 0x89, 0xd5, - 0x16, 0x20, 0x37, 0x10, 0x90, 0x02, 0x6c, 0x8e, 0x00, 0x14, 0x06, 0x11, - 0x00, 0x61, 0x18, 0x61, 0x60, 0x86, 0x11, 0x06, 0x60, 0x18, 0x81, 0x60, - 0x46, 0x00, 0x00, 0x00, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, - 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, - 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, - 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, - 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, - 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, - 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, - 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, - 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, - 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, - 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, - 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, - 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, - 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, - 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, - 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, - 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x43, 0x18, 0x05, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x21, 0xcc, 0x03, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x16, 0x08, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, - 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, - 0x62, 0x23, 0x00, 0x85, 0x50, 0x02, 0x45, 0x50, 0x10, 0x05, 0x54, 0x06, - 0x85, 0x51, 0x20, 0x85, 0x52, 0x30, 0x85, 0x53, 0x0a, 0x24, 0x0b, 0x67, - 0x04, 0xa0, 0x30, 0x0a, 0xa1, 0x20, 0x0a, 0xa4, 0x50, 0x0a, 0x86, 0xe2, - 0x58, 0x42, 0x24, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x65, 0x01, 0x00, - 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, - 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0x53, 0x40, 0x40, 0x74, 0x51, - 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, - 0x30, 0x04, 0x24, 0x30, 0x03, 0xdf, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, - 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, - 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x25, 0x07, 0x07, 0x04, - 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, 0x46, - 0x66, 0xc6, 0x25, 0x07, 0x27, 0x65, 0x88, 0x00, 0x11, 0x43, 0x0c, 0x86, - 0x60, 0x0c, 0x46, 0x60, 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36, 0x04, 0x81, - 0x0e, 0x86, 0x60, 0x08, 0x46, 0xe0, 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, - 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, - 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36, 0x44, 0x80, - 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x04, 0x68, 0x21, 0x19, 0x84, - 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, - 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, - 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, - 0x11, 0xa0, 0x86, 0x51, 0x58, 0x9a, 0x9c, 0x8b, 0x5c, 0x99, 0x1b, 0x59, - 0x99, 0xdc, 0x17, 0x5d, 0x98, 0xdc, 0x59, 0x19, 0x1d, 0xa3, 0xb0, 0x34, - 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f, 0xb7, - 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x43, 0x10, - 0xe8, 0x61, 0x04, 0x08, 0x82, 0xa2, 0x21, 0x02, 0x24, 0x91, 0x09, 0x4b, - 0x93, 0x73, 0x81, 0x7b, 0x9b, 0x4b, 0xa3, 0x4b, 0x7b, 0x73, 0xa3, 0x12, - 0x96, 0x26, 0xe7, 0x32, 0x56, 0xe6, 0x46, 0x57, 0x26, 0x47, 0x29, 0x2c, - 0x4d, 0xce, 0xc5, 0xed, 0xed, 0x0b, 0xae, 0x4c, 0x6e, 0x0e, 0xae, 0x6c, - 0x8c, 0x2e, 0xcd, 0xae, 0x8c, 0x4c, 0x58, 0x9a, 0x9c, 0x4b, 0x98, 0xdc, - 0xd9, 0x97, 0x5b, 0x58, 0x5b, 0x19, 0x11, 0xb8, 0xb7, 0xb9, 0x34, 0xba, - 0xb4, 0x37, 0xb7, 0x21, 0x10, 0x23, 0x40, 0x14, 0x54, 0x41, 0x16, 0x04, - 0x41, 0x11, 0x74, 0x41, 0x18, 0xa5, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, - 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, 0xaf, 0x34, 0x37, 0xb8, 0x3a, 0x3a, - 0x5a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x7c, - 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca, 0xc6, 0xe8, - 0xd2, 0xec, 0xca, 0x58, 0x8c, 0xbd, 0xb1, 0xbd, 0xc9, 0x0d, 0x91, 0x18, - 0x02, 0xd2, 0xa0, 0x0d, 0xaa, 0x20, 0x0e, 0x82, 0xa0, 0x08, 0xba, 0xa0, - 0x8e, 0xd9, 0x59, 0x99, 0x5b, 0x99, 0x5c, 0x18, 0x5d, 0x19, 0x19, 0x0a, - 0x0e, 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b, 0x1c, 0x19, 0x91, 0x9d, 0xcc, - 0x97, 0x59, 0x0a, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x22, 0x74, - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x43, 0x24, 0xa6, 0x80, 0x34, - 0xe8, 0x83, 0x2a, 0x88, 0x83, 0x20, 0x08, 0x0c, 0xa0, 0x0b, 0x0a, 0x03, - 0x2a, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x7c, - 0xc2, 0xd2, 0xe4, 0x5c, 0xc4, 0xea, 0xcc, 0xcc, 0xca, 0xe4, 0xbe, 0xe6, - 0xd2, 0xf4, 0xca, 0x28, 0x85, 0xa5, 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, 0x85, - 0xd1, 0xa5, 0xbd, 0xb9, 0x7d, 0xa5, 0xb9, 0x91, 0x95, 0xe1, 0x11, 0x09, - 0x4b, 0x93, 0x73, 0x91, 0x2b, 0x0b, 0x23, 0x23, 0x15, 0x96, 0x26, 0xe7, - 0x32, 0x47, 0x27, 0x57, 0x37, 0x46, 0xf7, 0x45, 0x97, 0x07, 0x57, 0xf6, - 0x95, 0xe6, 0x66, 0xf6, 0xc6, 0xc2, 0x8c, 0xed, 0x2d, 0x8c, 0x8e, 0xcc, - 0xdc, 0x98, 0xd4, 0x91, 0xd0, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, 0x1d, - 0x19, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x2f, 0xba, 0x3c, 0xb8, - 0x32, 0x2a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x5c, 0xc6, 0xde, 0xd8, 0xde, 0xe4, 0xbe, 0xe6, 0xc6, 0xc2, 0xd8, 0xca, - 0xe8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0xb5, 0x95, 0xd1, - 0xa1, 0xbd, 0x91, 0xf1, 0xa1, 0x7b, 0x73, 0x2b, 0x6b, 0x0b, 0x83, 0xfb, - 0x32, 0x0b, 0x1b, 0xa3, 0x7b, 0x93, 0x8b, 0xe1, 0x43, 0xf7, 0xe6, 0x56, - 0xd6, 0x16, 0x06, 0xf7, 0x65, 0x16, 0x36, 0x46, 0xf7, 0x26, 0x27, 0xc3, - 0x67, 0x8e, 0x4c, 0xee, 0xeb, 0x0e, 0x2d, 0x8d, 0xae, 0xec, 0x0b, 0xee, - 0x2d, 0xcd, 0x8d, 0x6e, 0x08, 0x2c, 0x30, 0x02, 0x33, 0x30, 0x02, 0x84, - 0x06, 0x50, 0x1a, 0x30, 0x03, 0x33, 0x30, 0x02, 0x84, 0x06, 0x90, 0x1a, - 0x30, 0x06, 0x33, 0x30, 0x02, 0x84, 0x06, 0xd0, 0x1a, 0x30, 0x09, 0x33, - 0x30, 0x02, 0x84, 0x06, 0x10, 0x1b, 0x30, 0x0a, 0x33, 0x30, 0x02, 0x84, - 0x06, 0x50, 0x1b, 0x30, 0x0b, 0x33, 0x30, 0x02, 0x84, 0x06, 0x90, 0x1b, - 0x30, 0x0c, 0x33, 0x30, 0x02, 0x84, 0x06, 0xd0, 0x1b, 0x30, 0x0d, 0x33, - 0x30, 0x02, 0x84, 0x06, 0x10, 0x1c, 0x30, 0x0a, 0x4b, 0x93, 0x73, 0x09, - 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, - 0xe3, 0x15, 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0x45, 0x97, 0x07, - 0x57, 0xf6, 0x15, 0xc6, 0x96, 0x76, 0xe6, 0xf6, 0x35, 0x97, 0xa6, 0x57, - 0xc6, 0x67, 0x0a, 0x2d, 0x8c, 0xac, 0x4c, 0x6e, 0xe8, 0xcd, 0x6d, 0x8e, - 0x2e, 0xcc, 0x8d, 0x6e, 0x8e, 0xc1, 0xd8, 0x10, 0x32, 0x60, 0x10, 0x68, - 0x0c, 0x20, 0x32, 0x60, 0x0e, 0xa8, 0x0c, 0x18, 0x81, 0x21, 0x20, 0x33, - 0x80, 0xce, 0x00, 0x8a, 0x03, 0x48, 0x0e, 0x98, 0x03, 0x9a, 0x03, 0x66, - 0x80, 0x20, 0x88, 0x0e, 0xa0, 0x0b, 0xaa, 0x03, 0x2e, 0x61, 0x69, 0x72, - 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x54, 0xc2, 0xd2, 0xe4, - 0x5c, 0xe6, 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0x88, 0xd1, 0x95, 0xe1, 0xd1, - 0xd5, 0xc9, 0x95, 0xc9, 0x90, 0xf1, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xb1, - 0x80, 0xcc, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xf9, 0x70, 0xa0, 0x2b, 0xc3, - 0x1b, 0x42, 0x31, 0x03, 0x74, 0x07, 0x50, 0x19, 0x30, 0x02, 0x43, 0x40, - 0x78, 0x00, 0x41, 0x50, 0x1e, 0x40, 0x17, 0xa4, 0x07, 0x5c, 0xc2, 0xd2, - 0xe4, 0x5c, 0xe6, 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0xe4, 0x78, 0xcc, 0x85, - 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0x31, 0x98, 0x1b, 0x22, 0x31, 0x0e, 0xc4, - 0x07, 0x50, 0x19, 0x30, 0x02, 0x43, 0x40, 0x10, 0xd4, 0x07, 0xd0, 0x05, - 0xf9, 0xc1, 0x10, 0x06, 0xca, 0x20, 0x0f, 0x12, 0x03, 0xc8, 0x0e, 0xa0, - 0x3d, 0x80, 0xfe, 0x60, 0x88, 0xa1, 0x00, 0xd0, 0x04, 0x81, 0x02, 0xc7, - 0x20, 0x2c, 0x4d, 0xae, 0x25, 0x8c, 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, - 0xec, 0x0d, 0xae, 0x6c, 0x0e, 0x65, 0x8a, 0x88, 0xe9, 0x6b, 0xe8, 0x0d, - 0x2e, 0xef, 0xcb, 0x4c, 0x2e, 0xec, 0xac, 0xad, 0xcc, 0x8d, 0x2e, 0x65, - 0x08, 0x01, 0x8d, 0x02, 0x24, 0x0a, 0xc4, 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, - 0xd8, 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a, 0xe8, - 0xca, 0xf0, 0xe8, 0xea, 0xe4, 0xca, 0xe6, 0x86, 0x18, 0x50, 0x29, 0x40, - 0xa3, 0x00, 0x91, 0x02, 0xb1, 0xb0, 0x34, 0xb9, 0x96, 0x30, 0xb6, 0xb4, - 0xb0, 0xb9, 0x96, 0xb9, 0xb1, 0x37, 0xb8, 0xb2, 0x96, 0xb9, 0xb0, 0x36, - 0x38, 0xb6, 0x32, 0xb9, 0xb9, 0x21, 0x06, 0x74, 0x0a, 0xd0, 0x28, 0x40, - 0xa6, 0x30, 0x84, 0x80, 0x4a, 0x01, 0x3a, 0x05, 0x5a, 0x61, 0x69, 0x72, - 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x43, 0x0c, 0x48, 0x15, 0xa0, - 0x51, 0x80, 0x52, 0x61, 0x88, 0x00, 0xa9, 0x02, 0xab, 0x2f, 0x2d, 0xaa, - 0xa9, 0x98, 0x9a, 0x29, 0xb4, 0x30, 0xb2, 0x32, 0xb9, 0xa1, 0x37, 0xb7, - 0x39, 0xba, 0x30, 0x37, 0xba, 0x39, 0x3e, 0x6f, 0x6d, 0x6e, 0x69, 0x70, - 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x7c, 0xa6, - 0xd2, 0xda, 0xe0, 0xd8, 0xca, 0x40, 0x86, 0x56, 0x56, 0x40, 0xa8, 0x84, - 0x82, 0x82, 0x86, 0x08, 0x90, 0x2b, 0x0c, 0x31, 0xa0, 0x56, 0x80, 0x5e, - 0x41, 0x82, 0x86, 0x18, 0x10, 0x1a, 0x40, 0xb0, 0x20, 0x41, 0x43, 0xc4, - 0x00, 0x62, 0x05, 0x28, 0x16, 0x24, 0x08, 0x8a, 0x05, 0x49, 0x82, 0x62, - 0x41, 0x9a, 0xa0, 0x58, 0x90, 0x22, 0x28, 0x16, 0x24, 0x0a, 0x8a, 0x05, - 0xa9, 0x82, 0x62, 0x41, 0xb2, 0xa0, 0x58, 0x90, 0x9e, 0x21, 0x06, 0x24, - 0x0b, 0x50, 0x2c, 0x48, 0xd1, 0x88, 0x88, 0x1d, 0xd8, 0xc1, 0x1e, 0xda, - 0xc1, 0x0d, 0xda, 0xe1, 0x1d, 0xc8, 0xa1, 0x1e, 0xd8, 0xa1, 0x1c, 0xdc, - 0xc0, 0x1c, 0xd8, 0x21, 0x1c, 0xce, 0x61, 0x1e, 0xa6, 0x08, 0xc1, 0x30, - 0x42, 0x61, 0x07, 0x76, 0xb0, 0x87, 0x76, 0x70, 0x83, 0x74, 0x20, 0x87, - 0x72, 0x70, 0x07, 0x7a, 0x98, 0x12, 0x14, 0x23, 0x96, 0x70, 0x48, 0x07, - 0x79, 0x70, 0x03, 0x7b, 0x28, 0x07, 0x79, 0x98, 0x87, 0x74, 0x78, 0x07, - 0x77, 0x98, 0x12, 0x18, 0x23, 0xa8, 0x70, 0x48, 0x07, 0x79, 0x70, 0x03, - 0x76, 0x08, 0x07, 0x77, 0x38, 0x87, 0x7a, 0x08, 0x87, 0x73, 0x28, 0x87, - 0x5f, 0xb0, 0x87, 0x72, 0x90, 0x87, 0x79, 0x48, 0x87, 0x77, 0x70, 0x87, - 0x29, 0x01, 0x32, 0x62, 0x0a, 0x87, 0x74, 0x90, 0x07, 0x37, 0x18, 0x87, - 0x77, 0x68, 0x07, 0x78, 0x48, 0x07, 0x76, 0x28, 0x87, 0x5f, 0x78, 0x07, - 0x78, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0x98, 0x87, 0x29, 0x83, 0xc2, - 0x38, 0x23, 0x98, 0x70, 0x48, 0x07, 0x79, 0x70, 0x03, 0x73, 0x90, 0x87, - 0x70, 0x38, 0x87, 0x76, 0x28, 0x07, 0x77, 0xa0, 0x87, 0x29, 0x41, 0x28, - 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, - 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, - 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, - 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, - 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, - 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, - 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, - 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, - 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, - 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, - 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, - 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, - 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, - 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, - 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, - 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, - 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, - 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, - 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, - 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, - 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, - 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, - 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, - 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, - 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, - 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, - 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, - 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, - 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, - 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, - 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, - 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, - 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, - 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, - 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, - 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, - 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, - 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, - 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, - 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, - 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, - 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, - 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, - 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, - 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, - 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, - 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, - 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, - 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, - 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, - 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, - 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, - 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, - 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, - 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x06, 0x10, 0xb1, 0x5d, 0xf9, 0x73, 0xce, - 0x83, 0xfd, 0x45, 0x04, 0x18, 0x0c, 0xd1, 0x4c, 0x16, 0xb0, 0x01, 0x48, - 0xe4, 0x4b, 0x00, 0xf3, 0x2c, 0xc4, 0x3f, 0x11, 0xd7, 0x44, 0x45, 0xc4, - 0x6f, 0x0f, 0x7e, 0x85, 0x17, 0xb7, 0x0d, 0x00, 0x00, 0x61, 0x20, 0x00, - 0x00, 0x21, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x64, 0xc7, 0x22, 0x80, 0x40, 0x38, 0xe6, - 0x20, 0x04, 0xa2, 0x10, 0x03, 0x5a, 0x35, 0x30, 0x02, 0x40, 0x6c, 0x06, - 0x80, 0xda, 0x08, 0x00, 0xd1, 0xb1, 0x06, 0x20, 0x10, 0x46, 0x00, 0xa8, - 0xce, 0x00, 0x50, 0x98, 0x01, 0x20, 0x30, 0x02, 0x00, 0x23, 0x06, 0xca, - 0x10, 0xa0, 0x41, 0xc3, 0x3c, 0x89, 0x81, 0x04, 0xe3, 0x0d, 0x8f, 0x26, - 0x06, 0x14, 0x8c, 0x41, 0x86, 0xa1, 0x40, 0xe6, 0x18, 0x0e, 0x61, 0x0d, - 0x06, 0x19, 0x02, 0x24, 0xb1, 0x60, 0x90, 0xcf, 0x20, 0x43, 0xa0, 0x44, - 0x83, 0x0c, 0x01, 0x32, 0x59, 0x90, 0xc9, 0x27, 0x83, 0x80, 0x18, 0x00, - 0x00, 0x05, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0, 0x40, 0x05, 0x64, 0x15, - 0xb6, 0x1c, 0x42, 0x30, 0x0b, 0xc7, 0x2a, 0x20, 0xa8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x19, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, - 0x00, 0x41, 0x06, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, - 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, - 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, - 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, - 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, - 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, - 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, 0x00, 0x8a, 0x00, 0x00, - 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, - 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, - 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, - 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xa2, 0x1d, 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, - 0xe1, 0x1c, 0xc2, 0x81, 0x1d, 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, - 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0, - 0x01, 0x88, 0x03, 0x39, 0xc0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, - 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, - 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, - 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, - 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, - 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, - 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, - 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, - 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, - 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, - 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, - 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, - 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, - 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, - 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, - 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, - 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, - 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, - 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, - 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, - 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, - 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, - 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, - 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, - 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, - 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, - 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, - 0x7a, 0x28, 0x07, 0x60, 0xc3, 0x26, 0x10, 0xc0, 0x02, 0x54, 0x43, 0x38, - 0xa4, 0x83, 0x3c, 0xb4, 0x81, 0x38, 0xd4, 0x83, 0x39, 0x98, 0x43, 0x39, - 0xc8, 0x43, 0x1b, 0xb8, 0xc3, 0x3b, 0xb4, 0x41, 0x38, 0xb0, 0x43, 0x3a, - 0x84, 0xc3, 0x3c, 0x00, 0x1b, 0xb6, 0xa1, 0x00, 0x16, 0xa0, 0x1a, 0xc2, - 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, 0xcc, 0xc1, 0x1c, 0xca, - 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d, 0xc2, 0x81, 0x1d, 0xd2, - 0x21, 0x1c, 0xe6, 0x01, 0xd8, 0x60, 0x10, 0x08, 0xb0, 0x00, 0xd5, 0x06, - 0xa3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0x03, 0x62, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x80, 0x04, 0x54, 0x1b, 0x8c, - 0x23, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x20, 0x02, 0xb0, 0x00, 0xd5, 0x06, - 0x24, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x36, - 0x18, 0xca, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50, 0x00, 0x00, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40, - 0x18, 0x88, 0x09, 0x41, 0x31, 0x61, 0x30, 0x0e, 0x64, 0xc2, 0x90, 0x1c, - 0xc8, 0x84, 0x40, 0x01, 0x00, 0x89, 0x20, 0x00, 0x00, 0x42, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, - 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, - 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xb0, 0xc1, 0x0c, 0xc0, 0x30, 0x02, - 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, - 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18, - 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6, - 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4, - 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50, - 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21, - 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29, - 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1, - 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0xb8, 0x48, 0x9a, 0x22, 0x4a, - 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00, - 0x06, 0x11, 0x18, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44, 0xb2, 0x2c, 0x0d, - 0x39, 0x85, 0x28, 0x8a, 0xa2, 0x20, 0xa8, 0x0c, 0x00, 0x00, 0x90, 0x54, - 0x04, 0x00, 0x20, 0xaa, 0x0c, 0x40, 0x51, 0x90, 0x55, 0x86, 0xa2, 0x28, - 0x08, 0x2b, 0x42, 0x51, 0x90, 0x36, 0x47, 0x10, 0xcc, 0x11, 0x80, 0xc1, - 0x30, 0x82, 0xd0, 0x15, 0x24, 0x58, 0x1a, 0x81, 0xf3, 0x38, 0x80, 0xbe, - 0x81, 0x80, 0x14, 0xe8, 0xe6, 0x08, 0x40, 0x61, 0x10, 0x01, 0x10, 0xa6, - 0x00, 0x46, 0x00, 0x86, 0x11, 0x86, 0x6e, 0x10, 0x21, 0x10, 0x06, 0x11, - 0x0e, 0x61, 0x10, 0xa1, 0x10, 0x86, 0x11, 0x88, 0x0e, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x06, 0x00, 0xb1, 0x5d, 0xf9, 0xb3, 0xce, 0x82, 0x0c, 0x7f, 0x45, + 0x44, 0x13, 0x71, 0x01, 0x00, 0x61, 0x20, 0x00, 0x00, 0x5c, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6, 0x22, 0x04, 0x41, 0x10, + 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88, 0x15, 0x41, 0x09, 0x94, + 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14, 0x66, 0x00, 0x66, 0x00, + 0x08, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0x1f, 0x00, 0xe3, 0x11, 0x8d, + 0x94, 0x49, 0x14, 0x94, 0xf1, 0x08, 0x88, 0xda, 0x28, 0x0a, 0xca, 0x20, + 0xc3, 0x70, 0x34, 0x26, 0x04, 0xf2, 0x19, 0x8f, 0xa0, 0xb0, 0xaf, 0xa1, + 0xa0, 0x0c, 0x32, 0x1c, 0x8a, 0x64, 0x42, 0x20, 0x1f, 0x0b, 0x0a, 0xf8, + 0x8c, 0x47, 0x64, 0x1d, 0x19, 0x4c, 0x14, 0x94, 0x41, 0x06, 0xe6, 0xc1, + 0x4c, 0x08, 0xe4, 0x63, 0x45, 0x00, 0x9f, 0xf1, 0x08, 0x4f, 0x0c, 0xd2, + 0xc0, 0xa2, 0xa0, 0x0c, 0x32, 0x44, 0x94, 0x67, 0x42, 0x20, 0x1f, 0x2b, + 0x02, 0xf8, 0x8c, 0x47, 0x88, 0xc1, 0x19, 0xb8, 0x01, 0x47, 0x41, 0x19, + 0x64, 0x08, 0x34, 0x30, 0xb0, 0xa0, 0x92, 0xcf, 0x20, 0xc3, 0xb0, 0x8d, + 0x81, 0x05, 0x93, 0x7c, 0x6c, 0x08, 0xe0, 0x33, 0xc8, 0x60, 0x78, 0x67, + 0x60, 0x41, 0x24, 0x1f, 0x1b, 0x02, 0xf8, 0x0c, 0x32, 0x24, 0x61, 0xb0, + 0x06, 0x16, 0x3c, 0xf2, 0xb1, 0x21, 0x80, 0xcf, 0x78, 0xc4, 0x1b, 0xd0, + 0xc1, 0x1e, 0xa0, 0x01, 0x05, 0x65, 0x90, 0x21, 0x38, 0x83, 0x36, 0xb0, + 0x40, 0x0c, 0xe4, 0x33, 0xc8, 0x30, 0xa0, 0x01, 0x1c, 0x58, 0x00, 0x06, + 0xf2, 0x19, 0x64, 0x28, 0xd4, 0x60, 0x0e, 0x2c, 0xe8, 0xe4, 0x33, 0xc8, + 0x70, 0xb0, 0x81, 0x1d, 0x58, 0xa0, 0xc9, 0x67, 0x90, 0x81, 0x0f, 0xe2, + 0xa0, 0x0e, 0x2c, 0x0b, 0xe4, 0x33, 0xc8, 0xe0, 0x07, 0x73, 0x80, 0x07, + 0xe6, 0x04, 0xf2, 0xb1, 0x64, 0x80, 0x8f, 0x05, 0x0c, 0x7c, 0x2c, 0x48, + 0xe0, 0x63, 0x01, 0x02, 0x1f, 0x0b, 0x0a, 0xf8, 0xcc, 0x36, 0xe4, 0x41, + 0x00, 0xcc, 0x36, 0x04, 0xa5, 0x10, 0xcc, 0x36, 0x04, 0x78, 0x20, 0x64, + 0x10, 0x10, 0x03, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, + 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0xd8, 0x72, 0x0c, 0x01, 0x1d, 0x1c, + 0x7c, 0x80, 0xe4, 0xc1, 0x96, 0xe3, 0x08, 0xe8, 0xe0, 0xe0, 0x03, 0x24, + 0x0f, 0xb6, 0x1c, 0x4c, 0x40, 0x07, 0x07, 0x1f, 0x20, 0x79, 0xb0, 0xe5, + 0x88, 0x02, 0x3a, 0x38, 0xf8, 0x00, 0xc9, 0x83, 0x2d, 0x87, 0x15, 0xd0, + 0xc1, 0x91, 0x07, 0x08, 0x1f, 0x6c, 0x39, 0xc6, 0x20, 0xa0, 0x83, 0x23, + 0x0f, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0xbc, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, + 0xde, 0x21, 0x0c, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x00, 0x0b, 0x82, 0x20, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, + 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, + 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, + 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, + 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, + 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x48, 0x11, 0x62, 0xa8, + 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, + 0x00, 0x79, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, + 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, + 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, + 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, + 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, + 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, + 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78, + 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70, + 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, + 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, + 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00, + 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, + 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d, + 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d, + 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d, + 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, + 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68, + 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, + 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, + 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, + 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, + 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70, + 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98, + 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, + 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, + 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d, + 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, + 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58, + 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0, + 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, + 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f, + 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d, + 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, + 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c, 0x02, 0x01, 0x2c, 0x40, + 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83, + 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, 0x84, 0x03, + 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0x61, 0x1b, 0x0a, 0x60, 0x01, + 0xaa, 0x21, 0x1c, 0xd2, 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, + 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xda, 0x20, 0x1c, + 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, + 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, + 0x76, 0x08, 0x41, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87, + 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07, + 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07, + 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x62, 0x0c, + 0x11, 0x84, 0x31, 0x74, 0x06, 0x02, 0xe6, 0x08, 0xc0, 0x20, 0x05, 0xd4, + 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x04, 0xc2, 0x30, 0x02, 0xa1, 0x8c, 0x00, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51, @@ -1294,173 +445,381 @@ const unsigned char sdl_metallib[] = { 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80, - 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x98, - 0x07, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0x4c, 0x04, - 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, 0x66, 0x02, 0x02, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0x53, 0x01, 0x01, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xb9, 0x80, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x4c, 0x40, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0c, 0x61, 0x32, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x86, 0x30, 0x1b, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x43, 0x98, 0x0c, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x21, 0x0c, 0x18, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, - 0x05, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, - 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, - 0xea, 0x46, 0x00, 0x4a, 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80, - 0x0a, 0x30, 0xa0, 0x0c, 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac, - 0x14, 0x8a, 0xa1, 0x1c, 0x68, 0x2c, 0x9c, 0x11, 0x80, 0x42, 0x28, 0x88, - 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x12, 0xc7, 0x12, 0x22, 0x01, 0x00, - 0x00, 0x79, 0x18, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, - 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, - 0xb7, 0x21, 0x46, 0xe7, 0x84, 0x01, 0x20, 0x06, 0x63, 0x40, 0xe5, 0x6e, - 0x0c, 0x2d, 0x4c, 0xee, 0x6b, 0x2e, 0x4d, 0xaf, 0x6c, 0x88, 0xd1, 0x2d, - 0x61, 0x20, 0x74, 0x0c, 0xdf, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, 0xa4, - 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, - 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x25, 0x07, 0x07, 0x04, 0xa5, - 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, - 0xc6, 0x25, 0x07, 0x27, 0x65, 0x88, 0x10, 0x06, 0xc4, 0x10, 0xa3, 0x5b, - 0xba, 0xa7, 0x53, 0x58, 0x34, 0x95, 0xd1, 0x85, 0xb1, 0x0d, 0x41, 0xc2, - 0xe0, 0xe8, 0x96, 0x6e, 0xe9, 0x14, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, - 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, - 0x30, 0x48, 0xc8, 0x85, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, - 0xb1, 0x95, 0xb9, 0x98, 0x85, 0xcd, 0xd1, 0x7d, 0xb5, 0x85, 0xd1, 0xa1, - 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0xc2, 0x60, 0x21, + 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18, + 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00, + 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, + 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x52, 0x25, 0x50, 0x04, + 0x23, 0x00, 0x05, 0x18, 0x50, 0x08, 0x65, 0x50, 0x20, 0x05, 0x41, 0x6c, + 0x04, 0x80, 0xd6, 0x58, 0x82, 0x24, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, + 0x00, 0x06, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, + 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x86, 0x22, + 0x24, 0xc0, 0xa2, 0x50, 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, + 0xd3, 0x2b, 0x1b, 0x62, 0x28, 0x41, 0x22, 0x28, 0x05, 0xe3, 0x20, 0x08, + 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, + 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, + 0x85, 0x06, 0x86, 0x06, 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, + 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, + 0x88, 0x90, 0x10, 0x43, 0x0c, 0x25, 0x50, 0x10, 0x65, 0x60, 0xd1, 0x54, + 0x46, 0x17, 0xc6, 0x36, 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, 0x65, 0xe0, + 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, + 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, + 0x26, 0xc6, 0x56, 0x36, 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, + 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x84, 0x64, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, + 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, + 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, + 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, 0x58, 0x9a, + 0x9c, 0x0b, 0xdc, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, 0xa3, 0xb0, + 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f, + 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x64, + 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, 0xda, 0xca, + 0x88, 0xc0, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, 0x51, 0x92, + 0x27, 0x81, 0x92, 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, 0x9c, 0x8b, + 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, + 0x1d, 0xad, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32, 0x94, + 0x9a, 0xb1, 0x37, 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, 0xb3, 0x14, + 0x16, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, 0xac, 0x04, + 0x4a, 0xa2, 0x44, 0x4a, 0x2e, 0x66, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, + 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x34, 0xcc, 0xd8, 0xde, 0xc2, + 0xe8, 0x64, 0x88, 0xd0, 0x95, 0xe1, 0x8d, 0xbd, 0xbd, 0xc9, 0x91, 0x0d, + 0x61, 0x92, 0x2a, 0xc9, 0x12, 0x28, 0xd1, 0x12, 0x29, 0xd9, 0x86, 0x18, + 0x09, 0x95, 0x60, 0x09, 0x47, 0x28, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, + 0x8e, 0xae, 0x0c, 0xef, 0x2b, 0xcd, 0x0d, 0xae, 0x8e, 0x8e, 0x52, 0x58, + 0x9a, 0x9c, 0x0b, 0xdb, 0xdb, 0x58, 0x18, 0x5d, 0xda, 0x9b, 0xdb, 0x57, + 0x9a, 0x1b, 0x59, 0x19, 0x1e, 0xbd, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, + 0xba, 0x32, 0x32, 0x94, 0xaf, 0xaf, 0xb0, 0x34, 0xb9, 0x2f, 0x38, 0xb6, + 0xb0, 0xb1, 0x32, 0xb4, 0x37, 0x36, 0xb2, 0x32, 0xb9, 0xaf, 0xaf, 0x94, + 0x21, 0x94, 0x32, 0x24, 0x5e, 0xf2, 0x29, 0x83, 0x12, 0x24, 0x60, 0x90, + 0x40, 0x89, 0x96, 0x48, 0xc9, 0x34, 0x84, 0x52, 0x82, 0xc4, 0x4b, 0x3e, + 0x25, 0x50, 0x82, 0x04, 0x0c, 0x12, 0x28, 0x89, 0x12, 0x29, 0xb9, 0x86, + 0x50, 0x8a, 0x90, 0x78, 0xc9, 0xa7, 0x08, 0x4a, 0x90, 0x80, 0x41, 0x02, + 0x25, 0x5a, 0x22, 0x25, 0x1b, 0x95, 0xb0, 0x34, 0x39, 0x17, 0xb1, 0x3a, + 0x33, 0xb3, 0x32, 0x39, 0x3e, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x44, 0xc2, 0xd2, 0xe4, + 0x5c, 0xe4, 0xca, 0xc2, 0xc8, 0x18, 0x85, 0xa5, 0xc9, 0xb9, 0x84, 0xc9, + 0x9d, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0xcd, 0xa5, 0xe9, 0x95, 0xf1, + 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, + 0xfb, 0x0a, 0x63, 0x4b, 0x3b, 0x73, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x23, + 0x62, 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x83, 0x47, 0x43, 0x05, 0x4e, 0xee, + 0x4d, 0xad, 0x6c, 0x8c, 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0x18, 0x28, 0x46, + 0x42, 0x06, 0x49, 0x19, 0x28, 0x44, 0xf2, 0x29, 0x82, 0x12, 0x24, 0x66, + 0x90, 0x9c, 0x81, 0x42, 0x24, 0x68, 0xa0, 0x1c, 0x09, 0x94, 0xa4, 0x41, + 0x22, 0x25, 0x6a, 0xc0, 0x84, 0x4e, 0x2e, 0xcc, 0x6d, 0xce, 0xec, 0x4d, + 0xae, 0x6d, 0x08, 0x18, 0x28, 0x45, 0x42, 0x06, 0x49, 0x19, 0x28, 0x44, + 0xf2, 0x29, 0x86, 0x12, 0x24, 0x66, 0x90, 0x9c, 0x81, 0x42, 0x24, 0x68, + 0xa0, 0x1c, 0x09, 0x94, 0xa4, 0x41, 0x22, 0x25, 0x6c, 0x30, 0x44, 0x49, + 0xc2, 0x20, 0x11, 0x83, 0x64, 0x0c, 0x92, 0x35, 0x48, 0xda, 0x60, 0x88, + 0x81, 0x00, 0x49, 0x97, 0xb8, 0x01, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, + 0x37, 0xba, 0x32, 0x37, 0x3a, 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, + 0x41, 0x41, 0x43, 0x84, 0x24, 0x0e, 0x86, 0x18, 0x09, 0x1c, 0x24, 0x72, + 0xc0, 0x24, 0x43, 0x8c, 0x64, 0x0e, 0x92, 0x39, 0x60, 0x12, 0x86, 0x41, + 0x58, 0x9a, 0x5c, 0x4b, 0x18, 0x5b, 0x5a, 0xd8, 0x5c, 0xcb, 0xdc, 0xd8, + 0x1b, 0x5c, 0xd9, 0x1c, 0xca, 0x14, 0x11, 0xd3, 0xd7, 0xd0, 0x1b, 0x5c, + 0xde, 0x97, 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0x5e, 0xca, 0x10, 0x22, 0xb1, + 0x83, 0xa4, 0x0e, 0x68, 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, + 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0x84, 0xc9, 0x9d, 0xa1, + 0xd0, 0xa4, 0x0c, 0x31, 0x12, 0x3c, 0x48, 0xec, 0x20, 0xb9, 0x83, 0x21, + 0x42, 0x82, 0x07, 0xb4, 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8, 0xd2, 0xc2, + 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a, 0xc2, 0xe4, 0xce, 0x50, + 0x66, 0x52, 0x86, 0x18, 0xc9, 0x1e, 0x24, 0x76, 0x90, 0xe8, 0xc1, 0x10, + 0x21, 0xd9, 0x83, 0x11, 0x11, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, + 0xb4, 0xc3, 0x3b, 0x90, 0x43, 0x3d, 0xb0, 0x43, 0x39, 0xb8, 0x81, 0x39, + 0xb0, 0x43, 0x38, 0x9c, 0xc3, 0x3c, 0x4c, 0x11, 0x82, 0x61, 0x84, 0xc2, + 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xe9, 0x40, 0x0e, 0xe5, 0xe0, + 0x0e, 0xf4, 0x30, 0x25, 0x28, 0x46, 0x2c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, + 0x06, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, + 0x25, 0x30, 0x46, 0x50, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xec, 0x10, + 0x0e, 0xee, 0x70, 0x0e, 0xf5, 0x10, 0x0e, 0xe7, 0x50, 0x0e, 0xbf, 0x60, + 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0x53, 0x02, + 0x64, 0xc4, 0x14, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x30, 0x0e, 0xef, 0xd0, + 0x0e, 0xf0, 0x90, 0x0e, 0xec, 0x50, 0x0e, 0xbf, 0xf0, 0x0e, 0xf0, 0x40, + 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x0f, 0x53, 0x06, 0x85, 0x71, 0x46, + 0x28, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xf6, 0x50, 0x0e, 0xf2, 0x40, + 0x0f, 0xe5, 0x80, 0x0f, 0x53, 0x82, 0x37, 0x00, 0x00, 0x79, 0x18, 0x00, + 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, + 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, + 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, + 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, + 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, + 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, + 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, + 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, + 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, + 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, + 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, + 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, + 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, + 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, + 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, + 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, + 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, + 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, + 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, + 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, + 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, + 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, + 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, + 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, + 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, + 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, + 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, + 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, + 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, + 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, + 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, + 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, + 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, + 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, + 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, + 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, + 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, + 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, + 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, + 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, + 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, + 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, + 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, + 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, + 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, + 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, + 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, + 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, + 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, + 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, + 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, + 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, + 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, + 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, + 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x06, 0xf0, 0xb0, 0x5d, 0xf9, 0x73, 0xce, 0x83, 0xfd, 0x15, 0x11, + 0x4d, 0xc4, 0x05, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x5a, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, + 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6, 0x22, 0x04, 0x41, 0x10, + 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88, 0x95, 0x40, 0x19, 0x14, + 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14, 0x66, 0x00, 0x66, 0x00, + 0x00, 0xe3, 0x11, 0x8c, 0x84, 0x49, 0x14, 0x94, 0xf1, 0x88, 0x87, 0xd2, + 0x28, 0x0a, 0xca, 0x20, 0xc3, 0x60, 0x30, 0x26, 0x04, 0xf2, 0x19, 0x8f, + 0x98, 0x30, 0xaf, 0xa1, 0xa0, 0x0c, 0x32, 0x1c, 0x49, 0x64, 0x42, 0x20, + 0x1f, 0x0b, 0x0a, 0xf8, 0x8c, 0x47, 0x60, 0xdd, 0x18, 0x40, 0x14, 0x94, + 0x41, 0x06, 0xc6, 0xb9, 0x4c, 0x08, 0xe4, 0x63, 0x45, 0x00, 0x9f, 0xf1, + 0x88, 0x4e, 0x0c, 0xd0, 0xc0, 0xa2, 0xa0, 0x0c, 0x32, 0x44, 0x53, 0x67, + 0x42, 0x20, 0x1f, 0x2b, 0x02, 0xf8, 0x8c, 0x47, 0x84, 0xc1, 0x19, 0xb4, + 0x01, 0x47, 0x41, 0x19, 0x64, 0x08, 0xb2, 0xcf, 0x82, 0x4a, 0x3e, 0x83, + 0x0c, 0x83, 0x26, 0x06, 0x16, 0x4c, 0xf2, 0xb1, 0x21, 0x80, 0xcf, 0x20, + 0x83, 0xd1, 0x99, 0x81, 0x05, 0x91, 0x7c, 0x6c, 0x08, 0xe0, 0x33, 0xc8, + 0x90, 0x80, 0x81, 0x1a, 0x58, 0xf0, 0xc8, 0xc7, 0x86, 0x00, 0x3e, 0xe3, + 0x11, 0x6e, 0x40, 0x07, 0x7a, 0x80, 0x06, 0x14, 0x94, 0x41, 0x86, 0xc0, + 0x0c, 0xd8, 0xc0, 0x02, 0x31, 0x90, 0xcf, 0x20, 0xc3, 0x70, 0x06, 0x6f, + 0x60, 0x01, 0x18, 0xc8, 0x67, 0x90, 0xa1, 0x48, 0x03, 0x39, 0xb0, 0xa0, + 0x93, 0xcf, 0x20, 0xc3, 0xb1, 0x06, 0x75, 0x60, 0x81, 0x26, 0x9f, 0x41, + 0x06, 0x3e, 0x78, 0x03, 0x3a, 0xb0, 0x2c, 0x90, 0xcf, 0x20, 0x83, 0x1f, + 0xc4, 0xc1, 0x1d, 0x98, 0x13, 0xc8, 0xc7, 0x92, 0x01, 0x3e, 0x16, 0x30, + 0xf0, 0xb1, 0x20, 0x81, 0x8f, 0x05, 0x08, 0x7c, 0x2c, 0x28, 0xe0, 0x33, + 0xdb, 0x90, 0x07, 0x01, 0x30, 0xdb, 0x10, 0x94, 0x42, 0x30, 0xdb, 0x10, + 0x94, 0x82, 0x90, 0x41, 0x40, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x5b, 0x8e, 0x20, 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0xd8, 0x72, + 0x0c, 0x01, 0x1d, 0x1c, 0x7c, 0x80, 0xe4, 0xc1, 0x96, 0xe3, 0x08, 0xe8, + 0xe0, 0xe0, 0x03, 0x24, 0x0f, 0xb6, 0x1c, 0x4c, 0x40, 0x07, 0x07, 0x1f, + 0x20, 0x79, 0xb0, 0xe5, 0x88, 0x02, 0x3a, 0x38, 0xf8, 0x00, 0xc9, 0x83, + 0x2d, 0x87, 0x15, 0xd0, 0xc1, 0x91, 0x07, 0x08, 0x1f, 0x6c, 0x39, 0xc6, + 0x20, 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xfd, 0x02, 0x00, + 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, + 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, + 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32, + 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, + 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, + 0x08, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, + 0x00, 0x51, 0x18, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x8a, 0x08, 0x07, 0x78, + 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, + 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, + 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, + 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, + 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, + 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, + 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, + 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, + 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, + 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, + 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, + 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, + 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, + 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, + 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, + 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, + 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, + 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, + 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, + 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, + 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, + 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, + 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, + 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, + 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, + 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, + 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, + 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, + 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, + 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, + 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, + 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c, + 0xc2, 0x00, 0x2c, 0x40, 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, + 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, + 0x43, 0x1b, 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0x00, 0x00, + 0x00, 0x49, 0x18, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x84, 0x40, + 0x00, 0x89, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, + 0x4c, 0x10, 0x3c, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, + 0x67, 0x49, 0x53, 0x44, 0x09, 0x93, 0xcf, 0x1e, 0xc0, 0x40, 0x44, 0x9c, + 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x12, 0x42, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x11, 0x06, 0xa1, 0x10, 0x21, 0x41, 0x54, 0x03, 0x01, 0x73, 0x04, 0x60, + 0x90, 0x02, 0x38, 0x47, 0x00, 0x0a, 0x83, 0x08, 0x80, 0x30, 0x8c, 0x30, + 0x00, 0xc3, 0x08, 0x04, 0x32, 0x02, 0x00, 0x00, 0x00, 0x13, 0xa8, 0x70, + 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, + 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, + 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f, + 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, + 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, + 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, + 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, + 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, + 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07, + 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07, + 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, + 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, + 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, + 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07, + 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07, + 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, + 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, + 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, + 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07, + 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, + 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, + 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07, + 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, + 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, + 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, + 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, + 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, + 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, + 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, + 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18, 0x03, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, + 0x47, 0xc6, 0x04, 0x43, 0xc2, 0x11, 0x80, 0x42, 0x28, 0x81, 0x22, 0x28, + 0x88, 0x02, 0x2a, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0xd2, 0xc2, + 0x19, 0x01, 0x28, 0x8c, 0x42, 0x28, 0x88, 0x02, 0x29, 0x94, 0x82, 0xa1, + 0x1c, 0x4b, 0x90, 0x04, 0x00, 0x79, 0x18, 0x00, 0x00, 0x27, 0x01, 0x00, + 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, + 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0x42, 0x1c, 0x40, 0x42, 0x51, + 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, + 0x20, 0xc3, 0x21, 0x20, 0x02, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, + 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, + 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x06, + 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, + 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88, 0x70, 0x10, 0x43, + 0x0c, 0x64, 0x40, 0x0a, 0x24, 0x60, 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36, + 0x04, 0x39, 0x0e, 0x64, 0x40, 0x06, 0x24, 0xe0, 0x16, 0x96, 0x26, 0xe7, + 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6, + 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36, + 0x44, 0x38, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, + 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x63, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1, - 0x95, 0x0d, 0x11, 0xc2, 0xa0, 0x61, 0x14, 0x96, 0x26, 0xe7, 0x22, 0x57, - 0xe6, 0x46, 0x56, 0x26, 0xf7, 0x45, 0x17, 0x26, 0x77, 0x56, 0x46, 0xc7, + 0x95, 0x0d, 0x11, 0x8e, 0x86, 0x51, 0x58, 0x9a, 0x9c, 0x8b, 0x5c, 0x99, + 0x1b, 0x59, 0x99, 0xdc, 0x17, 0x5d, 0x98, 0xdc, 0x59, 0x19, 0x1d, 0xa3, + 0xb0, 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, + 0x2f, 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, + 0x43, 0x90, 0xe3, 0x41, 0x82, 0x03, 0x3a, 0xa2, 0x21, 0xc2, 0x21, 0x51, + 0x0a, 0x4b, 0x93, 0x73, 0x31, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, 0x73, 0xa3, + 0xfb, 0x4a, 0x73, 0x83, 0xab, 0xa3, 0x63, 0x76, 0x56, 0xe6, 0x56, 0x26, + 0x17, 0x46, 0x57, 0x46, 0x86, 0x82, 0x03, 0xf7, 0x36, 0x97, 0x46, 0x97, + 0xf6, 0xe6, 0x46, 0x64, 0x27, 0xf3, 0x65, 0x96, 0x42, 0x25, 0x2c, 0x4d, + 0xce, 0x65, 0xac, 0xcc, 0x8d, 0xae, 0x4c, 0x8e, 0x4f, 0x58, 0x9a, 0x9c, + 0x0b, 0x5c, 0x99, 0xdc, 0x1c, 0x5c, 0xd9, 0x18, 0x5d, 0x9a, 0x5d, 0x19, + 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x32, 0x61, 0x69, 0x72, 0x2e, + 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0xe0, 0xde, 0xe6, + 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0x86, 0x48, 0x48, 0x70, 0x50, 0x47, 0x75, + 0x58, 0xc7, 0x75, 0x40, 0x07, 0x76, 0x64, 0x87, 0x46, 0xeb, 0xac, 0xcc, + 0xad, 0x4c, 0x2e, 0x8c, 0xae, 0x8c, 0x0c, 0xa5, 0x66, 0xec, 0x8d, 0xed, + 0x4d, 0x8e, 0xc8, 0x8e, 0xe6, 0xcb, 0x2c, 0x85, 0xc5, 0xd8, 0x1b, 0xdb, + 0x9b, 0xdc, 0x10, 0x09, 0x19, 0x0e, 0xea, 0xe0, 0x0e, 0xeb, 0xb8, 0x0e, + 0xe8, 0x88, 0x8e, 0xec, 0xe8, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x88, 0xd5, + 0x99, 0x99, 0x95, 0xc9, 0xf1, 0x09, 0x4b, 0x93, 0x73, 0x11, 0xab, 0x33, + 0x33, 0x2b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0xa3, 0x14, 0x96, 0x26, + 0xe7, 0xc2, 0xf6, 0x36, 0x16, 0x46, 0x97, 0xf6, 0xe6, 0xf6, 0x95, 0xe6, + 0x46, 0x56, 0x86, 0x47, 0x24, 0x2c, 0x4d, 0xce, 0x45, 0xae, 0x2c, 0x8c, + 0x8c, 0x54, 0x58, 0x9a, 0x9c, 0xcb, 0x1c, 0x9d, 0x5c, 0xdd, 0x18, 0xdd, + 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x9a, 0x9b, 0xd9, 0x1b, 0x0b, 0x33, + 0xb6, 0xb7, 0x30, 0x3a, 0x32, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x64, 0xe8, 0xca, 0xf0, 0xe8, 0xea, 0xe4, + 0xca, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, 0xa8, 0xa4, 0xb9, 0xc1, 0xd5, 0xd1, + 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x71, 0x19, 0x7b, 0x63, 0x7b, 0x93, 0xfb, + 0x9a, 0x1b, 0x0b, 0x63, 0x2b, 0xa3, 0x43, 0xf7, 0xe6, 0x56, 0xd6, 0x16, + 0x06, 0xf7, 0xd5, 0x56, 0x46, 0x87, 0xf6, 0x46, 0xc6, 0x87, 0xee, 0xcd, + 0xad, 0xac, 0x2d, 0x0c, 0xee, 0xcb, 0x2c, 0x6c, 0x8c, 0xee, 0x4d, 0x2e, + 0x86, 0x0f, 0xdd, 0x9b, 0x5b, 0x59, 0x5b, 0x18, 0xdc, 0x97, 0x59, 0xd8, + 0x18, 0xdd, 0x9b, 0x9c, 0x0c, 0x9f, 0x39, 0x32, 0xb9, 0xaf, 0x3b, 0xb4, + 0x34, 0xba, 0xb2, 0x2f, 0xb8, 0xb7, 0x34, 0x37, 0xba, 0x21, 0xb0, 0x80, + 0x04, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x65, 0x80, 0x08, 0x88, 0x80, + 0x04, 0x07, 0x19, 0x1c, 0x66, 0x80, 0x14, 0x88, 0x80, 0x04, 0x07, 0x19, + 0x1c, 0x67, 0x80, 0x1c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x68, 0x80, + 0x20, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x69, 0x80, 0x24, 0x88, 0x80, + 0x04, 0x07, 0x19, 0x1c, 0x6a, 0x80, 0x28, 0x88, 0x80, 0x04, 0x07, 0x19, + 0x1c, 0x6b, 0x80, 0x2c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x6c, 0xc0, 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, 0xec, 0x8b, 0x2e, 0x0f, 0xae, - 0xec, 0xcb, 0x2d, 0xac, 0xad, 0x8c, 0x86, 0x19, 0xdb, 0x5b, 0x18, 0x1d, - 0xcd, 0x10, 0x24, 0x0c, 0x9e, 0x4e, 0x09, 0x03, 0x28, 0x0c, 0xa2, 0x21, - 0x42, 0x18, 0x48, 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xde, 0xe6, 0xd2, - 0xe8, 0xd2, 0xde, 0xdc, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0x95, 0xb9, - 0xd1, 0x95, 0xc9, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x71, 0x7b, 0xfb, 0x82, - 0x2b, 0x93, 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3, 0x2b, 0x23, 0x13, - 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0xe5, 0x16, 0xd6, 0x56, 0x46, - 0x04, 0xee, 0x6d, 0x2e, 0x8d, 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0xd4, 0x29, - 0x61, 0x40, 0x85, 0x41, 0x15, 0x06, 0x56, 0x18, 0x40, 0x61, 0x10, 0x85, - 0xc1, 0x15, 0x06, 0x18, 0xa5, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, - 0xb3, 0xb6, 0x32, 0x37, 0xba, 0xaf, 0x34, 0x37, 0xb8, 0x3a, 0x3a, 0x5a, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, - 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x7c, 0xc2, - 0xd2, 0xe4, 0x5c, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca, 0xc6, 0xe8, 0xd2, - 0xec, 0xca, 0x58, 0x8c, 0xbd, 0xb1, 0xbd, 0xc9, 0x0d, 0x91, 0xba, 0x25, - 0x0c, 0xb4, 0x30, 0xd8, 0xc2, 0xa0, 0x0a, 0x03, 0x2e, 0x0c, 0xa0, 0x30, - 0x88, 0xc2, 0xe0, 0x0a, 0x83, 0x8e, 0xd9, 0x59, 0x99, 0x5b, 0x99, 0x5c, - 0x18, 0x5d, 0x19, 0x19, 0x0a, 0x0e, 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b, - 0x1c, 0x19, 0x91, 0x9d, 0xcc, 0x97, 0x59, 0x0a, 0x0d, 0x33, 0xb6, 0xb7, - 0x30, 0x3a, 0x19, 0x22, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, - 0x43, 0xa4, 0xce, 0x09, 0x03, 0x2d, 0x0c, 0xbe, 0x30, 0xa8, 0xc2, 0x80, - 0x0b, 0x03, 0x28, 0x0c, 0xc0, 0x20, 0x0c, 0xae, 0x30, 0x08, 0x03, 0x2a, - 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x7c, 0xc2, - 0xd2, 0xe4, 0x5c, 0xc4, 0xea, 0xcc, 0xcc, 0xca, 0xe4, 0xbe, 0xe6, 0xd2, - 0xf4, 0xca, 0x28, 0x85, 0xa5, 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, 0x85, 0xd1, - 0xa5, 0xbd, 0xb9, 0x7d, 0xa5, 0xb9, 0x91, 0x95, 0xe1, 0x11, 0x09, 0x4b, - 0x93, 0x73, 0x91, 0x2b, 0x0b, 0x23, 0x23, 0x15, 0x96, 0x26, 0xe7, 0x32, - 0x47, 0x27, 0x57, 0x37, 0x46, 0xf7, 0x45, 0x97, 0x07, 0x57, 0xf6, 0x95, - 0xe6, 0x66, 0xf6, 0xc6, 0xc2, 0x8c, 0xed, 0x2d, 0x8c, 0x8e, 0xcc, 0xdc, - 0x98, 0xd4, 0x91, 0xd0, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, 0x1d, 0x19, - 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x2f, 0xba, 0x3c, 0xb8, 0x32, - 0x2a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5c, - 0xc6, 0xde, 0xd8, 0xde, 0xe4, 0xbe, 0xe6, 0xc6, 0xc2, 0xd8, 0xca, 0xe8, - 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0xb5, 0x95, 0xd1, 0xa1, - 0xbd, 0x91, 0xf1, 0xa1, 0x7b, 0x73, 0x2b, 0x6b, 0x0b, 0x83, 0xfb, 0x32, - 0x0b, 0x1b, 0xa3, 0x7b, 0x93, 0x8b, 0xe1, 0x43, 0xf7, 0xe6, 0x56, 0xd6, - 0x16, 0x06, 0xf7, 0x65, 0x16, 0x36, 0x46, 0xf7, 0x26, 0x27, 0xc3, 0x67, - 0x8e, 0x4c, 0xee, 0xeb, 0x0e, 0x2d, 0x8d, 0xae, 0xec, 0x0b, 0xee, 0x2d, - 0xcd, 0x8d, 0x6e, 0x08, 0x2c, 0x74, 0x4a, 0xc7, 0x74, 0x4a, 0x18, 0xa0, - 0x41, 0x18, 0xa4, 0x41, 0xc7, 0x74, 0x4c, 0xa7, 0x84, 0x01, 0x1a, 0x84, - 0x81, 0x1a, 0x74, 0x4f, 0xc7, 0x74, 0x4a, 0x18, 0xa0, 0x41, 0x18, 0xac, - 0x41, 0x37, 0x75, 0x4c, 0xa7, 0x84, 0x01, 0x1a, 0x84, 0x01, 0x1b, 0x74, - 0x4d, 0xc7, 0x74, 0x4a, 0x18, 0xa0, 0x41, 0x18, 0xb4, 0x41, 0x47, 0x75, - 0x4c, 0xa7, 0x84, 0x01, 0x1a, 0x84, 0x81, 0x1b, 0x74, 0x55, 0xc7, 0x74, - 0x4a, 0x18, 0xa0, 0x41, 0x18, 0xbc, 0x41, 0x67, 0x75, 0x4c, 0xa7, 0x84, - 0x01, 0x1a, 0x84, 0x01, 0x1c, 0x30, 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, - 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0xe3, - 0x15, 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0x45, 0x97, 0x07, 0x57, - 0xf6, 0x15, 0xc6, 0x96, 0x76, 0xe6, 0xf6, 0x35, 0x97, 0xa6, 0x57, 0xc6, - 0x67, 0x0a, 0x2d, 0x8c, 0xac, 0x4c, 0x6e, 0xe8, 0xcd, 0x6d, 0x8e, 0x2e, - 0xcc, 0x8d, 0x6e, 0x8e, 0xc1, 0xd8, 0x10, 0x32, 0xe8, 0xa4, 0x30, 0x18, - 0x83, 0x30, 0x20, 0x83, 0x0e, 0x0a, 0x83, 0x32, 0xe8, 0x94, 0x6e, 0x09, - 0x03, 0x33, 0x08, 0x83, 0x33, 0x08, 0x83, 0x38, 0x08, 0x03, 0x39, 0xe8, - 0xa0, 0x30, 0x98, 0x83, 0x8e, 0x09, 0x03, 0x28, 0x0c, 0xe8, 0x20, 0x0c, - 0xae, 0x30, 0xa8, 0x03, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x34, - 0xde, 0xcc, 0xcc, 0xe6, 0xca, 0xe8, 0x88, 0x98, 0xb1, 0xbd, 0x85, 0xd1, - 0xcd, 0xe0, 0xcd, 0xd0, 0x68, 0x0b, 0xa3, 0x93, 0x4b, 0xc3, 0x1b, 0x42, - 0x75, 0x4a, 0xd7, 0x74, 0x4a, 0x18, 0xdc, 0x41, 0x18, 0xe0, 0x41, 0xd7, - 0x74, 0x57, 0xa7, 0x84, 0x41, 0x1e, 0x84, 0x81, 0x1e, 0x30, 0xc9, 0xaa, - 0xb2, 0x22, 0x2a, 0x1b, 0x7b, 0x23, 0x2b, 0xa3, 0x41, 0x56, 0x36, 0xf6, - 0x46, 0x56, 0x36, 0x84, 0x0c, 0x3a, 0x26, 0x0c, 0xc6, 0x20, 0x0c, 0xc8, - 0xa0, 0x8b, 0xc2, 0xa0, 0x0c, 0xba, 0xa5, 0x5b, 0xc2, 0xc0, 0x0c, 0xc2, - 0xe0, 0x0c, 0xc2, 0x60, 0x0f, 0xc2, 0x40, 0x0e, 0xba, 0x28, 0x0c, 0xe6, - 0xa0, 0x6b, 0xc2, 0x00, 0x0a, 0x03, 0x3e, 0x08, 0x83, 0x2b, 0x0c, 0xfa, - 0x80, 0x4b, 0x58, 0x9a, 0x9c, 0x0b, 0x5d, 0x19, 0x1e, 0x5d, 0x9d, 0x5c, - 0x19, 0x95, 0xb0, 0x34, 0x39, 0x97, 0xb9, 0xb0, 0x36, 0x38, 0xb6, 0x32, - 0x62, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, - 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x3e, 0x24, 0xe8, 0xca, 0xf0, 0x60, 0x86, 0x50, 0x1d, 0x16, 0x06, 0x7f, - 0x10, 0x06, 0x65, 0xd0, 0x29, 0xdd, 0x12, 0x06, 0xa0, 0x10, 0x06, 0x50, - 0x18, 0x84, 0x42, 0x18, 0x5c, 0x61, 0x20, 0x0a, 0x24, 0xe8, 0xca, 0xf0, - 0x62, 0x86, 0x50, 0x5d, 0x16, 0x06, 0x7f, 0x10, 0x06, 0x65, 0xd0, 0x2d, - 0xdd, 0x12, 0x06, 0xa0, 0x10, 0x06, 0x50, 0x18, 0x84, 0x42, 0x18, 0x5c, - 0x61, 0x40, 0x0a, 0x5c, 0xc2, 0xd2, 0xe4, 0x5c, 0xe6, 0xc2, 0xda, 0xe0, - 0xd8, 0xca, 0xe4, 0x78, 0xcc, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0x31, - 0x98, 0x1b, 0x22, 0x75, 0x5a, 0x18, 0x98, 0x42, 0x18, 0x94, 0x41, 0xa7, - 0x74, 0x4b, 0x18, 0x40, 0x61, 0x70, 0x0a, 0x61, 0x70, 0x85, 0x01, 0x2a, - 0x0c, 0x81, 0xc2, 0x20, 0x0b, 0x03, 0x2f, 0x0c, 0xc4, 0x20, 0x0c, 0xec, - 0x20, 0x0c, 0xfc, 0x20, 0x0c, 0x46, 0x21, 0x0c, 0x4a, 0x21, 0x0c, 0x52, - 0x61, 0x88, 0xf1, 0x00, 0x61, 0x30, 0x85, 0x81, 0x2a, 0xb0, 0xfa, 0xd2, - 0xa2, 0x9a, 0x8a, 0xa9, 0x99, 0x42, 0x0b, 0x23, 0x2b, 0x93, 0x1b, 0x7a, - 0x73, 0x9b, 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0xe3, 0xf3, 0xd6, 0xe6, 0x96, - 0x06, 0xf7, 0x46, 0x57, 0xe6, 0x46, 0x07, 0x32, 0x86, 0x16, 0x26, 0xc7, - 0x67, 0x2a, 0xad, 0x0d, 0x8e, 0xad, 0x0c, 0x64, 0x68, 0x65, 0x05, 0x84, - 0x4a, 0x28, 0x28, 0x68, 0x88, 0x10, 0x06, 0xae, 0x30, 0xc4, 0x08, 0x83, - 0x56, 0x08, 0x83, 0x57, 0x18, 0x03, 0x6e, 0x88, 0x11, 0x06, 0x68, 0x10, - 0x06, 0xb0, 0x30, 0x06, 0xdc, 0x10, 0x31, 0x08, 0x03, 0x56, 0x08, 0x83, - 0x58, 0x18, 0x03, 0x2e, 0x0c, 0x62, 0x61, 0x0c, 0xba, 0x30, 0x88, 0x85, - 0x31, 0xf0, 0xc2, 0x20, 0x16, 0xc6, 0xe0, 0x0b, 0x83, 0x58, 0x18, 0x03, - 0x30, 0x08, 0x83, 0x58, 0x18, 0x83, 0x30, 0x08, 0x83, 0x58, 0x18, 0x03, - 0x31, 0x08, 0x83, 0x58, 0x18, 0x83, 0x6d, 0x88, 0x11, 0x06, 0xb2, 0x10, - 0x06, 0xb1, 0x30, 0x06, 0x1d, 0xcf, 0x20, 0x2c, 0x4d, 0xae, 0x25, 0x8c, - 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0x6c, 0x0e, 0x65, - 0x8a, 0x88, 0xe9, 0x2b, 0x88, 0xcc, 0x2e, 0xcc, 0x6d, 0xac, 0x8c, 0xec, - 0xcb, 0x4c, 0x2e, 0xec, 0xac, 0xad, 0xcc, 0x8d, 0x2e, 0x65, 0x08, 0x11, - 0x06, 0xb5, 0x10, 0x06, 0xb4, 0x40, 0x2b, 0x2c, 0x4d, 0xae, 0x25, 0x8c, - 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, 0x25, 0x4c, - 0xee, 0x0c, 0x65, 0x26, 0x65, 0x88, 0x11, 0x06, 0xb7, 0x10, 0x06, 0xb5, - 0x10, 0x06, 0xb6, 0x30, 0x44, 0x08, 0x83, 0x5b, 0xa0, 0x15, 0x96, 0x26, - 0xd7, 0x12, 0xc6, 0x96, 0x16, 0x36, 0xd7, 0x32, 0x37, 0xf6, 0x06, 0x57, - 0xd6, 0x12, 0x26, 0x77, 0x86, 0x42, 0x93, 0x32, 0xc4, 0x08, 0x03, 0x5d, - 0x08, 0x83, 0x5a, 0x08, 0x83, 0x5c, 0x20, 0x16, 0x96, 0x26, 0xd7, 0x12, - 0xc6, 0x96, 0x16, 0x36, 0xd7, 0x32, 0x37, 0xf6, 0x06, 0x57, 0xd6, 0x42, - 0x57, 0x86, 0x47, 0x57, 0x27, 0x57, 0x36, 0x37, 0xc4, 0x08, 0x03, 0x5e, - 0x08, 0x83, 0x5a, 0x08, 0x83, 0x5d, 0x20, 0x16, 0x96, 0x26, 0xd7, 0x12, - 0xc6, 0x96, 0x16, 0x36, 0xd7, 0x32, 0x37, 0xf6, 0x06, 0x57, 0xd6, 0x32, - 0x17, 0xd6, 0x06, 0xc7, 0x56, 0x26, 0x37, 0x37, 0xc4, 0x08, 0x03, 0x5f, - 0x08, 0x83, 0x5a, 0x08, 0x83, 0x5e, 0x18, 0x62, 0x84, 0x81, 0x2e, 0x84, - 0x01, 0x2f, 0x84, 0x81, 0x2f, 0x0c, 0x31, 0xc2, 0x40, 0x16, 0xc2, 0x20, - 0x16, 0xc6, 0xc0, 0x1b, 0x62, 0x84, 0x81, 0x2c, 0x84, 0x41, 0x2c, 0x8c, - 0xc1, 0x36, 0xc4, 0x08, 0x03, 0x59, 0x08, 0x83, 0x58, 0x18, 0x03, 0x30, - 0x18, 0x62, 0x84, 0x81, 0x2c, 0x84, 0x41, 0x2c, 0x8c, 0x41, 0x18, 0x0c, - 0x31, 0xc2, 0x40, 0x16, 0xc2, 0x20, 0x16, 0xc6, 0x40, 0x0c, 0x86, 0x18, - 0x61, 0x20, 0x0b, 0x61, 0x10, 0x0b, 0x63, 0xc0, 0x0d, 0x31, 0xc2, 0x40, - 0x16, 0xc2, 0x20, 0x16, 0xc6, 0xe0, 0x1b, 0x11, 0xb1, 0x03, 0x3b, 0xd8, - 0x43, 0x3b, 0xb8, 0x41, 0x3b, 0xbc, 0x03, 0x39, 0xd4, 0x03, 0x3b, 0x94, - 0x83, 0x1b, 0x98, 0x03, 0x3b, 0x84, 0xc3, 0x39, 0xcc, 0xc3, 0x14, 0x21, - 0x18, 0x46, 0x28, 0xec, 0xc0, 0x0e, 0xf6, 0xd0, 0x0e, 0x6e, 0x90, 0x0e, - 0xe4, 0x50, 0x0e, 0xee, 0x40, 0x0f, 0x53, 0x82, 0x62, 0xc4, 0x12, 0x0e, - 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, - 0xef, 0xe0, 0x0e, 0x53, 0x02, 0x63, 0x04, 0x15, 0x0e, 0xe9, 0x20, 0x0f, - 0x6e, 0xc0, 0x0e, 0xe1, 0xe0, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x70, 0x0e, - 0xe5, 0xf0, 0x0b, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, - 0xee, 0x30, 0x25, 0x40, 0x46, 0x4c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, - 0xe3, 0xf0, 0x0e, 0xed, 0x00, 0x0f, 0xe9, 0xc0, 0x0e, 0xe5, 0xf0, 0x0b, - 0xef, 0x00, 0x0f, 0xf4, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0xf3, 0x30, 0x65, - 0x50, 0x18, 0x67, 0x04, 0x13, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0e, - 0xf2, 0x10, 0x0e, 0xe7, 0xd0, 0x0e, 0xe5, 0xe0, 0x0e, 0xf4, 0x30, 0x25, - 0x58, 0x05, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, + 0xec, 0x6b, 0x2e, 0x4d, 0xaf, 0x8c, 0x57, 0x58, 0x9a, 0x9c, 0x4b, 0x98, + 0xdc, 0xd9, 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x18, 0x5b, 0xda, 0x99, + 0xdb, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x9f, 0x29, 0xb4, 0x30, 0xb2, 0x32, + 0xb9, 0xa1, 0x37, 0xb7, 0x39, 0xba, 0x30, 0x37, 0xba, 0x39, 0x06, 0x63, + 0x43, 0xc8, 0x00, 0x21, 0x8e, 0xef, 0x00, 0x03, 0xc4, 0x38, 0xc2, 0x00, + 0x09, 0x90, 0xe1, 0x10, 0x83, 0x63, 0x0c, 0x8e, 0x36, 0x38, 0xdc, 0x00, + 0x31, 0x8e, 0x37, 0x40, 0x84, 0x03, 0x3a, 0xe0, 0xe0, 0xc8, 0x8e, 0x38, + 0x18, 0x62, 0x1c, 0xdb, 0xe1, 0x1d, 0x72, 0x30, 0xc4, 0x30, 0x80, 0x63, + 0x3a, 0xe6, 0x80, 0xd5, 0x97, 0x16, 0xd5, 0x54, 0x4c, 0xcd, 0x14, 0x5a, + 0x18, 0x59, 0x99, 0xdc, 0xd0, 0x9b, 0xdb, 0x1c, 0x5d, 0x98, 0x1b, 0xdd, + 0x1c, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, 0x37, 0xba, 0x32, 0x37, 0x3a, + 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, + 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x43, 0x84, 0xe3, + 0x0e, 0x86, 0x18, 0x87, 0x1d, 0x1c, 0x78, 0xa0, 0x34, 0x43, 0x8c, 0x83, + 0x0c, 0x8e, 0x3c, 0x50, 0x9a, 0x21, 0x62, 0x70, 0xd4, 0xc1, 0xa1, 0x07, + 0x4a, 0x73, 0xe8, 0x81, 0xf2, 0x1c, 0x7a, 0xa0, 0x40, 0x87, 0x1e, 0x28, + 0xce, 0xa1, 0x07, 0x4a, 0x74, 0xe8, 0x81, 0x22, 0x1d, 0x7a, 0xa0, 0x4c, + 0x87, 0x1e, 0x28, 0xcc, 0x10, 0xe3, 0xd8, 0x83, 0x43, 0x0f, 0x14, 0x87, + 0x64, 0x10, 0x96, 0x26, 0xd7, 0x12, 0xc6, 0x96, 0x16, 0x36, 0xd7, 0x32, + 0x37, 0xf6, 0x06, 0x57, 0x36, 0x87, 0x32, 0x45, 0xc4, 0xf4, 0x35, 0xf5, + 0xc6, 0x96, 0x46, 0xf6, 0x65, 0x26, 0x17, 0x76, 0xd6, 0x56, 0xe6, 0x46, + 0x97, 0x32, 0x84, 0x38, 0xfc, 0xe0, 0xe8, 0x03, 0x5a, 0x61, 0x69, 0x72, + 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2d, 0x61, 0x72, 0x67, 0x28, 0x32, 0x29, 0x43, 0x8c, 0x03, 0x14, 0x0e, + 0x3f, 0x38, 0xfe, 0x60, 0x88, 0x70, 0x80, 0xc2, 0x88, 0x88, 0x1d, 0xd8, + 0xc1, 0x1e, 0xda, 0xc1, 0x0d, 0xda, 0xe1, 0x1d, 0xc8, 0xa1, 0x1e, 0xd8, + 0xa1, 0x1c, 0xdc, 0xc0, 0x1c, 0xd8, 0x21, 0x1c, 0xce, 0x61, 0x1e, 0xa6, + 0x08, 0xc1, 0x30, 0x42, 0x61, 0x07, 0x76, 0xb0, 0x87, 0x76, 0x70, 0x83, + 0x74, 0x20, 0x87, 0x72, 0x70, 0x07, 0x7a, 0x98, 0x12, 0x14, 0x23, 0x96, + 0x70, 0x48, 0x07, 0x79, 0x70, 0x03, 0x7b, 0x28, 0x07, 0x79, 0x98, 0x87, + 0x74, 0x78, 0x07, 0x77, 0x98, 0x12, 0x18, 0x23, 0xa8, 0x70, 0x48, 0x07, + 0x79, 0x70, 0x03, 0x76, 0x08, 0x07, 0x77, 0x38, 0x87, 0x7a, 0x08, 0x87, + 0x73, 0x28, 0x87, 0x5f, 0xb0, 0x87, 0x72, 0x90, 0x87, 0x79, 0x48, 0x87, + 0x77, 0x70, 0x87, 0x29, 0x01, 0x32, 0x62, 0x0a, 0x87, 0x74, 0x90, 0x07, + 0x37, 0x18, 0x87, 0x77, 0x68, 0x07, 0x78, 0x48, 0x07, 0x76, 0x28, 0x87, + 0x5f, 0x78, 0x07, 0x78, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0x98, 0x87, + 0x29, 0x83, 0xc2, 0x38, 0x23, 0x98, 0x70, 0x48, 0x07, 0x79, 0x70, 0x03, + 0x73, 0x90, 0x87, 0x70, 0x38, 0x87, 0x76, 0x28, 0x07, 0x77, 0xa0, 0x87, + 0x29, 0x01, 0x1d, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, @@ -1516,214 +875,20 @@ const unsigned char sdl_metallib[] = { 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x71, 0x20, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x46, 0xd0, 0x00, - 0x48, 0xe4, 0x0f, 0xce, 0xe4, 0x57, 0x77, 0x71, 0xdb, 0x96, 0xb0, 0x01, - 0x48, 0xe4, 0x4b, 0x00, 0xf3, 0x2c, 0xc4, 0x3f, 0x11, 0xd7, 0x44, 0x45, - 0xc4, 0x6f, 0x0f, 0x7e, 0x85, 0x17, 0xb7, 0x6d, 0x07, 0x13, 0x80, 0x44, - 0x7e, 0x01, 0x48, 0xd3, 0x5f, 0x00, 0x81, 0xe4, 0x57, 0x77, 0x71, 0xdb, - 0x16, 0x40, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0xc2, 0x02, 0x30, - 0x8f, 0x5f, 0xdd, 0xc5, 0x6d, 0x9b, 0x00, 0x04, 0x20, 0x91, 0x5f, 0x00, - 0xd2, 0xf4, 0x3f, 0x8e, 0xe5, 0x17, 0xb7, 0x6d, 0x08, 0x13, 0x80, 0x44, - 0x7e, 0x01, 0x48, 0xd3, 0x5f, 0x30, 0xc0, 0xe5, 0x57, 0x77, 0x71, 0xdb, - 0x06, 0x50, 0xb1, 0x5d, 0xf9, 0x6b, 0x43, 0x05, 0x34, 0x02, 0x31, 0xfc, - 0x45, 0x04, 0x18, 0x0c, 0xd1, 0x4c, 0x36, 0x10, 0x01, 0x48, 0xe4, 0x17, - 0x80, 0x34, 0xfd, 0x05, 0x10, 0x48, 0x7e, 0x71, 0xdb, 0x56, 0x10, 0x01, - 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, 0x03, 0x5c, 0x7e, 0x71, 0xdb, - 0x66, 0x20, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x8f, 0x63, 0xf9, - 0xd5, 0x5d, 0xdc, 0x36, 0x00, 0x61, 0x20, 0x00, 0x00, 0x36, 0x02, 0x00, - 0x00, 0x13, 0x04, 0x79, 0x10, 0x0b, 0x04, 0x00, 0x00, 0x5e, 0x00, 0x00, - 0x00, 0xb4, 0x8e, 0x45, 0x00, 0x81, 0x70, 0xcc, 0x41, 0x28, 0x8b, 0x73, - 0x07, 0x74, 0x8e, 0x35, 0x00, 0x03, 0x31, 0xc7, 0xa0, 0x2c, 0x77, 0x30, - 0xc7, 0xa0, 0xdc, 0xc1, 0x1d, 0x8c, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, - 0x63, 0x11, 0x94, 0x00, 0x79, 0x63, 0x09, 0x01, 0x30, 0x02, 0x40, 0xdd, - 0x0c, 0x00, 0x71, 0x23, 0x00, 0x35, 0x40, 0xc0, 0x18, 0x01, 0x08, 0x82, - 0x20, 0x09, 0x06, 0x14, 0xcc, 0x00, 0xcc, 0x00, 0xcc, 0x41, 0xcc, 0xc2, - 0x2c, 0xcc, 0x82, 0x2e, 0x8c, 0x45, 0x80, 0x20, 0x08, 0xe2, 0x1f, 0x08, - 0x82, 0x20, 0xfe, 0x81, 0x20, 0x08, 0xe2, 0x1f, 0x08, 0x82, 0x20, 0xfe, - 0x8d, 0x45, 0x80, 0x20, 0x08, 0xe2, 0x1f, 0x00, 0x80, 0x20, 0x08, 0xe2, - 0x1f, 0x09, 0x33, 0x00, 0x54, 0xcc, 0x00, 0x8c, 0x00, 0xcc, 0x00, 0x8c, - 0x35, 0x80, 0x20, 0x08, 0xe2, 0x1f, 0x08, 0x82, 0x20, 0xfe, 0x81, 0x20, - 0x08, 0xe2, 0xdf, 0x58, 0x03, 0xdb, 0xce, 0x3f, 0xe9, 0xb1, 0xed, 0xfc, - 0x93, 0x1e, 0xdb, 0xce, 0x3f, 0xe9, 0x8d, 0x35, 0x80, 0x20, 0xc8, 0xd6, - 0xbf, 0x00, 0x82, 0x20, 0x5b, 0xff, 0x02, 0x08, 0x82, 0x6c, 0xfd, 0x0b, - 0x63, 0x0d, 0x20, 0x08, 0xae, 0x39, 0x18, 0x80, 0x20, 0xb8, 0xe6, 0x60, - 0x00, 0x82, 0xe0, 0x9a, 0x83, 0xc1, 0x58, 0x03, 0x08, 0xd2, 0x6d, 0x0e, - 0x06, 0x20, 0x48, 0xb7, 0x39, 0x18, 0x80, 0x20, 0xdd, 0xe6, 0x60, 0x30, - 0xd6, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x3a, 0xe2, 0x31, 0x0b, 0x06, - 0xeb, 0x88, 0xc7, 0x2c, 0x18, 0x8c, 0x35, 0x80, 0x20, 0x8c, 0x87, 0x63, - 0x00, 0x82, 0x30, 0x1e, 0x8e, 0x01, 0x08, 0xc2, 0x78, 0x38, 0x06, 0x63, - 0x0d, 0x62, 0x2e, 0xa6, 0xfd, 0x07, 0x96, 0x3c, 0x1b, 0xff, 0xc2, 0x98, - 0xae, 0x6a, 0xee, 0x0b, 0x63, 0x0d, 0xff, 0x4c, 0xfa, 0xbf, 0x2f, 0xd0, - 0x35, 0x28, 0xe6, 0x5f, 0x0b, 0xc7, 0x31, 0xe8, 0x0b, 0x63, 0x0d, 0x73, - 0xdf, 0xa6, 0xa9, 0x2f, 0xb4, 0x6e, 0xc8, 0xf3, 0xbe, 0xc0, 0xe7, 0xac, - 0x8f, 0x7f, 0x04, 0x8c, 0x11, 0xe8, 0xac, 0x39, 0x87, 0x60, 0x30, 0x46, - 0xf0, 0xee, 0x69, 0x79, 0x7f, 0x63, 0x04, 0x6e, 0x1f, 0x8b, 0xb6, 0x37, - 0x46, 0x10, 0xf3, 0x60, 0x9f, 0x7b, 0x63, 0x04, 0xe6, 0xbd, 0xae, 0xb2, - 0x37, 0x03, 0x30, 0x46, 0x00, 0x82, 0x20, 0x08, 0x82, 0xc1, 0x18, 0x81, - 0xdb, 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba, 0xf8, 0x37, - 0x46, 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8, 0xf6, 0x34, - 0x18, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x18, 0x01, 0x08, 0x82, - 0x20, 0xfe, 0x8d, 0x00, 0x00, 0xe3, 0x0d, 0x75, 0x00, 0x0a, 0xb1, 0x40, - 0xc1, 0x18, 0x6e, 0x08, 0x86, 0x60, 0x96, 0xe1, 0x08, 0x82, 0xe1, 0x06, - 0xa1, 0x08, 0x66, 0x19, 0x84, 0x21, 0x18, 0x31, 0x50, 0x88, 0xe0, 0x16, - 0xee, 0xa0, 0x0e, 0xf4, 0xe0, 0x0c, 0xd4, 0x00, 0x0d, 0x8a, 0x59, 0x82, - 0x63, 0xb8, 0x81, 0x68, 0x82, 0x59, 0x06, 0xa2, 0x08, 0x46, 0x0c, 0x14, - 0x22, 0xc8, 0x85, 0x3c, 0xb8, 0x03, 0x3e, 0x48, 0x03, 0x36, 0x50, 0x83, - 0x63, 0xc4, 0x40, 0x21, 0x02, 0x5d, 0xc8, 0x03, 0x3c, 0xe8, 0x03, 0x35, - 0x68, 0x83, 0x35, 0x40, 0x06, 0x19, 0x04, 0x34, 0xa0, 0x83, 0x41, 0x06, - 0x41, 0x0d, 0xec, 0x60, 0x90, 0x41, 0x08, 0xf0, 0xe0, 0xfe, 0x00, 0x5d, - 0x0a, 0xca, 0x20, 0x43, 0xe0, 0x06, 0x77, 0x60, 0x44, 0x00, 0x9f, 0xf1, - 0x86, 0x51, 0x78, 0x05, 0x70, 0xb8, 0x00, 0x5d, 0x0a, 0xca, 0x20, 0x43, - 0x30, 0x07, 0x7c, 0x30, 0x62, 0x50, 0x14, 0xc1, 0x3a, 0x14, 0xc1, 0x78, - 0x05, 0x2a, 0xd0, 0x42, 0x39, 0x98, 0x03, 0x1f, 0x5c, 0x80, 0x2e, 0x05, - 0x65, 0x90, 0x21, 0xc0, 0x83, 0x50, 0x18, 0x31, 0x28, 0x8a, 0x00, 0x1e, - 0x94, 0x60, 0xbc, 0xa2, 0x15, 0x72, 0x41, 0x1d, 0xd6, 0x41, 0x14, 0x2e, - 0x40, 0x97, 0x82, 0x32, 0xc8, 0x10, 0xf4, 0x81, 0x29, 0x8c, 0x18, 0x14, - 0x45, 0x50, 0x0f, 0x4f, 0x30, 0xc7, 0xd0, 0x07, 0x0b, 0x3c, 0xcc, 0x31, - 0x04, 0x07, 0x3c, 0xcc, 0x31, 0x04, 0x83, 0x3b, 0xcc, 0x12, 0x1c, 0xc3, - 0x0d, 0x60, 0x30, 0x0a, 0xc1, 0x2c, 0x83, 0x71, 0x04, 0x23, 0x06, 0x0a, - 0x11, 0xd4, 0x43, 0x2d, 0xcc, 0x02, 0x2e, 0x94, 0x02, 0x2a, 0x98, 0xc2, - 0x18, 0x8c, 0x18, 0x28, 0x44, 0x60, 0x0f, 0xb5, 0x40, 0x0b, 0xb9, 0x60, - 0x0a, 0xa9, 0x70, 0x0a, 0x64, 0x30, 0xc8, 0x10, 0x94, 0xc2, 0x2a, 0x0c, - 0x32, 0x0c, 0xa5, 0x10, 0x0b, 0x83, 0x0c, 0x82, 0x28, 0xcc, 0xc2, 0x20, - 0x83, 0x10, 0xd4, 0xc2, 0xf1, 0x02, 0xba, 0x14, 0x94, 0x41, 0x86, 0x60, - 0x15, 0x68, 0xc1, 0x88, 0x00, 0x3e, 0xe3, 0x0d, 0xe0, 0xc0, 0x0e, 0xfd, - 0x70, 0x01, 0xba, 0x14, 0x94, 0x41, 0x86, 0x00, 0x16, 0x72, 0x61, 0xc4, - 0xa0, 0x28, 0x02, 0x94, 0x28, 0x82, 0xf1, 0x8a, 0x72, 0x88, 0x07, 0x91, - 0x18, 0x89, 0x5c, 0xb8, 0x00, 0x5d, 0x0a, 0xca, 0x20, 0x43, 0x50, 0x0b, - 0xbe, 0x30, 0x62, 0x50, 0x14, 0x41, 0x4b, 0x28, 0xc1, 0x78, 0x85, 0x3a, - 0xd8, 0xc3, 0x49, 0xa0, 0xc4, 0x2f, 0x5c, 0x80, 0x2e, 0x05, 0x65, 0x90, - 0x21, 0xd0, 0x85, 0x71, 0x18, 0x31, 0x28, 0x8a, 0x40, 0x26, 0x9e, 0x60, - 0x8e, 0x41, 0x17, 0x96, 0x96, 0x98, 0x63, 0x08, 0x8e, 0x96, 0x98, 0x63, - 0x08, 0x86, 0x95, 0x98, 0x25, 0x38, 0x06, 0x5a, 0x02, 0x7a, 0x10, 0xf8, - 0x80, 0x10, 0x0c, 0xbc, 0x00, 0xec, 0xa2, 0x18, 0x6f, 0xa0, 0x87, 0x7f, - 0x68, 0x09, 0x0a, 0xc6, 0x70, 0x43, 0x30, 0x0e, 0xc1, 0x2c, 0x03, 0x92, - 0x04, 0x83, 0x0c, 0xc4, 0x38, 0xb0, 0xc3, 0x78, 0x03, 0x3e, 0x8c, 0x44, - 0x49, 0x50, 0x30, 0x46, 0x0c, 0x88, 0x22, 0xd0, 0x89, 0x61, 0xc4, 0xa0, - 0x28, 0x02, 0x9e, 0x08, 0x7a, 0xc1, 0x82, 0x5e, 0x80, 0xcf, 0x88, 0x41, - 0x51, 0x04, 0x3c, 0x11, 0x88, 0x83, 0x0d, 0xbe, 0x20, 0x1f, 0xf3, 0x85, - 0x20, 0x3e, 0x36, 0x04, 0xf4, 0x19, 0x31, 0x20, 0x8a, 0x20, 0x2c, 0x82, - 0x11, 0x83, 0xa2, 0x08, 0xc6, 0x22, 0x00, 0x07, 0x0b, 0xc0, 0x41, 0x3e, - 0x73, 0x0c, 0xea, 0xb0, 0x84, 0xc5, 0x20, 0x43, 0xb0, 0x0e, 0xfb, 0x60, - 0x43, 0x40, 0x9f, 0x41, 0x86, 0xa0, 0x1d, 0x42, 0x62, 0x90, 0x21, 0xa8, - 0x46, 0x62, 0x96, 0x20, 0x19, 0xa8, 0x08, 0x04, 0x84, 0x0d, 0x8e, 0xf1, - 0x06, 0x95, 0xa8, 0x89, 0xb2, 0xa0, 0x60, 0x0c, 0x37, 0x04, 0xb8, 0xe0, - 0xcc, 0x32, 0x28, 0x50, 0x30, 0xc8, 0x40, 0xe4, 0x83, 0x48, 0x8c, 0x37, - 0xb8, 0x44, 0x4e, 0xf4, 0x04, 0x05, 0x63, 0xbc, 0x01, 0x26, 0x76, 0xc2, - 0x27, 0x28, 0x18, 0x83, 0x0c, 0x89, 0x3f, 0xb0, 0xc4, 0x70, 0x03, 0x02, - 0x0e, 0xc1, 0x2c, 0xc3, 0xc2, 0x04, 0x73, 0x0c, 0xfa, 0x50, 0xc4, 0xc5, - 0x20, 0x43, 0xb0, 0x0f, 0x2b, 0x61, 0x41, 0x22, 0x9f, 0x41, 0x86, 0xa0, - 0x1f, 0x62, 0x62, 0x96, 0xe0, 0x19, 0x6e, 0x68, 0xd6, 0x21, 0x98, 0x65, - 0x68, 0x9e, 0x60, 0x0c, 0x01, 0xb2, 0x8b, 0x31, 0x84, 0xc8, 0x2e, 0xc6, - 0x10, 0x24, 0xba, 0x18, 0x31, 0x28, 0x8a, 0xc0, 0x2f, 0x84, 0x60, 0xc4, - 0xa0, 0x28, 0x82, 0xbf, 0x20, 0x82, 0xe1, 0x86, 0x40, 0x1d, 0x84, 0x59, - 0x06, 0xe7, 0x09, 0x4c, 0x80, 0xe4, 0x63, 0x41, 0x3b, 0xc0, 0xc7, 0x08, - 0x48, 0x3e, 0x16, 0xbc, 0x03, 0x7c, 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0xa0, - 0x12, 0x41, 0x68, 0x0c, 0x32, 0x04, 0x2b, 0xb1, 0x13, 0x16, 0x64, 0xf2, - 0x19, 0x64, 0x08, 0x5a, 0x22, 0x2c, 0x66, 0x09, 0x9e, 0x81, 0x92, 0x40, - 0x0c, 0x16, 0x36, 0x60, 0x04, 0x87, 0x0d, 0x9a, 0x41, 0x86, 0x00, 0x0c, - 0xc8, 0x62, 0x96, 0x00, 0x1a, 0xa8, 0x08, 0x84, 0x47, 0x14, 0x92, 0xe1, - 0x06, 0x3b, 0xc0, 0x87, 0x60, 0x96, 0x21, 0xea, 0x82, 0xf1, 0x06, 0xb6, - 0xb8, 0x8b, 0xd4, 0xa0, 0x60, 0x8c, 0x37, 0xb8, 0x45, 0x5e, 0x8c, 0x06, - 0x05, 0x63, 0x90, 0xc1, 0xe0, 0x09, 0xb5, 0x18, 0x6e, 0x20, 0xfa, 0xc1, - 0x99, 0x65, 0x90, 0xb8, 0x60, 0x0c, 0x01, 0x79, 0x8d, 0xe1, 0x86, 0x00, - 0x25, 0x94, 0x59, 0x06, 0x6a, 0x0a, 0x4c, 0x50, 0x09, 0xf9, 0xcc, 0x12, - 0x54, 0x36, 0xb0, 0x04, 0x7c, 0x46, 0x0c, 0x88, 0x22, 0xd0, 0x8d, 0xc0, - 0x82, 0x97, 0x90, 0xcf, 0x88, 0x41, 0x51, 0x04, 0xbd, 0x11, 0xc4, 0xc4, - 0x2c, 0x41, 0x35, 0x50, 0x01, 0x28, 0x93, 0x40, 0xcd, 0x31, 0x94, 0x45, - 0x70, 0x1b, 0x63, 0x08, 0xd1, 0x6d, 0x0c, 0x37, 0x04, 0x31, 0xa1, 0xcc, - 0x32, 0x5c, 0x56, 0x60, 0xc2, 0x4c, 0xc8, 0x67, 0x96, 0x00, 0xb3, 0xa1, - 0x26, 0xe0, 0x33, 0x62, 0x40, 0x14, 0xc1, 0x78, 0x04, 0x16, 0xe0, 0x84, - 0x7c, 0x46, 0x0c, 0x8a, 0x22, 0x30, 0x8f, 0x40, 0x27, 0x66, 0x09, 0xb0, - 0x81, 0x0a, 0x40, 0xb1, 0x84, 0x6b, 0x8e, 0x21, 0x09, 0x7e, 0x63, 0x0c, - 0x41, 0xeb, 0x8d, 0xe1, 0x86, 0x40, 0x27, 0x94, 0x59, 0x06, 0x2d, 0x0b, - 0x4c, 0xe0, 0x09, 0xf9, 0xcc, 0x12, 0x6c, 0x36, 0xf8, 0x04, 0x7c, 0x46, - 0x0c, 0x88, 0x22, 0x60, 0x8f, 0xc0, 0x82, 0xb0, 0x90, 0xcf, 0x88, 0x41, - 0x51, 0x04, 0xef, 0x11, 0x8c, 0xc5, 0x2c, 0xc1, 0x36, 0x50, 0x01, 0x28, - 0x99, 0xa0, 0xcd, 0x31, 0x24, 0x41, 0x79, 0xcc, 0x12, 0x70, 0x03, 0x15, - 0x81, 0xb0, 0xe9, 0x41, 0x34, 0xc8, 0x10, 0xe8, 0xc5, 0x68, 0xcc, 0x31, - 0xd4, 0x05, 0x18, 0xb0, 0xc7, 0x20, 0x43, 0x60, 0x17, 0xa6, 0x61, 0x43, - 0x20, 0x9f, 0x41, 0x86, 0x00, 0x2f, 0x58, 0x63, 0x90, 0x21, 0x48, 0x03, - 0xd7, 0x98, 0x25, 0xc0, 0x83, 0xe1, 0x86, 0x5f, 0x38, 0x8b, 0x60, 0x96, - 0xc1, 0x53, 0x83, 0x60, 0x90, 0x61, 0x0d, 0x42, 0x43, 0x35, 0xc6, 0x1b, - 0x6c, 0x23, 0x3c, 0xe6, 0x83, 0x82, 0x31, 0xde, 0x80, 0x1b, 0xe3, 0xd1, - 0x1e, 0x14, 0x8c, 0x39, 0x06, 0xd0, 0x08, 0xee, 0x63, 0x90, 0x21, 0x08, - 0x8d, 0xd8, 0xb0, 0xe0, 0x90, 0xcf, 0x20, 0x43, 0x30, 0x1a, 0xb7, 0x31, - 0xdc, 0x70, 0xa8, 0x85, 0x33, 0xcb, 0x90, 0x06, 0x5f, 0x30, 0x86, 0x30, - 0xf0, 0xc7, 0x70, 0x43, 0xe0, 0x16, 0xca, 0x2c, 0x43, 0x18, 0x80, 0x41, - 0x60, 0x02, 0x5c, 0xc8, 0x67, 0x96, 0x40, 0x0c, 0x46, 0x0c, 0x88, 0x22, - 0x30, 0x91, 0x61, 0xc4, 0xa0, 0x28, 0x02, 0x14, 0x09, 0xe6, 0xc2, 0x82, - 0xba, 0x90, 0x8f, 0x05, 0x77, 0x01, 0x9f, 0x59, 0x02, 0x31, 0x18, 0xa8, - 0x00, 0x14, 0x30, 0x10, 0xc2, 0x60, 0x8e, 0x61, 0x35, 0x02, 0x12, 0x19, - 0x43, 0x60, 0x48, 0x64, 0xb8, 0x21, 0xb8, 0x0b, 0x65, 0x96, 0x81, 0x0c, - 0xc6, 0x20, 0x30, 0x21, 0x2f, 0xe4, 0x33, 0x4b, 0x50, 0x06, 0x23, 0x06, - 0x44, 0x11, 0xbc, 0xc8, 0x30, 0x62, 0x50, 0x14, 0x41, 0x8c, 0x04, 0x7c, - 0x61, 0x81, 0x5f, 0xc8, 0xc7, 0x02, 0xd0, 0x80, 0xcf, 0x2c, 0x41, 0x19, - 0x0c, 0x54, 0x00, 0xca, 0x18, 0x08, 0x64, 0x30, 0xc7, 0x90, 0x04, 0x2c, - 0x32, 0x86, 0x50, 0xa9, 0xc8, 0x70, 0x43, 0x00, 0x1a, 0xca, 0x2c, 0xc3, - 0x19, 0x98, 0x41, 0x60, 0x82, 0x68, 0xc8, 0x67, 0x96, 0x00, 0x0d, 0x46, - 0x0c, 0x88, 0x22, 0xc0, 0x91, 0x61, 0xc4, 0xa0, 0x28, 0x02, 0x1d, 0x09, - 0x4a, 0xc3, 0x82, 0xd3, 0x90, 0x8f, 0x05, 0xa9, 0x01, 0x9f, 0x59, 0x02, - 0x34, 0x18, 0xa8, 0x00, 0x14, 0x33, 0x10, 0xce, 0x60, 0x8e, 0x21, 0x09, - 0x64, 0x64, 0xc4, 0xc0, 0x28, 0x02, 0x30, 0x09, 0x7e, 0xa3, 0x37, 0x06, - 0x19, 0x82, 0xf0, 0xa8, 0x8f, 0x59, 0x82, 0x34, 0x18, 0xa8, 0x08, 0xfc, - 0xc0, 0x13, 0xd0, 0x60, 0x90, 0x21, 0x98, 0x05, 0xfc, 0x98, 0x25, 0xc0, - 0x83, 0x59, 0x86, 0x35, 0xb8, 0x03, 0x94, 0x18, 0x64, 0xa0, 0x05, 0xf5, - 0x98, 0x8f, 0x11, 0x83, 0xa2, 0x08, 0xc4, 0x24, 0xd8, 0x8d, 0x39, 0x06, - 0xf2, 0x08, 0x7a, 0x64, 0xc4, 0xa0, 0x28, 0x02, 0x32, 0x19, 0x78, 0x63, - 0x8e, 0x41, 0x08, 0x7c, 0x64, 0xc4, 0xa0, 0x28, 0x02, 0x33, 0x29, 0x7a, - 0x63, 0x8e, 0x41, 0x08, 0x7a, 0x64, 0xbc, 0xa1, 0x44, 0x60, 0x44, 0x4c, - 0x28, 0x18, 0xe3, 0x0d, 0x27, 0x22, 0x23, 0x3c, 0x42, 0xc1, 0x98, 0x63, - 0x78, 0x8f, 0xc0, 0x4c, 0x06, 0x19, 0x02, 0xf8, 0x00, 0x11, 0x0b, 0x0e, - 0xf9, 0x0c, 0x32, 0x04, 0xf2, 0x61, 0x22, 0xc3, 0x0d, 0x47, 0x6e, 0x38, - 0xb3, 0x0c, 0x76, 0xc0, 0x06, 0xc1, 0x18, 0xc2, 0xb0, 0x26, 0xc3, 0x0d, - 0x41, 0x6f, 0x28, 0xb3, 0x0c, 0x6e, 0xd0, 0x06, 0x81, 0x09, 0xbf, 0x21, - 0x9f, 0x59, 0x82, 0x37, 0x18, 0x31, 0x20, 0x8a, 0xa0, 0x4e, 0x86, 0x11, - 0x83, 0xa2, 0x08, 0xee, 0x24, 0x10, 0x0f, 0x0b, 0xc8, 0x43, 0x3e, 0x16, - 0x98, 0x07, 0x7c, 0x66, 0x09, 0xde, 0x60, 0xa0, 0x02, 0x50, 0xda, 0x40, - 0x70, 0x83, 0x39, 0x06, 0xfd, 0x08, 0xe6, 0x64, 0x0c, 0x81, 0x99, 0x93, - 0xe1, 0x86, 0xc0, 0x3c, 0x94, 0x59, 0x86, 0x38, 0x80, 0x83, 0xc0, 0x04, - 0xf4, 0x90, 0xcf, 0x2c, 0x81, 0x1c, 0x8c, 0x18, 0x10, 0x45, 0xe0, 0x27, - 0xc3, 0x88, 0x41, 0x51, 0x04, 0xa0, 0x12, 0xac, 0x87, 0x05, 0xed, 0x21, - 0x1f, 0x0b, 0xde, 0x03, 0x3e, 0xb3, 0x04, 0x72, 0x30, 0x50, 0x01, 0x28, - 0x70, 0x20, 0xc4, 0xc1, 0x1c, 0x43, 0x12, 0xec, 0xc9, 0x18, 0x42, 0x95, - 0x27, 0xc3, 0x0d, 0xc1, 0x7b, 0x28, 0xb3, 0x0c, 0x74, 0x30, 0x07, 0x81, - 0x09, 0xf1, 0x21, 0x9f, 0x59, 0x82, 0x3a, 0x18, 0x31, 0x20, 0x8a, 0xe0, - 0x54, 0x86, 0x11, 0x83, 0xa2, 0x08, 0x52, 0x25, 0xa0, 0x0f, 0x0b, 0xec, - 0x43, 0x3e, 0x16, 0xe0, 0x07, 0x7c, 0x66, 0x09, 0xea, 0x60, 0xa0, 0x02, - 0x50, 0xe6, 0x40, 0xa0, 0x83, 0x39, 0x86, 0x24, 0x08, 0x95, 0x11, 0x03, - 0xa3, 0x08, 0x5e, 0x25, 0x70, 0x11, 0x16, 0x19, 0x64, 0x08, 0x60, 0x84, - 0x4c, 0x66, 0x09, 0xec, 0x60, 0xa0, 0x22, 0xf0, 0x83, 0x35, 0x10, 0xea, - 0x60, 0x90, 0x21, 0x10, 0x89, 0x33, 0x99, 0x25, 0xc0, 0x83, 0xf1, 0x86, - 0x36, 0xc1, 0x13, 0x51, 0xa1, 0x60, 0x0c, 0x32, 0x94, 0xc4, 0x8e, 0x90, - 0xc9, 0x1c, 0x83, 0x8d, 0x08, 0xad, 0x32, 0xc8, 0x10, 0xdc, 0xc8, 0x99, - 0x58, 0x30, 0xc8, 0x67, 0x90, 0x21, 0xc8, 0x91, 0x36, 0x19, 0x64, 0x08, - 0x54, 0xe2, 0x4d, 0x66, 0x09, 0xf0, 0x60, 0xa0, 0x24, 0x20, 0x0d, 0x0e, - 0x1e, 0xd2, 0x40, 0xb2, 0x03, 0xe1, 0x0e, 0x2c, 0xc0, 0x13, 0xf9, 0x64, - 0x10, 0x0e, 0x04, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x77, 0xb0, 0x0e, - 0xff, 0x5c, 0xdf, 0x20, 0x31, 0x89, 0xcd, 0x43, 0x4d, 0x9c, 0xb3, 0x38, - 0x51, 0x57, 0xd9, 0x7f, 0x51, 0xac, 0x6e, 0x5d, 0x9b, 0x6d, 0x29, 0x38, - 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xf6, 0xb2, 0xfb, 0x76, 0x84, 0xe0, 0x0c, - 0xc4, 0x99, 0x33, 0xc4, 0x04, 0x2c, 0xfd, 0x44, 0x5c, 0x13, 0x15, 0x11, - 0xf6, 0x20, 0x16, 0xe5, 0xc9, 0xde, 0xbf, 0x0e, 0x08, 0x02, 0x21, 0x49, - 0x1e, 0xed, 0x55, 0x9e, 0xc7, 0xea, 0xff, 0xc9, 0xde, 0xff, 0x2e, 0x01, - 0xcc, 0xb3, 0x10, 0x91, 0xe7, 0x13, 0x17, 0x32, 0x01, 0x01, 0x31, 0x00, - 0x00, 0x21, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, 0x98, 0x85, 0x03, 0x17, - 0x90, 0x5f, 0xd8, 0x72, 0x9c, 0x42, 0x00, 0x0e, 0x07, 0x2e, 0x20, 0xbf, - 0xb0, 0xe5, 0x60, 0x85, 0x20, 0x1c, 0x0e, 0x5c, 0x40, 0x7e, 0x61, 0xcb, - 0xf1, 0x0b, 0x81, 0x38, 0x1c, 0xb8, 0x80, 0xfc, 0xc2, 0x96, 0x83, 0x1c, - 0x82, 0x71, 0x38, 0x70, 0x01, 0xf9, 0x85, 0x2d, 0x87, 0x39, 0x04, 0xe4, - 0x70, 0xe0, 0x02, 0xf2, 0x0b, 0x5b, 0x8e, 0x94, 0x08, 0xca, 0xe1, 0xc0, - 0x05, 0xe4, 0x17, 0xb6, 0x1c, 0x2b, 0x11, 0x98, 0xc3, 0x81, 0x0b, 0xc8, - 0x2f, 0x6c, 0x39, 0x40, 0x23, 0x28, 0x87, 0x03, 0x17, 0x90, 0x5f, 0xd8, - 0x72, 0x88, 0x46, 0x60, 0x0e, 0x07, 0x2e, 0x20, 0xbf, 0xb0, 0xe5, 0xe0, - 0x8f, 0xa0, 0x1c, 0x0e, 0x5c, 0x40, 0x7e, 0x61, 0xcb, 0xe1, 0x1f, 0x81, - 0x39, 0x1c, 0xb8, 0x80, 0xfc, 0xc2, 0x96, 0x03, 0x4e, 0x02, 0x73, 0x38, - 0x70, 0x01, 0xf9, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x71, 0x20, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x20, 0xb1, + 0x5d, 0xf9, 0xb3, 0xce, 0x82, 0x0c, 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34, + 0x13, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x00, 0xd4, 0x73, 0x10, 0x41, 0x10, 0x68, 0x84, 0x65, 0x30, 0x03, 0x40, + 0x3c, 0x03, 0x40, 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x00, 0x00, + 0x00, 0xe3, 0x0d, 0x06, 0x44, 0x50, 0x30, 0xe6, 0x18, 0x88, 0xc0, 0x1b, + 0x64, 0x08, 0x0a, 0x64, 0x8e, 0x21, 0x28, 0x10, 0x0b, 0x18, 0xf9, 0x64, + 0x10, 0x10, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5b, 0x8a, 0x20, + 0xe0, 0x83, 0x23, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0xb0, 0x11, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, - 0xde, 0x21, 0x0c, 0x00, 0x00, 0x69, 0x04, 0x00, 0x00, 0x0b, 0x82, 0x20, + 0x00, 0x88, 0x18, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, + 0xde, 0x21, 0x0c, 0x00, 0x00, 0x1f, 0x06, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, @@ -1731,7 +896,7 @@ const unsigned char sdl_metallib[] = { 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, - 0x00, 0x8b, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, + 0x00, 0xef, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, @@ -1768,224 +933,240 @@ const unsigned char sdl_metallib[] = { 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0xc3, 0x26, 0x10, 0xc0, 0x02, 0x54, 0x43, 0x38, 0xa4, 0x83, 0x3c, 0xb4, 0x81, 0x38, 0xd4, 0x83, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0xb8, 0xc3, 0x3b, 0xb4, 0x41, - 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00, 0x1b, 0xb6, 0xa1, 0x00, - 0x16, 0xa0, 0x1a, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, - 0xcc, 0xc1, 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d, - 0xc2, 0x81, 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0xd8, 0x60, 0x10, 0x06, - 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0x40, 0x80, 0x05, 0xa8, 0x36, 0x18, 0xc6, - 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50, 0x1b, 0x90, 0xe3, 0xff, - 0xff, 0xff, 0xff, 0x07, 0x80, 0x01, 0x24, 0xa0, 0xda, 0x60, 0x20, 0x01, - 0xb0, 0x00, 0xd5, 0x06, 0x23, 0x11, 0x80, 0x05, 0xa8, 0x36, 0x20, 0xca, - 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x03, 0x48, 0x40, 0xb5, 0xc1, 0x58, - 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x24, 0x80, 0x02, 0x49, 0x18, 0x00, - 0x00, 0x05, 0x00, 0x00, 0x00, 0x13, 0x8a, 0x40, 0x18, 0x88, 0x62, 0x42, - 0x60, 0x4c, 0x18, 0x0e, 0x24, 0x99, 0x30, 0x28, 0x48, 0x32, 0x21, 0x58, - 0x00, 0x89, 0x20, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, - 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, - 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, - 0x4c, 0x10, 0xa8, 0xc1, 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, - 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, - 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18, 0x80, 0x1c, 0x28, 0x66, - 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6, 0x81, 0x1e, 0xdc, 0xa0, - 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4, 0x40, 0x0f, 0xda, 0x21, - 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50, 0x60, 0x1c, 0x24, 0x4d, - 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21, 0x38, 0x03, 0x81, 0x84, - 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, - 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80, - 0x41, 0x04, 0x25, 0x38, 0x4d, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x7f, 0x22, - 0xae, 0x89, 0x8a, 0x88, 0xdf, 0x1e, 0x7e, 0x20, 0x8a, 0x00, 0xec, 0x9f, - 0xc6, 0x08, 0x80, 0x41, 0x04, 0x26, 0xb8, 0x48, 0x9a, 0x22, 0x4a, 0x98, - 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00, 0x06, - 0x11, 0x1c, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44, 0xb2, 0x34, 0x0f, 0x41, - 0x65, 0x00, 0x00, 0x80, 0xa4, 0x22, 0x00, 0x00, 0x51, 0x65, 0x00, 0x8a, - 0x82, 0xac, 0x39, 0x02, 0x30, 0x98, 0x23, 0x08, 0x86, 0x11, 0x04, 0xac, - 0x24, 0x41, 0xf3, 0x08, 0x58, 0xa6, 0x65, 0x00, 0x6d, 0x05, 0x09, 0x96, - 0x47, 0xc8, 0xb4, 0x0c, 0xa0, 0x6e, 0x20, 0x20, 0x05, 0xb0, 0x61, 0x84, - 0x01, 0x1b, 0x44, 0x08, 0x84, 0x39, 0x02, 0x50, 0x18, 0x44, 0x38, 0x84, - 0x41, 0x84, 0x42, 0x18, 0x44, 0x00, 0x84, 0x29, 0x80, 0x11, 0x80, 0x61, - 0x04, 0x02, 0x03, 0x00, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, - 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, - 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, - 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, - 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, - 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, - 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, - 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, - 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, - 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, - 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, - 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, - 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, - 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, - 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, - 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, - 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, - 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, - 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, - 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, - 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, - 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, - 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, - 0x20, 0x07, 0x43, 0x98, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x21, 0xcc, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x10, 0xa6, 0x02, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, - 0x73, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xe1, - 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x78, 0x40, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x81, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, - 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xc2, 0x46, 0x00, 0x4a, - 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80, 0x0a, 0x30, 0xa0, 0x0c, - 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, - 0x68, 0x2c, 0x9c, 0x11, 0x80, 0xc2, 0x28, 0x84, 0x82, 0x28, 0x90, 0x42, - 0x29, 0x18, 0x02, 0xc7, 0x12, 0x22, 0x01, 0x00, 0x00, 0x79, 0x18, 0x00, - 0x00, 0xa2, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, - 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0xa6, - 0x7c, 0x00, 0x18, 0x7c, 0x54, 0xee, 0xc6, 0xd0, 0xc2, 0xe4, 0xbe, 0xe6, - 0xd2, 0xf4, 0xca, 0x86, 0x18, 0xd8, 0xf1, 0x09, 0x18, 0xc2, 0x37, 0x08, - 0x82, 0x83, 0x63, 0x2b, 0x03, 0x69, 0x2b, 0xa3, 0x0b, 0x63, 0x03, 0xb1, - 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x03, 0x99, 0x91, 0x81, 0x91, 0x99, - 0x71, 0xc9, 0xc1, 0x01, 0x41, 0x69, 0x2b, 0xa3, 0x0b, 0x63, 0x33, 0x2b, - 0x6b, 0x99, 0x91, 0x81, 0x91, 0x99, 0x71, 0xc9, 0xc1, 0x49, 0x19, 0x22, - 0x7c, 0xc4, 0x10, 0x03, 0x3b, 0xb0, 0x05, 0x33, 0x58, 0x34, 0x95, 0xd1, - 0x85, 0xb1, 0x0d, 0x41, 0xbe, 0x03, 0x3b, 0xb0, 0x03, 0x33, 0xb8, 0x85, - 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x90, - 0x95, 0xb9, 0xbd, 0xc9, 0xb5, 0xcd, 0x7d, 0x91, 0xa5, 0xcd, 0x85, 0x89, - 0xb1, 0x95, 0x0d, 0x11, 0xbe, 0x84, 0x5c, 0x58, 0x9a, 0x9c, 0xcb, 0xd8, - 0x5b, 0x1b, 0x5c, 0x1a, 0x5b, 0x99, 0x8b, 0x59, 0xd8, 0x1c, 0xdd, 0x57, - 0x5b, 0x18, 0x1d, 0xda, 0x57, 0x99, 0x5b, 0x98, 0x18, 0x5b, 0xd9, 0x10, - 0xe1, 0x5b, 0x48, 0x06, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, - 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0xaf, 0x61, 0x14, 0x96, 0x26, 0xe7, - 0x22, 0x57, 0xe6, 0x46, 0x56, 0x26, 0xf7, 0x45, 0x17, 0x26, 0x77, 0x56, - 0x46, 0xc7, 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, 0xec, 0x8b, 0x2e, - 0x0f, 0xae, 0xec, 0xcb, 0x2d, 0xac, 0xad, 0x8c, 0x86, 0x19, 0xdb, 0x5b, - 0x18, 0x1d, 0xcd, 0x10, 0xe4, 0x7b, 0x30, 0xe3, 0x83, 0xbe, 0x68, 0x88, - 0xf0, 0x49, 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xde, 0xe6, 0xd2, 0xe8, - 0xd2, 0xde, 0xdc, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0x95, 0xb9, 0xd1, - 0x95, 0xc9, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x71, 0x7b, 0xfb, 0x82, 0x2b, - 0x93, 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3, 0x2b, 0x23, 0x13, 0x96, - 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0xe5, 0x16, 0xd6, 0x56, 0x46, 0x04, - 0xee, 0x6d, 0x2e, 0x8d, 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0x84, 0x19, 0x1f, - 0xf5, 0x55, 0x9f, 0xf5, 0x41, 0x5f, 0xf4, 0x5d, 0x1f, 0x46, 0x29, 0x2c, - 0x4d, 0xce, 0xc5, 0x4c, 0x2e, 0xec, 0xac, 0xad, 0xcc, 0x8d, 0xee, 0x2b, - 0xcd, 0x0d, 0xae, 0x8e, 0x8e, 0xd6, 0x59, 0x99, 0x5b, 0x99, 0x5c, 0x18, - 0x5d, 0x19, 0x19, 0x4a, 0xcd, 0xd8, 0x1b, 0xdb, 0x9b, 0x1c, 0x91, 0x1d, - 0xcd, 0x97, 0x59, 0x0a, 0x9f, 0xb0, 0x34, 0x39, 0x17, 0xb8, 0x32, 0xb9, - 0x39, 0xb8, 0xb2, 0x31, 0xba, 0x34, 0xbb, 0x32, 0x16, 0x63, 0x6f, 0x6c, - 0x6f, 0x72, 0x43, 0x24, 0xec, 0xf8, 0xb4, 0x6f, 0xfb, 0xaa, 0x8f, 0xfb, - 0xa0, 0x2f, 0xfa, 0xae, 0xaf, 0x63, 0x76, 0x56, 0xe6, 0x56, 0x26, 0x17, - 0x46, 0x57, 0x46, 0x86, 0x82, 0x43, 0x57, 0x86, 0x37, 0xf6, 0xf6, 0x26, - 0x47, 0x46, 0x64, 0x27, 0xf3, 0x65, 0x96, 0x42, 0xc3, 0x8c, 0xed, 0x2d, - 0x8c, 0x4e, 0x86, 0x08, 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b, 0x1c, 0xd9, - 0x10, 0x09, 0x53, 0x3e, 0xed, 0xfb, 0xbe, 0xea, 0xe3, 0x3e, 0xe8, 0x03, - 0x83, 0xef, 0xfa, 0xc2, 0x80, 0x4a, 0x58, 0x9a, 0x9c, 0x8b, 0x58, 0x9d, - 0x99, 0x59, 0x99, 0x1c, 0x9f, 0xb0, 0x34, 0x39, 0x17, 0xb1, 0x3a, 0x33, - 0xb3, 0x32, 0xb9, 0xaf, 0xb9, 0x34, 0xbd, 0x32, 0x4a, 0x61, 0x69, 0x72, - 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x44, 0xc2, 0xd2, 0xe4, 0x5c, 0xe4, 0xca, 0xc2, 0xc8, - 0x48, 0x85, 0xa5, 0xc9, 0xb9, 0xcc, 0xd1, 0xc9, 0xd5, 0x8d, 0xd1, 0x7d, - 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0xa5, 0xb9, 0x99, 0xbd, 0xb1, 0x30, 0x63, - 0x7b, 0x0b, 0xa3, 0x23, 0x33, 0x37, 0x26, 0x75, 0x24, 0xf4, 0xf5, 0x56, - 0x47, 0x07, 0x57, 0x47, 0x47, 0x86, 0xae, 0x0c, 0x8f, 0xae, 0x4e, 0xae, - 0xec, 0x8b, 0x2e, 0x0f, 0xae, 0x8c, 0x4a, 0x9a, 0x1b, 0x5c, 0x1d, 0xdd, - 0x17, 0x5d, 0x1e, 0x5c, 0x19, 0x97, 0xb1, 0x37, 0xb6, 0x37, 0xb9, 0xaf, - 0xb9, 0xb1, 0x30, 0xb6, 0x32, 0x3a, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, - 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x7c, 0xe8, 0xde, 0xdc, - 0xca, 0xda, 0xc2, 0xe0, 0xbe, 0xcc, 0xc2, 0xc6, 0xe8, 0xde, 0xe4, 0x62, - 0xf8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0x99, 0x85, 0x8d, - 0xd1, 0xbd, 0xc9, 0xc9, 0xf0, 0x99, 0x23, 0x93, 0xfb, 0xba, 0x43, 0x4b, - 0xa3, 0x2b, 0xfb, 0x82, 0x7b, 0x4b, 0x73, 0xa3, 0x1b, 0x02, 0x0b, 0x98, - 0x81, 0x21, 0x98, 0xf1, 0xa1, 0xc1, 0x97, 0x06, 0x18, 0x82, 0x21, 0x98, - 0xf1, 0xa1, 0xc1, 0xa7, 0x06, 0xd8, 0x82, 0x21, 0x98, 0xf1, 0xa1, 0xc1, - 0xb7, 0x06, 0xd8, 0x83, 0x21, 0x98, 0xf1, 0xa1, 0xc1, 0xc7, 0x06, 0x58, - 0x82, 0x21, 0x98, 0xf1, 0xa1, 0xc1, 0xd7, 0x06, 0x18, 0x84, 0x21, 0x98, - 0xf1, 0xa1, 0xc1, 0xe7, 0x06, 0x58, 0x84, 0x21, 0x98, 0xf1, 0xa1, 0xc1, - 0xf7, 0x06, 0x98, 0x84, 0x21, 0x98, 0xf1, 0xa1, 0xc1, 0x07, 0x07, 0x8c, - 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, - 0xbe, 0xe6, 0xd2, 0xf4, 0xca, 0x78, 0x85, 0xa5, 0xc9, 0xb9, 0x84, 0xc9, - 0x9d, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0x85, 0xb1, 0xa5, 0x9d, 0xb9, - 0x7d, 0xcd, 0xa5, 0xe9, 0x95, 0xf1, 0x99, 0x42, 0x0b, 0x23, 0x2b, 0x93, - 0x1b, 0x7a, 0x73, 0x9b, 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0x63, 0x30, 0x36, - 0x84, 0x0c, 0x30, 0xe7, 0x1b, 0x83, 0x8f, 0x0c, 0x30, 0xe6, 0x2b, 0x03, - 0xcc, 0xc0, 0x8e, 0xcf, 0x0c, 0xbe, 0x33, 0xf8, 0xe2, 0xe0, 0x93, 0x03, - 0x8c, 0xf9, 0xe6, 0x00, 0x43, 0x3e, 0xe8, 0xa3, 0x83, 0xef, 0xfa, 0xea, - 0x80, 0x86, 0x19, 0xdb, 0x5b, 0x18, 0xdd, 0x0c, 0x8d, 0x37, 0x33, 0xb3, - 0xb9, 0x32, 0x3a, 0x22, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, - 0x34, 0xda, 0xc2, 0xe8, 0xe4, 0xd2, 0xf0, 0x86, 0x50, 0x98, 0x81, 0x25, - 0x98, 0xf1, 0xdd, 0xc1, 0x87, 0x07, 0x58, 0x82, 0x4d, 0x98, 0xf1, 0xe5, - 0xc1, 0xa7, 0x07, 0x4c, 0xb2, 0xaa, 0xac, 0x88, 0xca, 0xc6, 0xde, 0xc8, - 0xca, 0x68, 0x90, 0x95, 0x8d, 0xbd, 0x91, 0x95, 0x0d, 0x21, 0x03, 0x0c, - 0xf9, 0xc6, 0xe0, 0x23, 0x03, 0xac, 0xf9, 0xca, 0x00, 0x3b, 0xb0, 0xe3, - 0x33, 0x83, 0xef, 0x0c, 0xbe, 0x3d, 0xf8, 0xe4, 0x00, 0x6b, 0xbe, 0x39, - 0xc0, 0x92, 0x0f, 0xfa, 0xf8, 0xe0, 0xbb, 0xbe, 0x3e, 0xe0, 0x12, 0x96, - 0x26, 0xe7, 0x42, 0x57, 0x86, 0x47, 0x57, 0x27, 0x57, 0x46, 0x25, 0x2c, - 0x4d, 0xce, 0x65, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x8c, 0x18, 0x5d, 0x19, - 0x1e, 0x5d, 0x9d, 0x5c, 0x99, 0x0c, 0x19, 0x8f, 0x19, 0xdb, 0x5b, 0x18, - 0x1d, 0x0b, 0xc8, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0x0f, 0x09, 0xba, - 0x32, 0xbc, 0xac, 0x21, 0x14, 0x46, 0x7d, 0x7f, 0xf0, 0x95, 0x01, 0x66, - 0x60, 0xc7, 0x07, 0x0a, 0x1f, 0xf4, 0x85, 0xc2, 0x77, 0x7d, 0xa2, 0x40, - 0x8f, 0xae, 0x0c, 0x8f, 0xae, 0x4e, 0xae, 0x4c, 0x86, 0xec, 0x2b, 0x4c, - 0x4e, 0x2e, 0x2c, 0x8f, 0xc7, 0x8c, 0xed, 0x2d, 0x8c, 0x8e, 0x05, 0x64, - 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0xcc, 0x87, 0x05, 0x5d, 0x19, 0x5e, 0x95, - 0xd5, 0x10, 0x0a, 0xab, 0xbe, 0x3f, 0xf8, 0xca, 0x00, 0x3b, 0xb0, 0xe3, - 0x03, 0x85, 0x0f, 0xfa, 0x48, 0xe1, 0xbb, 0xbe, 0x52, 0xe0, 0x12, 0x96, - 0x26, 0xe7, 0x32, 0x17, 0xd6, 0x06, 0xc7, 0x56, 0x26, 0xc7, 0x63, 0x2e, - 0xac, 0x0d, 0x8e, 0xad, 0x4c, 0x8e, 0xc1, 0xdc, 0x10, 0x09, 0xb3, 0xbe, - 0x53, 0xf8, 0xca, 0x00, 0x33, 0xb0, 0xe3, 0x83, 0x3e, 0x54, 0xf8, 0xae, - 0x2f, 0x15, 0x86, 0x40, 0x5f, 0xf6, 0x79, 0x9f, 0x18, 0x7c, 0x76, 0xf0, - 0xf9, 0xc1, 0x37, 0x0a, 0x9f, 0x29, 0x7c, 0xaa, 0x30, 0xc4, 0x88, 0x80, - 0x6f, 0xfa, 0x56, 0x81, 0x62, 0x10, 0x96, 0x26, 0xd7, 0x12, 0xc6, 0x96, - 0x16, 0x36, 0xd7, 0x32, 0x37, 0xf6, 0x06, 0x57, 0x36, 0x87, 0x32, 0x45, - 0xc4, 0xf4, 0x95, 0x55, 0x65, 0xf5, 0x65, 0x26, 0x17, 0x76, 0xd6, 0x56, - 0xe6, 0x46, 0x97, 0x32, 0x84, 0xf8, 0x5c, 0xe1, 0x6b, 0x05, 0x62, 0x61, - 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x43, - 0x8c, 0x0f, 0x16, 0x3e, 0x57, 0xf8, 0x5e, 0x81, 0x58, 0x58, 0x9a, 0x5c, - 0x4b, 0x18, 0x5b, 0x5a, 0xd8, 0x5c, 0xcb, 0xdc, 0xd8, 0x1b, 0x5c, 0x59, - 0xcb, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0xdc, 0xdc, 0x10, 0xe3, 0x93, - 0x85, 0xcf, 0x15, 0xbe, 0x58, 0x18, 0x42, 0x7c, 0xb0, 0xf0, 0xc9, 0x02, - 0xad, 0xb0, 0x34, 0xb9, 0x96, 0x30, 0xb6, 0xb4, 0xb0, 0xb9, 0x96, 0xb9, - 0xb1, 0x37, 0xb8, 0xb2, 0x96, 0x30, 0xb9, 0x33, 0x94, 0x99, 0x94, 0x21, - 0xc6, 0x57, 0x0b, 0x9f, 0x2b, 0x7c, 0xb4, 0x40, 0x2b, 0x2c, 0x4d, 0xae, - 0x25, 0x8c, 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, - 0x25, 0x4c, 0xee, 0x0c, 0x85, 0x26, 0x65, 0x88, 0xf1, 0xdd, 0xc2, 0xe7, - 0x0a, 0x9f, 0x2d, 0x0c, 0x21, 0xbe, 0x5a, 0xf8, 0x6e, 0x61, 0x88, 0xf0, - 0xdd, 0xc2, 0x10, 0xe3, 0xab, 0x85, 0x0f, 0x16, 0x3e, 0x59, 0x60, 0xf5, - 0xa5, 0x45, 0x35, 0x15, 0x53, 0x33, 0x85, 0x16, 0x46, 0x56, 0x26, 0x37, - 0xf4, 0xe6, 0x36, 0x47, 0x17, 0xe6, 0x46, 0x37, 0xc7, 0xe7, 0xad, 0xcd, - 0x2d, 0x0d, 0xee, 0x8d, 0xae, 0xcc, 0x8d, 0x0e, 0x64, 0x0c, 0x2d, 0x4c, - 0x8e, 0xcf, 0x54, 0x5a, 0x1b, 0x1c, 0x5b, 0x19, 0xc8, 0xd0, 0xca, 0x0a, - 0x08, 0x95, 0x50, 0x50, 0xd0, 0x10, 0xe1, 0xeb, 0x85, 0x21, 0xc6, 0xc7, - 0x0b, 0x9f, 0x2f, 0x8c, 0x01, 0x36, 0xc4, 0xf8, 0xd0, 0xe0, 0xfb, 0x85, - 0x31, 0xc0, 0x86, 0x88, 0xc1, 0xb7, 0x0b, 0x1f, 0x38, 0x8c, 0x01, 0xf6, - 0x81, 0xc3, 0x18, 0x68, 0x1f, 0x38, 0x8c, 0xc1, 0xf6, 0x81, 0xc3, 0x18, - 0x64, 0x1f, 0x38, 0x8c, 0x01, 0xf7, 0x81, 0xc3, 0x18, 0x74, 0x1f, 0x38, - 0x8c, 0x81, 0xf7, 0x81, 0xc3, 0x18, 0x5c, 0x43, 0x8c, 0x2f, 0x1c, 0x3e, - 0x70, 0x18, 0x03, 0x6c, 0x88, 0xf0, 0xd5, 0xc2, 0x10, 0xe3, 0xbb, 0x85, - 0x0f, 0x16, 0x3e, 0x59, 0x18, 0x62, 0x7c, 0xe1, 0xf0, 0x81, 0xc3, 0x18, - 0x64, 0x23, 0x22, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, - 0x77, 0x20, 0x87, 0x7a, 0x60, 0x87, 0x72, 0x70, 0x03, 0x73, 0x60, 0x87, - 0x70, 0x38, 0x87, 0x79, 0x98, 0x22, 0x04, 0xc3, 0x08, 0x85, 0x1d, 0xd8, - 0xc1, 0x1e, 0xda, 0xc1, 0x0d, 0xd2, 0x81, 0x1c, 0xca, 0xc1, 0x1d, 0xe8, - 0x61, 0x4a, 0x50, 0x8c, 0x58, 0xc2, 0x21, 0x1d, 0xe4, 0xc1, 0x0d, 0xec, - 0xa1, 0x1c, 0xe4, 0x61, 0x1e, 0xd2, 0xe1, 0x1d, 0xdc, 0x61, 0x4a, 0x60, - 0x8c, 0xa0, 0xc2, 0x21, 0x1d, 0xe4, 0xc1, 0x0d, 0xd8, 0x21, 0x1c, 0xdc, - 0xe1, 0x1c, 0xea, 0x21, 0x1c, 0xce, 0xa1, 0x1c, 0x7e, 0xc1, 0x1e, 0xca, - 0x41, 0x1e, 0xe6, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0xa6, 0x04, 0xc8, 0x88, - 0x29, 0x1c, 0xd2, 0x41, 0x1e, 0xdc, 0x60, 0x1c, 0xde, 0xa1, 0x1d, 0xe0, - 0x21, 0x1d, 0xd8, 0xa1, 0x1c, 0x7e, 0xe1, 0x1d, 0xe0, 0x81, 0x1e, 0xd2, - 0xe1, 0x1d, 0xdc, 0x61, 0x1e, 0xa6, 0x0c, 0x0a, 0xe3, 0x8c, 0x60, 0xc2, - 0x21, 0x1d, 0xe4, 0xc1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xe1, 0x1c, 0xda, - 0xa1, 0x1c, 0xdc, 0x81, 0x1e, 0xa6, 0x04, 0xac, 0x00, 0x79, 0x18, 0x00, + 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00, 0x1b, 0x8c, 0xa1, 0x00, + 0x16, 0xa0, 0xda, 0x60, 0x10, 0x06, 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0x83, 0x8f, 0x18, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00, 0x0f, 0xf0, + 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0, 0x0e, 0xe3, + 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, + 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b, 0xa4, 0x83, + 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b, 0xb4, 0x81, + 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b, 0xdc, 0x43, + 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03, 0x90, 0x07, 0x76, 0x00, 0x0c, 0xee, + 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5, 0x90, 0x0e, 0xec, 0x40, 0x0f, 0xe9, + 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x60, 0x0e, 0xf2, + 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0xef, 0x90, 0x0e, 0xee, + 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d, 0x50, 0x0e, 0xec, 0x90, 0x0e, 0xed, + 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, + 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94, 0x43, 0x1b, 0xc0, 0xc3, + 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0x94, 0x03, + 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81, 0x3b, 0xbc, 0x83, 0x3b, 0xb4, 0x01, + 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, + 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x90, 0x0e, 0xee, 0x60, 0x0e, 0xf3, + 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, + 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, + 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3, 0x3c, 0xb4, 0x81, 0x39, 0xc0, 0x43, + 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f, 0xf5, + 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xe7, + 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d, 0xa0, 0x0f, 0xe5, 0x20, 0x0f, 0xef, + 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, 0x0e, 0xf4, + 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3, + 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43, 0x38, 0xc0, 0x03, 0x3c, 0xa4, 0x83, + 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, + 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0x31, 0x0f, 0xf4, 0x10, 0x0e, 0xe3, + 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2, 0xf0, 0x0e, 0xf4, 0x50, 0x0e, 0xe3, + 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d, 0x20, 0x0e, 0xf5, 0x60, 0x0e, 0xe6, + 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xfa, 0x50, 0x0e, 0x00, + 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3, 0x3c, 0x84, 0x83, 0x39, 0x94, 0x43, + 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, + 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x6c, 0x40, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0x00, 0x06, 0x90, 0x80, 0x6a, 0x83, 0x81, 0x04, 0xc0, + 0x02, 0x54, 0x1b, 0x8c, 0x44, 0x00, 0x16, 0xa0, 0xda, 0x80, 0x28, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x0c, 0x20, 0x01, 0xd5, 0x06, 0x63, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0xc3, 0xc4, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x28, 0x80, 0x34, 0xb8, 0xc3, 0x3b, 0xb4, 0x81, + 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03, 0x3d, 0xa4, 0x83, 0x3b, 0xcc, 0x03, + 0x00, 0x49, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40, + 0x18, 0x88, 0x09, 0x41, 0x31, 0x21, 0x30, 0x26, 0x0c, 0x07, 0x92, 0x4c, + 0x18, 0x14, 0x24, 0x99, 0x10, 0x2c, 0x13, 0x02, 0x06, 0x89, 0x20, 0x00, + 0x00, 0x32, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, + 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, + 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0x9c, 0xc1, + 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, + 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, + 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, + 0x41, 0x38, 0x4a, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89, + 0x8a, 0x88, 0xdf, 0x1e, 0xfe, 0x69, 0x8c, 0x00, 0x18, 0x44, 0x28, 0x82, + 0x8b, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x25, 0x80, 0x79, 0x16, 0x22, + 0xfa, 0xa7, 0x31, 0x02, 0x60, 0x10, 0xe1, 0x10, 0xca, 0x11, 0x04, 0x81, + 0x40, 0x18, 0x08, 0x25, 0xc3, 0x08, 0x03, 0x50, 0x88, 0x65, 0x59, 0x16, + 0x62, 0xca, 0x00, 0x00, 0x00, 0x39, 0x45, 0x00, 0x00, 0x82, 0xca, 0x00, + 0x2c, 0x0b, 0x49, 0xc5, 0x58, 0x16, 0x00, 0x00, 0x00, 0xa2, 0xca, 0xb0, + 0x2c, 0x0b, 0x59, 0x45, 0x58, 0x16, 0xc2, 0xe6, 0x08, 0x82, 0x39, 0x02, + 0x30, 0x18, 0x46, 0x10, 0xb6, 0x82, 0x04, 0x06, 0x22, 0x68, 0x9c, 0x06, + 0x50, 0x37, 0x10, 0x90, 0x02, 0xdb, 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x00, + 0xc2, 0x14, 0xc0, 0x08, 0xc0, 0x30, 0xc2, 0xb0, 0x0d, 0x23, 0x10, 0x1b, + 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, + 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, + 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51, + 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80, + 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0, + 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, + 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60, + 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, + 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0, + 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, + 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, + 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90, + 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, + 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, + 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, + 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, + 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60, + 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, + 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, + 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10, + 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, + 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80, + 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18, + 0x05, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0x4c, 0x03, + 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, 0xe6, 0x01, 0x02, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0x13, 0x01, 0x01, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0x99, 0x80, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x54, 0x08, 0x30, 0x0c, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0c, 0x61, 0x1e, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x86, 0x30, 0x17, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x43, 0x98, 0x0c, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x21, 0xcc, 0x05, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, + 0xc6, 0x03, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0b, 0x04, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, + 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xda, 0x46, 0x00, 0x0a, + 0xa1, 0x04, 0x8a, 0xa0, 0x20, 0x0a, 0xa8, 0x0c, 0x0a, 0xa3, 0x40, 0x0a, + 0xa5, 0x60, 0x0a, 0xa7, 0x14, 0x28, 0x2c, 0x9c, 0x11, 0x80, 0x42, 0x28, + 0x88, 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x02, 0xc7, 0x12, 0x24, 0x01, + 0x00, 0x79, 0x18, 0x00, 0x00, 0x77, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, + 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, + 0xb7, 0x21, 0xc6, 0xe6, 0x7c, 0x00, 0x18, 0x80, 0x01, 0x95, 0xbb, 0x31, + 0xb4, 0x30, 0xb9, 0xaf, 0xb9, 0x34, 0xbd, 0xb2, 0x21, 0xc6, 0xd6, 0x7c, + 0xc2, 0xc6, 0x30, 0x0e, 0x82, 0xe0, 0xe0, 0xd8, 0xca, 0x40, 0xda, 0xca, + 0xe8, 0xc2, 0xd8, 0x40, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0x40, + 0x66, 0x64, 0x60, 0x64, 0x66, 0x5c, 0x68, 0x60, 0x68, 0x40, 0x50, 0xda, + 0xca, 0xe8, 0xc2, 0xd8, 0xcc, 0xca, 0x5a, 0x66, 0x64, 0x60, 0x64, 0x66, + 0x5c, 0x68, 0x60, 0x68, 0x52, 0x86, 0x08, 0x1f, 0x31, 0xc4, 0xd8, 0x9a, + 0xed, 0xd9, 0x16, 0x16, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x43, 0x90, 0xef, + 0xd8, 0x9a, 0xad, 0xd9, 0x16, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, + 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x2f, + 0x21, 0x17, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, + 0xe6, 0x62, 0x16, 0x36, 0x47, 0xf7, 0xd5, 0x16, 0x46, 0x87, 0xf6, 0x55, + 0xe6, 0x16, 0x26, 0xc6, 0x56, 0x36, 0x44, 0xf8, 0x16, 0x92, 0x41, 0x58, + 0x9a, 0x9c, 0xcb, 0xd8, 0x5b, 0x1b, 0x5c, 0x1a, 0x5b, 0x99, 0x8b, 0x99, + 0x5c, 0x58, 0x5b, 0x99, 0x58, 0x9d, 0x99, 0x59, 0x99, 0xdc, 0x97, 0x59, + 0x19, 0xdd, 0x18, 0xda, 0x57, 0x99, 0x5b, 0x98, 0x18, 0x5b, 0xd9, 0x10, + 0xe1, 0x6b, 0x18, 0x85, 0xa5, 0xc9, 0xb9, 0xc8, 0x95, 0xb9, 0x91, 0x95, + 0xc9, 0x7d, 0xd1, 0x85, 0xc9, 0x9d, 0x95, 0xd1, 0x31, 0x0a, 0x4b, 0x93, + 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x72, 0x0b, + 0x6b, 0x2b, 0xa3, 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x33, 0x04, 0xf9, + 0x9e, 0x6d, 0xf9, 0xa0, 0x2f, 0x1a, 0x22, 0x7c, 0x12, 0x99, 0xb0, 0x34, + 0x39, 0x17, 0xb8, 0xb7, 0xb9, 0x34, 0xba, 0xb4, 0x37, 0x37, 0x2a, 0x61, + 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x94, 0xc2, 0xd2, + 0xe4, 0x5c, 0xdc, 0xde, 0xbe, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca, 0xc6, + 0xe8, 0xd2, 0xec, 0xca, 0xc8, 0x84, 0xa5, 0xc9, 0xb9, 0x84, 0xc9, 0x9d, + 0x7d, 0xb9, 0x85, 0xb5, 0x95, 0x11, 0x81, 0x7b, 0x9b, 0x4b, 0xa3, 0x4b, + 0x7b, 0x73, 0x1b, 0x02, 0x6d, 0xcb, 0x47, 0x7d, 0xd5, 0x67, 0x7d, 0xd0, + 0x17, 0x7d, 0xd7, 0x87, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x31, 0x93, 0x0b, + 0x3b, 0x6b, 0x2b, 0x73, 0xa3, 0xfb, 0x4a, 0x73, 0x83, 0xab, 0xa3, 0xa3, + 0x75, 0x56, 0xe6, 0x56, 0x26, 0x17, 0x46, 0x57, 0x46, 0x86, 0x52, 0x33, + 0xf6, 0xc6, 0xf6, 0x26, 0x47, 0x64, 0x47, 0xf3, 0x65, 0x96, 0xc2, 0x27, + 0x2c, 0x4d, 0xce, 0x05, 0xae, 0x4c, 0x6e, 0x0e, 0xae, 0x6c, 0x8c, 0x2e, + 0xcd, 0xae, 0x8c, 0xc5, 0xd8, 0x1b, 0xdb, 0x9b, 0xdc, 0x10, 0x69, 0x6b, + 0x3e, 0xed, 0xdb, 0xbe, 0xea, 0xe3, 0x3e, 0xe8, 0x8b, 0xbe, 0xeb, 0xeb, + 0x98, 0x9d, 0x95, 0xb9, 0x95, 0xc9, 0x85, 0xd1, 0x95, 0x91, 0xa1, 0xe0, + 0xd0, 0x95, 0xe1, 0x8d, 0xbd, 0xbd, 0xc9, 0x91, 0x11, 0xd9, 0xc9, 0x7c, + 0x99, 0xa5, 0xd0, 0x30, 0x63, 0x7b, 0x0b, 0xa3, 0x93, 0x21, 0x42, 0x57, + 0x86, 0x37, 0xf6, 0xf6, 0x26, 0x47, 0x36, 0x44, 0xda, 0x9c, 0x4f, 0xfb, + 0xbe, 0xaf, 0xfa, 0xb8, 0x0f, 0xfa, 0xc0, 0xe0, 0xbb, 0xbe, 0x30, 0xa0, + 0x12, 0x96, 0x26, 0xe7, 0x22, 0x56, 0x67, 0x66, 0x56, 0x26, 0xc7, 0x27, + 0x2c, 0x4d, 0xce, 0x45, 0xac, 0xce, 0xcc, 0xac, 0x4c, 0xee, 0x6b, 0x2e, + 0x4d, 0xaf, 0x8c, 0x52, 0x58, 0x9a, 0x9c, 0x0b, 0xdb, 0xdb, 0x58, 0x18, + 0x5d, 0xda, 0x9b, 0xdb, 0x57, 0x9a, 0x1b, 0x59, 0x19, 0x1e, 0x91, 0xb0, + 0x34, 0x39, 0x17, 0xb9, 0xb2, 0x30, 0x32, 0x52, 0x61, 0x69, 0x72, 0x2e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0xcc, 0xd8, 0xde, 0xc2, 0xe8, 0xc8, 0xcc, + 0x8d, 0x49, 0x1d, 0x09, 0x7d, 0xbd, 0xd5, 0xd1, 0xc1, 0xd5, 0xd1, 0x91, + 0xa1, 0x2b, 0xc3, 0xa3, 0xab, 0x93, 0x2b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, + 0xa3, 0x92, 0xe6, 0x06, 0x57, 0x47, 0xf7, 0x45, 0x97, 0x07, 0x57, 0xc6, + 0x65, 0xec, 0x8d, 0xed, 0x4d, 0xee, 0x6b, 0x6e, 0x2c, 0x8c, 0xad, 0x8c, + 0x0e, 0xdd, 0x9b, 0x5b, 0x59, 0x5b, 0x18, 0xdc, 0x57, 0x5b, 0x19, 0x1d, + 0xda, 0x1b, 0x19, 0x1f, 0xba, 0x37, 0xb7, 0xb2, 0xb6, 0x30, 0xb8, 0x2f, + 0xb3, 0xb0, 0x31, 0xba, 0x37, 0xb9, 0x18, 0x3e, 0x74, 0x6f, 0x6e, 0x65, + 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x7c, + 0xe6, 0xc8, 0xe4, 0xbe, 0xee, 0xd0, 0xd2, 0xe8, 0xca, 0xbe, 0xe0, 0xde, + 0xd2, 0xdc, 0xe8, 0x86, 0xc0, 0xc2, 0xb6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68, + 0xf0, 0xa5, 0xc1, 0xc6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xa9, 0xc1, + 0xf6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xad, 0xc1, 0x26, 0x6d, 0xcc, + 0xb6, 0x7c, 0x68, 0xf0, 0xb1, 0xc1, 0x36, 0x6d, 0xcc, 0xb6, 0x7c, 0x68, + 0xf0, 0xb5, 0xc1, 0x46, 0x6d, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xb9, 0xc1, + 0x56, 0x6d, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xbd, 0xc1, 0x66, 0x6d, 0xcc, + 0xb6, 0x7c, 0x68, 0xf0, 0xc1, 0x01, 0xa3, 0xb0, 0x34, 0x39, 0x97, 0x30, + 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0xaf, 0xb9, 0x34, 0xbd, 0x32, + 0x5e, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x7c, 0xa6, 0xd0, 0xc2, 0xc8, 0xca, 0xe4, 0x86, 0xde, 0xdc, 0xe6, 0xe8, + 0xc2, 0xdc, 0xe8, 0xe6, 0x18, 0x8c, 0x0d, 0x21, 0x83, 0x2d, 0xfa, 0xc6, + 0xe0, 0x23, 0x83, 0x0d, 0xfa, 0xca, 0x60, 0x5b, 0xb6, 0xe6, 0x33, 0x83, + 0xef, 0x0c, 0xbe, 0x38, 0xf8, 0xe4, 0x60, 0x83, 0xbe, 0x39, 0xd8, 0x98, + 0x0f, 0xfa, 0xe8, 0xe0, 0xbb, 0xbe, 0x3a, 0xe0, 0x12, 0x96, 0x26, 0xe7, + 0x42, 0x57, 0x86, 0x47, 0x57, 0x27, 0x57, 0x46, 0x25, 0x2c, 0x4d, 0xce, + 0x65, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x8c, 0x18, 0x5d, 0x19, 0x1e, 0x5d, + 0x9d, 0x5c, 0x99, 0x0c, 0x19, 0x8f, 0x19, 0xdb, 0x5b, 0x18, 0x1d, 0x0b, + 0xc8, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0x0f, 0x07, 0xba, 0x32, 0xbc, + 0x21, 0xd4, 0xc6, 0x7c, 0x77, 0xf0, 0x95, 0xc1, 0xb6, 0x6c, 0xcd, 0x87, + 0x07, 0x1f, 0xf4, 0xe5, 0xc1, 0x77, 0x7d, 0x7a, 0xc0, 0x25, 0x2c, 0x4d, + 0xce, 0x65, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x4c, 0x8e, 0xc7, 0x5c, 0x58, + 0x1b, 0x1c, 0x5b, 0x99, 0x1c, 0x83, 0xb9, 0x21, 0xd2, 0x76, 0x7d, 0x7c, + 0xf0, 0x95, 0xc1, 0xb6, 0x6c, 0xcd, 0x07, 0x7d, 0x7d, 0xf0, 0x5d, 0x9f, + 0x1f, 0x0c, 0x61, 0xbe, 0xec, 0xf3, 0x3e, 0x31, 0xf8, 0xec, 0xe0, 0xdb, + 0x83, 0xef, 0x0f, 0x86, 0x18, 0x0a, 0xf0, 0x4d, 0x1f, 0x28, 0x70, 0x0c, + 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8, 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6, + 0xde, 0xe0, 0xca, 0xe6, 0x50, 0xa6, 0x88, 0x98, 0xbe, 0x86, 0xde, 0xe0, + 0xf2, 0xbe, 0xcc, 0xe4, 0xc2, 0xce, 0xda, 0xca, 0xdc, 0xe8, 0x52, 0x86, + 0x10, 0xdf, 0x28, 0x7c, 0xa2, 0x40, 0x2c, 0x2c, 0x4d, 0xae, 0x25, 0x8c, + 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, 0x85, 0xae, + 0x0c, 0x8f, 0xae, 0x4e, 0xae, 0x6c, 0x6e, 0x88, 0xf1, 0x95, 0xc2, 0x37, + 0x0a, 0x1f, 0x29, 0x10, 0x0b, 0x4b, 0x93, 0x6b, 0x09, 0x63, 0x4b, 0x0b, + 0x9b, 0x6b, 0x99, 0x1b, 0x7b, 0x83, 0x2b, 0x6b, 0x99, 0x0b, 0x6b, 0x83, + 0x63, 0x2b, 0x93, 0x9b, 0x1b, 0x62, 0x7c, 0xa7, 0xf0, 0x8d, 0xc2, 0x67, + 0x0a, 0x43, 0x88, 0xaf, 0x14, 0xbe, 0x53, 0xa0, 0x15, 0x96, 0x26, 0xd7, + 0x12, 0xc6, 0x96, 0x16, 0x36, 0xd7, 0x32, 0x37, 0xf6, 0x06, 0x57, 0xd6, + 0x12, 0x26, 0x77, 0x86, 0x32, 0x93, 0x32, 0xc4, 0xf8, 0x54, 0xe1, 0x1b, + 0x85, 0x2f, 0x15, 0x86, 0x08, 0x9f, 0x2a, 0xb0, 0xfa, 0xd2, 0xa2, 0x9a, + 0x8a, 0xa9, 0x99, 0x42, 0x0b, 0x23, 0x2b, 0x93, 0x1b, 0x7a, 0x73, 0x9b, + 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0xe3, 0xf3, 0xd6, 0xe6, 0x96, 0x06, 0xf7, + 0x46, 0x57, 0xe6, 0x46, 0x07, 0x32, 0x86, 0x16, 0x26, 0xc7, 0x67, 0x2a, + 0xad, 0x0d, 0x8e, 0xad, 0x0c, 0x64, 0x68, 0x65, 0x05, 0x84, 0x4a, 0x28, + 0x28, 0x68, 0x88, 0xf0, 0xb9, 0xc2, 0x10, 0xe3, 0x6b, 0x85, 0xef, 0x15, + 0xc2, 0x20, 0x1b, 0x62, 0x7c, 0x68, 0xf0, 0xc1, 0x42, 0x18, 0x64, 0x43, + 0xc4, 0xe0, 0x63, 0x85, 0x2f, 0x16, 0xc2, 0x20, 0xfb, 0x62, 0x21, 0x0c, + 0xb4, 0x2f, 0x16, 0xc2, 0x60, 0xfb, 0x62, 0x21, 0x0c, 0xb8, 0x2f, 0x16, + 0xc2, 0xa0, 0xfb, 0x62, 0x21, 0x0c, 0xbc, 0x2f, 0x16, 0xc2, 0xe0, 0xfb, + 0x62, 0x21, 0x0c, 0xb0, 0x21, 0xc6, 0x27, 0x0b, 0x5f, 0x2c, 0x84, 0xc1, + 0x36, 0xc4, 0xf8, 0x64, 0xe1, 0x8b, 0x85, 0x30, 0xc0, 0x86, 0x18, 0x9f, + 0x2c, 0x7c, 0xb1, 0x10, 0x06, 0xdd, 0x10, 0xe3, 0x93, 0x85, 0x2f, 0x16, + 0xc2, 0xc0, 0x1b, 0x62, 0x7c, 0xb2, 0xf0, 0xc5, 0x42, 0x18, 0x7c, 0x43, + 0x8c, 0x4f, 0x16, 0xbe, 0x58, 0x08, 0x03, 0x6d, 0x88, 0xf1, 0xc9, 0xc2, + 0x17, 0x0b, 0x61, 0xc0, 0x0d, 0x31, 0x3e, 0x59, 0xf8, 0x62, 0x21, 0x0c, + 0xb2, 0x11, 0x11, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0xb4, 0xc3, + 0x3b, 0x90, 0x43, 0x3d, 0xb0, 0x43, 0x39, 0xb8, 0x81, 0x39, 0xb0, 0x43, + 0x38, 0x9c, 0xc3, 0x3c, 0x4c, 0x11, 0x82, 0x61, 0x84, 0xc2, 0x0e, 0xec, + 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xe9, 0x40, 0x0e, 0xe5, 0xe0, 0x0e, 0xf4, + 0x30, 0x25, 0x28, 0x46, 0x2c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xf6, + 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x25, 0x30, + 0x46, 0x50, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xec, 0x10, 0x0e, 0xee, + 0x70, 0x0e, 0xf5, 0x10, 0x0e, 0xe7, 0x50, 0x0e, 0xbf, 0x60, 0x0f, 0xe5, + 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0x53, 0x02, 0x64, 0xc4, + 0x14, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x30, 0x0e, 0xef, 0xd0, 0x0e, 0xf0, + 0x90, 0x0e, 0xec, 0x50, 0x0e, 0xbf, 0xf0, 0x0e, 0xf0, 0x40, 0x0f, 0xe9, + 0xf0, 0x0e, 0xee, 0x30, 0x0f, 0x53, 0x06, 0x85, 0x71, 0x46, 0x30, 0xe1, + 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe6, 0x20, 0x0f, 0xe1, 0x70, 0x0e, 0xed, + 0x50, 0x0e, 0xee, 0x40, 0x0f, 0x53, 0x82, 0x50, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, @@ -2041,66 +1222,1391 @@ const unsigned char sdl_metallib[] = { 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x1b, 0x00, 0x00, - 0x00, 0x46, 0x10, 0x06, 0x00, 0x12, 0xf9, 0x12, 0xc0, 0x3c, 0x0b, 0xf1, - 0x4f, 0xc4, 0x35, 0x51, 0x11, 0xf1, 0xdb, 0xc3, 0x0f, 0x44, 0x11, 0x80, - 0xf9, 0x15, 0x5e, 0xdc, 0xb6, 0x0d, 0x34, 0x00, 0x12, 0xf9, 0x83, 0x33, - 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x15, 0x6c, 0x00, 0x12, 0xf9, 0x12, 0xc0, - 0x3c, 0x0b, 0xf1, 0x4f, 0xc4, 0x35, 0x51, 0x11, 0xf1, 0xdb, 0x83, 0x5f, - 0xe1, 0xc5, 0x6d, 0x5b, 0x00, 0x04, 0x20, 0x91, 0x5f, 0x00, 0xd2, 0xf4, - 0x3f, 0x8e, 0xe5, 0x17, 0xb7, 0x6d, 0x00, 0x10, 0xdb, 0x95, 0xbf, 0xec, - 0xbe, 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34, 0x93, 0x09, 0x44, 0x00, 0x12, - 0xf9, 0x05, 0x20, 0x4d, 0x7f, 0x01, 0x04, 0x92, 0x5f, 0xdc, 0x36, 0x00, - 0x00, 0x61, 0x20, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4c, - 0x2c, 0x10, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x94, 0xce, 0x41, - 0x18, 0x87, 0x12, 0x07, 0x34, 0x16, 0x41, 0x09, 0x50, 0x38, 0x02, 0x30, - 0xc7, 0x60, 0xc4, 0x41, 0x1c, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xda, 0x08, - 0x00, 0x65, 0x23, 0x00, 0x35, 0x40, 0xd8, 0x0c, 0x00, 0x15, 0x33, 0x00, - 0x14, 0xcc, 0x00, 0xcc, 0x00, 0x10, 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, - 0x7f, 0x63, 0x04, 0x3a, 0x6b, 0xce, 0x21, 0x18, 0x8c, 0x11, 0xbc, 0x7b, - 0x5a, 0xde, 0xdf, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xc4, - 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x00, - 0x00, 0x23, 0x06, 0x0a, 0x11, 0xdc, 0xc1, 0x55, 0x69, 0x8c, 0xd3, 0x04, - 0x23, 0x06, 0x0b, 0x11, 0xe4, 0xc1, 0x65, 0x6d, 0x77, 0xd0, 0x3c, 0x8e, - 0x30, 0x86, 0x10, 0xe0, 0xc1, 0x20, 0xc3, 0xc0, 0x4c, 0x73, 0x0c, 0x81, - 0x90, 0x07, 0x23, 0x06, 0x0b, 0x11, 0xf4, 0xc1, 0xa6, 0x7d, 0x7a, 0x10, - 0x4d, 0x92, 0x31, 0x86, 0x10, 0xf0, 0xc1, 0x1c, 0xc3, 0x10, 0xe4, 0xc1, - 0x81, 0x81, 0xb8, 0x14, 0x94, 0x41, 0x86, 0x40, 0xca, 0x8c, 0x08, 0xe0, - 0x33, 0xde, 0x40, 0x06, 0x70, 0x10, 0x0a, 0x17, 0x88, 0x4b, 0x41, 0x19, - 0x64, 0x08, 0x2e, 0x6f, 0xc4, 0xa0, 0x28, 0x82, 0x54, 0x28, 0x82, 0x39, - 0x06, 0x2d, 0x38, 0x85, 0xf1, 0x0a, 0x35, 0xb0, 0x83, 0x53, 0x40, 0x05, - 0x32, 0xb8, 0x40, 0x5c, 0x0a, 0xca, 0x20, 0x43, 0xd0, 0x91, 0xc1, 0x88, - 0x41, 0x51, 0x04, 0xaf, 0xb0, 0x04, 0x73, 0x0c, 0x46, 0xc0, 0x0a, 0xe3, - 0x15, 0x70, 0xc0, 0x07, 0xad, 0xe0, 0x0a, 0x6b, 0x70, 0x81, 0xb8, 0x14, - 0x94, 0x41, 0x86, 0x60, 0x0c, 0xd4, 0x60, 0xc4, 0xa0, 0x28, 0x82, 0x5a, - 0x88, 0x82, 0x39, 0x06, 0x23, 0x78, 0x85, 0xf1, 0x86, 0x3b, 0x10, 0x05, - 0x5a, 0xa0, 0x60, 0x8c, 0x37, 0xe4, 0x01, 0x29, 0xb8, 0x02, 0x05, 0x63, - 0xb8, 0x61, 0x18, 0x03, 0x67, 0x96, 0x21, 0x58, 0x82, 0xe1, 0x86, 0xa9, - 0x0c, 0x94, 0x59, 0x86, 0x41, 0x08, 0x8c, 0x3a, 0x03, 0xf9, 0xcc, 0x12, - 0x10, 0x56, 0xa5, 0x01, 0x7c, 0x46, 0x0c, 0x88, 0x22, 0x00, 0x87, 0xc0, - 0x02, 0x36, 0x90, 0xcf, 0x88, 0x41, 0x51, 0x04, 0xe3, 0x10, 0xb8, 0xc1, - 0x2c, 0x01, 0x31, 0x50, 0x01, 0x28, 0x82, 0x30, 0xcc, 0x31, 0xcc, 0x41, - 0x00, 0x0e, 0xc3, 0x0d, 0x55, 0x1b, 0x28, 0xb3, 0x0c, 0x46, 0x11, 0x98, - 0xf5, 0x06, 0xf2, 0x99, 0x25, 0x38, 0xec, 0x8a, 0x03, 0xf8, 0x8c, 0x18, - 0x10, 0x45, 0x80, 0x0e, 0x81, 0x05, 0x74, 0x20, 0x9f, 0x11, 0x83, 0xa2, - 0x08, 0xd6, 0x21, 0xb0, 0x83, 0x59, 0x82, 0x63, 0xa0, 0x02, 0x50, 0x0a, - 0xc1, 0x98, 0x63, 0x40, 0x82, 0x73, 0x18, 0x6e, 0xb8, 0xea, 0x40, 0x99, - 0x65, 0x48, 0x90, 0xc0, 0xb0, 0x3b, 0x90, 0xcf, 0x2c, 0x81, 0x62, 0x59, - 0x1e, 0xc0, 0x67, 0xc4, 0x80, 0x28, 0x02, 0x78, 0x08, 0x2c, 0xe0, 0x03, - 0xf9, 0x8c, 0x18, 0x14, 0x45, 0x30, 0x0f, 0x81, 0x1f, 0xcc, 0x12, 0x28, - 0x03, 0x15, 0x80, 0x82, 0x08, 0xc9, 0x1c, 0x03, 0x12, 0xb0, 0xc3, 0x2c, - 0xc1, 0x32, 0x50, 0x11, 0x08, 0x0a, 0x1f, 0x00, 0x83, 0x0c, 0x01, 0x29, - 0xac, 0xc2, 0x1c, 0xc3, 0x29, 0x70, 0xf3, 0x30, 0xc8, 0x10, 0xa0, 0xc2, - 0x2b, 0xd8, 0x10, 0xc8, 0x67, 0x90, 0x21, 0x50, 0x05, 0x5a, 0x98, 0x63, - 0x08, 0x50, 0xe1, 0x1d, 0x2c, 0xe8, 0x05, 0xf9, 0x64, 0x10, 0x10, 0x03, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0, 0x98, 0x05, 0x04, 0x17, - 0xb6, 0x14, 0xc1, 0x31, 0x0b, 0x08, 0x2e, 0x6c, 0x29, 0x8a, 0x63, 0x16, - 0x10, 0x5c, 0xd8, 0x52, 0x24, 0x47, 0x2e, 0x20, 0xba, 0xb0, 0xa5, 0x70, - 0x8e, 0x5c, 0x40, 0x74, 0x61, 0x4b, 0x41, 0x1d, 0xb9, 0x80, 0xe8, 0xc2, - 0x96, 0x42, 0x3b, 0x72, 0x01, 0xd1, 0x85, 0x2d, 0xc7, 0x17, 0x88, 0xc3, - 0x31, 0x0e, 0x08, 0x39, 0x6c, 0x39, 0xc2, 0x20, 0x28, 0x87, 0x63, 0x1c, - 0x10, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x2e, 0x00, 0x00, + 0x00, 0x06, 0x10, 0xb1, 0x5d, 0xf9, 0x73, 0xce, 0x83, 0xfd, 0x45, 0x04, + 0x18, 0x0c, 0xd1, 0x4c, 0x56, 0x90, 0xfd, 0x73, 0x6d, 0x6b, 0xcf, 0xb3, + 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74, 0xd5, 0xfd, 0x17, 0x45, 0x51, + 0x14, 0x46, 0xd0, 0x00, 0x48, 0xe4, 0x0f, 0xce, 0xe4, 0x57, 0x77, 0x71, + 0xdb, 0xa6, 0xb0, 0x01, 0x48, 0xe4, 0x4b, 0x00, 0xf3, 0x2c, 0xc4, 0x3f, + 0x11, 0xd7, 0x44, 0x45, 0xc4, 0x6f, 0x0f, 0x7e, 0x85, 0x17, 0xb7, 0x6d, + 0x08, 0x13, 0x80, 0x44, 0x7e, 0x01, 0x48, 0xd3, 0x5f, 0x00, 0x81, 0xe4, + 0x57, 0x77, 0x71, 0xdb, 0x16, 0x40, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, + 0xfd, 0xc2, 0x02, 0x30, 0x8f, 0x5f, 0xdd, 0xc5, 0x6d, 0x5b, 0xc2, 0x04, + 0x20, 0x91, 0x5f, 0x00, 0xd2, 0xf4, 0x17, 0x0c, 0x70, 0xf9, 0xd5, 0x5d, + 0xdc, 0xb6, 0x09, 0x40, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0xff, 0xe3, + 0x58, 0x7e, 0x71, 0xdb, 0x36, 0x10, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, + 0xfd, 0x05, 0x10, 0x48, 0x7e, 0x71, 0xdb, 0x66, 0x10, 0x01, 0x48, 0xe4, + 0x17, 0x80, 0x34, 0xfd, 0x05, 0x03, 0x5c, 0x7e, 0x71, 0xdb, 0x76, 0x20, + 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x8f, 0x63, 0xf9, 0xd5, 0x5d, + 0xdc, 0x36, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x9a, 0x01, 0x00, + 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00, 0x00, 0x51, 0x00, 0x00, + 0x00, 0x64, 0x8e, 0x45, 0x00, 0x81, 0x70, 0xcc, 0x41, 0x2c, 0x8d, 0xd3, + 0x06, 0x54, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xdc, 0x08, 0x00, + 0x6d, 0xc5, 0x30, 0x03, 0x50, 0x0e, 0xa4, 0x8d, 0x00, 0xd4, 0x00, 0x01, + 0x63, 0x04, 0xef, 0x9e, 0x96, 0xf7, 0x37, 0x46, 0xa0, 0xb3, 0xe6, 0x1c, + 0x82, 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x09, 0x06, 0x63, 0x04, 0x20, + 0x08, 0x82, 0x20, 0x18, 0xcc, 0x00, 0x50, 0x30, 0x03, 0x30, 0x03, 0x30, + 0x07, 0x91, 0x0a, 0xaf, 0x90, 0x0a, 0x75, 0x40, 0xcb, 0x0c, 0xc0, 0x08, + 0xc0, 0x0c, 0xc0, 0x58, 0x03, 0x08, 0x82, 0x20, 0xfe, 0x81, 0x20, 0x08, + 0xe2, 0x1f, 0x08, 0x82, 0x20, 0xfe, 0x8d, 0x35, 0xb0, 0xed, 0xfc, 0x93, + 0x1e, 0xdb, 0xce, 0x3f, 0xe9, 0xb1, 0xed, 0xfc, 0x93, 0xde, 0x58, 0x03, + 0x08, 0x82, 0x6c, 0xfd, 0x0b, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, + 0xc8, 0xd6, 0xbf, 0x30, 0xd6, 0x00, 0x82, 0xe0, 0x9a, 0x83, 0x01, 0x08, + 0x82, 0x6b, 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x8c, 0x35, 0x80, + 0x20, 0xdd, 0xe6, 0x60, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, + 0x6d, 0x0e, 0x06, 0x63, 0x0d, 0xeb, 0x88, 0xc7, 0x2c, 0x18, 0xac, 0x23, + 0x1e, 0xb3, 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x58, 0x03, 0x08, + 0xc2, 0x78, 0x38, 0x06, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, + 0x87, 0x63, 0x30, 0xd6, 0x20, 0xe6, 0x62, 0xda, 0x7f, 0x60, 0xc9, 0xb3, + 0xf1, 0x2f, 0x8c, 0xe9, 0xaa, 0xe6, 0xbe, 0x30, 0xd6, 0xf0, 0xcf, 0xa4, + 0xff, 0xfb, 0x02, 0x5d, 0x83, 0x62, 0xfe, 0xb5, 0x70, 0x1c, 0x83, 0xbe, + 0x30, 0xd6, 0x30, 0xf7, 0x6d, 0x9a, 0xfa, 0x42, 0xeb, 0x86, 0x3c, 0xef, + 0x0b, 0x7c, 0xce, 0xfa, 0xf8, 0x47, 0xc0, 0x18, 0x81, 0xdb, 0xc7, 0xa2, + 0xed, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0x79, 0xaf, + 0xab, 0xec, 0x8d, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, 0xdb, + 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba, 0xf8, 0x37, 0x46, + 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8, 0xf6, 0x34, 0x18, + 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x23, 0x06, 0x4a, 0x11, 0x98, 0xc2, 0x1a, 0xa8, 0x41, 0x1b, 0x80, + 0x41, 0x19, 0x84, 0x41, 0x30, 0xde, 0xd0, 0x06, 0x78, 0x30, 0x0a, 0x14, + 0x8c, 0xe1, 0x86, 0x00, 0x0c, 0x82, 0x59, 0x86, 0x40, 0x08, 0x06, 0x19, + 0x08, 0x4f, 0x0d, 0xc6, 0x1b, 0xe2, 0x80, 0x0f, 0xce, 0x80, 0x82, 0x31, + 0x62, 0x40, 0x18, 0xc1, 0x2b, 0x0c, 0x23, 0x06, 0x85, 0x11, 0xc4, 0x42, + 0xb0, 0x59, 0xb0, 0xc1, 0x67, 0xc4, 0xa0, 0x30, 0x82, 0x58, 0x08, 0xc0, + 0xc0, 0x06, 0x4e, 0x3e, 0xc6, 0x05, 0xf1, 0xb1, 0x21, 0xa0, 0xcf, 0x88, + 0x01, 0x61, 0x04, 0xb6, 0x10, 0x8c, 0x18, 0x14, 0x46, 0x80, 0x0b, 0x81, + 0x67, 0x81, 0x27, 0x9f, 0x39, 0x06, 0x34, 0x58, 0x6c, 0x61, 0x90, 0x21, + 0x48, 0x83, 0x3c, 0xb0, 0x21, 0xa0, 0xcf, 0x20, 0x43, 0xb0, 0x06, 0x7c, + 0x30, 0xc8, 0x10, 0x54, 0x7e, 0x30, 0x4b, 0x20, 0x0c, 0x54, 0x04, 0x42, + 0xc0, 0x06, 0xc0, 0x78, 0xc3, 0x28, 0xb8, 0xc2, 0x2e, 0x50, 0x30, 0x86, + 0x1b, 0x02, 0xcd, 0x99, 0x65, 0x18, 0x88, 0x60, 0x90, 0x81, 0xa0, 0x03, + 0x50, 0x18, 0x6f, 0x38, 0x05, 0x59, 0xa0, 0x05, 0x0a, 0xc6, 0x78, 0x43, + 0x2a, 0xd0, 0x42, 0x28, 0x50, 0x30, 0x46, 0x0c, 0x90, 0x23, 0x52, 0x87, + 0xa2, 0x3b, 0x86, 0x60, 0x90, 0x21, 0xb8, 0x03, 0x54, 0x18, 0x64, 0x08, + 0x16, 0x55, 0x98, 0x25, 0x20, 0x06, 0x2a, 0x02, 0x61, 0xc0, 0x84, 0xe1, + 0x86, 0x30, 0x50, 0x83, 0x60, 0x96, 0xa1, 0x98, 0x82, 0xf1, 0x06, 0x58, + 0xd8, 0x85, 0x73, 0xa0, 0x60, 0x0c, 0x37, 0x04, 0x6d, 0x10, 0xcc, 0x32, + 0x18, 0x47, 0x30, 0xc8, 0x50, 0x84, 0x42, 0x2b, 0x8c, 0x37, 0xd0, 0xc2, + 0x2f, 0x9c, 0x03, 0x05, 0x63, 0x8e, 0x21, 0x14, 0x82, 0x77, 0x18, 0x64, + 0x08, 0x44, 0x41, 0x16, 0x2c, 0x28, 0xe4, 0x33, 0xc8, 0x10, 0x90, 0x42, + 0x2d, 0xcc, 0x12, 0xb4, 0xc1, 0x78, 0x83, 0x2e, 0x94, 0xc3, 0x3c, 0x50, + 0x30, 0xc6, 0x1b, 0x78, 0xe1, 0x1c, 0xde, 0x81, 0x82, 0x31, 0xc8, 0x00, + 0xb1, 0x82, 0x2e, 0x0c, 0x37, 0x10, 0x74, 0xe0, 0xcc, 0x32, 0x20, 0x52, + 0x30, 0x86, 0x20, 0xe5, 0xc3, 0x70, 0x43, 0xd0, 0x07, 0xca, 0x2c, 0x83, + 0x92, 0x04, 0x26, 0xfc, 0x81, 0x7c, 0x66, 0x09, 0x16, 0x1b, 0x42, 0x01, + 0x3e, 0x23, 0x06, 0x84, 0x11, 0x94, 0x44, 0x60, 0x01, 0x2e, 0xc8, 0x67, + 0xc4, 0xa0, 0x30, 0x02, 0x94, 0x08, 0x70, 0x61, 0x96, 0x60, 0x19, 0xa8, + 0x00, 0x94, 0x44, 0x50, 0xe6, 0x18, 0x6a, 0x21, 0x08, 0x89, 0x31, 0x84, + 0x0d, 0x24, 0x86, 0x1b, 0x02, 0x53, 0x50, 0x66, 0x19, 0x1a, 0x26, 0x30, + 0x01, 0x15, 0xe4, 0x33, 0x4b, 0xe0, 0xd8, 0xa0, 0x0a, 0xf0, 0x19, 0x31, + 0x20, 0x8c, 0xc0, 0x25, 0x02, 0x0b, 0xc2, 0x41, 0x3e, 0x23, 0x06, 0x85, + 0x11, 0xc4, 0x44, 0x10, 0x0e, 0xb3, 0x04, 0xce, 0x40, 0x05, 0xa0, 0x30, + 0x42, 0x33, 0xc7, 0x90, 0x04, 0x28, 0x31, 0x86, 0x40, 0x06, 0x28, 0x31, + 0xdc, 0x10, 0xbc, 0x82, 0x32, 0xcb, 0x00, 0x3d, 0x81, 0x09, 0xb1, 0x20, + 0x9f, 0x59, 0x82, 0xc8, 0x86, 0x59, 0x80, 0xcf, 0x88, 0x01, 0x61, 0x04, + 0x37, 0x11, 0x58, 0xa0, 0x0e, 0xf2, 0x19, 0x31, 0x28, 0x8c, 0x40, 0x27, + 0x02, 0x75, 0x98, 0x25, 0x88, 0x06, 0x2a, 0x00, 0xe5, 0x11, 0xa0, 0x39, + 0x86, 0x24, 0x80, 0x89, 0x59, 0x02, 0x69, 0xa0, 0x22, 0x10, 0x22, 0x3d, + 0x38, 0x06, 0x19, 0x02, 0x75, 0xb0, 0x87, 0x39, 0x06, 0x74, 0x00, 0x03, + 0x9b, 0x18, 0x64, 0x08, 0xd2, 0x21, 0x1f, 0x6c, 0x08, 0xe4, 0x33, 0xc8, + 0x10, 0xac, 0x03, 0x3f, 0xcc, 0x12, 0xb4, 0xc1, 0x70, 0xc3, 0x2c, 0xc4, + 0x43, 0x30, 0xcb, 0x40, 0x81, 0x41, 0x30, 0xc8, 0x40, 0x07, 0xf0, 0xc0, + 0x0f, 0xe3, 0x0d, 0x23, 0xe1, 0x12, 0x3c, 0x41, 0xc1, 0x18, 0x6f, 0x28, + 0x09, 0x98, 0xc0, 0x09, 0x0a, 0xc6, 0x1c, 0x83, 0x3c, 0x04, 0x60, 0x31, + 0xc8, 0x10, 0xcc, 0xc3, 0x48, 0x58, 0x70, 0xc8, 0x67, 0x90, 0x21, 0xa8, + 0x07, 0x93, 0x18, 0x6e, 0x38, 0xc0, 0xc1, 0x99, 0x65, 0xf8, 0xaa, 0x60, + 0x0c, 0x61, 0x28, 0x8b, 0xe1, 0x86, 0x60, 0x1c, 0x94, 0x59, 0x86, 0xcb, + 0x0a, 0x4c, 0x28, 0x07, 0xf9, 0xcc, 0x12, 0x60, 0x23, 0x06, 0x84, 0x11, + 0xc0, 0xc5, 0x30, 0x62, 0x50, 0x18, 0x81, 0x5c, 0x04, 0xe8, 0x60, 0x81, + 0x3a, 0xc8, 0xc7, 0x02, 0x76, 0x80, 0xcf, 0x2c, 0x01, 0x36, 0x50, 0x01, + 0x28, 0x96, 0x70, 0xcd, 0x31, 0xf4, 0x43, 0xd0, 0x16, 0x63, 0x08, 0x0c, + 0x5b, 0x0c, 0x37, 0x04, 0xec, 0xa0, 0xcc, 0x32, 0x68, 0x59, 0x60, 0x82, + 0x3b, 0xc8, 0x67, 0x96, 0x60, 0x1b, 0x31, 0x20, 0x8c, 0x20, 0x2f, 0x86, + 0x11, 0x83, 0xc2, 0x08, 0xf6, 0x22, 0x88, 0x07, 0x0b, 0xe6, 0x41, 0x3e, + 0x16, 0xd4, 0x03, 0x7c, 0x66, 0x09, 0xb6, 0x81, 0x0a, 0x40, 0xc9, 0x04, + 0x6d, 0x8e, 0x21, 0x09, 0xe8, 0x62, 0x0c, 0xa1, 0xa2, 0x8b, 0xe1, 0x86, + 0xa0, 0x1e, 0x94, 0x59, 0x86, 0x8e, 0x0b, 0x4c, 0xb8, 0x07, 0xf9, 0xcc, + 0x12, 0x78, 0x23, 0x06, 0x84, 0x11, 0x88, 0xc6, 0x30, 0x62, 0x50, 0x18, + 0x01, 0x69, 0x04, 0xfa, 0x60, 0x01, 0x3f, 0xc8, 0xc7, 0x02, 0x7f, 0x80, + 0xcf, 0x2c, 0x81, 0x37, 0x50, 0x01, 0x28, 0x9c, 0xd0, 0xcd, 0x31, 0x24, + 0x01, 0x5f, 0x8c, 0x18, 0x18, 0x46, 0xa0, 0x1a, 0x41, 0x4c, 0xbc, 0xc4, + 0x20, 0x43, 0x30, 0x13, 0x64, 0x31, 0x4b, 0xf0, 0x0d, 0x54, 0x04, 0x7e, + 0x40, 0x09, 0xde, 0x20, 0x43, 0x80, 0x13, 0x66, 0x31, 0x4b, 0xd0, 0x06, + 0xb3, 0x0c, 0x61, 0xd0, 0x06, 0xfc, 0x30, 0xc8, 0xd0, 0x0b, 0x39, 0x51, + 0x16, 0x23, 0x06, 0x85, 0x11, 0xb0, 0x46, 0xd0, 0x12, 0x73, 0x0c, 0x36, + 0x11, 0x98, 0xc6, 0x88, 0x41, 0x61, 0x04, 0xae, 0x31, 0xb8, 0xc4, 0x1c, + 0x83, 0x10, 0x98, 0xc6, 0x88, 0x41, 0x61, 0x04, 0xb0, 0x51, 0xbc, 0xc4, + 0x1c, 0x83, 0x10, 0x9c, 0xc6, 0x20, 0x43, 0xd0, 0x13, 0x6e, 0x31, 0xc8, + 0x10, 0x94, 0x03, 0x5c, 0x8c, 0x37, 0xd0, 0xc5, 0x5f, 0xb4, 0x06, 0x05, + 0x63, 0xbc, 0xc1, 0x2e, 0x42, 0x23, 0x35, 0x28, 0x18, 0x73, 0x0c, 0x63, + 0x11, 0xc4, 0xc6, 0x20, 0x43, 0x40, 0x16, 0x74, 0x61, 0x41, 0x22, 0x9f, + 0x41, 0x86, 0xc0, 0x2c, 0xee, 0x62, 0xb8, 0xe1, 0x88, 0x09, 0x67, 0x96, + 0x81, 0x0d, 0xc4, 0x20, 0x18, 0x43, 0x18, 0x6c, 0x63, 0xb8, 0x21, 0xa0, + 0x09, 0x65, 0x96, 0x81, 0x0c, 0xc6, 0x20, 0x30, 0xc1, 0x26, 0xe4, 0x33, + 0x4b, 0x50, 0x06, 0x23, 0x06, 0x84, 0x11, 0x84, 0xc7, 0x30, 0x62, 0x50, + 0x18, 0xc1, 0x78, 0x04, 0x39, 0x61, 0xc1, 0x4e, 0xc8, 0xc7, 0x82, 0x9e, + 0x80, 0xcf, 0x2c, 0x41, 0x19, 0x0c, 0x54, 0x00, 0xca, 0x18, 0x08, 0x64, + 0x30, 0xc7, 0xe0, 0x16, 0x81, 0x6f, 0x8c, 0x21, 0x30, 0xbd, 0x31, 0xdc, + 0x10, 0xf4, 0x84, 0x32, 0xcb, 0x70, 0x06, 0x66, 0x10, 0x98, 0xf0, 0x13, + 0xf2, 0x99, 0x25, 0x40, 0x83, 0x11, 0x03, 0xc2, 0x08, 0xd4, 0x63, 0x18, + 0x31, 0x28, 0x8c, 0x80, 0x3d, 0x02, 0xb1, 0xb0, 0x80, 0x2c, 0xe4, 0x63, + 0x81, 0x59, 0xc0, 0x67, 0x96, 0x00, 0x0d, 0x06, 0x2a, 0x00, 0xc5, 0x0c, + 0x84, 0x33, 0x98, 0x63, 0x48, 0x82, 0xf2, 0x18, 0x43, 0xa8, 0xca, 0x63, + 0xb8, 0x21, 0x30, 0x0b, 0x65, 0x96, 0x41, 0x0d, 0xd2, 0x20, 0x30, 0x01, + 0x2d, 0xe4, 0x33, 0x4b, 0xb0, 0x06, 0x23, 0x06, 0x84, 0x11, 0xcc, 0xc7, + 0x30, 0x62, 0x50, 0x18, 0x41, 0x7d, 0x04, 0x6b, 0x61, 0x41, 0x5b, 0xc8, + 0xc7, 0x82, 0xb7, 0x80, 0xcf, 0x2c, 0xc1, 0x1a, 0x0c, 0x54, 0x00, 0x4a, + 0x1a, 0x08, 0x6a, 0x30, 0xc7, 0x90, 0x04, 0xed, 0x31, 0x62, 0x60, 0x18, + 0xc1, 0x7e, 0x04, 0xa2, 0x01, 0x1a, 0x83, 0x0c, 0x01, 0x69, 0xd4, 0xc6, + 0x2c, 0x01, 0x1b, 0x0c, 0x54, 0x04, 0x7e, 0x10, 0x06, 0xc2, 0x1a, 0x0c, + 0x32, 0x04, 0xa9, 0x71, 0x1b, 0xb3, 0x04, 0x6d, 0x30, 0xd0, 0x12, 0xf0, + 0x88, 0xc1, 0x23, 0x12, 0x8f, 0x7c, 0xb2, 0xc0, 0x06, 0x3c, 0x02, 0x06, + 0x03, 0x2d, 0x01, 0x8a, 0x18, 0x7a, 0x21, 0x99, 0xc3, 0x47, 0xb0, 0x81, + 0xcc, 0x80, 0xc1, 0x20, 0x43, 0x20, 0xec, 0x86, 0x05, 0xe1, 0x21, 0x9f, + 0x0c, 0xc2, 0x81, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xd7, 0xd2, 0x07, + 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4, 0x50, 0x13, 0xe7, 0x2c, + 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d, 0x9b, 0x6d, 0x29, 0x38, + 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b, 0x00, 0x03, 0x11, 0x71, + 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71, 0x21, 0x13, 0x00, 0x00, + 0x00, 0x01, 0x31, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0, + 0x40, 0x05, 0x64, 0x15, 0xb6, 0x0c, 0x42, 0x30, 0x0b, 0x5b, 0x86, 0x23, + 0xa0, 0x85, 0x2d, 0x83, 0x16, 0xd4, 0xc2, 0x96, 0xe1, 0x0b, 0x6c, 0x61, + 0xcb, 0x10, 0x06, 0xc1, 0x2d, 0x6c, 0x19, 0xd4, 0x20, 0xc0, 0x85, 0x2d, + 0xc3, 0x1b, 0x04, 0xb9, 0xb0, 0x65, 0xb0, 0x83, 0x40, 0x17, 0xb6, 0x0c, + 0x78, 0x10, 0xe4, 0xc2, 0x96, 0x81, 0x1d, 0x02, 0x5d, 0xd8, 0x32, 0xb8, + 0x43, 0x90, 0x0b, 0x5b, 0x06, 0xb5, 0x08, 0x74, 0x61, 0xcb, 0xc0, 0x16, + 0x41, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x64, 0xce, 0x41, 0x2c, 0x8d, 0x93, 0x06, + 0x54, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xdb, 0x0c, 0x00, 0x05, + 0x33, 0x00, 0xb4, 0xcc, 0x00, 0x8c, 0x35, 0xb0, 0xec, 0x19, 0xca, 0x1f, + 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce, 0xde, 0x58, 0x83, 0x5e, + 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf, 0xdb, 0xa7, 0xf4, 0xe8, + 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a, 0xc2, 0xe8, 0xee, 0xdd, + 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25, + 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f, + 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c, + 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2, + 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05, 0x33, 0x00, 0x04, 0x8c, + 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82, + 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5, 0x02, 0x0d, 0x37, 0x50, + 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43, 0x43, 0xb5, 0xc1, 0x20, + 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64, 0x08, 0xa0, 0x6a, 0x96, + 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61, 0x48, 0x82, 0xe1, 0x86, + 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31, 0x28, 0x8c, 0x40, 0x0f, + 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xe8, 0x60, 0xc4, 0xa0, 0x30, 0x02, 0x3e, + 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xa0, 0x83, 0x11, 0x83, 0xc2, 0x08, 0xfc, + 0x20, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xa8, 0x83, 0x59, 0x82, 0x62, 0xa0, + 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xf4, 0x60, 0x0c, 0x41, 0xc8, + 0x83, 0x31, 0x84, 0x21, 0x0f, 0x46, 0x0c, 0x0a, 0x23, 0x10, 0x05, 0x21, + 0x18, 0x31, 0x28, 0x8c, 0x60, 0x14, 0x88, 0x60, 0xb8, 0x21, 0xb8, 0x84, + 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c, 0x0c, 0x6c, 0x40, 0x03, + 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90, 0x8f, 0x05, 0x1a, 0x7c, + 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81, 0x29, 0x0c, 0x32, 0x04, + 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64, 0x08, 0xd2, 0xc0, 0x0d, + 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4, 0xa0, 0x98, 0x65, 0x40, + 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18, 0x31, 0x28, 0x8c, 0x60, + 0x16, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0xa0, 0x15, 0x46, 0x0c, 0x0a, + 0x23, 0xa8, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84, 0xa0, 0x15, 0x46, 0x0c, + 0x0a, 0x23, 0xb8, 0x85, 0x42, 0x0d, 0xe6, 0x18, 0x84, 0xc0, 0x15, 0x66, + 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57, 0x10, 0x04, 0x04, 0x3a, + 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0xc0, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xed, 0x06, 0x00, + 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, + 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, + 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, + 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, + 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, + 0x88, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, + 0x00, 0x51, 0x18, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, + 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, + 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, + 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, + 0x1d, 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, + 0x1d, 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, + 0x0d, 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, + 0xc0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, + 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, + 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, + 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, + 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, + 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, + 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, + 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, + 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, + 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, + 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, + 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, + 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, + 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, + 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, + 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, + 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, + 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, + 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, + 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, + 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, + 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, + 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, + 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, + 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, + 0xc3, 0x26, 0x10, 0xc0, 0x02, 0x54, 0x43, 0x38, 0xa4, 0x83, 0x3c, 0xb4, + 0x81, 0x38, 0xd4, 0x83, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0xb8, + 0xc3, 0x3b, 0xb4, 0x41, 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00, + 0x1b, 0xb6, 0xa1, 0x00, 0x16, 0xa0, 0x1a, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, + 0x0d, 0xc4, 0xa1, 0x1e, 0xcc, 0xc1, 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, + 0x1d, 0xde, 0xa1, 0x0d, 0xc2, 0x81, 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, + 0xd8, 0x60, 0x10, 0x06, 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0x40, 0x80, 0x05, + 0xa8, 0x36, 0x18, 0xc6, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50, + 0x1b, 0x7c, 0xe4, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, + 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, + 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, + 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, + 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, + 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x3c, + 0xb0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, + 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, + 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, + 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, + 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, + 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, + 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, + 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, + 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, + 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, + 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, + 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, + 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, + 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, + 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, + 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, + 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, + 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, + 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, + 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, + 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, + 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, + 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, + 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, + 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, + 0x03, 0x82, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x80, 0x04, 0x54, + 0x1b, 0x8c, 0x24, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x28, 0x02, 0xb0, 0x00, + 0xd5, 0x06, 0x64, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, + 0xa8, 0x36, 0x18, 0xcc, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50, + 0x1b, 0xa6, 0xe6, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x01, 0xa4, 0xc1, + 0x1d, 0xde, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, 0xd2, 0x81, 0x1d, 0xe8, 0x21, + 0x1d, 0xdc, 0x61, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, 0x8a, 0x40, 0x18, 0x88, 0x62, 0x42, + 0x60, 0x4c, 0x08, 0x8e, 0x09, 0x03, 0x92, 0x28, 0x13, 0x86, 0x25, 0x51, + 0x26, 0x04, 0xcc, 0x84, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, + 0x00, 0x4d, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, + 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, + 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xc8, 0xc1, + 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, + 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, + 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, + 0x41, 0x18, 0x46, 0x18, 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, + 0xe4, 0xa1, 0x1e, 0xc6, 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, + 0xc2, 0x81, 0x1d, 0xf4, 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, + 0xd2, 0x01, 0x1f, 0x50, 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, + 0xec, 0xbe, 0x1d, 0x21, 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, + 0x84, 0xa3, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, + 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0x38, + 0x4d, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, + 0xdf, 0x1e, 0x7e, 0x20, 0x8a, 0x00, 0xec, 0x9f, 0xc6, 0x08, 0x80, 0x41, + 0x04, 0x26, 0xb8, 0x48, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, + 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00, 0x06, 0x11, 0x1c, 0xa1, 0x24, + 0x41, 0x10, 0x08, 0x44, 0xb2, 0x34, 0x0f, 0x41, 0x85, 0x28, 0x8a, 0xa2, + 0x20, 0xa9, 0x0c, 0x00, 0x00, 0x10, 0x55, 0x04, 0x00, 0x20, 0xab, 0x0c, + 0x40, 0x51, 0x10, 0x56, 0x8c, 0xa2, 0x00, 0x00, 0x00, 0x20, 0xad, 0x0c, + 0x45, 0x51, 0x10, 0x57, 0x84, 0xa2, 0x20, 0x6f, 0x8e, 0x00, 0x0c, 0xe6, + 0x08, 0x82, 0x61, 0x04, 0x01, 0x0c, 0x4a, 0x12, 0x34, 0x8f, 0x00, 0x86, + 0x62, 0x08, 0xd0, 0x58, 0x90, 0x60, 0x79, 0x84, 0x50, 0x0c, 0x01, 0x2a, + 0x07, 0x02, 0x52, 0x00, 0x1c, 0x46, 0x18, 0xc0, 0x60, 0x10, 0x21, 0x10, + 0xe6, 0x08, 0x40, 0x61, 0x10, 0xe1, 0x10, 0x06, 0x11, 0x0a, 0x61, 0x10, + 0x01, 0x10, 0xa6, 0x00, 0x46, 0x00, 0x86, 0x11, 0x08, 0x30, 0x00, 0x00, + 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, + 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, + 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51, + 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80, + 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0, + 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, + 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, + 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60, + 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, + 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0, + 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, + 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, + 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, + 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40, + 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0, + 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90, + 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, + 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, + 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, + 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, + 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60, + 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, + 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, + 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10, + 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, + 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80, + 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x98, + 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0xcc, 0x04, + 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, 0xa6, 0x02, 0x02, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0x73, 0x01, 0x01, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xc9, 0x80, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x6c, 0x08, 0x30, 0x0c, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0c, 0x61, 0x2a, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x86, 0x30, 0x1d, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x43, 0x98, 0x0f, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x21, 0x4c, 0x07, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, + 0x86, 0x0c, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, + 0x98, 0x01, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x20, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, + 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x02, 0x47, 0x00, 0x4a, + 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80, 0x0a, 0x30, 0xa0, 0x0c, + 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, + 0x68, 0x2d, 0x9c, 0x11, 0x80, 0x42, 0x28, 0x88, 0xc2, 0x28, 0x90, 0x42, + 0x29, 0x18, 0x42, 0xc7, 0x12, 0x24, 0x01, 0x00, 0x00, 0x79, 0x18, 0x00, + 0x00, 0xd9, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, + 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0x18, + 0x40, 0x67, 0x00, 0xa0, 0x41, 0x19, 0x50, 0xb9, 0x1b, 0x43, 0x0b, 0x93, + 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, 0x80, 0x41, 0x73, 0x06, 0x02, + 0x18, 0x38, 0x8c, 0x83, 0x20, 0x38, 0x38, 0xb6, 0x32, 0x90, 0xb6, 0x32, + 0xba, 0x30, 0x36, 0x10, 0xbb, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0x37, 0x90, + 0x19, 0x19, 0x18, 0x99, 0x19, 0x17, 0x1a, 0x18, 0x1a, 0x10, 0x94, 0xb6, + 0x32, 0xba, 0x30, 0x36, 0xb3, 0xb2, 0x96, 0x19, 0x19, 0x18, 0x99, 0x19, + 0x17, 0x1a, 0x18, 0x9a, 0x94, 0x21, 0xc2, 0x19, 0x10, 0x43, 0x0c, 0x30, + 0x68, 0xc0, 0x20, 0x02, 0x03, 0x86, 0x45, 0x53, 0x19, 0x5d, 0x18, 0xdb, + 0x10, 0xe4, 0x0c, 0x0e, 0x30, 0x68, 0xc0, 0xa0, 0x01, 0x03, 0x86, 0x5b, + 0x58, 0x9a, 0x9c, 0xcb, 0xd8, 0x5b, 0x1b, 0x5c, 0x1a, 0x5b, 0x99, 0x0b, + 0x59, 0x99, 0xdb, 0x9b, 0x5c, 0xdb, 0xdc, 0x17, 0x59, 0xda, 0x5c, 0x98, + 0x18, 0x5b, 0xd9, 0x10, 0xe1, 0x0c, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, + 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x84, 0x33, 0x58, 0x48, 0x06, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x33, 0x68, 0x18, 0x85, + 0xa5, 0xc9, 0xb9, 0xc8, 0x95, 0xb9, 0x91, 0x95, 0xc9, 0x7d, 0xd1, 0x85, + 0xc9, 0x9d, 0x95, 0xd1, 0x31, 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, 0x3b, + 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x72, 0x0b, 0x6b, 0x2b, 0xa3, 0x61, + 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x33, 0x04, 0x39, 0x83, 0x07, 0x0c, 0x98, + 0x33, 0x80, 0xce, 0x20, 0x1a, 0x22, 0x9c, 0x81, 0x44, 0x26, 0x2c, 0x4d, + 0xce, 0x05, 0xee, 0x6d, 0x2e, 0x8d, 0x2e, 0xed, 0xcd, 0x8d, 0x4a, 0x58, + 0x9a, 0x9c, 0xcb, 0x58, 0x99, 0x1b, 0x5d, 0x99, 0x1c, 0xa5, 0xb0, 0x34, + 0x39, 0x17, 0xb7, 0xb7, 0x2f, 0xb8, 0x32, 0xb9, 0x39, 0xb8, 0xb2, 0x31, + 0xba, 0x34, 0xbb, 0x32, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0xe0, 0xde, 0xe6, 0xd2, 0xe8, 0xd2, + 0xde, 0xdc, 0x86, 0x40, 0x60, 0xc0, 0x9c, 0x01, 0x75, 0x06, 0xd5, 0x19, + 0x58, 0x67, 0x00, 0x9d, 0x41, 0x74, 0x06, 0xd7, 0x19, 0x60, 0x94, 0xc2, + 0xd2, 0xe4, 0x5c, 0xcc, 0xe4, 0xc2, 0xce, 0xda, 0xca, 0xdc, 0xe8, 0xbe, + 0xd2, 0xdc, 0xe0, 0xea, 0xe8, 0x68, 0x9d, 0x95, 0xb9, 0x95, 0xc9, 0x85, + 0xd1, 0x95, 0x91, 0xa1, 0xd4, 0x8c, 0xbd, 0xb1, 0xbd, 0xc9, 0x11, 0xd9, + 0xd1, 0x7c, 0x99, 0xa5, 0xf0, 0x09, 0x4b, 0x93, 0x73, 0x81, 0x2b, 0x93, + 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3, 0x2b, 0x63, 0x31, 0xf6, 0xc6, + 0xf6, 0x26, 0x37, 0x44, 0x02, 0x83, 0xe6, 0x0c, 0xb4, 0x33, 0xd8, 0xce, + 0xa0, 0x3a, 0x03, 0xee, 0x0c, 0xa0, 0x33, 0x88, 0xce, 0xe0, 0x3a, 0x83, + 0x8e, 0xd9, 0x59, 0x99, 0x5b, 0x99, 0x5c, 0x18, 0x5d, 0x19, 0x19, 0x0a, + 0x0e, 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b, 0x1c, 0x19, 0x91, 0x9d, 0xcc, + 0x97, 0x59, 0x0a, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x22, 0x74, + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x43, 0x24, 0x30, 0x80, 0xce, + 0x40, 0x3b, 0x83, 0xef, 0x0c, 0xaa, 0x33, 0xe0, 0xce, 0x00, 0x3a, 0x03, + 0x30, 0x38, 0x83, 0xeb, 0x0c, 0xc2, 0x80, 0x4a, 0x58, 0x9a, 0x9c, 0x8b, + 0x58, 0x9d, 0x99, 0x59, 0x99, 0x1c, 0x9f, 0xb0, 0x34, 0x39, 0x17, 0xb1, + 0x3a, 0x33, 0xb3, 0x32, 0xb9, 0xaf, 0xb9, 0x34, 0xbd, 0x32, 0x4a, 0x61, + 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x44, 0xc2, 0xd2, 0xe4, 0x5c, 0xe4, 0xca, + 0xc2, 0xc8, 0x48, 0x85, 0xa5, 0xc9, 0xb9, 0xcc, 0xd1, 0xc9, 0xd5, 0x8d, + 0xd1, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0xa5, 0xb9, 0x99, 0xbd, 0xb1, + 0x30, 0x63, 0x7b, 0x0b, 0xa3, 0x23, 0x33, 0x37, 0x26, 0x75, 0x24, 0xf4, + 0xf5, 0x56, 0x47, 0x07, 0x57, 0x47, 0x47, 0x86, 0xae, 0x0c, 0x8f, 0xae, + 0x4e, 0xae, 0xec, 0x8b, 0x2e, 0x0f, 0xae, 0x8c, 0x4a, 0x9a, 0x1b, 0x5c, + 0x1d, 0xdd, 0x17, 0x5d, 0x1e, 0x5c, 0x19, 0x97, 0xb1, 0x37, 0xb6, 0x37, + 0xb9, 0xaf, 0xb9, 0xb1, 0x30, 0xb6, 0x32, 0x3a, 0x74, 0x6f, 0x6e, 0x65, + 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x7c, 0xe8, + 0xde, 0xdc, 0xca, 0xda, 0xc2, 0xe0, 0xbe, 0xcc, 0xc2, 0xc6, 0xe8, 0xde, + 0xe4, 0x62, 0xf8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0x99, + 0x85, 0x8d, 0xd1, 0xbd, 0xc9, 0xc9, 0xf0, 0x99, 0x23, 0x93, 0xfb, 0xba, + 0x43, 0x4b, 0xa3, 0x2b, 0xfb, 0x82, 0x7b, 0x4b, 0x73, 0xa3, 0x1b, 0x02, + 0x0b, 0x60, 0xc0, 0x80, 0x81, 0x03, 0x06, 0xcc, 0x19, 0xa0, 0xc1, 0x19, + 0xa4, 0x01, 0x18, 0x38, 0x60, 0xe0, 0x80, 0x01, 0x73, 0x06, 0x68, 0x70, + 0x06, 0x6a, 0x00, 0x06, 0x11, 0x18, 0x38, 0x60, 0xc0, 0x9c, 0x01, 0x1a, + 0x9c, 0xc1, 0x1a, 0x80, 0x41, 0x05, 0x06, 0x0e, 0x18, 0x30, 0x67, 0x80, + 0x06, 0x67, 0xc0, 0x06, 0x60, 0xf0, 0x80, 0x81, 0x03, 0x06, 0xcc, 0x19, + 0xa0, 0xc1, 0x19, 0xb4, 0x01, 0x18, 0x58, 0x60, 0xe0, 0x80, 0x01, 0x73, + 0x06, 0x68, 0x70, 0x06, 0x6e, 0x00, 0x06, 0x17, 0x18, 0x38, 0x60, 0xc0, + 0x9c, 0x01, 0x1a, 0x9c, 0xc1, 0x1b, 0x80, 0x01, 0x06, 0x06, 0x0e, 0x18, + 0x30, 0x67, 0x80, 0x06, 0x67, 0x00, 0x07, 0x8c, 0xc2, 0xd2, 0xe4, 0x5c, + 0xc2, 0xe4, 0xce, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, 0xbe, 0xe6, 0xd2, 0xf4, + 0xca, 0x78, 0x85, 0xa5, 0xc9, 0xb9, 0x84, 0xc9, 0x9d, 0x7d, 0xd1, 0xe5, + 0xc1, 0x95, 0x7d, 0x85, 0xb1, 0xa5, 0x9d, 0xb9, 0x7d, 0xcd, 0xa5, 0xe9, + 0x95, 0xf1, 0x99, 0x42, 0x0b, 0x23, 0x2b, 0x93, 0x1b, 0x7a, 0x73, 0x9b, + 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0x63, 0x30, 0x36, 0x84, 0x0c, 0xc0, 0x80, + 0x3a, 0x83, 0x31, 0x38, 0x03, 0x32, 0x00, 0x03, 0xe9, 0x0c, 0xca, 0x00, + 0x0c, 0x18, 0x30, 0x68, 0xce, 0xc0, 0x0c, 0xce, 0xe0, 0x0c, 0xce, 0x20, + 0x0e, 0xce, 0x40, 0x0e, 0xc0, 0x40, 0x3a, 0x83, 0x39, 0x00, 0x03, 0xe7, + 0x0c, 0xa0, 0x33, 0xa0, 0x83, 0x33, 0xb8, 0xce, 0xa0, 0x0e, 0x68, 0x98, + 0xb1, 0xbd, 0x85, 0xd1, 0xcd, 0xd0, 0x78, 0x33, 0x33, 0x9b, 0x2b, 0xa3, + 0x23, 0x62, 0xc6, 0xf6, 0x16, 0x46, 0x37, 0x83, 0x37, 0x43, 0xa3, 0x2d, + 0x8c, 0x4e, 0x2e, 0x0d, 0x6f, 0x08, 0x05, 0x06, 0x0c, 0x18, 0x3c, 0x60, + 0xc0, 0x9c, 0xc1, 0x1d, 0x9c, 0x01, 0x1e, 0x80, 0xc1, 0x03, 0x06, 0x19, + 0x18, 0x30, 0x67, 0x90, 0x07, 0x67, 0xa0, 0x07, 0x4c, 0xb2, 0xaa, 0xac, + 0x88, 0xca, 0xc6, 0xde, 0xc8, 0xca, 0x68, 0x90, 0x95, 0x8d, 0xbd, 0x91, + 0x95, 0x0d, 0x21, 0x03, 0x30, 0x70, 0xce, 0x60, 0x0c, 0xce, 0x80, 0x0c, + 0xc0, 0x60, 0x3a, 0x83, 0x32, 0x00, 0x83, 0x06, 0x0c, 0x9a, 0x33, 0x30, + 0x83, 0x33, 0x38, 0x83, 0x33, 0xd8, 0x83, 0x33, 0x90, 0x03, 0x30, 0x98, + 0xce, 0x60, 0x0e, 0xc0, 0xe0, 0x39, 0x03, 0xe8, 0x0c, 0xf8, 0xe0, 0x0c, + 0xae, 0x33, 0xe8, 0x03, 0x2e, 0x61, 0x69, 0x72, 0x2e, 0x74, 0x65, 0x78, + 0x74, 0x75, 0x72, 0x65, 0x54, 0xc2, 0xd2, 0xe4, 0x5c, 0xe6, 0xc2, 0xda, + 0xe0, 0xd8, 0xca, 0x88, 0xd1, 0x95, 0xe1, 0xd1, 0xd5, 0xc9, 0x95, 0xc9, + 0x90, 0xf1, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xb1, 0x80, 0xcc, 0x85, 0xb5, + 0xc1, 0xb1, 0x95, 0xf9, 0x90, 0xa0, 0x2b, 0xc3, 0xcb, 0x1a, 0x42, 0x81, + 0x81, 0x76, 0x06, 0x7f, 0x70, 0x06, 0x65, 0x00, 0x06, 0x0c, 0x18, 0x34, + 0x67, 0x00, 0x0a, 0x67, 0x00, 0x9d, 0x41, 0x28, 0x9c, 0xc1, 0x75, 0x06, + 0xa2, 0x40, 0x8f, 0xae, 0x0c, 0x8f, 0xae, 0x4e, 0xae, 0x4c, 0x86, 0xec, + 0x2b, 0x4c, 0x4e, 0x2e, 0x2c, 0x8f, 0xc7, 0x8c, 0xed, 0x2d, 0x8c, 0x8e, + 0x05, 0x64, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0xcc, 0x87, 0x05, 0x5d, 0x19, + 0x5e, 0x95, 0xd5, 0x10, 0x0a, 0x0c, 0xb6, 0x33, 0xf8, 0x83, 0x33, 0x28, + 0x03, 0x30, 0x68, 0xc0, 0xa0, 0x39, 0x03, 0x50, 0x38, 0x03, 0xe8, 0x0c, + 0x48, 0xe1, 0x0c, 0xae, 0x33, 0x28, 0x05, 0x2e, 0x61, 0x69, 0x72, 0x2e, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x3c, 0xe6, 0xc2, 0xda, 0xe0, + 0xd8, 0xca, 0xe4, 0x18, 0xcc, 0x0d, 0x91, 0xc0, 0x80, 0x3b, 0x83, 0x53, + 0x38, 0x83, 0x32, 0x00, 0x03, 0x06, 0x0c, 0x9a, 0x33, 0x80, 0xce, 0x00, + 0x15, 0xce, 0xe0, 0x3a, 0x83, 0x54, 0x18, 0x02, 0x9d, 0x41, 0x76, 0x06, + 0xde, 0x19, 0x88, 0xc1, 0x19, 0xd8, 0xc1, 0x19, 0xf8, 0xc1, 0x19, 0x8c, + 0xc2, 0x19, 0x98, 0xc2, 0x19, 0xa8, 0xc2, 0x10, 0x23, 0x02, 0xce, 0x60, + 0x3a, 0x83, 0x55, 0xa0, 0x18, 0x84, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, + 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xcd, 0xa1, 0x4c, 0x11, + 0x31, 0x7d, 0x65, 0x55, 0x59, 0x7d, 0x99, 0xc9, 0x85, 0x9d, 0xb5, 0x95, + 0xb9, 0xd1, 0xa5, 0x0c, 0x21, 0xce, 0xc0, 0x15, 0xce, 0xa0, 0x15, 0x88, + 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, + 0xbd, 0xc1, 0x95, 0xb5, 0xd0, 0x95, 0xe1, 0xd1, 0xd5, 0xc9, 0x95, 0xcd, + 0x0d, 0x31, 0xce, 0x00, 0x16, 0xce, 0xc0, 0x15, 0xce, 0xe0, 0x15, 0x88, + 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, + 0xbd, 0xc1, 0x95, 0xb5, 0xcc, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0xcd, + 0x0d, 0x31, 0xce, 0x40, 0x16, 0xce, 0xc0, 0x15, 0xce, 0x20, 0x16, 0x86, + 0x10, 0x67, 0x00, 0x0b, 0x67, 0x20, 0x0b, 0xb4, 0xc2, 0xd2, 0xe4, 0x5a, + 0xc2, 0xd8, 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a, + 0xc2, 0xe4, 0xce, 0x50, 0x66, 0x52, 0x86, 0x18, 0x67, 0x50, 0x0b, 0x67, + 0xe0, 0x0a, 0x67, 0x40, 0x0b, 0xb4, 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8, + 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a, 0xc2, 0xe4, + 0xce, 0x50, 0x68, 0x52, 0x86, 0x18, 0x67, 0x70, 0x0b, 0x67, 0xe0, 0x0a, + 0x67, 0x60, 0x0b, 0x43, 0x88, 0x33, 0xa8, 0x85, 0x33, 0xb8, 0x85, 0x21, + 0xc2, 0x19, 0xdc, 0xc2, 0x10, 0xe3, 0x0c, 0x6a, 0xe1, 0x0c, 0x60, 0xe1, + 0x0c, 0x64, 0x81, 0xd5, 0x97, 0x16, 0xd5, 0x54, 0x4c, 0xcd, 0x14, 0x5a, + 0x18, 0x59, 0x99, 0xdc, 0xd0, 0x9b, 0xdb, 0x1c, 0x5d, 0x98, 0x1b, 0xdd, + 0x1c, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, 0x37, 0xba, 0x32, 0x37, 0x3a, + 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, + 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x43, 0x84, 0x33, + 0xe8, 0x85, 0x21, 0xc6, 0x19, 0xf0, 0xc2, 0x19, 0xf8, 0xc2, 0x1a, 0x78, + 0x43, 0x8c, 0x33, 0x40, 0x83, 0x33, 0xf8, 0x85, 0x35, 0xf0, 0x86, 0x88, + 0xc1, 0x19, 0xec, 0xc2, 0x19, 0x80, 0xc3, 0x1a, 0x78, 0x67, 0x00, 0x0e, + 0x6b, 0xf0, 0x9d, 0x01, 0x38, 0xac, 0x01, 0x18, 0x9c, 0x01, 0x38, 0xac, + 0x41, 0x18, 0x9c, 0x01, 0x38, 0xac, 0x81, 0x18, 0x9c, 0x01, 0x38, 0xac, + 0xc1, 0x18, 0x9c, 0x01, 0x38, 0xac, 0x01, 0x19, 0x9c, 0x01, 0x38, 0xac, + 0x41, 0x37, 0xc4, 0x38, 0x83, 0x70, 0x38, 0x03, 0x70, 0x58, 0x03, 0x30, + 0x18, 0x62, 0x9c, 0x41, 0x38, 0x9c, 0x01, 0x38, 0xac, 0x41, 0x37, 0xc4, + 0x38, 0x83, 0x70, 0x38, 0x03, 0x70, 0x58, 0x03, 0x31, 0x18, 0x62, 0x9c, + 0x41, 0x38, 0x9c, 0x01, 0x38, 0xac, 0xc1, 0x18, 0x0c, 0x31, 0xce, 0x20, + 0x1c, 0xce, 0x00, 0x1c, 0xd6, 0x80, 0x0c, 0x86, 0x18, 0x67, 0x10, 0x0e, + 0x67, 0x00, 0x0e, 0x6b, 0xf0, 0x0d, 0x31, 0xce, 0x20, 0x1c, 0xce, 0x00, + 0x1c, 0xd6, 0x20, 0x0c, 0x86, 0x18, 0x67, 0x10, 0x0e, 0x67, 0x00, 0x0e, + 0x6b, 0xe0, 0x8d, 0x88, 0xd8, 0x81, 0x1d, 0xec, 0xa1, 0x1d, 0xdc, 0xa0, + 0x1d, 0xde, 0x81, 0x1c, 0xea, 0x81, 0x1d, 0xca, 0xc1, 0x0d, 0xcc, 0x81, + 0x1d, 0xc2, 0xe1, 0x1c, 0xe6, 0x61, 0x8a, 0x10, 0x0c, 0x23, 0x14, 0x76, + 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x48, 0x07, 0x72, 0x28, 0x07, 0x77, + 0xa0, 0x87, 0x29, 0x41, 0x31, 0x62, 0x09, 0x87, 0x74, 0x90, 0x07, 0x37, + 0xb0, 0x87, 0x72, 0x90, 0x87, 0x79, 0x48, 0x87, 0x77, 0x70, 0x87, 0x29, + 0x81, 0x31, 0x82, 0x0a, 0x87, 0x74, 0x90, 0x07, 0x37, 0x60, 0x87, 0x70, + 0x70, 0x87, 0x73, 0xa8, 0x87, 0x70, 0x38, 0x87, 0x72, 0xf8, 0x05, 0x7b, + 0x28, 0x07, 0x79, 0x98, 0x87, 0x74, 0x78, 0x07, 0x77, 0x98, 0x12, 0x20, + 0x23, 0xa6, 0x70, 0x48, 0x07, 0x79, 0x70, 0x83, 0x71, 0x78, 0x87, 0x76, + 0x80, 0x87, 0x74, 0x60, 0x87, 0x72, 0xf8, 0x85, 0x77, 0x80, 0x07, 0x7a, + 0x48, 0x87, 0x77, 0x70, 0x87, 0x79, 0x98, 0x32, 0x28, 0x8c, 0x33, 0x82, + 0x09, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x07, 0x79, 0x08, 0x87, 0x73, + 0x68, 0x87, 0x72, 0x70, 0x07, 0x7a, 0x98, 0x12, 0xb0, 0x02, 0x00, 0x00, + 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, + 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, + 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, + 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, + 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, + 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, + 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, + 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, + 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, + 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, + 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, + 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, + 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, + 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, + 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, + 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, + 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, + 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, + 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, + 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, + 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, + 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, + 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, + 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, + 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, + 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, + 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, + 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, + 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, + 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, + 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, + 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, + 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, + 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, + 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, + 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, + 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, + 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, + 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, + 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, + 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, + 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, + 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, + 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, + 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, + 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, + 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, + 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, + 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, + 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, + 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, + 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, + 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, + 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, + 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, + 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, + 0x00, 0x35, 0x00, 0x00, 0x00, 0x56, 0x90, 0xfd, 0x73, 0x6d, 0x6b, 0xcf, + 0xb3, 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74, 0xd5, 0xfd, 0x17, 0x45, + 0x51, 0x14, 0x96, 0x30, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, + 0x03, 0x5c, 0x7e, 0x75, 0x17, 0xb7, 0x6d, 0x01, 0x14, 0x80, 0x44, 0x7e, + 0x01, 0x48, 0xd3, 0x2f, 0x2c, 0x00, 0xf3, 0xf8, 0xd5, 0x5d, 0xdc, 0xb6, + 0x09, 0x40, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0xff, 0xe3, 0x58, 0x7e, + 0x71, 0xdb, 0x36, 0x10, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, + 0x10, 0x48, 0x7e, 0x71, 0xdb, 0x76, 0x20, 0x01, 0x48, 0xe4, 0x17, 0x80, + 0x34, 0xfd, 0x8f, 0x63, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x29, 0x84, 0x01, + 0x80, 0x44, 0xbe, 0x04, 0x30, 0xcf, 0x42, 0xfc, 0x13, 0x71, 0x4d, 0x54, + 0x44, 0xfc, 0xf6, 0xf0, 0x03, 0x51, 0x04, 0x60, 0x7e, 0x85, 0x17, 0xb7, + 0x6d, 0x04, 0x0d, 0x80, 0x44, 0xfe, 0xe0, 0x4c, 0x7e, 0x75, 0x17, 0xb7, + 0x6d, 0x0b, 0x1b, 0x80, 0x44, 0xbe, 0x04, 0x30, 0xcf, 0x42, 0xfc, 0x13, + 0x71, 0x4d, 0x54, 0x44, 0xfc, 0xf6, 0xe0, 0x57, 0x78, 0x71, 0xdb, 0x86, + 0x30, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, 0x10, 0x48, 0x7e, + 0x75, 0x17, 0xb7, 0x6d, 0x00, 0x10, 0xdb, 0x95, 0xbf, 0xec, 0xbe, 0x7f, + 0x11, 0x01, 0x06, 0x43, 0x34, 0x93, 0x19, 0x44, 0x00, 0x12, 0xf9, 0x05, + 0x20, 0x4d, 0x7f, 0xc1, 0x00, 0x97, 0x5f, 0xdc, 0x36, 0x00, 0x00, 0x00, + 0x00, 0x61, 0x20, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e, + 0x10, 0x0b, 0x04, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x14, 0x8f, 0x45, + 0x00, 0x81, 0x70, 0xcc, 0x41, 0x30, 0x0d, 0x84, 0x07, 0xb4, 0x16, 0x41, + 0x09, 0x50, 0x3a, 0xc7, 0xc0, 0xe0, 0x01, 0x1e, 0x8c, 0x00, 0x8c, 0x35, + 0x00, 0x81, 0x40, 0xe2, 0x08, 0x00, 0x85, 0x23, 0x00, 0x35, 0x40, 0xe0, + 0x0c, 0x00, 0x01, 0x63, 0x04, 0xef, 0x9e, 0x96, 0xf7, 0x37, 0x46, 0xa0, + 0xb3, 0xe6, 0x1c, 0x82, 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x09, 0x06, + 0x63, 0x04, 0x20, 0x08, 0x82, 0x20, 0x18, 0xcc, 0x00, 0x50, 0x30, 0x03, + 0x30, 0x03, 0x30, 0x07, 0x21, 0x0b, 0xb2, 0x20, 0x0b, 0xb3, 0x30, 0x07, + 0x31, 0x0b, 0xb9, 0x30, 0x0b, 0x7d, 0x40, 0xc5, 0x0c, 0xc0, 0x08, 0xc0, + 0x0c, 0xc0, 0x58, 0x03, 0x08, 0x82, 0x20, 0xfe, 0x81, 0x20, 0x08, 0xe2, + 0x1f, 0x08, 0x82, 0x20, 0xfe, 0x8d, 0x35, 0xb0, 0xed, 0xfc, 0x93, 0x1e, + 0xdb, 0xce, 0x3f, 0xe9, 0xb1, 0xed, 0xfc, 0x93, 0xde, 0x58, 0x03, 0x08, + 0x82, 0x6c, 0xfd, 0x0b, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, 0xc8, + 0xd6, 0xbf, 0x30, 0xd6, 0x00, 0x82, 0xe0, 0x9a, 0x83, 0x01, 0x08, 0x82, + 0x6b, 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x8c, 0x35, 0x80, 0x20, + 0xdd, 0xe6, 0x60, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, 0x6d, + 0x0e, 0x06, 0x63, 0x0d, 0xeb, 0x88, 0xc7, 0x2c, 0x18, 0xac, 0x23, 0x1e, + 0xb3, 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x58, 0x03, 0x08, 0xc2, + 0x78, 0x38, 0x06, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, 0x87, + 0x63, 0x30, 0xd6, 0x20, 0xe6, 0x62, 0xda, 0x7f, 0x60, 0xc9, 0xb3, 0xf1, + 0x2f, 0x8c, 0xe9, 0xaa, 0xe6, 0xbe, 0x30, 0xd6, 0xf0, 0xcf, 0xa4, 0xff, + 0xfb, 0x02, 0x5d, 0x83, 0x62, 0xfe, 0xb5, 0x70, 0x1c, 0x83, 0xbe, 0x30, + 0xd6, 0x30, 0xf7, 0x6d, 0x9a, 0xfa, 0x42, 0xeb, 0x86, 0x3c, 0xef, 0x0b, + 0x7c, 0xce, 0xfa, 0xf8, 0x47, 0xc0, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, + 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0x79, 0xaf, 0xab, + 0xec, 0xcd, 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, + 0xdb, 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba, 0xf8, 0x37, + 0x46, 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8, 0xf6, 0x34, + 0x18, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x23, 0x06, 0x4a, 0x11, 0xbc, 0xc2, 0x1b, 0xb4, 0x81, 0x1c, 0x8c, + 0x41, 0x19, 0x90, 0x41, 0x30, 0x62, 0xb0, 0x14, 0x41, 0x2c, 0xbc, 0x81, + 0x1b, 0xcc, 0xc1, 0x2b, 0x90, 0x81, 0x19, 0x94, 0x81, 0x30, 0x86, 0x10, + 0xc0, 0xc2, 0x20, 0xc3, 0xe0, 0xad, 0xc1, 0x1c, 0x43, 0x20, 0xc4, 0xc2, + 0x88, 0xc1, 0x52, 0x04, 0xb5, 0x30, 0x07, 0x72, 0x70, 0x07, 0xb2, 0x80, + 0x06, 0x6a, 0x90, 0x06, 0xc6, 0x18, 0x42, 0x40, 0x0b, 0x73, 0x0c, 0x43, + 0x10, 0x0b, 0x87, 0x07, 0xea, 0x52, 0x50, 0x06, 0x19, 0x02, 0x33, 0x80, + 0x03, 0x23, 0x02, 0xf8, 0x8c, 0x37, 0xf0, 0x01, 0x2a, 0xe4, 0xc2, 0x05, + 0xea, 0x52, 0x50, 0x06, 0x19, 0x82, 0x35, 0xa8, 0x83, 0x11, 0x83, 0xc2, + 0x08, 0xcc, 0xa1, 0x08, 0xc6, 0x2b, 0x42, 0xa1, 0x15, 0x7c, 0xe1, 0x17, + 0xf4, 0xe0, 0x02, 0x75, 0x29, 0x28, 0x83, 0x0c, 0x01, 0x1c, 0xe8, 0xc1, + 0x88, 0x41, 0x61, 0x04, 0xeb, 0xa0, 0x04, 0xe3, 0x15, 0xa6, 0x20, 0x0b, + 0xe3, 0x40, 0x0e, 0xa0, 0x70, 0x81, 0xba, 0x14, 0x94, 0x41, 0x86, 0xa0, + 0x0e, 0xfe, 0x60, 0xc4, 0xa0, 0x30, 0x02, 0x78, 0x78, 0x82, 0x39, 0x86, + 0x3a, 0x58, 0xd2, 0x61, 0x8e, 0x21, 0x38, 0xd2, 0x61, 0x8e, 0x21, 0x18, + 0xce, 0x61, 0xbc, 0xe1, 0x15, 0x74, 0x01, 0x1d, 0x28, 0x18, 0xc3, 0x0d, + 0xc1, 0x1f, 0x04, 0xb3, 0x0c, 0x81, 0x10, 0x0c, 0x32, 0x10, 0x7d, 0x70, + 0x0a, 0xe3, 0x0d, 0xb3, 0xe0, 0x0b, 0xe0, 0x40, 0xc1, 0x18, 0x31, 0x20, + 0x8c, 0xc0, 0x1e, 0x86, 0x11, 0x83, 0xc2, 0x08, 0xf0, 0x21, 0xc8, 0x03, + 0x0b, 0xf2, 0x00, 0x3e, 0x23, 0x06, 0x85, 0x11, 0xe0, 0x43, 0xe0, 0x07, + 0x36, 0xe8, 0x81, 0x7c, 0x4c, 0x0f, 0x82, 0xf8, 0xd8, 0x10, 0xd0, 0x67, + 0xc4, 0x80, 0x30, 0x82, 0x7e, 0x08, 0x46, 0x0c, 0x0a, 0x23, 0xf8, 0x87, + 0x80, 0x0f, 0x2c, 0xe0, 0x03, 0xf9, 0xcc, 0x31, 0x98, 0xc2, 0xc2, 0x0f, + 0x83, 0x0c, 0xc1, 0x29, 0xd8, 0x82, 0x0d, 0x01, 0x7d, 0x06, 0x19, 0x82, + 0x54, 0xe0, 0x85, 0x41, 0x86, 0xa0, 0xf2, 0x85, 0x59, 0x02, 0x61, 0xa0, + 0x22, 0x10, 0x02, 0x36, 0x00, 0xc6, 0x1b, 0xca, 0x01, 0x1e, 0x40, 0x82, + 0x82, 0x31, 0xdc, 0x10, 0xdc, 0x81, 0x33, 0xcb, 0x30, 0x10, 0xc1, 0x20, + 0x03, 0x31, 0x0b, 0xbd, 0x30, 0xde, 0x90, 0x0e, 0xf4, 0x80, 0x0f, 0x14, + 0x8c, 0xf1, 0x86, 0x75, 0xb0, 0x87, 0x7c, 0xa0, 0x60, 0x8c, 0x18, 0x20, + 0x47, 0x14, 0x13, 0x45, 0x77, 0x0c, 0xc1, 0x20, 0x43, 0x50, 0x0b, 0xe8, + 0x30, 0xc8, 0x10, 0x2c, 0xea, 0x30, 0x4b, 0x40, 0x0c, 0x54, 0x04, 0xc2, + 0x80, 0x09, 0xc3, 0x0d, 0x61, 0x70, 0x0a, 0xc1, 0x2c, 0x43, 0x31, 0x05, + 0xe3, 0x0d, 0xf2, 0xd0, 0x0f, 0x2e, 0x41, 0xc1, 0x18, 0x6e, 0x08, 0x54, + 0x21, 0x98, 0x65, 0x30, 0x8e, 0x60, 0x90, 0xa1, 0x00, 0x07, 0x75, 0x18, + 0x6f, 0xb0, 0x87, 0x90, 0x58, 0x09, 0x0a, 0xc6, 0x1c, 0xc3, 0x2f, 0x04, + 0x35, 0x31, 0xc8, 0x10, 0x80, 0xc3, 0x3b, 0x58, 0x50, 0xc8, 0x67, 0x90, + 0x21, 0x10, 0x87, 0x7a, 0x98, 0x25, 0x68, 0x83, 0xf1, 0x06, 0x7e, 0x38, + 0x89, 0x9c, 0xa0, 0x60, 0x8c, 0x37, 0xf8, 0x43, 0x4a, 0xcc, 0x04, 0x05, + 0x63, 0x90, 0x01, 0x5a, 0x07, 0x7d, 0x18, 0x6e, 0x20, 0x62, 0xc1, 0x99, + 0x65, 0x40, 0xa4, 0x60, 0x0c, 0x41, 0xfa, 0x89, 0xe1, 0x86, 0x60, 0x17, + 0x94, 0x59, 0x06, 0x25, 0x09, 0x4c, 0xe8, 0x05, 0xf9, 0xcc, 0x12, 0x2c, + 0x36, 0xfc, 0x02, 0x7c, 0x46, 0x0c, 0x08, 0x23, 0x60, 0x8b, 0xc0, 0x82, + 0x7b, 0x90, 0xcf, 0x88, 0x41, 0x61, 0x04, 0x6f, 0x11, 0xdc, 0xc3, 0x2c, + 0xc1, 0x32, 0x50, 0x01, 0x28, 0x89, 0xa0, 0xcc, 0x31, 0xd0, 0x43, 0x70, + 0x16, 0x63, 0x08, 0xdb, 0x59, 0x0c, 0x37, 0x04, 0xe4, 0xa0, 0xcc, 0x32, + 0x34, 0x4c, 0x60, 0x82, 0x39, 0xc8, 0x67, 0x96, 0xc0, 0xb1, 0x01, 0x1d, + 0xe0, 0x33, 0x62, 0x40, 0x18, 0x41, 0x5d, 0x04, 0x16, 0x80, 0x84, 0x7c, + 0x46, 0x0c, 0x0a, 0x23, 0xc0, 0x8b, 0x00, 0x24, 0x66, 0x09, 0x9c, 0x81, + 0x0a, 0x40, 0x61, 0x84, 0x66, 0x8e, 0x21, 0x09, 0xde, 0x62, 0x0c, 0x81, + 0x0c, 0xda, 0x62, 0xb8, 0x21, 0x68, 0x07, 0x65, 0x96, 0x01, 0x7a, 0x02, + 0x13, 0xde, 0x41, 0x3e, 0xb3, 0x04, 0x91, 0x0d, 0xf1, 0x00, 0x9f, 0x11, + 0x03, 0xc2, 0x08, 0xfc, 0x22, 0xb0, 0x20, 0x25, 0xe4, 0x33, 0x62, 0x50, + 0x18, 0x41, 0x68, 0x04, 0x29, 0x31, 0x4b, 0x10, 0x0d, 0x54, 0x00, 0xca, + 0x23, 0x40, 0x73, 0x0c, 0x49, 0x50, 0x17, 0xb3, 0x04, 0xd2, 0x40, 0x45, + 0x20, 0x44, 0x7a, 0x70, 0x0c, 0x32, 0x04, 0x29, 0x31, 0x13, 0x73, 0x0c, + 0x26, 0x01, 0x06, 0x7c, 0x31, 0xc8, 0x10, 0x9c, 0x84, 0x4d, 0xd8, 0x10, + 0xc8, 0x67, 0x90, 0x21, 0x48, 0x09, 0x9e, 0x98, 0x25, 0x68, 0x83, 0xe1, + 0x86, 0x59, 0x80, 0x89, 0x60, 0x96, 0x81, 0x02, 0x83, 0x60, 0x90, 0x81, + 0x0e, 0x5e, 0x22, 0x27, 0xc6, 0x1b, 0xca, 0x02, 0x2e, 0x44, 0x83, 0x82, + 0x31, 0xde, 0x70, 0x16, 0x72, 0xc1, 0x17, 0x14, 0x8c, 0x39, 0x06, 0x98, + 0x08, 0x4c, 0x63, 0x90, 0x21, 0x88, 0x09, 0xb0, 0xb0, 0xe0, 0x90, 0xcf, + 0x20, 0x43, 0x30, 0x13, 0x66, 0x31, 0xdc, 0x70, 0xf4, 0x83, 0x33, 0xcb, + 0xf0, 0x55, 0xc1, 0x18, 0xc2, 0xb0, 0x1a, 0xc3, 0x0d, 0x01, 0x48, 0x28, + 0xb3, 0x0c, 0x97, 0x15, 0x98, 0x20, 0x12, 0xf2, 0x99, 0x25, 0xc0, 0x46, + 0x0c, 0x08, 0x23, 0xb8, 0x8d, 0x61, 0xc4, 0xa0, 0x30, 0x82, 0xdc, 0x08, + 0x4a, 0xc2, 0x82, 0x93, 0x90, 0x8f, 0x05, 0x29, 0x01, 0x9f, 0x59, 0x02, + 0x6c, 0xa0, 0x02, 0x50, 0x2c, 0xe1, 0x9a, 0x63, 0xd8, 0x89, 0x60, 0x36, + 0xc6, 0x10, 0x98, 0xd9, 0x18, 0x6e, 0x08, 0x52, 0x42, 0x99, 0x65, 0xd0, + 0xb2, 0xc0, 0x84, 0x95, 0x90, 0xcf, 0x2c, 0xc1, 0x36, 0x62, 0x40, 0x18, + 0x01, 0x78, 0x0c, 0x23, 0x06, 0x85, 0x11, 0x88, 0x47, 0xe0, 0x12, 0x16, + 0xc0, 0x84, 0x7c, 0x2c, 0x90, 0x09, 0xf8, 0xcc, 0x12, 0x6c, 0x03, 0x15, + 0x80, 0x92, 0x09, 0xda, 0x1c, 0x43, 0x12, 0xec, 0xc6, 0x18, 0x42, 0x95, + 0x1b, 0xc3, 0x0d, 0x81, 0x4c, 0x28, 0xb3, 0x0c, 0x1d, 0x17, 0x98, 0x40, + 0x13, 0xf2, 0x99, 0x25, 0xf0, 0x46, 0x0c, 0x08, 0x23, 0x48, 0x8f, 0x61, + 0xc4, 0xa0, 0x30, 0x82, 0xf5, 0x08, 0x6e, 0xc2, 0x82, 0x9c, 0x90, 0x8f, + 0x05, 0x3b, 0x01, 0x9f, 0x59, 0x02, 0x6f, 0xa0, 0x02, 0x50, 0x38, 0xa1, + 0x9b, 0x63, 0x48, 0x82, 0xf0, 0x18, 0x31, 0x30, 0x8c, 0x20, 0x3e, 0x82, + 0xb7, 0x68, 0x8b, 0x41, 0x86, 0x20, 0x2e, 0x48, 0x63, 0x96, 0xe0, 0x1b, + 0xa8, 0x08, 0xfc, 0x80, 0x12, 0xbc, 0x41, 0x86, 0xe0, 0x2e, 0x4c, 0x63, + 0x96, 0xa0, 0x0d, 0x66, 0x19, 0xc2, 0xa0, 0x0d, 0xf8, 0x61, 0x90, 0xa1, + 0x17, 0xf0, 0x42, 0x34, 0x46, 0x0c, 0x0a, 0x23, 0x98, 0x8f, 0x60, 0x2d, + 0xe6, 0x18, 0xe8, 0x22, 0x60, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0xea, 0x63, + 0x60, 0x8b, 0x39, 0x06, 0x21, 0x68, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0xee, + 0xa3, 0x68, 0x8b, 0x39, 0x06, 0x21, 0x60, 0x8f, 0x41, 0x86, 0x60, 0x2f, + 0x5c, 0x63, 0x90, 0x21, 0x28, 0x07, 0xd8, 0x18, 0x6f, 0xb0, 0x8d, 0xf0, + 0x98, 0x0f, 0x0a, 0xc6, 0x78, 0x03, 0x6e, 0x8c, 0x47, 0x7b, 0x50, 0x30, + 0xe6, 0x18, 0x42, 0x23, 0xb8, 0x8f, 0x41, 0x86, 0x40, 0x34, 0x62, 0xc3, + 0x82, 0x44, 0x3e, 0x83, 0x0c, 0x01, 0x69, 0xdc, 0xc6, 0x70, 0xc3, 0xe1, + 0x16, 0xce, 0x2c, 0x03, 0x1b, 0x88, 0x41, 0x30, 0x86, 0x30, 0xf0, 0xc7, + 0x70, 0x43, 0x10, 0x17, 0xca, 0x2c, 0x03, 0x19, 0x8c, 0x41, 0x60, 0xc2, + 0x5c, 0xc8, 0x67, 0x96, 0xa0, 0x0c, 0x46, 0x0c, 0x08, 0x23, 0x40, 0x91, + 0x61, 0xc4, 0xa0, 0x30, 0x02, 0x15, 0x09, 0xec, 0xc2, 0x02, 0xbc, 0x90, + 0x8f, 0x05, 0x7a, 0x01, 0x9f, 0x59, 0x82, 0x32, 0x18, 0xa8, 0x00, 0x94, + 0x31, 0x10, 0xc8, 0x60, 0x8e, 0x81, 0x35, 0x02, 0x12, 0x19, 0x43, 0x60, + 0x48, 0x64, 0xb8, 0x21, 0xd0, 0x0b, 0x65, 0x96, 0xe1, 0x0c, 0xcc, 0x20, + 0x30, 0x81, 0x2f, 0xe4, 0x33, 0x4b, 0x80, 0x06, 0x23, 0x06, 0x84, 0x11, + 0xc4, 0xc8, 0x30, 0x62, 0x50, 0x18, 0xc1, 0x8c, 0x04, 0x7f, 0x61, 0x41, + 0x68, 0xc8, 0xc7, 0x82, 0xd1, 0x80, 0xcf, 0x2c, 0x01, 0x1a, 0x0c, 0x54, + 0x00, 0x8a, 0x19, 0x08, 0x67, 0x30, 0xc7, 0x90, 0x04, 0x2c, 0x32, 0x86, + 0x50, 0xa9, 0xc8, 0x70, 0x43, 0x30, 0x1a, 0xca, 0x2c, 0x83, 0x1a, 0xa4, + 0x41, 0x60, 0x42, 0x69, 0xc8, 0x67, 0x96, 0x60, 0x0d, 0x46, 0x0c, 0x08, + 0x23, 0xd0, 0x91, 0x61, 0xc4, 0xa0, 0x30, 0x02, 0x1e, 0x09, 0x50, 0xc3, + 0x02, 0xd5, 0x90, 0x8f, 0x05, 0xac, 0x01, 0x9f, 0x59, 0x82, 0x35, 0x18, + 0xa8, 0x00, 0x94, 0x34, 0x10, 0xd4, 0x60, 0x8e, 0x21, 0x09, 0x64, 0x64, + 0xc4, 0xc0, 0x30, 0x02, 0x31, 0x09, 0xc0, 0xc3, 0x37, 0x06, 0x19, 0x02, + 0xf1, 0xa8, 0x8f, 0x59, 0x02, 0x36, 0x18, 0xa8, 0x08, 0xfc, 0x20, 0x0c, + 0x84, 0x35, 0x18, 0x64, 0x08, 0xd0, 0xe3, 0x3e, 0x66, 0x09, 0xda, 0x60, + 0xa0, 0x25, 0xe0, 0x11, 0x83, 0x47, 0x24, 0x1e, 0xf9, 0x64, 0x81, 0x0d, + 0x78, 0x04, 0x0c, 0x06, 0x5a, 0x02, 0x14, 0x31, 0xf4, 0x42, 0x32, 0x87, + 0x8f, 0x60, 0x03, 0xd7, 0x01, 0x83, 0x41, 0x86, 0x40, 0xd8, 0x0f, 0x0b, + 0x46, 0x44, 0x3e, 0x19, 0x84, 0x03, 0x01, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0xd7, 0xd2, 0x07, 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4, + 0x50, 0x13, 0xe7, 0x2c, 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d, + 0x9b, 0x6d, 0x29, 0x38, 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b, + 0x00, 0x03, 0x11, 0x71, 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71, + 0x21, 0x13, 0x00, 0x00, 0x00, 0x01, 0x31, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x5b, 0x0a, 0xe0, 0x98, 0x05, 0x04, 0x17, 0xb6, 0x14, 0xc1, 0x31, + 0x0b, 0x08, 0x2e, 0x6c, 0x29, 0x8a, 0x63, 0x16, 0x10, 0x5c, 0xd8, 0x52, + 0x24, 0x47, 0x2e, 0x20, 0xba, 0xb0, 0xa5, 0x70, 0x8e, 0x5c, 0x40, 0x74, + 0x61, 0x4b, 0x31, 0x1d, 0xb9, 0x80, 0xe8, 0xc2, 0x96, 0x02, 0x3b, 0x72, + 0x01, 0xd1, 0x85, 0x2d, 0xc3, 0x17, 0x88, 0xc3, 0x96, 0x81, 0x0c, 0x82, + 0x71, 0xd8, 0x32, 0xdc, 0x41, 0x40, 0x0e, 0x5b, 0x06, 0x3e, 0x08, 0xca, + 0x61, 0xcb, 0xe0, 0x07, 0x81, 0x39, 0x6c, 0x19, 0x4e, 0x21, 0x38, 0x87, + 0x2d, 0x03, 0x2b, 0x04, 0xe8, 0xb0, 0x65, 0x98, 0x85, 0x20, 0x1d, 0xb6, + 0x0c, 0xb5, 0x10, 0xa0, 0xc3, 0x96, 0x21, 0x25, 0x82, 0x74, 0xd8, 0x32, + 0xac, 0x44, 0x80, 0x0e, 0x5b, 0x86, 0xd3, 0x08, 0xd2, 0x61, 0xcb, 0x90, + 0x1a, 0x01, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x14, 0xcf, 0x41, 0x30, 0x0d, 0xe4, 0x06, + 0x94, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xe0, 0x0c, 0x00, 0x05, + 0x33, 0x00, 0x54, 0xcc, 0x00, 0x8c, 0x35, 0xb0, 0xec, 0x19, 0xca, 0x1f, + 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce, 0xde, 0x58, 0x83, 0x5e, + 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf, 0xdb, 0xa7, 0xf4, 0xe8, + 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a, 0xc2, 0xe8, 0xee, 0xdd, + 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25, + 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f, + 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c, + 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2, + 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05, 0x33, 0x00, 0x04, 0x8c, + 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82, + 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5, 0x02, 0x0d, 0x37, 0x50, + 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43, 0x43, 0xc5, 0xc1, 0x20, + 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64, 0x08, 0xa0, 0x6a, 0x96, + 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61, 0x48, 0x82, 0xe1, 0x86, + 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31, 0x28, 0x8c, 0xe0, 0x0f, + 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xf0, 0x60, 0xc4, 0xa0, 0x30, 0x82, 0x50, + 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xc8, 0x83, 0x11, 0x83, 0xc2, 0x08, 0x46, + 0x21, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xc0, 0x83, 0x59, 0x82, 0x62, 0xa0, + 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xfc, 0x60, 0x0c, 0x41, 0xf0, + 0x83, 0x31, 0x84, 0x81, 0x0f, 0x46, 0x0c, 0x0a, 0x23, 0x38, 0x05, 0x21, + 0x18, 0x31, 0x28, 0x8c, 0x00, 0x15, 0x88, 0x60, 0xb8, 0x21, 0xb8, 0x84, + 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c, 0x0c, 0x6c, 0x40, 0x03, + 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90, 0x8f, 0x05, 0x1a, 0x7c, + 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81, 0x2a, 0x0c, 0x32, 0x04, + 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64, 0x08, 0xd2, 0xc0, 0x0d, + 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4, 0xa0, 0x98, 0x65, 0x40, + 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18, 0x31, 0x28, 0x8c, 0x00, + 0x17, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0x20, 0x16, 0x46, 0x0c, 0x0a, + 0x23, 0xd0, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84, 0x40, 0x16, 0x46, 0x0c, + 0x0a, 0x23, 0xe0, 0x85, 0x42, 0x0d, 0xe6, 0x18, 0x84, 0x20, 0x16, 0x66, + 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57, 0x10, 0x04, 0x04, 0x3a, + 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00 + 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x1c, 0x1c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, + 0xde, 0x21, 0x0c, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x0b, 0x82, 0x20, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, + 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, + 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, + 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, + 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, + 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8, + 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, + 0x00, 0xf7, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90, + 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68, + 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, + 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, 0x1d, 0xd2, 0xc1, 0x1d, + 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, 0x1d, 0xda, 0xc0, 0x1e, + 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, 0xee, 0x21, 0x1d, + 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, 0xc0, 0x03, 0x60, 0x70, + 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48, + 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90, + 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70, + 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68, + 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, + 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, + 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, + 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d, + 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, + 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98, + 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, + 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, + 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, + 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, + 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38, + 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78, + 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, + 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, + 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d, + 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, + 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18, + 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18, + 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30, + 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00, + 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c, + 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, + 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0xc3, 0x26, 0x10, 0xc0, + 0x02, 0x54, 0x43, 0x38, 0xa4, 0x83, 0x3c, 0xb4, 0x81, 0x38, 0xd4, 0x83, + 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0xb8, 0xc3, 0x3b, 0xb4, 0x41, + 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00, 0x1b, 0xb6, 0xa1, 0x00, + 0x16, 0xa0, 0x1a, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, + 0xcc, 0xc1, 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d, + 0xc2, 0x81, 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0xd8, 0x60, 0x10, 0x08, + 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, + 0x00, 0x6a, 0x83, 0x8f, 0x18, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, + 0x50, 0x11, 0xe1, 0x00, 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d, + 0x60, 0x0e, 0xf5, 0xe0, 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, + 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, + 0x39, 0x00, 0x44, 0x3b, 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3, + 0x39, 0x84, 0x03, 0x3b, 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, + 0x3b, 0xc8, 0x43, 0x1b, 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03, + 0x90, 0x07, 0x76, 0x00, 0x0c, 0xee, 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5, + 0x90, 0x0e, 0xec, 0x40, 0x0f, 0xe9, 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee, + 0xf0, 0x0e, 0x6d, 0x60, 0x0e, 0xf2, 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d, + 0x00, 0x0f, 0xef, 0x90, 0x0e, 0xee, 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d, + 0x50, 0x0e, 0xec, 0x90, 0x0e, 0xed, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, + 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, + 0x3b, 0x94, 0x43, 0x1b, 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, + 0x39, 0xc8, 0x43, 0x1b, 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81, + 0x3b, 0xbc, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03, + 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, + 0x90, 0x0e, 0xee, 0x60, 0x0e, 0xf3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, + 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, + 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3, + 0x3c, 0xb4, 0x81, 0x39, 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, + 0x3a, 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, + 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xe7, 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d, + 0xa0, 0x0f, 0xe5, 0x20, 0x0f, 0xef, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, + 0xd0, 0x06, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, + 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3, 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43, + 0x38, 0xc0, 0x03, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43, + 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, + 0x31, 0x0f, 0xf4, 0x10, 0x0e, 0xe3, 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2, + 0xf0, 0x0e, 0xf4, 0x50, 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d, + 0x20, 0x0e, 0xf5, 0x60, 0x0e, 0xe6, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3, + 0x90, 0x0e, 0xfa, 0x50, 0x0e, 0x00, 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3, + 0x3c, 0x84, 0x83, 0x39, 0x94, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, + 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, + 0x00, 0x6c, 0x40, 0x8e, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x06, 0x90, + 0x80, 0x6a, 0x83, 0x81, 0x04, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x44, 0x00, + 0x16, 0xa0, 0xda, 0x80, 0x28, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x0c, + 0x20, 0x01, 0xd5, 0x06, 0x63, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, + 0x00, 0x6a, 0xc3, 0xc4, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x28, 0x80, + 0x34, 0xb8, 0xc3, 0x3b, 0xb4, 0x81, 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03, + 0x3d, 0xa4, 0x83, 0x3b, 0xcc, 0x03, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x41, + 0x31, 0x21, 0x30, 0x26, 0x0c, 0x07, 0x92, 0x4c, 0x18, 0x14, 0x24, 0x99, + 0x10, 0x2c, 0x13, 0x02, 0x06, 0x89, 0x20, 0x00, 0x00, 0x43, 0x00, 0x00, + 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, + 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, + 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xb8, 0xc1, 0x0c, 0xc0, 0x30, 0x02, + 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, + 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18, + 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6, + 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4, + 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50, + 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21, + 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29, + 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1, + 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0xb8, 0x48, 0x9a, 0x22, 0x4a, + 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00, + 0x06, 0x11, 0x18, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44, 0xb2, 0x2c, 0x0d, + 0x39, 0x85, 0x28, 0x8a, 0xa2, 0x20, 0xa8, 0x0c, 0x00, 0x00, 0x90, 0x54, + 0x04, 0x00, 0x20, 0xaa, 0x0c, 0x40, 0x51, 0x90, 0x55, 0x8c, 0xa2, 0x00, + 0x00, 0x00, 0x20, 0xac, 0x0c, 0x45, 0x51, 0x90, 0x56, 0x84, 0xa2, 0x20, + 0x6e, 0x8e, 0x20, 0x98, 0x23, 0x00, 0x83, 0x61, 0x04, 0xe1, 0x2b, 0x48, + 0xb0, 0x34, 0x82, 0x07, 0x7a, 0x00, 0x85, 0x03, 0x01, 0x29, 0xf0, 0xcd, + 0x11, 0x80, 0xc2, 0x20, 0x02, 0x20, 0x4c, 0x01, 0x8c, 0x00, 0x0c, 0x23, + 0x0c, 0xdf, 0x20, 0x42, 0x20, 0x0c, 0x22, 0x1c, 0xc2, 0x20, 0x42, 0x21, + 0x0c, 0x23, 0x10, 0x1f, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, + 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, + 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, + 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, + 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, + 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, + 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, + 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, + 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, + 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, + 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, + 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, + 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, + 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, + 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, + 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, + 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, + 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, + 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, + 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, + 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, + 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, + 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, + 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, + 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, + 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, + 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, + 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, + 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, + 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, + 0x20, 0x07, 0x43, 0x98, 0x07, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x21, 0x4c, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x10, 0x66, 0x02, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, + 0x53, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xb9, + 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x64, 0x08, + 0x30, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x61, 0x26, 0x20, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x30, 0x1b, 0x10, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x98, 0x0e, 0x08, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x21, 0xcc, 0x06, 0x04, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x10, 0x46, 0x0c, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc8, 0x02, 0x01, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, + 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, + 0xfa, 0x46, 0x00, 0x4a, 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80, + 0x0a, 0x30, 0xa0, 0x0c, 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac, + 0x14, 0x8a, 0xa1, 0x1c, 0xa8, 0x2c, 0x9c, 0x11, 0x80, 0x42, 0x28, 0x88, + 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x22, 0xc7, 0x12, 0x24, 0x01, 0x00, + 0x00, 0x79, 0x18, 0x00, 0x00, 0xc9, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, + 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, + 0xb7, 0x21, 0xc6, 0xf7, 0x8c, 0x01, 0x40, 0x06, 0x64, 0x40, 0xe5, 0x6e, + 0x0c, 0x2d, 0x4c, 0xee, 0x6b, 0x2e, 0x4d, 0xaf, 0x6c, 0x88, 0xf1, 0x31, + 0x63, 0x20, 0x7c, 0x0d, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, 0xa4, + 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, + 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x06, 0x04, + 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, 0x46, + 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88, 0x30, 0x06, 0xc4, 0x10, + 0xe3, 0x63, 0x3e, 0xe8, 0x5b, 0x58, 0x34, 0x95, 0xd1, 0x85, 0xb1, 0x0d, + 0x41, 0xc6, 0xe0, 0xf8, 0x98, 0x8f, 0xf9, 0x16, 0x6e, 0x61, 0x69, 0x72, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, + 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x84, 0x31, 0x48, 0xc8, 0x85, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, + 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0x85, 0xcd, 0xd1, 0x7d, 0xb5, 0x85, + 0xd1, 0xa1, 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0xc6, + 0x60, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, + 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, + 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, 0xb9, 0x85, + 0x89, 0xb1, 0x95, 0x0d, 0x11, 0xc6, 0xa0, 0x61, 0x14, 0x96, 0x26, 0xe7, + 0x22, 0x57, 0xe6, 0x46, 0x56, 0x26, 0xf7, 0x45, 0x17, 0x26, 0x77, 0x56, + 0x46, 0xc7, 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, 0xec, 0x8b, 0x2e, + 0x0f, 0xae, 0xec, 0xcb, 0x2d, 0xac, 0xad, 0x8c, 0x86, 0x19, 0xdb, 0x5b, + 0x18, 0x1d, 0xcd, 0x10, 0x64, 0x0c, 0x9e, 0x6f, 0x19, 0x03, 0x68, 0x0c, + 0xa2, 0x21, 0xc2, 0x18, 0x48, 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xde, + 0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, + 0x95, 0xb9, 0xd1, 0x95, 0xc9, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x71, 0x7b, + 0xfb, 0x82, 0x2b, 0x93, 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3, 0x2b, + 0x23, 0x13, 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0xe5, 0x16, 0xd6, + 0x56, 0x46, 0x04, 0xee, 0x6d, 0x2e, 0x8d, 0x2e, 0xed, 0xcd, 0x6d, 0x08, + 0xf4, 0x2d, 0x63, 0x40, 0x8d, 0x41, 0x35, 0x06, 0xd6, 0x18, 0x40, 0x63, + 0x10, 0x8d, 0xc1, 0x35, 0x06, 0x18, 0xa5, 0xb0, 0x34, 0x39, 0x17, 0x33, + 0xb9, 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, 0xaf, 0x34, 0x37, 0xb8, 0x3a, + 0x3a, 0x5a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, + 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, + 0x7c, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca, 0xc6, + 0xe8, 0xd2, 0xec, 0xca, 0x58, 0x8c, 0xbd, 0xb1, 0xbd, 0xc9, 0x0d, 0x91, + 0x3e, 0x66, 0x0c, 0xb4, 0x31, 0xd8, 0xc6, 0xa0, 0x1a, 0x03, 0x6e, 0x0c, + 0xa0, 0x31, 0x88, 0xc6, 0xe0, 0x1a, 0x83, 0x8e, 0xd9, 0x59, 0x99, 0x5b, + 0x99, 0x5c, 0x18, 0x5d, 0x19, 0x19, 0x0a, 0x0e, 0x5d, 0x19, 0xde, 0xd8, + 0xdb, 0x9b, 0x1c, 0x19, 0x91, 0x9d, 0xcc, 0x97, 0x59, 0x0a, 0x0d, 0x33, + 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x22, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, + 0x72, 0x64, 0x43, 0xa4, 0xef, 0x19, 0x03, 0x6d, 0x0c, 0xbe, 0x31, 0xa8, + 0xc6, 0x80, 0x1b, 0x03, 0x68, 0x0c, 0xc0, 0x60, 0x0c, 0xae, 0x31, 0x08, + 0x03, 0x2a, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x7c, 0xc2, 0xd2, 0xe4, 0x5c, 0xc4, 0xea, 0xcc, 0xcc, 0xca, 0xe4, 0xbe, + 0xe6, 0xd2, 0xf4, 0xca, 0x28, 0x85, 0xa5, 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, + 0x85, 0xd1, 0xa5, 0xbd, 0xb9, 0x7d, 0xa5, 0xb9, 0x91, 0x95, 0xe1, 0x11, + 0x09, 0x4b, 0x93, 0x73, 0x91, 0x2b, 0x0b, 0x23, 0x23, 0x15, 0x96, 0x26, + 0xe7, 0x32, 0x47, 0x27, 0x57, 0x37, 0x46, 0xf7, 0x45, 0x97, 0x07, 0x57, + 0xf6, 0x95, 0xe6, 0x66, 0xf6, 0xc6, 0xc2, 0x8c, 0xed, 0x2d, 0x8c, 0x8e, + 0xcc, 0xdc, 0x98, 0xd4, 0x91, 0xd0, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, + 0x1d, 0x19, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x2f, 0xba, 0x3c, + 0xb8, 0x32, 0x2a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x5c, 0xc6, 0xde, 0xd8, 0xde, 0xe4, 0xbe, 0xe6, 0xc6, 0xc2, 0xd8, + 0xca, 0xe8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0xb5, 0x95, + 0xd1, 0xa1, 0xbd, 0x91, 0xf1, 0xa1, 0x7b, 0x73, 0x2b, 0x6b, 0x0b, 0x83, + 0xfb, 0x32, 0x0b, 0x1b, 0xa3, 0x7b, 0x93, 0x8b, 0xe1, 0x43, 0xf7, 0xe6, + 0x56, 0xd6, 0x16, 0x06, 0xf7, 0x65, 0x16, 0x36, 0x46, 0xf7, 0x26, 0x27, + 0xc3, 0x67, 0x8e, 0x4c, 0xee, 0xeb, 0x0e, 0x2d, 0x8d, 0xae, 0xec, 0x0b, + 0xee, 0x2d, 0xcd, 0x8d, 0x6e, 0x08, 0x2c, 0x7c, 0xcb, 0xd7, 0x7c, 0xcb, + 0x18, 0xa0, 0xc1, 0x18, 0xa4, 0xc1, 0xd7, 0x7c, 0xcd, 0xb7, 0x8c, 0x01, + 0x1a, 0x8c, 0x81, 0x1a, 0x7c, 0xd0, 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1, + 0x18, 0xac, 0xc1, 0x47, 0x7d, 0xcd, 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x01, + 0x1b, 0x7c, 0xce, 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1, 0x18, 0xb4, 0xc1, + 0x57, 0x7d, 0xcd, 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x81, 0x1b, 0x7c, 0xd6, + 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1, 0x18, 0xbc, 0xc1, 0x77, 0x7d, 0xcd, + 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x01, 0x1c, 0x30, 0x0a, 0x4b, 0x93, 0x73, + 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x9a, 0x4b, 0xd3, + 0x2b, 0xe3, 0x15, 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0x45, 0x97, + 0x07, 0x57, 0xf6, 0x15, 0xc6, 0x96, 0x76, 0xe6, 0xf6, 0x35, 0x97, 0xa6, + 0x57, 0xc6, 0x67, 0x0a, 0x2d, 0x8c, 0xac, 0x4c, 0x6e, 0xe8, 0xcd, 0x6d, + 0x8e, 0x2e, 0xcc, 0x8d, 0x6e, 0x8e, 0xc1, 0xd8, 0x10, 0x32, 0xf8, 0xa6, + 0x31, 0x18, 0x83, 0x31, 0x20, 0x83, 0x2f, 0x1a, 0x83, 0x32, 0xf8, 0x96, + 0x8f, 0x19, 0x03, 0x33, 0x18, 0x83, 0x33, 0x18, 0x83, 0x38, 0x18, 0x03, + 0x39, 0xf8, 0xa2, 0x31, 0x98, 0x83, 0xaf, 0x19, 0x03, 0x68, 0x0c, 0xe8, + 0x60, 0x0c, 0xae, 0x31, 0xa8, 0x03, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x33, 0x34, 0xde, 0xcc, 0xcc, 0xe6, 0xca, 0xe8, 0x88, 0x98, 0xb1, 0xbd, + 0x85, 0xd1, 0xcd, 0xe0, 0xcd, 0xd0, 0x68, 0x0b, 0xa3, 0x93, 0x4b, 0xc3, + 0x1b, 0x42, 0x7d, 0xcb, 0xe7, 0x7c, 0xcb, 0x18, 0xdc, 0xc1, 0x18, 0xe0, + 0xc1, 0xe7, 0x7c, 0xd8, 0xb7, 0x8c, 0x41, 0x1e, 0x8c, 0x81, 0x1e, 0x30, + 0xc9, 0xaa, 0xb2, 0x22, 0x2a, 0x1b, 0x7b, 0x23, 0x2b, 0xa3, 0x41, 0x56, + 0x36, 0xf6, 0x46, 0x56, 0x36, 0x84, 0x0c, 0xbe, 0x66, 0x0c, 0xc6, 0x60, + 0x0c, 0xc8, 0xe0, 0x93, 0xc6, 0xa0, 0x0c, 0x3e, 0xe6, 0x63, 0xc6, 0xc0, + 0x0c, 0xc6, 0xe0, 0x0c, 0xc6, 0x60, 0x0f, 0xc6, 0x40, 0x0e, 0x3e, 0x69, + 0x0c, 0xe6, 0xe0, 0x73, 0xc6, 0x00, 0x1a, 0x03, 0x3e, 0x18, 0x83, 0x6b, + 0x0c, 0xfa, 0x80, 0x4b, 0x58, 0x9a, 0x9c, 0x0b, 0x5d, 0x19, 0x1e, 0x5d, + 0x9d, 0x5c, 0x19, 0x95, 0xb0, 0x34, 0x39, 0x97, 0xb9, 0xb0, 0x36, 0x38, + 0xb6, 0x32, 0x62, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, + 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x3e, 0x24, 0xe8, 0xca, 0xf0, 0xb2, 0x86, 0x50, 0x5f, 0x36, + 0x06, 0x7f, 0x30, 0x06, 0x65, 0xf0, 0x2d, 0x1f, 0x33, 0x06, 0xa0, 0x30, + 0x06, 0xd0, 0x18, 0x84, 0xc2, 0x18, 0x5c, 0x63, 0x20, 0x0a, 0x2c, 0xe8, + 0xca, 0xf0, 0xaa, 0xac, 0x86, 0x50, 0x9f, 0x36, 0x06, 0x7f, 0x30, 0x06, + 0x65, 0xf0, 0x31, 0x1f, 0x33, 0x06, 0xa0, 0x30, 0x06, 0xd0, 0x18, 0x84, + 0xc2, 0x18, 0x5c, 0x63, 0x40, 0x0a, 0x5c, 0xc2, 0xd2, 0xe4, 0x5c, 0xe6, + 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0xe4, 0x78, 0xcc, 0x85, 0xb5, 0xc1, 0xb1, + 0x95, 0xc9, 0x31, 0x98, 0x1b, 0x22, 0x7d, 0xdb, 0x18, 0x98, 0xc2, 0x18, + 0x94, 0xc1, 0xb7, 0x7c, 0xcc, 0x18, 0x40, 0x63, 0x70, 0x0a, 0x63, 0x70, + 0x8d, 0x01, 0x2a, 0x0c, 0x81, 0xc6, 0x20, 0x1b, 0x03, 0x6f, 0x0c, 0xc4, + 0x60, 0x0c, 0xec, 0x60, 0x0c, 0xfc, 0x60, 0x0c, 0x46, 0x61, 0x0c, 0x4a, + 0x61, 0x0c, 0x52, 0x61, 0x88, 0xf1, 0x00, 0x63, 0x30, 0x8d, 0x81, 0x2a, + 0xb0, 0xfa, 0xd2, 0xa2, 0x9a, 0x8a, 0xa9, 0x99, 0x42, 0x0b, 0x23, 0x2b, + 0x93, 0x1b, 0x7a, 0x73, 0x9b, 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0xe3, 0xf3, + 0xd6, 0xe6, 0x96, 0x06, 0xf7, 0x46, 0x57, 0xe6, 0x46, 0x07, 0x32, 0x86, + 0x16, 0x26, 0xc7, 0x67, 0x2a, 0xad, 0x0d, 0x8e, 0xad, 0x0c, 0x64, 0x68, + 0x65, 0x05, 0x84, 0x4a, 0x28, 0x28, 0x68, 0x88, 0x30, 0x06, 0xae, 0x30, + 0xc4, 0x18, 0x83, 0x56, 0x18, 0x83, 0x57, 0x28, 0x83, 0x6e, 0x88, 0x31, + 0x06, 0x68, 0x30, 0x06, 0xb0, 0x50, 0x06, 0xdd, 0x10, 0x31, 0x18, 0x03, + 0x56, 0x18, 0x83, 0x58, 0x28, 0x83, 0x6e, 0x0c, 0x62, 0xa1, 0x0c, 0xbc, + 0x31, 0x88, 0x85, 0x32, 0xf8, 0xc6, 0x20, 0x16, 0xca, 0x00, 0x0c, 0xc6, + 0x20, 0x16, 0xca, 0x20, 0x0c, 0xc6, 0x20, 0x16, 0xca, 0x40, 0x0c, 0xc6, + 0x20, 0x16, 0xca, 0x60, 0x0c, 0xc6, 0x20, 0x16, 0xca, 0x80, 0x1b, 0x62, + 0x8c, 0x81, 0x2c, 0x8c, 0x41, 0x2c, 0x94, 0x81, 0xc7, 0x31, 0x08, 0x4b, + 0x93, 0x6b, 0x09, 0x63, 0x4b, 0x0b, 0x9b, 0x6b, 0x99, 0x1b, 0x7b, 0x83, + 0x2b, 0x9b, 0x43, 0x99, 0x22, 0x62, 0xfa, 0x72, 0xb2, 0x8a, 0x91, 0xf9, + 0x32, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, 0x73, 0xa3, 0x4b, 0x19, 0x42, 0x8c, + 0x41, 0x2d, 0x8c, 0x01, 0x2d, 0xd0, 0x0a, 0x4b, 0x93, 0x6b, 0x09, 0x63, + 0x4b, 0x0b, 0x9b, 0x6b, 0x99, 0x1b, 0x7b, 0x83, 0x2b, 0x6b, 0x09, 0x93, + 0x3b, 0x43, 0x99, 0x49, 0x19, 0x62, 0x8c, 0xc1, 0x2d, 0x8c, 0x41, 0x2d, + 0x8c, 0x81, 0x2d, 0x0c, 0x11, 0xc6, 0xe0, 0x16, 0x68, 0x85, 0xa5, 0xc9, + 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, + 0xb5, 0x84, 0xc9, 0x9d, 0xa1, 0xd0, 0xa4, 0x0c, 0x31, 0xc6, 0x40, 0x17, + 0xc6, 0xa0, 0x16, 0xc6, 0x20, 0x17, 0x88, 0x85, 0xa5, 0xc9, 0xb5, 0x84, + 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0xd0, + 0x95, 0xe1, 0xd1, 0xd5, 0xc9, 0x95, 0xcd, 0x0d, 0x31, 0xc6, 0x80, 0x17, + 0xc6, 0xa0, 0x16, 0xc6, 0x60, 0x17, 0x88, 0x85, 0xa5, 0xc9, 0xb5, 0x84, + 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0xcc, + 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0xcd, 0x0d, 0x31, 0xc6, 0xc0, 0x17, + 0xc6, 0xa0, 0x16, 0xc6, 0xa0, 0x17, 0x86, 0x18, 0x63, 0xa0, 0x0b, 0x63, + 0xc0, 0x0b, 0x63, 0xe0, 0x0b, 0x43, 0x88, 0x31, 0xe0, 0x85, 0x31, 0xf0, + 0x85, 0x21, 0xc4, 0x18, 0xdc, 0xc2, 0x18, 0xe8, 0xc2, 0x10, 0x61, 0x0c, + 0x74, 0x61, 0x88, 0x31, 0x06, 0xb7, 0x30, 0x06, 0xbc, 0x30, 0x06, 0xbe, + 0x30, 0xc4, 0x18, 0x03, 0x59, 0x18, 0x83, 0x58, 0x28, 0x83, 0x6f, 0x88, + 0x31, 0x06, 0xb2, 0x30, 0x06, 0xb1, 0x50, 0x06, 0xdc, 0x10, 0x63, 0x0c, + 0x64, 0x61, 0x0c, 0x62, 0xa1, 0x0c, 0xc2, 0x60, 0x88, 0x31, 0x06, 0xb2, + 0x30, 0x06, 0xb1, 0x50, 0x06, 0x62, 0x30, 0xc4, 0x18, 0x03, 0x59, 0x18, + 0x83, 0x58, 0x28, 0x83, 0x31, 0x18, 0x62, 0x8c, 0x81, 0x2c, 0x8c, 0x41, + 0x2c, 0x94, 0x01, 0x18, 0x0c, 0x31, 0xc6, 0x40, 0x16, 0xc6, 0x20, 0x16, + 0xca, 0xa0, 0x1b, 0x11, 0xb1, 0x03, 0x3b, 0xd8, 0x43, 0x3b, 0xb8, 0x41, + 0x3b, 0xbc, 0x03, 0x39, 0xd4, 0x03, 0x3b, 0x94, 0x83, 0x1b, 0x98, 0x03, + 0x3b, 0x84, 0xc3, 0x39, 0xcc, 0xc3, 0x14, 0x21, 0x18, 0x46, 0x28, 0xec, + 0xc0, 0x0e, 0xf6, 0xd0, 0x0e, 0x6e, 0x90, 0x0e, 0xe4, 0x50, 0x0e, 0xee, + 0x40, 0x0f, 0x53, 0x82, 0x62, 0xc4, 0x12, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, + 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0x53, + 0x02, 0x63, 0x04, 0x15, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0xc0, 0x0e, 0xe1, + 0xe0, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x70, 0x0e, 0xe5, 0xf0, 0x0b, 0xf6, + 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x25, 0x40, + 0x46, 0x4c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe3, 0xf0, 0x0e, 0xed, + 0x00, 0x0f, 0xe9, 0xc0, 0x0e, 0xe5, 0xf0, 0x0b, 0xef, 0x00, 0x0f, 0xf4, + 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0xf3, 0x30, 0x65, 0x50, 0x18, 0x67, 0x04, + 0x13, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0e, 0xf2, 0x10, 0x0e, 0xe7, + 0xd0, 0x0e, 0xe5, 0xe0, 0x0e, 0xf4, 0x30, 0x25, 0x58, 0x05, 0x00, 0x00, + 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, + 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, + 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, + 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, + 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, + 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, + 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, + 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, + 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, + 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, + 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, + 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, + 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, + 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, + 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, + 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, + 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, + 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, + 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, + 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, + 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, + 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, + 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, + 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, + 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, + 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, + 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, + 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, + 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, + 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, + 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, + 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, + 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, + 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, + 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, + 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, + 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, + 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, + 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, + 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, + 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, + 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, + 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, + 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, + 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, + 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, + 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, + 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, + 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, + 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, + 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, + 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, + 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, + 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, + 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, + 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, + 0x00, 0x2e, 0x00, 0x00, 0x00, 0x56, 0x90, 0xfd, 0x73, 0x6d, 0x6b, 0xcf, + 0xb3, 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74, 0xd5, 0xfd, 0x17, 0x45, + 0x51, 0x14, 0x76, 0x20, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x8f, + 0x63, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x11, 0x34, 0x00, 0x12, 0xf9, 0x83, + 0x33, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x29, 0x6c, 0x00, 0x12, 0xf9, 0x12, + 0xc0, 0x3c, 0x0b, 0xf1, 0x4f, 0xc4, 0x35, 0x51, 0x11, 0xf1, 0xdb, 0x83, + 0x5f, 0xe1, 0xc5, 0x6d, 0x1b, 0xc2, 0x04, 0x20, 0x91, 0x5f, 0x00, 0xd2, + 0xf4, 0x17, 0x40, 0x20, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x05, 0x50, 0x00, + 0x12, 0xf9, 0x05, 0x20, 0x4d, 0xbf, 0xb0, 0x00, 0xcc, 0xe3, 0x57, 0x77, + 0x71, 0xdb, 0x96, 0x30, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, + 0x03, 0x5c, 0x7e, 0x75, 0x17, 0xb7, 0x6d, 0x02, 0x10, 0x80, 0x44, 0x7e, + 0x01, 0x48, 0xd3, 0xff, 0x38, 0x96, 0x5f, 0xdc, 0xb6, 0x01, 0x44, 0x6c, + 0x57, 0xfe, 0xe7, 0x5b, 0xdb, 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34, 0x93, + 0x0d, 0x44, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0x7f, 0x01, 0x04, 0x92, + 0x5f, 0xdc, 0xb6, 0x19, 0x44, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0x7f, + 0xc1, 0x00, 0x97, 0x5f, 0xdc, 0x36, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x12, 0x02, 0x00, 0x00, 0x13, 0x04, 0x72, 0x10, 0x0b, 0x04, 0x00, + 0x00, 0x56, 0x00, 0x00, 0x00, 0xd4, 0x8e, 0x45, 0x00, 0x81, 0x70, 0xcc, + 0x41, 0x2c, 0xcc, 0x83, 0x07, 0x94, 0x8e, 0x35, 0x00, 0x03, 0x31, 0xc7, + 0xb0, 0x30, 0x78, 0x30, 0xc7, 0xb0, 0xe0, 0x01, 0x1e, 0x8c, 0x00, 0x8c, + 0x35, 0x00, 0x81, 0x40, 0x65, 0x11, 0x94, 0x00, 0x81, 0x63, 0x09, 0x01, + 0x30, 0x02, 0x40, 0xdf, 0x0c, 0x00, 0x79, 0x23, 0x00, 0x35, 0x40, 0xc0, + 0x0c, 0x00, 0x05, 0x33, 0x00, 0x33, 0x00, 0x73, 0x10, 0xb4, 0xa0, 0x0b, + 0xb4, 0xb0, 0x07, 0x24, 0xcc, 0x00, 0x50, 0x31, 0x03, 0x30, 0x02, 0x30, + 0x03, 0x30, 0xd6, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82, 0xf8, + 0x07, 0x82, 0x20, 0x88, 0x7f, 0x63, 0x0d, 0x6c, 0x3b, 0xff, 0xa4, 0xc7, + 0xb6, 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4, 0x37, 0xd6, 0x00, 0x82, + 0x20, 0x5b, 0xff, 0x02, 0x08, 0x82, 0x6c, 0xfd, 0x0b, 0x20, 0x08, 0xb2, + 0xf5, 0x2f, 0x8c, 0x35, 0x80, 0x20, 0xb8, 0xe6, 0x60, 0x00, 0x82, 0xe0, + 0x9a, 0x83, 0x01, 0x08, 0x82, 0x6b, 0x0e, 0x06, 0x63, 0x0d, 0x20, 0x48, + 0xb7, 0x39, 0x18, 0x80, 0x20, 0xdd, 0xe6, 0x60, 0x00, 0x82, 0x74, 0x9b, + 0x83, 0xc1, 0x58, 0xc3, 0x3a, 0xe2, 0x31, 0x0b, 0x06, 0xeb, 0x88, 0xc7, + 0x2c, 0x18, 0xac, 0x23, 0x1e, 0xb3, 0x60, 0x30, 0xd6, 0x00, 0x82, 0x30, + 0x1e, 0x8e, 0x01, 0x08, 0xc2, 0x78, 0x38, 0x06, 0x20, 0x08, 0xe3, 0xe1, + 0x18, 0x8c, 0x35, 0x88, 0xb9, 0x98, 0xf6, 0x1f, 0x58, 0xf2, 0x6c, 0xfc, + 0x0b, 0x63, 0xba, 0xaa, 0xb9, 0x2f, 0x8c, 0x35, 0xfc, 0x33, 0xe9, 0xff, + 0xbe, 0x40, 0xd7, 0xa0, 0x98, 0x7f, 0x2d, 0x1c, 0xc7, 0xa0, 0x2f, 0x8c, + 0x35, 0xcc, 0x7d, 0x9b, 0xa6, 0xbe, 0xd0, 0xba, 0x21, 0xcf, 0xfb, 0x02, + 0x9f, 0xb3, 0x3e, 0xfe, 0x11, 0x30, 0x46, 0x00, 0x82, 0x20, 0x48, 0x82, + 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, 0x63, 0x04, 0x3a, 0x6b, + 0xce, 0x21, 0x18, 0x8c, 0x11, 0xbc, 0x7b, 0x5a, 0xde, 0xdf, 0x18, 0x81, + 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, + 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, + 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba, + 0xf8, 0x37, 0x46, 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8, + 0xf6, 0x34, 0x18, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x08, 0x00, + 0x00, 0xe3, 0x0d, 0x73, 0xe0, 0x07, 0xaf, 0x40, 0xc1, 0x18, 0x6e, 0x08, + 0x9e, 0x60, 0x96, 0x21, 0x10, 0x82, 0x11, 0x03, 0xa5, 0x08, 0x68, 0x81, + 0x0e, 0xe4, 0xe0, 0x0e, 0xc8, 0xe0, 0x0c, 0xca, 0x80, 0x18, 0x31, 0x50, + 0x8a, 0xa0, 0x16, 0xe8, 0x60, 0x0e, 0xf0, 0xa0, 0x0c, 0xd0, 0xc0, 0x0c, + 0x8a, 0x41, 0x06, 0x61, 0x0c, 0xde, 0x60, 0x90, 0x41, 0x28, 0x83, 0x38, + 0x18, 0x64, 0x10, 0x82, 0x39, 0x38, 0x3d, 0x50, 0x97, 0x82, 0x32, 0xc8, + 0x10, 0xa4, 0x81, 0x1c, 0x18, 0x11, 0xc0, 0x67, 0xbc, 0xc1, 0x0f, 0x54, + 0x61, 0x17, 0x2e, 0x50, 0x97, 0x82, 0x32, 0xc8, 0x10, 0xb8, 0xc1, 0x1d, + 0x8c, 0x18, 0x14, 0x46, 0x70, 0x0e, 0x45, 0x30, 0xc7, 0xf0, 0x06, 0x41, + 0x38, 0x8c, 0x57, 0x90, 0x02, 0x2c, 0x84, 0x83, 0x38, 0xe0, 0xc1, 0x05, + 0xea, 0x52, 0x50, 0x06, 0x19, 0x02, 0x3a, 0xe8, 0x83, 0x11, 0x83, 0xc2, + 0x08, 0xda, 0x61, 0x09, 0xe6, 0x18, 0x8c, 0xc0, 0x1c, 0xc6, 0x2b, 0x54, + 0xc1, 0x16, 0xce, 0x01, 0x1d, 0xfe, 0xe0, 0x02, 0x75, 0x29, 0x28, 0x83, + 0x0c, 0x81, 0x1e, 0x8c, 0xc2, 0x88, 0x41, 0x61, 0x04, 0xf3, 0x10, 0x05, + 0x73, 0x0c, 0x46, 0x90, 0x0e, 0xb3, 0x04, 0xc4, 0x70, 0x43, 0xc7, 0x06, + 0xc1, 0x2c, 0xc3, 0x40, 0x04, 0x23, 0x06, 0x4a, 0x11, 0xc0, 0x03, 0x2c, + 0xb8, 0xc2, 0x2c, 0x80, 0xc2, 0x28, 0x84, 0x02, 0x18, 0x8c, 0x18, 0x28, + 0x45, 0x10, 0x0f, 0xb0, 0xf0, 0x0a, 0xb4, 0x10, 0x0a, 0xa4, 0x20, 0x0a, + 0x61, 0x30, 0xc8, 0x10, 0x80, 0x82, 0x29, 0x0c, 0x32, 0x0c, 0xa0, 0xc0, + 0x0a, 0x83, 0x0c, 0xc2, 0x1f, 0xb8, 0xc2, 0x20, 0x83, 0x10, 0xc0, 0xc2, + 0xdd, 0x82, 0xba, 0x14, 0x94, 0x41, 0x86, 0xc0, 0x14, 0x5e, 0xc1, 0x88, + 0x00, 0x3e, 0xe3, 0x0d, 0xbb, 0x70, 0x0e, 0xf8, 0x70, 0x81, 0xba, 0x14, + 0x94, 0x41, 0x86, 0x60, 0x15, 0x68, 0x61, 0xc4, 0xa0, 0x30, 0x02, 0x92, + 0x28, 0x82, 0x39, 0x06, 0x56, 0x08, 0xfc, 0x61, 0xbc, 0x22, 0x1c, 0xda, + 0xc1, 0x1f, 0xfe, 0xa1, 0x16, 0x2e, 0x50, 0x97, 0x82, 0x32, 0xc8, 0x10, + 0xc4, 0x82, 0x2e, 0x8c, 0x18, 0x14, 0x46, 0xa0, 0x12, 0x4b, 0x30, 0xc7, + 0x60, 0x04, 0x23, 0x31, 0x5e, 0x71, 0x0e, 0xf3, 0x40, 0x12, 0x25, 0xc1, + 0x0b, 0x17, 0xa8, 0x4b, 0x41, 0x19, 0x64, 0x08, 0x6e, 0x01, 0x1c, 0x46, + 0x0c, 0x0a, 0x23, 0x80, 0x89, 0x28, 0x98, 0x63, 0x30, 0x02, 0x93, 0x98, + 0x25, 0x20, 0x06, 0x3a, 0x02, 0x3e, 0x08, 0x84, 0x01, 0x2e, 0x84, 0x39, + 0x86, 0x60, 0x14, 0x48, 0x62, 0xbc, 0x01, 0x1e, 0xf6, 0x21, 0x25, 0x28, + 0x18, 0xc3, 0x0d, 0x41, 0x2b, 0x04, 0xb3, 0x0c, 0x85, 0x11, 0x0c, 0x32, + 0x10, 0xbf, 0x80, 0x0e, 0xe3, 0x0d, 0xf4, 0xf0, 0x0f, 0x21, 0x41, 0xc1, + 0x18, 0x31, 0x20, 0x8c, 0xc0, 0x26, 0x86, 0x11, 0x83, 0xc2, 0x08, 0x70, + 0x22, 0xd8, 0x05, 0x0b, 0x76, 0x01, 0x3e, 0x23, 0x06, 0x85, 0x11, 0xe0, + 0x44, 0x00, 0x0e, 0x36, 0xf0, 0x82, 0x7c, 0x8c, 0x17, 0x82, 0xf8, 0xd8, + 0x10, 0xd0, 0x67, 0xc4, 0x80, 0x30, 0x82, 0x9e, 0x08, 0x46, 0x0c, 0x0a, + 0x23, 0xf8, 0x89, 0xc0, 0x17, 0x2c, 0xf0, 0x05, 0xf9, 0xcc, 0x31, 0xa0, + 0xc3, 0xd2, 0x13, 0x83, 0x0c, 0x41, 0x3a, 0xdc, 0x83, 0x0d, 0x01, 0x7d, + 0x06, 0x19, 0x82, 0x75, 0xe8, 0x87, 0x41, 0x86, 0xa0, 0xfa, 0x87, 0x59, + 0x02, 0x63, 0xa0, 0x22, 0x10, 0x0a, 0x36, 0x20, 0xc6, 0x1b, 0x4c, 0x22, + 0x26, 0xc2, 0x82, 0x82, 0x31, 0xdc, 0x10, 0xd8, 0x82, 0x33, 0xcb, 0x70, + 0x20, 0xc1, 0x20, 0x03, 0x51, 0x0f, 0xfe, 0x30, 0xde, 0xa0, 0x12, 0x35, + 0x91, 0x13, 0x14, 0x8c, 0xf1, 0x06, 0x96, 0xb8, 0x09, 0x9d, 0xa0, 0x60, + 0x8c, 0x18, 0x20, 0x47, 0x14, 0x17, 0x45, 0x77, 0x0c, 0xc1, 0x20, 0x43, + 0x70, 0x0f, 0x29, 0x31, 0xc8, 0x10, 0x2c, 0x2b, 0x31, 0x4b, 0x80, 0x0c, + 0x54, 0x04, 0xc2, 0x81, 0x19, 0xc3, 0x0d, 0x61, 0x60, 0x0e, 0xc1, 0x2c, + 0x43, 0x72, 0x05, 0xe3, 0x0d, 0x33, 0xe1, 0x13, 0x6f, 0x41, 0xc1, 0x18, + 0x6e, 0x08, 0xd2, 0x21, 0x98, 0x65, 0x50, 0x96, 0x60, 0x90, 0xa1, 0x10, + 0x89, 0x95, 0x18, 0x6f, 0xb8, 0x09, 0xb1, 0x60, 0x0b, 0x0a, 0xc6, 0x1c, + 0x43, 0x48, 0x04, 0x76, 0x31, 0xc8, 0x10, 0x88, 0x04, 0x4c, 0x58, 0x50, + 0xc8, 0x67, 0x90, 0x21, 0x20, 0x09, 0x9b, 0x98, 0x25, 0x88, 0x83, 0xf1, + 0x86, 0x9e, 0x40, 0x0b, 0xbd, 0xa0, 0x60, 0x8c, 0x37, 0xfc, 0x84, 0x5a, + 0xd0, 0x05, 0x05, 0x63, 0x90, 0x01, 0x6a, 0x89, 0x9d, 0x18, 0x6e, 0x20, + 0xe0, 0xc1, 0x99, 0x65, 0x60, 0xac, 0x60, 0x0c, 0x41, 0x02, 0x8d, 0xe1, + 0x86, 0x20, 0x1f, 0x94, 0x59, 0x06, 0xa7, 0x09, 0x4c, 0xd8, 0x07, 0xf9, + 0xcc, 0x12, 0x3c, 0x36, 0xf4, 0x03, 0x7c, 0x46, 0x0c, 0x08, 0x23, 0x60, + 0x8d, 0xc0, 0x02, 0x90, 0x90, 0xcf, 0x88, 0x41, 0x61, 0x04, 0xaf, 0x11, + 0x88, 0xc4, 0x2c, 0xc1, 0x33, 0x50, 0x01, 0x28, 0x8d, 0xe0, 0xcc, 0x31, + 0xd8, 0x44, 0x80, 0x1a, 0x63, 0x08, 0x1b, 0x6a, 0x0c, 0x37, 0x04, 0x22, + 0xa1, 0xcc, 0x32, 0x44, 0x50, 0x60, 0x02, 0x49, 0xc8, 0x67, 0x96, 0x40, + 0xb2, 0xc1, 0x24, 0xe0, 0x33, 0x62, 0x40, 0x18, 0x41, 0x6d, 0x04, 0x16, + 0xa4, 0x84, 0x7c, 0x46, 0x0c, 0x0a, 0x23, 0xc0, 0x8d, 0x60, 0x25, 0x66, + 0x09, 0xa4, 0x81, 0x0a, 0x40, 0x81, 0x84, 0x68, 0x8e, 0x21, 0x09, 0x60, + 0x63, 0x0c, 0x81, 0x0c, 0x5c, 0x63, 0xb8, 0x21, 0x58, 0x09, 0x65, 0x96, + 0x81, 0x9a, 0x02, 0x13, 0x5a, 0x42, 0x3e, 0xb3, 0x04, 0x95, 0x0d, 0x2f, + 0x01, 0x9f, 0x11, 0x03, 0xc2, 0x08, 0x7c, 0x23, 0xb0, 0x40, 0x26, 0xe4, + 0x33, 0x62, 0x50, 0x18, 0x41, 0x78, 0x04, 0x34, 0x31, 0x4b, 0x50, 0x0d, + 0x54, 0x00, 0xca, 0x24, 0x50, 0x73, 0x0c, 0x49, 0x60, 0x1b, 0xb3, 0x04, + 0xd6, 0x40, 0x45, 0x20, 0x54, 0x7a, 0xb0, 0x0c, 0x32, 0x04, 0x6b, 0x41, + 0x17, 0x73, 0x0c, 0x68, 0x01, 0x06, 0xbd, 0x31, 0xc8, 0x10, 0xa4, 0xc5, + 0x5d, 0xd8, 0x10, 0xc8, 0x67, 0x90, 0x21, 0x58, 0x8b, 0xbe, 0x98, 0x25, + 0x88, 0x83, 0xe1, 0x86, 0x59, 0xf0, 0x89, 0x60, 0x96, 0x01, 0x23, 0x83, + 0x60, 0x90, 0x81, 0x0e, 0xe2, 0x42, 0x2f, 0xc6, 0x1b, 0x4c, 0x23, 0x36, + 0xc6, 0x83, 0x82, 0x31, 0xde, 0x80, 0x1a, 0xb3, 0xd1, 0x1b, 0x14, 0x8c, + 0x39, 0x06, 0xb9, 0x08, 0xce, 0x63, 0x90, 0x21, 0x98, 0x8b, 0xd0, 0xb0, + 0xe0, 0x90, 0xcf, 0x20, 0x43, 0x50, 0x17, 0xa7, 0x31, 0xdc, 0x70, 0xf0, + 0x84, 0x33, 0xcb, 0x30, 0x06, 0x59, 0x30, 0x86, 0x30, 0xb0, 0xc7, 0x70, + 0x43, 0xf0, 0x13, 0xca, 0x2c, 0xc3, 0xa6, 0x05, 0x26, 0x84, 0x85, 0x7c, + 0x66, 0x09, 0xb8, 0x11, 0x03, 0xc2, 0x08, 0xee, 0x63, 0x18, 0x31, 0x28, + 0x8c, 0x20, 0x3f, 0x02, 0xb2, 0xb0, 0xc0, 0x2c, 0xe4, 0x63, 0x01, 0x5a, + 0xc0, 0x67, 0x96, 0x80, 0x1b, 0xa8, 0x00, 0x14, 0x4d, 0xd8, 0xe6, 0x18, + 0xfa, 0x22, 0xa0, 0x8f, 0x31, 0x04, 0x86, 0x3e, 0x86, 0x1b, 0x02, 0xb4, + 0x50, 0x66, 0x19, 0xbc, 0x2e, 0x30, 0x41, 0x2d, 0xe4, 0x33, 0x4b, 0xf0, + 0x8d, 0x18, 0x10, 0x46, 0x00, 0x22, 0xc3, 0x88, 0x41, 0x61, 0x04, 0x22, + 0x12, 0xb4, 0x85, 0x05, 0x6f, 0x21, 0x1f, 0x0b, 0xe2, 0x02, 0x3e, 0xb3, + 0x04, 0xdf, 0x40, 0x05, 0xa0, 0x74, 0x82, 0x37, 0xc7, 0x90, 0x04, 0xfc, + 0x31, 0x86, 0x50, 0xe9, 0xc7, 0x70, 0x43, 0x10, 0x17, 0xca, 0x2c, 0x43, + 0x18, 0x80, 0x41, 0x60, 0xc2, 0x5c, 0xc8, 0x67, 0x96, 0x40, 0x0c, 0x46, + 0x0c, 0x08, 0x23, 0x48, 0x91, 0x61, 0xc4, 0xa0, 0x30, 0x82, 0x15, 0x09, + 0xec, 0xc2, 0x02, 0xbc, 0x90, 0x8f, 0x05, 0x7a, 0x01, 0x9f, 0x59, 0x02, + 0x31, 0x18, 0xa8, 0x00, 0x14, 0x30, 0x10, 0xc2, 0x60, 0x8e, 0x21, 0x09, + 0x44, 0x64, 0xc4, 0xc0, 0x30, 0x82, 0x18, 0x09, 0x62, 0xe3, 0x35, 0x06, + 0x19, 0x82, 0xd9, 0x28, 0x8f, 0x59, 0x82, 0x31, 0x18, 0xa8, 0x08, 0xfc, + 0x00, 0x13, 0xc4, 0x60, 0x90, 0x21, 0xc8, 0x8d, 0xf3, 0x98, 0x25, 0x88, + 0x83, 0x59, 0x86, 0x32, 0x88, 0x03, 0x7e, 0x18, 0x64, 0xe8, 0x05, 0xdd, + 0x18, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0x66, 0x24, 0x68, 0x8d, 0x39, 0x06, + 0xdb, 0x08, 0x5a, 0x64, 0xc4, 0xa0, 0x30, 0x82, 0x1a, 0x19, 0x5c, 0x63, + 0x8e, 0x41, 0x08, 0x5c, 0x64, 0xc4, 0xa0, 0x30, 0x82, 0x1b, 0x29, 0x5e, + 0x63, 0x8e, 0x41, 0x08, 0x5a, 0x64, 0x90, 0x21, 0xe8, 0x8d, 0xf7, 0x18, + 0x64, 0x08, 0xca, 0x21, 0x3e, 0xc6, 0x1b, 0xee, 0x43, 0x44, 0x68, 0x84, + 0x82, 0x31, 0xde, 0x90, 0x1f, 0x24, 0xe2, 0x22, 0x14, 0x8c, 0x39, 0x86, + 0xf1, 0x08, 0x70, 0x64, 0x90, 0x21, 0x20, 0x0f, 0xf9, 0xb0, 0x20, 0x91, + 0xcf, 0x20, 0x43, 0x60, 0x1e, 0xf8, 0x31, 0xdc, 0x70, 0xb4, 0x86, 0x33, + 0xcb, 0x00, 0x07, 0x66, 0x10, 0x8c, 0x21, 0x0c, 0x3d, 0x32, 0xdc, 0x10, + 0xc0, 0x86, 0x32, 0xcb, 0x80, 0x06, 0x67, 0x10, 0x98, 0x20, 0x1b, 0xf2, + 0x99, 0x25, 0x48, 0x83, 0x11, 0x03, 0xc2, 0x08, 0xd0, 0x64, 0x18, 0x31, + 0x28, 0x8c, 0x40, 0x4d, 0x82, 0xda, 0xb0, 0xe0, 0x36, 0xe4, 0x63, 0x41, + 0x6e, 0xc0, 0x67, 0x96, 0x20, 0x0d, 0x06, 0x2a, 0x00, 0xe5, 0x0c, 0x04, + 0x34, 0x98, 0x63, 0x70, 0x8f, 0xa0, 0x4c, 0xc6, 0x10, 0x98, 0x32, 0x19, + 0x6e, 0x08, 0x72, 0x43, 0x99, 0x65, 0x58, 0x03, 0x35, 0x08, 0x4c, 0xd8, + 0x0d, 0xf9, 0xcc, 0x12, 0xb0, 0xc1, 0x88, 0x01, 0x61, 0x04, 0x71, 0x32, + 0x8c, 0x18, 0x14, 0x46, 0x30, 0x27, 0x81, 0x6f, 0x58, 0x00, 0x1e, 0xf2, + 0xb1, 0x40, 0x3c, 0xe0, 0x33, 0x4b, 0xc0, 0x06, 0x03, 0x15, 0x80, 0xa2, + 0x06, 0xc2, 0x1a, 0xcc, 0x31, 0x24, 0x41, 0x9b, 0x8c, 0x21, 0x54, 0x6b, + 0x32, 0xdc, 0x10, 0x88, 0x87, 0x32, 0xcb, 0xe0, 0x06, 0x6d, 0x10, 0x98, + 0x40, 0x1e, 0xf2, 0x99, 0x25, 0x78, 0x83, 0x11, 0x03, 0xc2, 0x08, 0xf4, + 0x64, 0x18, 0x31, 0x28, 0x8c, 0x80, 0x4f, 0x82, 0xf3, 0xb0, 0x20, 0x3d, + 0xe4, 0x63, 0xc1, 0x7a, 0xc0, 0x67, 0x96, 0xe0, 0x0d, 0x06, 0x2a, 0x00, + 0xa5, 0x0d, 0x04, 0x37, 0x98, 0x63, 0x48, 0x82, 0x39, 0x19, 0x31, 0x30, + 0x8c, 0x40, 0x54, 0x02, 0x11, 0x01, 0x91, 0x41, 0x86, 0x80, 0x44, 0x6c, + 0x64, 0x96, 0x00, 0x0e, 0x06, 0x2a, 0x02, 0x3f, 0x28, 0x03, 0xe1, 0x0d, + 0x06, 0x19, 0x02, 0x15, 0xc1, 0x91, 0x59, 0x82, 0x38, 0x18, 0x68, 0x09, + 0x78, 0x44, 0xe1, 0x11, 0x8b, 0x47, 0xc6, 0x40, 0x16, 0xe0, 0x80, 0x47, + 0xc8, 0x60, 0xa0, 0x25, 0x40, 0x11, 0x45, 0x2f, 0x2c, 0x73, 0x18, 0x03, + 0x02, 0x0e, 0x68, 0x88, 0x0c, 0x06, 0x19, 0x02, 0x81, 0x47, 0x2c, 0x20, + 0x13, 0xf9, 0x64, 0x10, 0x0e, 0x04, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x17, 0xd3, 0x07, 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4, + 0x50, 0x13, 0xe7, 0x2c, 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d, + 0x9b, 0x6d, 0x29, 0x38, 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b, + 0x00, 0x03, 0x11, 0x71, 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71, + 0x21, 0x13, 0x00, 0x00, 0x00, 0x01, 0x31, 0x00, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x5b, 0x8e, 0x20, 0x98, 0x85, 0x03, 0x17, 0x90, 0x5f, 0xd8, 0x52, + 0x10, 0x07, 0x38, 0x20, 0xe1, 0xb0, 0xa5, 0x28, 0x0e, 0x70, 0x40, 0xc2, + 0x61, 0x4b, 0xa1, 0x1c, 0xe2, 0x80, 0x8c, 0xc3, 0x96, 0xe2, 0x39, 0xc4, + 0x01, 0x19, 0x87, 0x2d, 0x45, 0x75, 0x88, 0x03, 0x32, 0x0e, 0x5b, 0x8a, + 0xed, 0x10, 0x07, 0x64, 0x1c, 0xb6, 0x14, 0x62, 0x70, 0x80, 0x03, 0x12, + 0x0e, 0x5b, 0x8a, 0x31, 0x38, 0xc0, 0x01, 0x09, 0x87, 0x2d, 0x45, 0x1a, + 0x1c, 0xe2, 0x80, 0x8c, 0xc3, 0x96, 0xc2, 0x0d, 0x0e, 0x71, 0x40, 0xc6, + 0x61, 0x4b, 0x41, 0x07, 0x87, 0x38, 0x20, 0xe3, 0xb0, 0xa5, 0xd0, 0x83, + 0x43, 0x1c, 0x90, 0x71, 0xd8, 0x32, 0x88, 0x42, 0x40, 0x0e, 0x5b, 0x86, + 0x53, 0x08, 0xca, 0x61, 0xcb, 0xa0, 0x0b, 0x81, 0x39, 0x6c, 0x19, 0x7e, + 0x21, 0x38, 0x87, 0x2d, 0x43, 0x38, 0x04, 0xe8, 0xb0, 0x65, 0x50, 0x87, + 0x60, 0x16, 0xb6, 0x0c, 0xef, 0x10, 0xa4, 0xc3, 0x96, 0xc1, 0x1e, 0x02, + 0x75, 0xd8, 0x32, 0xe0, 0x43, 0x90, 0x0e, 0x5b, 0x06, 0xb6, 0x08, 0xd4, + 0x61, 0xcb, 0xe0, 0x16, 0x41, 0x3a, 0x6c, 0x19, 0xd4, 0x23, 0x50, 0x87, + 0x2d, 0x03, 0x7b, 0x04, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x61, 0x20, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, + 0x2c, 0x10, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0xd4, 0xce, 0x41, + 0x2c, 0xcc, 0xd3, 0x06, 0x94, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, + 0xdf, 0x0c, 0x00, 0x05, 0x33, 0x00, 0x54, 0xcc, 0x00, 0x8c, 0x35, 0xb0, + 0xec, 0x19, 0xca, 0x1f, 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce, + 0xde, 0x58, 0x83, 0x5e, 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf, + 0xdb, 0xa7, 0xf4, 0xe8, 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a, + 0xc2, 0xe8, 0xee, 0xdd, 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b, + 0x69, 0xff, 0x81, 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, + 0xc2, 0x58, 0xc3, 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, + 0xd7, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, + 0x0b, 0xad, 0x1b, 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05, + 0x33, 0x00, 0x04, 0x8c, 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, + 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5, + 0x02, 0x0d, 0x37, 0x50, 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43, + 0x43, 0xc5, 0xc1, 0x20, 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64, + 0x08, 0xa0, 0x6a, 0x96, 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61, + 0x48, 0x82, 0xe1, 0x86, 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31, + 0x28, 0x8c, 0xc0, 0x0f, 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xf0, 0x60, 0xc4, + 0xa0, 0x30, 0x02, 0x50, 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xc8, 0x83, 0x11, + 0x83, 0xc2, 0x08, 0x44, 0x21, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xc0, 0x83, + 0x59, 0x82, 0x62, 0xa0, 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xfc, + 0x60, 0x0c, 0x41, 0xf0, 0x83, 0x31, 0x84, 0x81, 0x0f, 0x46, 0x0c, 0x0a, + 0x23, 0x30, 0x05, 0x21, 0x18, 0x31, 0x28, 0x8c, 0xe0, 0x14, 0x88, 0x60, + 0xb8, 0x21, 0xb8, 0x84, 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c, + 0x0c, 0x6c, 0x40, 0x03, 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90, + 0x8f, 0x05, 0x1a, 0x7c, 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81, + 0x2a, 0x0c, 0x32, 0x04, 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64, + 0x08, 0xd2, 0xc0, 0x0d, 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4, + 0xa0, 0x98, 0x65, 0x40, 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18, + 0x31, 0x28, 0x8c, 0xe0, 0x16, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0x20, + 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xc8, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84, + 0x40, 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xd8, 0x85, 0x42, 0x0d, 0xe6, 0x18, + 0x84, 0x20, 0x16, 0x66, 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57, + 0x10, 0x04, 0x04, 0x3a, 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 }; -const unsigned int sdl_metallib_len = 25225; +const unsigned int sdl_metallib_len = 31301; diff --git a/libs/SDL3/src/render/metal/SDL_shaders_metal_tvsimulator.h b/libs/SDL3/src/render/metal/SDL_shaders_metal_tvsimulator.h index 05d187f0..f152da3e 100644 --- a/libs/SDL3/src/render/metal/SDL_shaders_metal_tvsimulator.h +++ b/libs/SDL3/src/render/metal/SDL_shaders_metal_tvsimulator.h @@ -1,18 +1,18 @@ const unsigned char sdl_metallib[] = { 0x4d, 0x54, 0x4c, 0x42, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x61, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xbd, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x87, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x41, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6e, 0x00, 0x00, + 0x3d, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, - 0x51, 0xba, 0x99, 0x7f, 0xfa, 0xf0, 0x20, 0xde, 0x2f, 0x06, 0x9e, 0xc8, - 0x59, 0x87, 0xe7, 0xc2, 0xf9, 0x9b, 0xfe, 0xcf, 0xaa, 0xb6, 0x1b, 0xa8, - 0xe8, 0x0c, 0x7f, 0xcf, 0x7a, 0xea, 0xa3, 0xc0, 0x4d, 0x44, 0x53, 0x5a, + 0x15, 0xf9, 0x4d, 0x6f, 0xe5, 0x9c, 0xb5, 0x9e, 0xfb, 0x24, 0xc0, 0x2a, + 0x04, 0x12, 0xb6, 0x3d, 0xce, 0x01, 0xe2, 0xef, 0x83, 0xef, 0x5c, 0xac, + 0x5a, 0xb2, 0xc9, 0xf0, 0xc8, 0xba, 0xc9, 0x2b, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0xa0, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -21,9 +21,9 @@ const unsigned char sdl_metallib[] = { 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, - 0x00, 0x53, 0x8a, 0xfc, 0xb3, 0xd7, 0xf8, 0xc0, 0xc7, 0x25, 0xe3, 0xa3, - 0xd2, 0x27, 0x96, 0xa8, 0x8b, 0x78, 0xe7, 0x75, 0x87, 0xec, 0x5f, 0xd2, - 0x61, 0x89, 0xf9, 0x42, 0x69, 0xfc, 0xcc, 0x73, 0xc8, 0x4d, 0x44, 0x53, + 0x00, 0x52, 0xb6, 0xb7, 0xe5, 0x86, 0x26, 0xb7, 0x1a, 0x21, 0xaf, 0xe3, + 0x79, 0x7a, 0x10, 0xe2, 0x0b, 0xc0, 0x31, 0xb4, 0x53, 0x24, 0xfd, 0x59, + 0xdf, 0x13, 0x54, 0xe6, 0x9f, 0x33, 0x99, 0x7a, 0x96, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0xb0, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0x00, @@ -32,10 +32,10 @@ const unsigned char sdl_metallib[] = { 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x13, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, - 0x41, 0x53, 0x48, 0x20, 0x00, 0x6a, 0x2d, 0x22, 0x87, 0xe6, 0x5c, 0x32, - 0x26, 0xf7, 0xd1, 0x3b, 0x3c, 0xf5, 0xef, 0xb4, 0xd3, 0xc8, 0x23, 0x1d, - 0x7e, 0x3b, 0xea, 0xfe, 0x25, 0x27, 0x7d, 0x7c, 0x97, 0x51, 0x87, 0x43, - 0x1f, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0x10, 0x0e, 0x00, 0x00, 0x00, + 0x41, 0x53, 0x48, 0x20, 0x00, 0x52, 0x06, 0xe9, 0x1b, 0x32, 0x0a, 0xb5, + 0xca, 0xb9, 0x78, 0x6c, 0x25, 0x2c, 0xfe, 0x03, 0x5b, 0x15, 0xc9, 0x22, + 0xfe, 0xf9, 0x65, 0x38, 0x46, 0x53, 0x98, 0xa9, 0x8a, 0xea, 0xbd, 0x05, + 0x56, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0x10, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, @@ -43,468 +43,156 @@ const unsigned char sdl_metallib[] = { 0x4e, 0x44, 0x54, 0x87, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, - 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0xc9, 0xc9, 0xca, 0x37, - 0x0b, 0x01, 0x24, 0x1b, 0xdd, 0x22, 0xf6, 0xf7, 0xce, 0xd3, 0x0a, 0xba, - 0xf9, 0x44, 0x59, 0x2d, 0x28, 0x44, 0xcb, 0xda, 0x7f, 0x9a, 0xdf, 0x91, - 0xbd, 0xc6, 0xbc, 0xc8, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0x10, 0x10, + 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0x35, 0x0e, 0x3c, 0xe0, + 0xce, 0x53, 0x67, 0x6e, 0xfb, 0xaf, 0x12, 0x13, 0x2f, 0x9a, 0x35, 0x08, + 0x2a, 0x4e, 0xd6, 0xe8, 0xa9, 0xff, 0xce, 0xe6, 0x90, 0x33, 0xa6, 0x4b, + 0xb3, 0xc1, 0x2d, 0x79, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0x50, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x8b, 0x00, 0x00, 0x00, 0x4e, 0x41, - 0x4d, 0x45, 0x16, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x41, 0x64, 0x76, 0x61, - 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, - 0x48, 0x20, 0x00, 0xcd, 0xd8, 0xa3, 0x72, 0x8b, 0x94, 0x57, 0x77, 0x64, - 0x26, 0x92, 0x31, 0x6e, 0x93, 0x9a, 0x6f, 0xbb, 0x45, 0x9c, 0xe6, 0x8d, - 0x9b, 0x0f, 0x50, 0x44, 0xee, 0x0e, 0xaf, 0x9e, 0xd5, 0x9c, 0x11, 0x4d, - 0x44, 0x53, 0x5a, 0x08, 0x00, 0xc0, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, - 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, - 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, - 0x54, 0x86, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, - 0x44, 0x4c, 0x5f, 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, - 0x41, 0x53, 0x48, 0x20, 0x00, 0x1b, 0x6d, 0xb4, 0xde, 0x48, 0xe4, 0x10, - 0x1e, 0xc8, 0x0a, 0xaf, 0x42, 0xf8, 0x6e, 0xa1, 0xa8, 0x07, 0xc5, 0x0b, - 0xa5, 0x64, 0x32, 0x7f, 0xb7, 0x35, 0x5e, 0x74, 0xa2, 0x31, 0xef, 0x10, - 0x7c, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0xf0, 0x14, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x7e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x30, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, - 0x53, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, - 0x4e, 0x44, 0x54, 0x45, 0x4e, 0x44, 0x54, 0x29, 0x00, 0x00, 0x00, 0x56, - 0x41, 0x54, 0x54, 0x15, 0x00, 0x02, 0x00, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, - 0x01, 0x80, 0x56, 0x41, 0x54, 0x59, 0x04, 0x00, 0x02, 0x00, 0x04, 0x06, - 0x45, 0x4e, 0x44, 0x54, 0x35, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, - 0x20, 0x00, 0x03, 0x00, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x00, 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x74, - 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x00, 0x02, 0x80, 0x56, 0x41, - 0x54, 0x59, 0x05, 0x00, 0x03, 0x00, 0x04, 0x06, 0x04, 0x45, 0x4e, 0x44, - 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, + 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x86, 0x00, 0x00, 0x00, 0x4e, 0x41, + 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x59, 0x55, 0x56, 0x5f, + 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, + 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0xa7, 0x01, + 0x7b, 0x12, 0xea, 0xf0, 0xa5, 0x6a, 0x6b, 0x4f, 0xc0, 0x6d, 0xb6, 0xea, + 0x5f, 0xd2, 0x67, 0xf6, 0x0d, 0xb4, 0x84, 0x9a, 0x83, 0xef, 0xdf, 0x35, + 0x42, 0x30, 0xb3, 0x5b, 0x2f, 0x4a, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, + 0x10, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, + 0x18, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x4a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x87, 0x00, 0x00, 0x00, + 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x4e, 0x56, + 0x31, 0x32, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, + 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, + 0x00, 0x01, 0x40, 0xa0, 0xf0, 0xd1, 0x67, 0x2d, 0x43, 0x1e, 0xf0, 0x7f, + 0xf2, 0x38, 0xda, 0xd8, 0x27, 0x85, 0xad, 0x09, 0xbf, 0x29, 0x25, 0x29, + 0x69, 0xde, 0x09, 0xb7, 0x80, 0xe9, 0x50, 0xc7, 0x35, 0x4d, 0x44, 0x53, + 0x5a, 0x08, 0x00, 0xc0, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, + 0x46, 0x46, 0x54, 0x18, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x6c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x45, + 0x4e, 0x44, 0x54, 0x29, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x15, + 0x00, 0x02, 0x00, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, + 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x56, 0x41, + 0x54, 0x59, 0x04, 0x00, 0x02, 0x00, 0x04, 0x06, 0x45, 0x4e, 0x44, 0x54, + 0x35, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x20, 0x00, 0x03, 0x00, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x74, 0x65, 0x78, 0x63, 0x6f, + 0x6f, 0x72, 0x64, 0x00, 0x02, 0x80, 0x56, 0x41, 0x54, 0x59, 0x05, 0x00, + 0x03, 0x00, 0x04, 0x06, 0x04, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, - 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0xde, 0xc0, 0x17, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x88, 0x0e, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, - 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x66, 0x03, 0x00, - 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, - 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, - 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, - 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, - 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, - 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, - 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x7b, 0x00, 0x00, - 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, - 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, - 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, - 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, - 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, - 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, - 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, - 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, - 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, - 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, - 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, - 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, - 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, - 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, - 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, - 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, - 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, - 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, - 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, - 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, - 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, - 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, - 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, - 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, - 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, - 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, - 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, - 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, - 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, - 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, - 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, - 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, - 0x72, 0x00, 0x36, 0x78, 0xc2, 0x00, 0x2c, 0x40, 0x15, 0xa4, 0x01, 0x28, - 0x0c, 0xe1, 0x90, 0x0e, 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, - 0x0e, 0xe5, 0x20, 0x0f, 0x6d, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe1, 0xc0, - 0x0e, 0xe9, 0x10, 0x0e, 0xf3, 0x00, 0x6c, 0xf0, 0x06, 0x02, 0x58, 0x80, - 0x2a, 0x48, 0x03, 0x50, 0x18, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, - 0xa1, 0x1e, 0xcc, 0xc1, 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, - 0xa1, 0x0d, 0xc2, 0x81, 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0x00, 0x00, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, - 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, - 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, - 0x60, 0x87, 0x10, 0xc0, 0x30, 0x82, 0x00, 0x24, 0x41, 0x98, 0xc9, 0x9a, - 0x07, 0x7a, 0x90, 0x87, 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, - 0x07, 0x7a, 0x08, 0x07, 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, - 0x07, 0x79, 0x48, 0x07, 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, - 0x28, 0x84, 0x52, 0x88, 0x11, 0x8c, 0xa1, 0x33, 0x10, 0x30, 0x47, 0x00, - 0x06, 0x29, 0xa0, 0xe6, 0x08, 0x40, 0x61, 0x10, 0x21, 0x10, 0x86, 0x11, - 0x08, 0x65, 0x04, 0x00, 0x00, 0x13, 0xc0, 0x20, 0x1c, 0xd2, 0x41, 0x1e, - 0xec, 0x80, 0x0e, 0xda, 0x20, 0x1c, 0xe0, 0x01, 0x1e, 0xd8, 0xa1, 0x1c, - 0xda, 0x80, 0x1e, 0xec, 0xe1, 0x1d, 0xe6, 0x21, 0x0e, 0xe6, 0xc0, 0x0d, - 0xe0, 0xc0, 0x0d, 0xe0, 0xa0, 0x0d, 0xe6, 0x21, 0x1d, 0xda, 0xa1, 0x1e, - 0xd8, 0x21, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0x61, 0xc3, 0x6d, 0x94, 0x43, - 0x1b, 0xc0, 0x83, 0x1e, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, - 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1e, 0xe0, 0x81, - 0x1e, 0xe0, 0x41, 0x1b, 0xa4, 0x03, 0x1e, 0xe8, 0x01, 0x1e, 0xe8, 0x01, - 0x1e, 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, - 0x1e, 0xc4, 0x81, 0x1d, 0xb4, 0x41, 0x3a, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, - 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x41, 0x3a, 0xd8, 0x01, - 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, - 0x39, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, - 0x1c, 0xb4, 0x81, 0x39, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, - 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1d, 0xe8, 0x41, - 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x01, - 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, - 0x3d, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, - 0x1c, 0xb4, 0x81, 0x3d, 0xd0, 0x01, 0x1e, 0xe8, 0x81, 0x1d, 0xd0, 0x81, - 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xd8, 0x01, 0x1d, 0xe8, 0x81, - 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xe4, 0x81, - 0x1d, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xe8, 0x41, 0x1c, 0xc8, 0x01, - 0x1e, 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, - 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x41, 0x1b, 0xd8, 0x43, - 0x1c, 0xe4, 0x81, 0x1c, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xe8, 0x81, - 0x1c, 0xd4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x41, 0x1d, 0xd8, 0x81, - 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x41, - 0x1b, 0xd8, 0x43, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, - 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xc4, 0x01, - 0x1c, 0xc8, 0x01, 0x1d, 0xe8, 0x41, 0x1c, 0xc0, 0x81, 0x1c, 0xd0, 0x81, - 0x1e, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, 0xb4, 0x81, 0x3b, 0xe0, 0x81, - 0x1e, 0xc4, 0x81, 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43, - 0x42, 0x6c, 0x57, 0xfe, 0xac, 0xb3, 0x20, 0xc3, 0x5f, 0x11, 0xd1, 0x44, - 0x5c, 0x43, 0x22, 0x00, 0x3a, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x40, 0x62, 0x83, 0x40, 0x51, 0xb4, 0x01, 0x00, 0x80, - 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, - 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, - 0x52, 0x45, 0x50, 0x02, 0x85, 0x30, 0x02, 0x50, 0x80, 0x01, 0x05, 0x52, - 0x06, 0xc4, 0x46, 0x00, 0x68, 0x8d, 0x25, 0x44, 0x02, 0x00, 0x00, 0x00, - 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, - 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, - 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, - 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, - 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, - 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, - 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, - 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, - 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, - 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, - 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, - 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, - 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, - 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, - 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, - 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, - 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, - 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, - 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, - 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, - 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, - 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, - 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, - 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, - 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, - 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, - 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, - 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, - 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, - 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, - 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, - 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, - 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, - 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, - 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, - 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, - 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, - 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, - 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, - 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, - 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, - 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, - 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, - 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, - 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, - 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, - 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, - 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, - 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, - 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, - 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, - 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, - 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, - 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, - 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, - 0x00, 0xd1, 0x00, 0x00, 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, - 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4, 0x3c, 0xac, 0x7c, 0x00, - 0x00, 0x8b, 0xf2, 0x06, 0xc5, 0xc6, 0x91, 0x01, 0x13, 0x19, 0x0c, 0x12, - 0x59, 0x85, 0x53, 0x24, 0x90, 0xe4, 0x19, 0xca, 0x83, 0x44, 0x17, 0xa2, - 0x24, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, - 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, - 0x39, 0x38, 0x20, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, - 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, 0x29, 0x4d, 0x65, 0x74, - 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, - 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, - 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, - 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, - 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, - 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, - 0x65, 0x78, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, - 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, - 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x53, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, - 0x65, 0x78, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x61, 0x69, 0x72, 0x2e, - 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, - 0x5f, 0x5f, 0x61, 0x69, 0x72, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, - 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x5f, 0x29, 0x66, 0x6c, 0x6f, 0x61, - 0x74, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, - 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x00, 0x00, 0x00, 0xc4, 0x51, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0xa0, 0x04, 0x23, 0x08, 0x4b, - 0x32, 0x82, 0xa0, 0x08, 0x23, 0x08, 0xca, 0x30, 0x82, 0xa0, 0x10, 0x23, - 0x08, 0x08, 0x30, 0x82, 0xa0, 0x14, 0x23, 0x08, 0x8a, 0x31, 0x82, 0xa0, - 0x1c, 0x33, 0x0c, 0x5f, 0x00, 0x06, 0x33, 0x0c, 0x61, 0x20, 0x88, 0xc1, - 0x0c, 0xc1, 0x30, 0xc3, 0xf0, 0x7d, 0x63, 0x30, 0x03, 0x41, 0x84, 0x41, - 0x18, 0x8c, 0xc1, 0x0c, 0x41, 0x31, 0x43, 0x60, 0xcc, 0x10, 0x1c, 0x33, - 0x14, 0x48, 0xa2, 0x2c, 0xcc, 0x0c, 0x46, 0xe3, 0x24, 0xca, 0xf2, 0xcc, - 0x50, 0x40, 0x49, 0xb4, 0x48, 0x33, 0x0c, 0x70, 0x10, 0x07, 0x72, 0x30, - 0x83, 0x32, 0x06, 0x13, 0x35, 0x06, 0x61, 0x50, 0x25, 0xd6, 0xc2, 0xcc, - 0xa0, 0x84, 0xc1, 0x44, 0x85, 0x41, 0x18, 0x54, 0x89, 0xb2, 0x3c, 0x33, - 0x40, 0xdf, 0x85, 0x95, 0x01, 0xf5, 0x85, 0x41, 0xa6, 0x95, 0xc1, 0x66, - 0x06, 0x09, 0xb7, 0x74, 0x33, 0x40, 0x67, 0x70, 0x61, 0x65, 0x40, 0x9d, - 0x41, 0x18, 0x64, 0x5a, 0x19, 0x6c, 0x66, 0x90, 0x70, 0x8b, 0x37, 0x03, - 0x41, 0x07, 0x75, 0x60, 0x07, 0x77, 0x30, 0xc3, 0x40, 0x06, 0x73, 0x80, - 0x07, 0xb5, 0x01, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0x1a, 0xb8, - 0x81, 0x85, 0x06, 0x7a, 0x60, 0x59, 0x96, 0x1b, 0xd0, 0x81, 0x1b, 0xd0, - 0x81, 0x2f, 0xf8, 0x02, 0x4a, 0xd0, 0x04, 0x28, 0xc8, 0x48, 0x60, 0x82, - 0x2e, 0x62, 0x63, 0xb3, 0x6b, 0x73, 0x69, 0x7b, 0x23, 0xab, 0x63, 0x2b, - 0x73, 0x31, 0x63, 0x0b, 0x3b, 0x9b, 0x1b, 0x45, 0x38, 0x03, 0x34, 0x38, - 0x85, 0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x94, - 0x20, 0x0d, 0x6e, 0x09, 0x4b, 0x93, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, - 0x7b, 0x73, 0x1b, 0x25, 0x50, 0x83, 0xa3, 0xc2, 0xd2, 0xe4, 0x5c, 0xd8, - 0xc2, 0xdc, 0xce, 0xea, 0xc2, 0xce, 0xca, 0xbe, 0xec, 0xca, 0xe4, 0xe6, - 0xd2, 0xde, 0xdc, 0x46, 0x09, 0xd6, 0xe0, 0xa6, 0xb0, 0x34, 0x39, 0x97, - 0xb1, 0xb7, 0x36, 0xb8, 0x34, 0xb6, 0xb2, 0xaf, 0x37, 0x38, 0xba, 0xb4, - 0x37, 0xb7, 0xb9, 0x51, 0x06, 0x36, 0x68, 0x03, 0x37, 0x38, 0x25, 0x2c, - 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x8e, 0xae, 0x0c, 0x6f, 0x94, 0x00, 0x0f, - 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, - 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, - 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, - 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, - 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, - 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, - 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, - 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, - 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, - 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, - 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, - 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, - 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, - 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, - 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, - 0x00, 0x8c, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, - 0x00, 0x0b, 0x00, 0x00, 0x00, 0xc4, 0x4a, 0xa0, 0x0c, 0x8a, 0x80, 0xdc, - 0x08, 0xc0, 0x58, 0x44, 0x10, 0x04, 0xc1, 0x58, 0x84, 0x20, 0x08, 0xc2, - 0x58, 0xc4, 0x30, 0x0c, 0x03, 0x81, 0x31, 0x02, 0x10, 0x04, 0x41, 0xfc, - 0xa3, 0x30, 0x03, 0x30, 0x03, 0x40, 0x62, 0x06, 0x80, 0xc6, 0x0c, 0x00, - 0x00, 0xf1, 0x30, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, - 0x90, 0x51, 0x16, 0x08, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x23, 0x06, - 0x96, 0x05, 0x00, 0x00, 0x00, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f, 0x74, - 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d, 0x70, - 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x61, - 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, - 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x29, 0x61, 0x69, 0x72, - 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, - 0x72, 0x67, 0x28, 0x32, 0x29, 0x13, 0x04, 0x06, 0x59, 0x21, 0x80, 0x02, - 0x1f, 0xac, 0x18, 0x42, 0x01, 0x14, 0xfa, 0x60, 0xc5, 0x20, 0x0a, 0xa0, - 0xe0, 0x07, 0x1b, 0x82, 0x3d, 0xd8, 0x30, 0xe8, 0xc1, 0x28, 0xfc, 0xc1, - 0x86, 0x81, 0x14, 0x48, 0xe1, 0x0f, 0x36, 0x04, 0xa1, 0xb0, 0x21, 0x10, - 0x05, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x10, 0x8d, 0x64, 0x49, 0x14, 0x84, - 0xb2, 0x0b, 0x01, 0x51, 0x18, 0x45, 0x41, 0x28, 0x83, 0x0c, 0xc3, 0xd1, - 0x98, 0x10, 0x88, 0xff, 0x2e, 0x04, 0x85, 0x71, 0x12, 0x05, 0xa1, 0x0c, - 0x32, 0x1c, 0x0c, 0x64, 0x42, 0x20, 0xfe, 0x16, 0x14, 0xe0, 0xbf, 0x0b, - 0x91, 0x75, 0x61, 0x50, 0x51, 0x10, 0xca, 0x20, 0x03, 0x13, 0x51, 0x26, - 0x04, 0xe2, 0x6f, 0x45, 0x00, 0xfe, 0xbb, 0x10, 0x9e, 0x18, 0x98, 0xc1, - 0x46, 0x41, 0x28, 0x83, 0x0c, 0x91, 0x85, 0x99, 0x10, 0x88, 0xbf, 0x15, - 0x01, 0xf8, 0xef, 0x42, 0x88, 0xc1, 0x19, 0xac, 0x41, 0x18, 0x50, 0x10, - 0xca, 0x20, 0x43, 0xa0, 0x81, 0x81, 0x05, 0x95, 0xf8, 0x0f, 0x32, 0x0c, - 0x5d, 0x18, 0x58, 0x30, 0x89, 0xbf, 0x0d, 0x01, 0xf8, 0x0f, 0x32, 0x18, - 0x60, 0x30, 0x06, 0x16, 0x44, 0xe2, 0x6f, 0x43, 0x00, 0xfe, 0x83, 0x0c, - 0xc9, 0x18, 0x94, 0x81, 0x05, 0x8f, 0xf8, 0xdb, 0x10, 0x80, 0xff, 0x2e, - 0xc4, 0x1b, 0xd0, 0x01, 0x1e, 0xb4, 0x01, 0x05, 0xa1, 0x0c, 0x32, 0x04, - 0x67, 0xd0, 0x06, 0x16, 0x88, 0x81, 0xf8, 0x0f, 0x32, 0x0c, 0x6a, 0xe0, - 0x06, 0x16, 0x80, 0x81, 0xf8, 0x0f, 0x32, 0x14, 0x6c, 0xf0, 0x06, 0x16, - 0x74, 0xe2, 0x3f, 0xc8, 0x70, 0xb8, 0x01, 0x1c, 0x58, 0xa0, 0x89, 0xff, - 0x20, 0x03, 0x1f, 0xb4, 0x41, 0x1d, 0x58, 0x16, 0x88, 0xff, 0x20, 0x83, - 0x1f, 0xbc, 0x81, 0x1d, 0x98, 0x13, 0x88, 0xbf, 0x25, 0x03, 0xf8, 0x5b, - 0xc0, 0x80, 0xbf, 0x05, 0x09, 0xf8, 0x5b, 0x80, 0x80, 0xbf, 0x05, 0x05, - 0xf8, 0xcf, 0x36, 0xdc, 0x41, 0x00, 0xcc, 0x36, 0x04, 0xa5, 0x10, 0xcc, - 0x36, 0x04, 0x7c, 0x20, 0x64, 0x10, 0x10, 0x03, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x5b, 0x8e, 0x20, 0x20, 0x85, 0xa3, 0x14, 0x10, 0x53, 0xd8, 0x72, - 0x0c, 0x01, 0x29, 0x1c, 0xa6, 0x80, 0x94, 0xc2, 0x96, 0xe3, 0x08, 0x48, - 0xe1, 0x30, 0x05, 0xa4, 0x14, 0xb6, 0x1c, 0x4c, 0x40, 0x0a, 0x87, 0x29, - 0x20, 0xa5, 0xb0, 0xe5, 0x88, 0x02, 0x52, 0x38, 0x4c, 0x01, 0x29, 0x85, - 0x2d, 0x87, 0x15, 0x90, 0xc2, 0x51, 0x0a, 0x88, 0x29, 0x6c, 0x39, 0xc6, - 0x20, 0x20, 0x85, 0xa3, 0x14, 0x10, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x71, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, - 0x22, 0x84, 0x00, 0xda, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x65, 0x0c, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, - 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, - 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x33, 0x32, 0x30, - 0x32, 0x33, 0x2e, 0x39, 0x38, 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, - 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x74, 0x76, 0x6f, 0x73, 0x31, 0x33, 0x2e, - 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, - 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x90, 0x0e, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, - 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x68, 0x03, 0x00, - 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, - 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, - 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, - 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, - 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, - 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, - 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x7b, 0x00, 0x00, - 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, - 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, - 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, - 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, - 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, - 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, - 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, - 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, - 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, - 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, - 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, - 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, - 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, - 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, - 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, - 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, - 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, - 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, - 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, - 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, - 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, - 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, - 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, - 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, - 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, - 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, - 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, - 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, - 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, - 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, - 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, - 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, - 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, - 0x72, 0x00, 0x36, 0x78, 0x02, 0x01, 0x2c, 0x40, 0x15, 0xa4, 0x01, 0x28, - 0x0c, 0xe1, 0x90, 0x0e, 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, - 0x0e, 0xe5, 0x20, 0x0f, 0x6d, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe1, 0xc0, - 0x0e, 0xe9, 0x10, 0x0e, 0xf3, 0x00, 0x6c, 0xf0, 0x86, 0x02, 0x58, 0x80, - 0x2a, 0x48, 0x03, 0x50, 0x18, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, - 0xa1, 0x1e, 0xcc, 0xc1, 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, - 0xa1, 0x0d, 0xc2, 0x81, 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0x00, 0x00, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, - 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, - 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, - 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, - 0x30, 0x8c, 0x20, 0x00, 0x76, 0x08, 0x41, 0x24, 0x41, 0x98, 0xc9, 0x9a, - 0x07, 0x7a, 0x90, 0x87, 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, - 0x07, 0x7a, 0x08, 0x07, 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, - 0x07, 0x79, 0x48, 0x07, 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, - 0x28, 0x84, 0x62, 0x0c, 0x11, 0x84, 0x31, 0x74, 0x06, 0x02, 0xe6, 0x08, - 0xc0, 0x20, 0x05, 0xd4, 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x04, 0xc2, 0x30, - 0x02, 0xa1, 0x8c, 0x00, 0x00, 0x13, 0xc0, 0x20, 0x1c, 0xd2, 0x41, 0x1e, - 0xec, 0x80, 0x0e, 0xda, 0x20, 0x1c, 0xe0, 0x01, 0x1e, 0xd8, 0xa1, 0x1c, - 0xda, 0x80, 0x1e, 0xec, 0xe1, 0x1d, 0xe6, 0x21, 0x0e, 0xe6, 0xc0, 0x0d, - 0xe0, 0xc0, 0x0d, 0xe0, 0xa0, 0x0d, 0xe6, 0x21, 0x1d, 0xda, 0xa1, 0x1e, - 0xd8, 0x21, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0x61, 0xc3, 0x6d, 0x94, 0x43, - 0x1b, 0xc0, 0x83, 0x1e, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, - 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1e, 0xe0, 0x81, - 0x1e, 0xe0, 0x41, 0x1b, 0xa4, 0x03, 0x1e, 0xe8, 0x01, 0x1e, 0xe8, 0x01, - 0x1e, 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, - 0x1e, 0xc4, 0x81, 0x1d, 0xb4, 0x41, 0x3a, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, - 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x41, 0x3a, 0xd8, 0x01, - 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, - 0x39, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, - 0x1c, 0xb4, 0x81, 0x39, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, - 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1d, 0xe8, 0x41, - 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x01, - 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, - 0x3d, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, - 0x1c, 0xb4, 0x81, 0x3d, 0xd0, 0x01, 0x1e, 0xe8, 0x81, 0x1d, 0xd0, 0x81, - 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xd8, 0x01, 0x1d, 0xe8, 0x81, - 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xe4, 0x81, - 0x1d, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xe8, 0x41, 0x1c, 0xc8, 0x01, - 0x1e, 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, - 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x41, 0x1b, 0xd8, 0x43, - 0x1c, 0xe4, 0x81, 0x1c, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xe8, 0x81, - 0x1c, 0xd4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x41, 0x1d, 0xd8, 0x81, - 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x41, - 0x1b, 0xd8, 0x43, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, - 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xc4, 0x01, - 0x1c, 0xc8, 0x01, 0x1d, 0xe8, 0x41, 0x1c, 0xc0, 0x81, 0x1c, 0xd0, 0x81, - 0x1e, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, 0xb4, 0x81, 0x3b, 0xe0, 0x81, - 0x1e, 0xc4, 0x81, 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43, - 0x3e, 0x6c, 0x57, 0xfe, 0x9c, 0xf3, 0x60, 0x7f, 0x45, 0x44, 0x13, 0x71, - 0x0d, 0x89, 0x80, 0xe7, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x89, 0x0d, 0x02, 0x45, 0xd5, 0x06, 0x00, 0x00, 0xb2, - 0x40, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, + 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, + 0x00, 0x45, 0x4e, 0x44, 0x54, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x8c, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00, + 0x00, 0x21, 0x0c, 0x00, 0x00, 0x66, 0x03, 0x00, 0x00, 0x0b, 0x02, 0x21, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, + 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, + 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, + 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, + 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, + 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, 0x90, 0x91, 0x22, 0xc4, + 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, + 0x06, 0x51, 0x18, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, + 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, + 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, + 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, + 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, + 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, + 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, + 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, + 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, + 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, + 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, + 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, + 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, + 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, + 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, + 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, + 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, + 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, + 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, + 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, + 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, + 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, + 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, + 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, + 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, + 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, + 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, + 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, + 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, + 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, + 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, + 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, + 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x78, + 0xc2, 0x00, 0x2c, 0x40, 0x15, 0xa4, 0x01, 0x28, 0x0c, 0xe1, 0x90, 0x0e, + 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, 0x0e, 0xe5, 0x20, 0x0f, + 0x6d, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe1, 0xc0, 0x0e, 0xe9, 0x10, 0x0e, + 0xf3, 0x00, 0x6c, 0xf0, 0x06, 0x02, 0x58, 0x80, 0x2a, 0x48, 0x03, 0x50, + 0x18, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, 0xcc, 0xc1, + 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d, 0xc2, 0x81, + 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, + 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x60, 0x87, 0x10, 0xc0, + 0x30, 0x82, 0x00, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87, + 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07, + 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07, + 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x52, 0x88, + 0x11, 0x8c, 0xa1, 0x33, 0x10, 0x30, 0x47, 0x00, 0x06, 0x29, 0xa0, 0xe6, + 0x08, 0x40, 0x61, 0x10, 0x21, 0x10, 0x86, 0x11, 0x08, 0x65, 0x04, 0x00, + 0x00, 0x13, 0xc0, 0x20, 0x1c, 0xd2, 0x41, 0x1e, 0xec, 0x80, 0x0e, 0xda, + 0x20, 0x1c, 0xe0, 0x01, 0x1e, 0xd8, 0xa1, 0x1c, 0xda, 0x80, 0x1e, 0xec, + 0xe1, 0x1d, 0xe6, 0x21, 0x0e, 0xe6, 0xc0, 0x0d, 0xe0, 0xc0, 0x0d, 0xe0, + 0xa0, 0x0d, 0xe6, 0x21, 0x1d, 0xda, 0xa1, 0x1e, 0xd8, 0x21, 0x1c, 0xe8, + 0xe1, 0x1d, 0xe4, 0x61, 0xc3, 0x6d, 0x94, 0x43, 0x1b, 0xc0, 0x83, 0x1e, + 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, + 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1e, 0xe0, 0x81, 0x1e, 0xe0, 0x41, 0x1b, + 0xa4, 0x03, 0x1e, 0xe8, 0x01, 0x1e, 0xe8, 0x01, 0x1e, 0xb4, 0x41, 0x3a, + 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d, + 0xb4, 0x41, 0x3a, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, + 0xcc, 0x81, 0x1c, 0xb4, 0x41, 0x3a, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, + 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x39, 0xcc, 0x81, 0x1c, + 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x39, + 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, + 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e, + 0xc4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x01, 0x1d, 0xe8, 0xc1, 0x1c, + 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xcc, 0x81, 0x1c, + 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d, + 0xd0, 0x01, 0x1e, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, + 0xb4, 0x81, 0x3d, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, + 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xe4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, + 0xc8, 0x01, 0x1e, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xb4, 0x81, 0x3d, + 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, + 0xc4, 0x81, 0x1c, 0xe0, 0x41, 0x1b, 0xd8, 0x43, 0x1c, 0xe4, 0x81, 0x1c, + 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, + 0xb4, 0x81, 0x3d, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, + 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x41, 0x1b, 0xd8, 0x43, 0x1d, + 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, + 0xc4, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, + 0xe8, 0x41, 0x1c, 0xc0, 0x81, 0x1c, 0xd0, 0x81, 0x1e, 0xc4, 0x01, 0x1c, + 0xc8, 0x01, 0x1d, 0xb4, 0x81, 0x3b, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1d, + 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43, 0x42, 0x6c, 0x57, 0xfe, + 0xac, 0xb3, 0x20, 0xc3, 0x5f, 0x11, 0xd1, 0x44, 0x5c, 0x43, 0x22, 0x00, + 0x3a, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, + 0x62, 0x83, 0x40, 0x51, 0xb4, 0x01, 0x00, 0x80, 0x2c, 0x10, 0x00, 0x00, + 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x52, 0x45, 0x50, 0x02, - 0x85, 0x30, 0x02, 0x50, 0x06, 0x05, 0x18, 0x50, 0x20, 0xc4, 0x46, 0x00, - 0x68, 0x8d, 0x25, 0x44, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x18, 0x00, + 0x85, 0x30, 0x02, 0x50, 0x80, 0x01, 0x05, 0x52, 0x06, 0xc4, 0x46, 0x00, + 0x68, 0x8d, 0x25, 0x48, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, @@ -560,261 +248,263 @@ const unsigned char sdl_metallib[] = { 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, 0x00, 0xd6, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, - 0x11, 0x32, 0x64, 0xd4, 0x3a, 0x4c, 0x7d, 0x00, 0x00, 0x8b, 0xf2, 0x06, - 0xc5, 0xc6, 0x91, 0x01, 0x13, 0x19, 0x0c, 0x12, 0x59, 0x45, 0x66, 0x20, - 0x90, 0xe4, 0x29, 0x0f, 0x12, 0x5d, 0x88, 0x92, 0x00, 0x53, 0x44, 0x4b, + 0x11, 0x32, 0x64, 0xd4, 0x3c, 0xec, 0x7c, 0x00, 0x00, 0x8b, 0x12, 0x07, + 0xc5, 0xc6, 0x91, 0x01, 0x13, 0x19, 0x0c, 0x12, 0x59, 0x85, 0x53, 0x24, + 0x90, 0xe4, 0x19, 0xca, 0x83, 0x44, 0x17, 0xa2, 0x24, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, 0x20, 0x28, - 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, - 0x33, 0x2e, 0x39, 0x38, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, - 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, - 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x69, 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, - 0x5f, 0x66, 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, - 0x6f, 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, - 0x69, 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x67, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x5f, 0x5f, 0x61, 0x69, 0x72, - 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, - 0x5f, 0x5f, 0x29, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, - 0x72, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, - 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x00, 0x00, 0x04, 0x58, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0xa0, 0x04, 0x23, 0x08, 0x4b, - 0x32, 0x82, 0xa0, 0x08, 0x23, 0x08, 0xca, 0x30, 0x82, 0xa0, 0x10, 0x23, - 0x08, 0x08, 0x30, 0x82, 0xa0, 0x14, 0x23, 0x08, 0x8a, 0x31, 0x82, 0xa0, - 0x1c, 0x33, 0x0c, 0x5e, 0xf0, 0xcd, 0x30, 0x80, 0x81, 0x10, 0x06, 0x33, - 0x04, 0xc3, 0x0c, 0x83, 0xe7, 0x89, 0xc1, 0x0c, 0x04, 0x01, 0x06, 0x60, - 0x20, 0x06, 0x33, 0x04, 0xc5, 0x0c, 0x81, 0x31, 0x43, 0x70, 0xcc, 0x50, - 0x20, 0x89, 0xb2, 0x30, 0x33, 0x18, 0x8d, 0x93, 0x28, 0xcb, 0x33, 0x83, - 0xd1, 0x40, 0x49, 0xb4, 0x48, 0x33, 0x0c, 0x6f, 0x00, 0x07, 0x71, 0x30, - 0x83, 0x22, 0x06, 0x13, 0x25, 0x06, 0x60, 0x50, 0x25, 0xd1, 0xc2, 0xcc, - 0xa0, 0x80, 0xc1, 0x44, 0x81, 0x01, 0x18, 0x54, 0x89, 0xb2, 0x3c, 0x33, - 0x28, 0xde, 0x44, 0x79, 0x60, 0x50, 0x25, 0xd1, 0x22, 0xcd, 0x00, 0x91, - 0x81, 0x75, 0x95, 0x01, 0xe5, 0x81, 0x01, 0x96, 0x95, 0x81, 0x66, 0x06, - 0xc9, 0xb6, 0x70, 0x33, 0x40, 0x61, 0x60, 0x5d, 0x65, 0x40, 0x91, 0x01, - 0x18, 0x60, 0x59, 0x19, 0x68, 0x66, 0x90, 0x6c, 0x4b, 0x37, 0x43, 0x31, - 0x07, 0x74, 0x50, 0x07, 0x76, 0x70, 0x07, 0x33, 0x0c, 0x63, 0x20, 0x07, - 0x78, 0x50, 0x1c, 0xc0, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x89, 0x81, - 0x1b, 0x58, 0x68, 0xa0, 0x07, 0x96, 0x65, 0xb9, 0x01, 0x1d, 0xd0, 0x01, - 0x1d, 0xf8, 0x82, 0x2f, 0xc8, 0x82, 0x4b, 0xd0, 0x04, 0x2b, 0xc8, 0x48, - 0x60, 0x82, 0x2e, 0x62, 0x63, 0xb3, 0x6b, 0x73, 0x69, 0x7b, 0x23, 0xab, - 0x63, 0x2b, 0x73, 0x31, 0x63, 0x0b, 0x3b, 0x9b, 0x1b, 0x45, 0x30, 0x83, - 0x33, 0x38, 0x85, 0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, - 0x6e, 0x94, 0x00, 0x0d, 0x6e, 0x09, 0x4b, 0x93, 0x73, 0xb1, 0x2b, 0x93, - 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0x48, 0x83, 0xa3, 0xc2, 0xd2, 0xe4, - 0x5c, 0xd8, 0xc2, 0xdc, 0xce, 0xea, 0xc2, 0xce, 0xca, 0xbe, 0xec, 0xca, - 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0x46, 0x09, 0xd4, 0xe0, 0xa6, 0xb0, 0x34, - 0x39, 0x97, 0xb1, 0xb7, 0x36, 0xb8, 0x34, 0xb6, 0xb2, 0xaf, 0x37, 0x38, - 0xba, 0xb4, 0x37, 0xb7, 0xb9, 0x51, 0x86, 0x35, 0x60, 0x83, 0x36, 0x38, - 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x8e, 0xae, 0x0c, 0x6f, 0x94, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, - 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, - 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, - 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, - 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60, - 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20, - 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87, - 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07, - 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d, - 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc, - 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2, - 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, - 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, - 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, - 0x00, 0x61, 0x20, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, - 0x2c, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0xc4, 0x4a, 0xa0, - 0x0c, 0x8a, 0x80, 0xdc, 0x08, 0xc0, 0x58, 0x44, 0x10, 0x04, 0xc1, 0x58, - 0x84, 0x20, 0x08, 0xc2, 0x58, 0xc4, 0x30, 0x0c, 0x03, 0x85, 0x19, 0x80, - 0x19, 0x00, 0x12, 0x33, 0x00, 0x34, 0x66, 0x00, 0x00, 0xf1, 0x30, 0x00, - 0x00, 0x2c, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0xc8, - 0x3c, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x13, 0x06, 0x96, 0x05, 0x00, 0x00, + 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, + 0x28, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, + 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, + 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, + 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x61, + 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, + 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, + 0x76, 0x34, 0x5f, 0x66, 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x61, 0x69, + 0x72, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, + 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x5f, 0x5f, + 0x61, 0x69, 0x72, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, + 0x64, 0x65, 0x72, 0x5f, 0x5f, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, + 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, + 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, + 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x00, 0xc4, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x82, 0xa0, 0x04, 0x23, 0x08, 0x4b, 0x32, 0x82, 0xa0, 0x08, + 0x23, 0x08, 0xca, 0x30, 0x82, 0xa0, 0x10, 0x23, 0x08, 0x08, 0x30, 0x82, + 0xa0, 0x14, 0x23, 0x08, 0x8a, 0x31, 0x82, 0xa0, 0x1c, 0x33, 0x0c, 0x5f, + 0x00, 0x06, 0x33, 0x0c, 0x61, 0x20, 0x88, 0xc1, 0x0c, 0xc1, 0x30, 0xc3, + 0xf0, 0x7d, 0x63, 0x30, 0x03, 0x41, 0x84, 0x41, 0x18, 0x8c, 0xc1, 0x0c, + 0x41, 0x31, 0x43, 0x60, 0xcc, 0x10, 0x1c, 0x33, 0x14, 0x48, 0xa2, 0x2c, + 0xcc, 0x0c, 0x46, 0xe3, 0x24, 0xca, 0xf2, 0xcc, 0x50, 0x40, 0x49, 0xb4, + 0x48, 0x33, 0x0c, 0x70, 0x10, 0x07, 0x72, 0x30, 0x83, 0x32, 0x06, 0x13, + 0x35, 0x06, 0x61, 0x50, 0x25, 0xd6, 0xc2, 0xcc, 0xa0, 0x84, 0xc1, 0x44, + 0x85, 0x41, 0x18, 0x54, 0x89, 0xb2, 0x3c, 0x33, 0x40, 0xdf, 0x85, 0x95, + 0x01, 0xf5, 0x85, 0x41, 0xa6, 0x95, 0xc1, 0x66, 0x06, 0x09, 0xb7, 0x74, + 0x33, 0x40, 0x67, 0x70, 0x61, 0x65, 0x40, 0x9d, 0x41, 0x18, 0x64, 0x5a, + 0x19, 0x6c, 0x66, 0x90, 0x70, 0x8b, 0x37, 0x03, 0x41, 0x07, 0x75, 0x60, + 0x07, 0x77, 0x30, 0xc3, 0x40, 0x06, 0x73, 0x80, 0x07, 0xb5, 0x01, 0x1c, + 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0x1a, 0xb8, 0x81, 0x85, 0x06, 0x7a, + 0x60, 0x59, 0x96, 0x1b, 0xd0, 0x81, 0x1b, 0xd0, 0x81, 0x2f, 0xf8, 0x02, + 0x4a, 0xd0, 0x04, 0x28, 0xc8, 0x48, 0x60, 0x82, 0x2e, 0x62, 0x63, 0xb3, + 0x6b, 0x73, 0x69, 0x7b, 0x23, 0xab, 0x63, 0x2b, 0x73, 0x31, 0x63, 0x0b, + 0x3b, 0x9b, 0x1b, 0x45, 0x38, 0x03, 0x34, 0x38, 0x85, 0x8d, 0xcd, 0xae, + 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x94, 0x20, 0x0d, 0x6e, 0x09, + 0x4b, 0x93, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, + 0x50, 0x83, 0xa3, 0xc2, 0xd2, 0xe4, 0x5c, 0xd8, 0xc2, 0xdc, 0xce, 0xea, + 0xc2, 0xce, 0xca, 0xbe, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0x46, + 0x09, 0xd6, 0xe0, 0xa6, 0xb0, 0x34, 0x39, 0x97, 0xb1, 0xb7, 0x36, 0xb8, + 0x34, 0xb6, 0xb2, 0xaf, 0x37, 0x38, 0xba, 0xb4, 0x37, 0xb7, 0xb9, 0x51, + 0x06, 0x36, 0x68, 0x03, 0x37, 0x38, 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae, + 0x4c, 0x8e, 0xae, 0x0c, 0x6f, 0x94, 0x00, 0x0f, 0x00, 0xa9, 0x18, 0x00, + 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, + 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, + 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, + 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, + 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4, + 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81, + 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08, + 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01, + 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c, + 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c, + 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c, + 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1, + 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, + 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, + 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x8c, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0x00, 0xc4, 0x4a, 0xa0, 0x0c, 0x8a, 0x80, 0xdc, 0x08, 0xc0, 0x58, 0x44, + 0x10, 0x04, 0xc1, 0x58, 0x84, 0x20, 0x08, 0xc2, 0x58, 0xc4, 0x30, 0x0c, + 0x03, 0x81, 0x31, 0x02, 0x10, 0x04, 0x41, 0xfc, 0xa3, 0x30, 0x03, 0x30, + 0x03, 0x40, 0x62, 0x06, 0x80, 0xc6, 0x0c, 0x00, 0x00, 0xf1, 0x30, 0x00, + 0x00, 0x2c, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0x08, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x23, 0x06, 0x96, 0x05, 0x00, 0x00, 0x00, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, - 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, - 0x74, 0x65, 0x78, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, - 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, - 0x34, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, - 0x00, 0x13, 0x04, 0x06, 0x59, 0x21, 0x80, 0x02, 0x1f, 0xac, 0x18, 0x42, + 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, + 0x72, 0x74, 0x65, 0x78, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, + 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, + 0x28, 0x33, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x32, + 0x29, 0x13, 0x04, 0x06, 0x59, 0x21, 0x80, 0x02, 0x1f, 0xac, 0x18, 0x42, 0x01, 0x14, 0xfa, 0x60, 0xc5, 0x20, 0x0a, 0xa0, 0xe0, 0x07, 0x1b, 0x82, 0x3d, 0xd8, 0x30, 0xe8, 0xc1, 0x28, 0xfc, 0xc1, 0x86, 0x81, 0x14, 0x48, 0xe1, 0x0f, 0x36, 0x04, 0xa1, 0xb0, 0x21, 0x10, 0x05, 0x00, 0x00, 0x00, - 0x00, 0xbb, 0x10, 0x8c, 0x64, 0x49, 0x14, 0x84, 0xb2, 0x0b, 0xf1, 0x50, - 0x18, 0x45, 0x41, 0x28, 0x83, 0x0c, 0xc3, 0xc1, 0x98, 0x10, 0x88, 0xff, - 0x2e, 0xc4, 0x84, 0x71, 0x11, 0x05, 0xa1, 0x0c, 0x32, 0x1c, 0xcc, 0x63, - 0x42, 0x20, 0xfe, 0x16, 0x14, 0xe0, 0xbf, 0x0b, 0x81, 0x75, 0x61, 0x40, - 0x51, 0x10, 0xca, 0x20, 0x03, 0x13, 0x4d, 0x26, 0x04, 0xe2, 0x6f, 0x45, - 0x00, 0xfe, 0xbb, 0x10, 0x9d, 0x18, 0x98, 0x81, 0x46, 0x41, 0x28, 0x83, - 0x0c, 0x91, 0x75, 0x99, 0x10, 0x88, 0xbf, 0x15, 0x01, 0xf8, 0xef, 0x42, - 0x84, 0xc1, 0x19, 0xac, 0x01, 0x18, 0x50, 0x10, 0xca, 0x20, 0x43, 0xa0, - 0x7d, 0x16, 0x54, 0xe2, 0x3f, 0xc8, 0x30, 0x74, 0x60, 0x60, 0xc1, 0x24, - 0xfe, 0x36, 0x04, 0xe0, 0x3f, 0xc8, 0x60, 0x80, 0x81, 0x18, 0x58, 0x10, - 0x89, 0xbf, 0x0d, 0x01, 0xf8, 0x0f, 0x32, 0x24, 0x63, 0x40, 0x06, 0x16, - 0x3c, 0xe2, 0x6f, 0x43, 0x00, 0xfe, 0xbb, 0x10, 0x6e, 0x40, 0x07, 0x78, - 0xc0, 0x06, 0x14, 0x84, 0x32, 0xc8, 0x10, 0x9c, 0x01, 0x1b, 0x58, 0x20, - 0x06, 0xe2, 0x3f, 0xc8, 0x30, 0xa8, 0x41, 0x1b, 0x58, 0x00, 0x06, 0xe2, - 0x3f, 0xc8, 0x50, 0xb0, 0x81, 0x1b, 0x58, 0xd0, 0x89, 0xff, 0x20, 0xc3, - 0xe1, 0x06, 0x6f, 0x60, 0x81, 0x26, 0xfe, 0x83, 0x0c, 0x7c, 0xe0, 0x06, - 0x74, 0x60, 0x59, 0x20, 0xfe, 0x83, 0x0c, 0x7e, 0x00, 0x07, 0x75, 0x60, - 0x4e, 0x20, 0xfe, 0x96, 0x0c, 0xe0, 0x6f, 0x01, 0x03, 0xfe, 0x16, 0x24, - 0xe0, 0x6f, 0x01, 0x02, 0xfe, 0x16, 0x14, 0xe0, 0x3f, 0xdb, 0x60, 0x07, - 0x01, 0x30, 0xdb, 0x10, 0x94, 0x42, 0x30, 0xdb, 0x10, 0x94, 0x82, 0x90, - 0x41, 0x40, 0x0c, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, + 0x00, 0xbb, 0x10, 0x8d, 0x64, 0x49, 0x14, 0x84, 0xb2, 0x0b, 0x01, 0x51, + 0x18, 0x45, 0x41, 0x28, 0x83, 0x0c, 0xc3, 0xd1, 0x98, 0x10, 0x88, 0xff, + 0x2e, 0x04, 0x85, 0x71, 0x12, 0x05, 0xa1, 0x0c, 0x32, 0x1c, 0x0c, 0x64, + 0x42, 0x20, 0xfe, 0x16, 0x14, 0xe0, 0xbf, 0x0b, 0x91, 0x75, 0x61, 0x50, + 0x51, 0x10, 0xca, 0x20, 0x03, 0x13, 0x51, 0x26, 0x04, 0xe2, 0x6f, 0x45, + 0x00, 0xfe, 0xbb, 0x10, 0x9e, 0x18, 0x98, 0xc1, 0x46, 0x41, 0x28, 0x83, + 0x0c, 0x91, 0x85, 0x99, 0x10, 0x88, 0xbf, 0x15, 0x01, 0xf8, 0xef, 0x42, + 0x88, 0xc1, 0x19, 0xac, 0x41, 0x18, 0x50, 0x10, 0xca, 0x20, 0x43, 0xa0, + 0x81, 0x81, 0x05, 0x95, 0xf8, 0x0f, 0x32, 0x0c, 0x5d, 0x18, 0x58, 0x30, + 0x89, 0xbf, 0x0d, 0x01, 0xf8, 0x0f, 0x32, 0x18, 0x60, 0x30, 0x06, 0x16, + 0x44, 0xe2, 0x6f, 0x43, 0x00, 0xfe, 0x83, 0x0c, 0xc9, 0x18, 0x94, 0x81, + 0x05, 0x8f, 0xf8, 0xdb, 0x10, 0x80, 0xff, 0x2e, 0xc4, 0x1b, 0xd0, 0x01, + 0x1e, 0xb4, 0x01, 0x05, 0xa1, 0x0c, 0x32, 0x04, 0x67, 0xd0, 0x06, 0x16, + 0x88, 0x81, 0xf8, 0x0f, 0x32, 0x0c, 0x6a, 0xe0, 0x06, 0x16, 0x80, 0x81, + 0xf8, 0x0f, 0x32, 0x14, 0x6c, 0xf0, 0x06, 0x16, 0x74, 0xe2, 0x3f, 0xc8, + 0x70, 0xb8, 0x01, 0x1c, 0x58, 0xa0, 0x89, 0xff, 0x20, 0x03, 0x1f, 0xb4, + 0x41, 0x1d, 0x58, 0x16, 0x88, 0xff, 0x20, 0x83, 0x1f, 0xbc, 0x81, 0x1d, + 0x98, 0x13, 0x88, 0xbf, 0x25, 0x03, 0xf8, 0x5b, 0xc0, 0x80, 0xbf, 0x05, + 0x09, 0xf8, 0x5b, 0x80, 0x80, 0xbf, 0x05, 0x05, 0xf8, 0xcf, 0x36, 0xdc, + 0x41, 0x00, 0xcc, 0x36, 0x04, 0xa5, 0x10, 0xcc, 0x36, 0x04, 0x7c, 0x20, + 0x64, 0x10, 0x10, 0x03, 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, 0x20, 0x85, 0xa3, 0x14, 0x10, 0x53, 0xd8, 0x72, 0x0c, 0x01, 0x29, 0x1c, 0xa6, 0x80, 0x94, 0xc2, 0x96, 0xe3, 0x08, 0x48, 0xe1, 0x30, 0x05, 0xa4, 0x14, 0xb6, 0x1c, 0x4c, 0x40, 0x0a, 0x87, 0x29, 0x20, 0xa5, 0xb0, 0xe5, 0x88, 0x02, 0x52, 0x38, 0x4c, 0x01, 0x29, 0x85, 0x2d, 0x87, 0x15, 0x90, 0xc2, 0x51, 0x0a, 0x88, 0x29, 0x6c, 0x39, 0xc6, 0x20, 0x20, 0x85, 0xa3, 0x14, 0x10, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xde, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xda, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xf0, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x77, 0x00, 0x00, 0x00, - 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, - 0x72, 0x74, 0x65, 0x78, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, - 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, - 0x74, 0x76, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, - 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0xf8, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, - 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, - 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, - 0x00, 0x41, 0x03, 0x00, 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, - 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, - 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, - 0x42, 0x84, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x42, - 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, - 0x42, 0x04, 0x49, 0x0e, 0x90, 0x11, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, - 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x21, 0x46, 0x06, 0x51, 0x18, 0x00, - 0x00, 0x71, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0x01, 0x80, 0x03, 0x40, 0x02, 0x28, 0x22, 0x1c, 0xe0, 0x01, 0x1e, - 0xe4, 0xe1, 0x1d, 0xf0, 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, - 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, - 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, - 0x87, 0x36, 0x60, 0x87, 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, - 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, - 0x07, 0x72, 0xa0, 0x07, 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, - 0xdc, 0xe1, 0x1d, 0xda, 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, - 0xd2, 0xc1, 0x1d, 0xe6, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, - 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, - 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, - 0xda, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, - 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, - 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, - 0x07, 0x76, 0x48, 0x87, 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, - 0x03, 0x76, 0x28, 0x87, 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, - 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, - 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, - 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, - 0x87, 0x36, 0x70, 0x87, 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, - 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, - 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, - 0xce, 0xc1, 0x1d, 0xca, 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, - 0xde, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, - 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, - 0x87, 0x77, 0x68, 0x03, 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, - 0x07, 0x77, 0x38, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, - 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, - 0xc6, 0x61, 0x1d, 0xda, 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, - 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, - 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, - 0x00, 0x3c, 0x00, 0x88, 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, - 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, - 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0xe0, 0x09, 0x03, - 0xb0, 0x00, 0x55, 0x90, 0x06, 0x60, 0x30, 0x84, 0x43, 0x3a, 0xc8, 0x43, - 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, - 0x3b, 0xbc, 0x43, 0x1b, 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x84, 0x40, - 0x00, 0x89, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08, - 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, - 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, - 0x4c, 0x10, 0x3c, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, - 0x67, 0x49, 0x53, 0x44, 0x09, 0x93, 0xcf, 0x1e, 0xc0, 0x40, 0x44, 0x9c, - 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x12, 0x42, 0x00, 0x00, 0x00, 0x00, 0x06, - 0x11, 0x06, 0xa1, 0x10, 0x21, 0x41, 0x54, 0x03, 0x01, 0x73, 0x04, 0x60, - 0x90, 0x02, 0x38, 0x47, 0x00, 0x0a, 0x83, 0x08, 0x80, 0x30, 0x8c, 0x30, - 0x00, 0xc3, 0x08, 0x04, 0x32, 0x02, 0x00, 0x00, 0x00, 0x13, 0xc0, 0x20, - 0x1c, 0xd2, 0x41, 0x1e, 0xec, 0x80, 0x0e, 0xda, 0x20, 0x1c, 0xe0, 0x01, - 0x1e, 0xd8, 0xa1, 0x1c, 0xda, 0x80, 0x1e, 0xec, 0xe1, 0x1d, 0xe6, 0x21, - 0x0e, 0xe6, 0xc0, 0x0d, 0xe0, 0xc0, 0x0d, 0xe0, 0xa0, 0x0d, 0xe6, 0x21, - 0x1d, 0xda, 0xa1, 0x1e, 0xd8, 0x21, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0x61, - 0xc3, 0x6d, 0x94, 0x43, 0x1b, 0xc0, 0x83, 0x1e, 0xd8, 0x01, 0x1d, 0xe8, - 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x41, 0x3a, 0xc4, - 0x81, 0x1e, 0xe0, 0x81, 0x1e, 0xe0, 0x41, 0x1b, 0xa4, 0x03, 0x1e, 0xe8, - 0x01, 0x1e, 0xe8, 0x01, 0x1e, 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1d, 0xe8, - 0x41, 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d, 0xb4, 0x41, 0x3a, 0xcc, - 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, - 0x41, 0x3a, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, - 0x01, 0x1d, 0xb4, 0x81, 0x39, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, - 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x39, 0xd8, 0x01, 0x1d, 0xe8, - 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xc4, - 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d, 0xb4, - 0x81, 0x3d, 0xc8, 0x01, 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, - 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, - 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xd0, 0x01, 0x1e, 0xe8, - 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xd8, - 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, - 0x81, 0x3d, 0xe4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xe8, - 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1c, 0xe0, - 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, - 0x41, 0x1b, 0xd8, 0x43, 0x1c, 0xe4, 0x81, 0x1c, 0xe8, 0x81, 0x1c, 0xd4, - 0x81, 0x1d, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, - 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, - 0x41, 0x1d, 0xd8, 0x41, 0x1b, 0xd8, 0x43, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, - 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xb4, - 0x81, 0x3d, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, 0xe8, 0x41, 0x1c, 0xc0, - 0x81, 0x1c, 0xd0, 0x81, 0x1e, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, 0xb4, - 0x81, 0x3b, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, - 0x81, 0x46, 0x08, 0x43, 0x4a, 0x6c, 0x57, 0xfe, 0xac, 0xb3, 0x20, 0xc3, - 0x5f, 0x44, 0x80, 0xc1, 0x10, 0xcd, 0x34, 0x24, 0x02, 0xa4, 0x02, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x36, 0x08, - 0x14, 0x1d, 0x1a, 0x00, 0x00, 0xc8, 0x02, 0x01, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, - 0x47, 0xc6, 0x04, 0x43, 0xc2, 0x22, 0x28, 0x81, 0x42, 0x18, 0x01, 0x28, - 0xa0, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0xd2, 0x11, - 0x80, 0x42, 0x28, 0x88, 0xc2, 0x28, 0x90, 0x42, 0x29, 0x98, 0xc2, 0xa1, - 0x1c, 0x4b, 0x88, 0x04, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, + 0x00, 0x12, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x79, 0x00, 0x00, 0x00, + 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x76, + 0x65, 0x72, 0x74, 0x65, 0x78, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, + 0x30, 0x34, 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, + 0x65, 0x2d, 0x74, 0x76, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, + 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x90, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00, + 0x00, 0x21, 0x0c, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x0b, 0x02, 0x21, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, + 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, + 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, + 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, + 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, + 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, 0x90, 0x91, 0x22, 0xc4, + 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, + 0x06, 0x51, 0x18, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, + 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, + 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, + 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, + 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, + 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, + 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, + 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, + 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, + 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, + 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, + 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, + 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, + 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, + 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, + 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, + 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, + 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, + 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, + 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, + 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, + 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, + 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, + 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, + 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, + 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, + 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, + 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, + 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, + 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, + 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, + 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, + 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x78, + 0x02, 0x01, 0x2c, 0x40, 0x15, 0xa4, 0x01, 0x28, 0x0c, 0xe1, 0x90, 0x0e, + 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, 0x0e, 0xe5, 0x20, 0x0f, + 0x6d, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe1, 0xc0, 0x0e, 0xe9, 0x10, 0x0e, + 0xf3, 0x00, 0x6c, 0xf0, 0x86, 0x02, 0x58, 0x80, 0x2a, 0x48, 0x03, 0x50, + 0x18, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, 0xcc, 0xc1, + 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d, 0xc2, 0x81, + 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, + 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, + 0x76, 0x08, 0x41, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87, + 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07, + 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07, + 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x62, 0x0c, + 0x11, 0x84, 0x31, 0x74, 0x06, 0x02, 0xe6, 0x08, 0xc0, 0x20, 0x05, 0xd4, + 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x04, 0xc2, 0x30, 0x02, 0xa1, 0x8c, 0x00, + 0x00, 0x13, 0xc0, 0x20, 0x1c, 0xd2, 0x41, 0x1e, 0xec, 0x80, 0x0e, 0xda, + 0x20, 0x1c, 0xe0, 0x01, 0x1e, 0xd8, 0xa1, 0x1c, 0xda, 0x80, 0x1e, 0xec, + 0xe1, 0x1d, 0xe6, 0x21, 0x0e, 0xe6, 0xc0, 0x0d, 0xe0, 0xc0, 0x0d, 0xe0, + 0xa0, 0x0d, 0xe6, 0x21, 0x1d, 0xda, 0xa1, 0x1e, 0xd8, 0x21, 0x1c, 0xe8, + 0xe1, 0x1d, 0xe4, 0x61, 0xc3, 0x6d, 0x94, 0x43, 0x1b, 0xc0, 0x83, 0x1e, + 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, + 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1e, 0xe0, 0x81, 0x1e, 0xe0, 0x41, 0x1b, + 0xa4, 0x03, 0x1e, 0xe8, 0x01, 0x1e, 0xe8, 0x01, 0x1e, 0xb4, 0x41, 0x3a, + 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d, + 0xb4, 0x41, 0x3a, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, + 0xcc, 0x81, 0x1c, 0xb4, 0x41, 0x3a, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, + 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x39, 0xcc, 0x81, 0x1c, + 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x39, + 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, + 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e, + 0xc4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x01, 0x1d, 0xe8, 0xc1, 0x1c, + 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xcc, 0x81, 0x1c, + 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d, + 0xd0, 0x01, 0x1e, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, + 0xb4, 0x81, 0x3d, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, + 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xe4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, + 0xc8, 0x01, 0x1e, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xb4, 0x81, 0x3d, + 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, + 0xc4, 0x81, 0x1c, 0xe0, 0x41, 0x1b, 0xd8, 0x43, 0x1c, 0xe4, 0x81, 0x1c, + 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, + 0xb4, 0x81, 0x3d, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, + 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x41, 0x1b, 0xd8, 0x43, 0x1d, + 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, + 0xc4, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, + 0xe8, 0x41, 0x1c, 0xc0, 0x81, 0x1c, 0xd0, 0x81, 0x1e, 0xc4, 0x01, 0x1c, + 0xc8, 0x01, 0x1d, 0xb4, 0x81, 0x3b, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1d, + 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43, 0x3e, 0x6c, 0x57, 0xfe, + 0x9c, 0xf3, 0x60, 0x7f, 0x45, 0x44, 0x13, 0x71, 0x0d, 0x89, 0x80, 0xe7, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x0d, 0x02, 0x45, 0xd5, 0x06, 0x00, 0x00, 0xb2, 0x40, 0x0a, 0x00, 0x00, + 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, + 0x47, 0xc6, 0x04, 0x43, 0x52, 0x45, 0x50, 0x02, 0x85, 0x30, 0x02, 0x50, + 0x06, 0x05, 0x18, 0x50, 0x20, 0xc4, 0x46, 0x00, 0x68, 0x8d, 0x25, 0x48, + 0x02, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, @@ -870,264 +560,260 @@ const unsigned char sdl_metallib[] = { 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x79, 0x20, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0x32, 0x9a, 0x08, + 0x00, 0x79, 0x20, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4, - 0xca, 0x00, 0x0c, 0x62, 0x09, 0x8b, 0xf2, 0x06, 0xc5, 0xc6, 0x91, 0x41, - 0x14, 0x19, 0x52, 0xa6, 0x3c, 0x06, 0x83, 0x58, 0x85, 0xf2, 0x48, 0x08, - 0x55, 0x30, 0x8c, 0xb2, 0x38, 0xcf, 0xf3, 0x44, 0xd7, 0x13, 0x00, 0x00, - 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, - 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, - 0x39, 0x38, 0x20, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, - 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, 0x29, 0x4d, 0x65, 0x74, - 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, - 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, - 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, - 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x34, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x61, 0x69, 0x72, 0x2e, - 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x65, - 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, - 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x63, 0x6f, 0x6c, - 0x6f, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, - 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, - 0x6f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, - 0x61, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, - 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, - 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, - 0x64, 0x72, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, - 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, - 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x00, 0x00, - 0x00, 0x44, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0x80, - 0x04, 0x23, 0x08, 0x09, 0x35, 0x82, 0x80, 0x08, 0x23, 0x08, 0xc8, 0x30, - 0x82, 0x80, 0x10, 0x23, 0x08, 0x06, 0x30, 0x82, 0x80, 0x14, 0x23, 0x08, - 0x88, 0x31, 0x82, 0x80, 0x1c, 0x23, 0x08, 0x08, 0x32, 0x82, 0x80, 0x24, - 0x23, 0x08, 0x88, 0x32, 0x82, 0x80, 0x2c, 0x33, 0x0c, 0x66, 0x10, 0x9c, - 0xc1, 0x0c, 0x03, 0x1a, 0x08, 0x69, 0x30, 0x43, 0x30, 0xcc, 0x30, 0x98, - 0x81, 0x19, 0xa8, 0xc1, 0x0c, 0x04, 0x81, 0x06, 0x68, 0xa0, 0x06, 0x33, - 0x04, 0xc5, 0x0c, 0x81, 0x31, 0x43, 0x70, 0xcc, 0x50, 0x20, 0x6a, 0xa0, - 0x06, 0x89, 0x32, 0x43, 0xb0, 0x07, 0x33, 0x24, 0x6a, 0xb0, 0x30, 0x8d, - 0x93, 0x3c, 0x50, 0x34, 0x43, 0x82, 0x06, 0x8b, 0xd4, 0x38, 0x89, 0x02, - 0x4d, 0x33, 0xa0, 0x81, 0x1a, 0xa4, 0x81, 0x1a, 0x64, 0x5a, 0x1a, 0xa4, - 0x81, 0x1a, 0x64, 0x5b, 0x1b, 0xa4, 0x81, 0x1a, 0x64, 0x9c, 0x1b, 0xa4, - 0x81, 0x1a, 0x64, 0xdd, 0x1b, 0xa4, 0x81, 0x1a, 0x64, 0x1e, 0x1c, 0xa4, - 0x81, 0x1a, 0x64, 0x5f, 0x1c, 0xa4, 0x81, 0x1a, 0x64, 0x60, 0x20, 0x07, - 0x69, 0xa0, 0x06, 0x59, 0x18, 0xcc, 0x20, 0x99, 0x01, 0x55, 0xb1, 0x81, - 0xa5, 0x06, 0x68, 0x70, 0x61, 0x7f, 0x20, 0x06, 0x6c, 0x30, 0x06, 0x69, - 0x90, 0x90, 0x01, 0x54, 0x06, 0x33, 0x0c, 0x7d, 0xe0, 0x07, 0xa0, 0x30, - 0xc3, 0xb0, 0x06, 0x7c, 0x10, 0x0a, 0xd5, 0x01, 0x1c, 0xc7, 0x71, 0x1c, - 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x9c, 0x1b, 0xb8, 0x81, 0x45, 0x07, 0x7a, - 0x60, 0x59, 0x96, 0x1e, 0x70, 0xac, 0xc0, 0x0a, 0x62, 0xe3, 0x17, 0x74, - 0x20, 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d, 0xcd, 0xae, 0xcd, 0xa5, 0xed, - 0x8d, 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c, 0x2d, 0xec, 0x6c, 0x6e, 0x14, - 0x41, 0x0e, 0xe6, 0xe0, 0x14, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2, - 0x32, 0x37, 0xba, 0x51, 0x02, 0x3a, 0xb8, 0x25, 0x2c, 0x4d, 0xce, 0xc5, - 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x94, 0xa0, 0x0e, 0x8e, 0x0a, - 0x4b, 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b, 0xab, 0x0b, 0x3b, 0x2b, 0xfb, - 0xb2, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0xb0, 0x83, 0x9b, - 0xc2, 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda, 0xe0, 0xd2, 0xd8, 0xca, 0xbe, - 0xde, 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0x46, 0x19, 0xee, 0x00, 0x0f, - 0xf2, 0xe0, 0x98, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, 0xb6, - 0x32, 0x37, 0xba, 0x51, 0x82, 0x50, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00, - 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, - 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, - 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, - 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, - 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4, - 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81, - 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08, - 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01, - 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c, - 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c, - 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c, - 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1, - 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, - 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, - 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, - 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x4e, 0x00, 0x00, - 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x84, 0x65, 0x30, 0x03, 0x40, 0x5a, 0x06, 0xd4, 0x73, 0x10, 0x04, - 0x41, 0x64, 0x04, 0x63, 0x04, 0x20, 0x08, 0x82, 0xf8, 0x47, 0x3c, 0x03, - 0x00, 0xf1, 0x30, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, - 0x90, 0x51, 0x16, 0x48, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x90, - 0x81, 0x05, 0x00, 0x00, 0x00, 0x5f, 0x5a, 0x54, 0x53, 0x31, 0x35, 0x53, - 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x74, 0x73, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, - 0x20, 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, - 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, - 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, - 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66, - 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x61, 0x69, 0x72, 0x2d, - 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, - 0x61, 0x72, 0x67, 0x28, 0x32, 0x29, 0x00, 0x00, 0x00, 0x13, 0x04, 0x85, - 0x99, 0x20, 0x28, 0xcd, 0x04, 0x41, 0x71, 0x26, 0x08, 0xca, 0x33, 0x41, - 0x50, 0xa0, 0x09, 0x82, 0x12, 0x4d, 0x10, 0x14, 0x69, 0x82, 0xa0, 0x4c, - 0x2b, 0x04, 0x58, 0x30, 0x85, 0x15, 0x43, 0x2c, 0xc0, 0xc2, 0x29, 0x6c, - 0x08, 0x4a, 0x61, 0xc3, 0x40, 0x0a, 0xb2, 0x80, 0x0a, 0x1b, 0x86, 0x6c, - 0x16, 0x50, 0x61, 0x43, 0x34, 0x0a, 0xb4, 0x80, 0x0a, 0xb4, 0x90, 0x0a, - 0xb4, 0xa0, 0x0a, 0xb4, 0xb0, 0x0a, 0xb4, 0xc0, 0x0a, 0xb4, 0xd0, 0x0a, - 0xb4, 0xe0, 0x0a, 0xb4, 0xf0, 0x0a, 0x1b, 0x86, 0x5a, 0xa0, 0x85, 0x55, - 0xd8, 0x10, 0xc4, 0x02, 0x00, 0x7b, 0x86, 0x43, 0x32, 0x28, 0x80, 0x31, - 0xc7, 0x30, 0x04, 0xd4, 0x20, 0x43, 0x40, 0x18, 0x73, 0x0c, 0x81, 0x81, - 0x58, 0xd0, 0x88, 0x7f, 0x06, 0x01, 0x31, 0x00, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x5b, 0x8a, 0x20, 0xa8, 0x85, 0xc3, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x71, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, - 0x22, 0x84, 0x00, 0xf3, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x65, 0x0c, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, - 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, - 0x7a, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, - 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x33, - 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, 0x61, 0x69, 0x72, 0x36, 0x34, - 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x74, 0x76, 0x6f, 0x73, 0x31, - 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, - 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, - 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, - 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, - 0x00, 0xb3, 0x03, 0x00, 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, - 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, - 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, - 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, - 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, - 0x42, 0x04, 0x49, 0x0e, 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, - 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, - 0x00, 0x80, 0x00, 0x00, 0x00, 0x1b, 0xc6, 0x24, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0x01, 0x68, 0x03, 0x60, 0x0d, 0x00, 0x09, 0xa8, 0x88, 0x70, 0x80, - 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, 0x70, - 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, - 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, 0x1d, - 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, 0x1d, - 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, - 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, 0xc0, - 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, 0x60, - 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, - 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, 0x78, - 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, 0x60, - 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, - 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, - 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, - 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, - 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, 0x90, - 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, 0x70, - 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, - 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, - 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, - 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, - 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x98, - 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, 0x28, - 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, - 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, - 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, 0x1e, - 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, - 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, 0xa0, - 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, 0xa0, - 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, 0xa8, - 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, 0xd0, - 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, 0x1c, - 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, - 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0x83, - 0x27, 0x10, 0xc0, 0x02, 0x54, 0x41, 0x1a, 0x80, 0xc1, 0x10, 0x0e, 0xe9, - 0x20, 0x0f, 0x6d, 0x20, 0x0e, 0xf5, 0x60, 0x0e, 0xe6, 0x50, 0x0e, 0xf2, - 0xd0, 0x06, 0xee, 0xf0, 0x0e, 0x6d, 0x10, 0x0e, 0xec, 0x90, 0x0e, 0xe1, - 0x30, 0x0f, 0xc0, 0x06, 0x63, 0x28, 0x80, 0x05, 0xa8, 0x36, 0x18, 0x84, - 0x01, 0x2c, 0x40, 0xb5, 0x41, 0x29, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x00, - 0xda, 0x00, 0x58, 0x03, 0x40, 0x02, 0xaa, 0x0d, 0x86, 0x11, 0x00, 0x0b, - 0x50, 0x6d, 0x30, 0x0e, 0x01, 0x58, 0x80, 0x6a, 0x83, 0x82, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0x00, 0xb4, 0x01, 0xb0, 0x06, 0x80, 0x04, 0x54, 0x00, - 0x00, 0x49, 0x18, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40, - 0x18, 0x88, 0x09, 0x43, 0x61, 0x1c, 0x13, 0x06, 0xc4, 0x38, 0x00, 0x00, - 0x00, 0x89, 0x20, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, - 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, - 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, - 0x4c, 0x10, 0x68, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, - 0x67, 0x49, 0x53, 0x44, 0x09, 0x93, 0xcf, 0x1e, 0xc0, 0x40, 0x44, 0x9c, - 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x12, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x11, 0x06, 0xe1, 0x28, 0x69, 0x8a, 0x28, 0x61, 0xf2, 0xff, 0x89, - 0xb8, 0x26, 0x2a, 0x22, 0x7e, 0x7b, 0xf8, 0xa7, 0x31, 0x02, 0x60, 0x10, - 0xa1, 0x08, 0x2e, 0x92, 0xa6, 0x88, 0x12, 0x26, 0xff, 0x97, 0x00, 0xe6, - 0x59, 0x88, 0xe8, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x84, 0x43, 0x28, 0x47, - 0x08, 0x41, 0x10, 0x83, 0x28, 0xcd, 0x11, 0x20, 0x46, 0x08, 0x6b, 0x8e, - 0x20, 0x98, 0x23, 0x00, 0x83, 0x61, 0x04, 0xc1, 0x29, 0x0a, 0x33, 0x48, - 0xb4, 0xd7, 0x00, 0x70, 0x04, 0x07, 0x02, 0x52, 0xc0, 0xcd, 0x11, 0x80, - 0xc2, 0x20, 0x02, 0x20, 0x0c, 0x23, 0x0c, 0xce, 0x30, 0xc2, 0x00, 0x0c, - 0x23, 0x10, 0xce, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xc0, 0x20, - 0x1c, 0xd2, 0x41, 0x1e, 0xec, 0x80, 0x0e, 0xda, 0x20, 0x1c, 0xe0, 0x01, - 0x1e, 0xd8, 0xa1, 0x1c, 0xda, 0x80, 0x1e, 0xec, 0xe1, 0x1d, 0xe6, 0x21, - 0x0e, 0xe6, 0xc0, 0x0d, 0xe0, 0xc0, 0x0d, 0xe0, 0xa0, 0x0d, 0xe6, 0x21, - 0x1d, 0xda, 0xa1, 0x1e, 0xd8, 0x21, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0x61, - 0xc3, 0x6d, 0x94, 0x43, 0x1b, 0xc0, 0x83, 0x1e, 0xd8, 0x01, 0x1d, 0xe8, - 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x41, 0x3a, 0xc4, - 0x81, 0x1e, 0xe0, 0x81, 0x1e, 0xe0, 0x41, 0x1b, 0xa4, 0x03, 0x1e, 0xe8, - 0x01, 0x1e, 0xe8, 0x01, 0x1e, 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1d, 0xe8, - 0x41, 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d, 0xb4, 0x41, 0x3a, 0xcc, - 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, - 0x41, 0x3a, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, - 0x01, 0x1d, 0xb4, 0x81, 0x39, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, - 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x39, 0xd8, 0x01, 0x1d, 0xe8, - 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xc4, - 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d, 0xb4, - 0x81, 0x3d, 0xc8, 0x01, 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, - 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, - 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xd0, 0x01, 0x1e, 0xe8, - 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xd8, - 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, - 0x81, 0x3d, 0xe4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xe8, - 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1c, 0xe0, - 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, - 0x41, 0x1b, 0xd8, 0x43, 0x1c, 0xe4, 0x81, 0x1c, 0xe8, 0x81, 0x1c, 0xd4, - 0x81, 0x1d, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, - 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, - 0x41, 0x1d, 0xd8, 0x41, 0x1b, 0xd8, 0x43, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, - 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xb4, - 0x81, 0x3d, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, 0xe8, 0x41, 0x1c, 0xc0, - 0x81, 0x1c, 0xd0, 0x81, 0x1e, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, 0xb4, - 0x81, 0x3b, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, - 0x81, 0x46, 0x08, 0x43, 0x46, 0x6c, 0x57, 0xfe, 0x9c, 0xf3, 0x60, 0x7f, - 0x11, 0x01, 0x06, 0x43, 0x34, 0xd3, 0x90, 0x08, 0x88, 0x12, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x12, 0x45, 0x1b, - 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x12, - 0x1b, 0x04, 0x8a, 0xd6, 0x0e, 0x00, 0x00, 0x64, 0x81, 0x00, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, - 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x72, 0x45, 0x50, 0x02, - 0x85, 0x30, 0x02, 0x50, 0x06, 0x05, 0x54, 0x10, 0x85, 0x51, 0x20, 0x85, - 0x52, 0x30, 0x85, 0x53, 0x0a, 0x44, 0x47, 0x00, 0x0a, 0xa1, 0x20, 0x0a, - 0xa3, 0x40, 0x0a, 0xa5, 0x60, 0x0a, 0x87, 0xe6, 0x58, 0x42, 0x24, 0x00, + 0x3a, 0x8c, 0x7d, 0x00, 0x00, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x01, + 0x13, 0x19, 0x0c, 0x12, 0x59, 0x45, 0x66, 0x20, 0x90, 0xe4, 0x29, 0x0f, + 0x12, 0x5d, 0x88, 0x92, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, + 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32, + 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74, + 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, + 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, + 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, + 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, + 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, + 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, + 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69, 0x72, + 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x28, 0x5f, 0x5f, 0x61, 0x69, 0x72, 0x5f, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x5f, + 0x29, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, + 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, + 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x04, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x82, 0xa0, 0x04, 0x23, 0x08, 0x4b, 0x32, 0x82, 0xa0, 0x08, + 0x23, 0x08, 0xca, 0x30, 0x82, 0xa0, 0x10, 0x23, 0x08, 0x08, 0x30, 0x82, + 0xa0, 0x14, 0x23, 0x08, 0x8a, 0x31, 0x82, 0xa0, 0x1c, 0x33, 0x0c, 0x5e, + 0xf0, 0xcd, 0x30, 0x80, 0x81, 0x10, 0x06, 0x33, 0x04, 0xc3, 0x0c, 0x83, + 0xe7, 0x89, 0xc1, 0x0c, 0x04, 0x01, 0x06, 0x60, 0x20, 0x06, 0x33, 0x04, + 0xc5, 0x0c, 0x81, 0x31, 0x43, 0x70, 0xcc, 0x50, 0x20, 0x89, 0xb2, 0x30, + 0x33, 0x18, 0x8d, 0x93, 0x28, 0xcb, 0x33, 0x83, 0xd1, 0x40, 0x49, 0xb4, + 0x48, 0x33, 0x0c, 0x6f, 0x00, 0x07, 0x71, 0x30, 0x83, 0x22, 0x06, 0x13, + 0x25, 0x06, 0x60, 0x50, 0x25, 0xd1, 0xc2, 0xcc, 0xa0, 0x80, 0xc1, 0x44, + 0x81, 0x01, 0x18, 0x54, 0x89, 0xb2, 0x3c, 0x33, 0x28, 0xde, 0x44, 0x79, + 0x60, 0x50, 0x25, 0xd1, 0x22, 0xcd, 0x00, 0x91, 0x81, 0x75, 0x95, 0x01, + 0xe5, 0x81, 0x01, 0x96, 0x95, 0x81, 0x66, 0x06, 0xc9, 0xb6, 0x70, 0x33, + 0x40, 0x61, 0x60, 0x5d, 0x65, 0x40, 0x91, 0x01, 0x18, 0x60, 0x59, 0x19, + 0x68, 0x66, 0x90, 0x6c, 0x4b, 0x37, 0x43, 0x31, 0x07, 0x74, 0x50, 0x07, + 0x76, 0x70, 0x07, 0x33, 0x0c, 0x63, 0x20, 0x07, 0x78, 0x50, 0x1c, 0xc0, + 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x89, 0x81, 0x1b, 0x58, 0x68, 0xa0, + 0x07, 0x96, 0x65, 0xb9, 0x01, 0x1d, 0xd0, 0x01, 0x1d, 0xf8, 0x82, 0x2f, + 0xc8, 0x82, 0x4b, 0xd0, 0x04, 0x2b, 0xc8, 0x48, 0x60, 0x82, 0x2e, 0x62, + 0x63, 0xb3, 0x6b, 0x73, 0x69, 0x7b, 0x23, 0xab, 0x63, 0x2b, 0x73, 0x31, + 0x63, 0x0b, 0x3b, 0x9b, 0x1b, 0x45, 0x30, 0x83, 0x33, 0x38, 0x85, 0x8d, + 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x94, 0x00, 0x0d, + 0x6e, 0x09, 0x4b, 0x93, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, + 0x1b, 0x25, 0x48, 0x83, 0xa3, 0xc2, 0xd2, 0xe4, 0x5c, 0xd8, 0xc2, 0xdc, + 0xce, 0xea, 0xc2, 0xce, 0xca, 0xbe, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, + 0xdc, 0x46, 0x09, 0xd4, 0xe0, 0xa6, 0xb0, 0x34, 0x39, 0x97, 0xb1, 0xb7, + 0x36, 0xb8, 0x34, 0xb6, 0xb2, 0xaf, 0x37, 0x38, 0xba, 0xb4, 0x37, 0xb7, + 0xb9, 0x51, 0x86, 0x35, 0x60, 0x83, 0x36, 0x38, 0x25, 0x2c, 0x4d, 0xce, + 0xc5, 0xae, 0x4c, 0x8e, 0xae, 0x0c, 0x6f, 0x94, 0x00, 0x0f, 0x00, 0x00, + 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, + 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, + 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, + 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, + 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, + 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, + 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, + 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, + 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, + 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, + 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, + 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, + 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, + 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, + 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x8a, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x00, 0x00, 0xc4, 0x4a, 0xa0, 0x0c, 0x8a, 0x80, 0xdc, + 0x08, 0xc0, 0x58, 0x44, 0x10, 0x04, 0xc1, 0x58, 0x84, 0x20, 0x08, 0xc2, + 0x58, 0xc4, 0x30, 0x0c, 0x03, 0x85, 0x19, 0x80, 0x19, 0x00, 0x12, 0x33, + 0x00, 0x34, 0x66, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0xc8, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0xcf, 0x13, 0x06, 0x96, 0x05, 0x00, 0x00, 0x00, 0x6f, 0x6d, 0x6e, + 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, + 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, + 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x29, + 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x34, 0x29, 0x61, 0x69, + 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x00, 0x13, 0x04, 0x06, + 0x59, 0x21, 0x80, 0x02, 0x1f, 0xac, 0x18, 0x42, 0x01, 0x14, 0xfa, 0x60, + 0xc5, 0x20, 0x0a, 0xa0, 0xe0, 0x07, 0x1b, 0x82, 0x3d, 0xd8, 0x30, 0xe8, + 0xc1, 0x28, 0xfc, 0xc1, 0x86, 0x81, 0x14, 0x48, 0xe1, 0x0f, 0x36, 0x04, + 0xa1, 0xb0, 0x21, 0x10, 0x05, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x10, 0x8c, + 0x64, 0x49, 0x14, 0x84, 0xb2, 0x0b, 0xf1, 0x50, 0x18, 0x45, 0x41, 0x28, + 0x83, 0x0c, 0xc3, 0xc1, 0x98, 0x10, 0x88, 0xff, 0x2e, 0xc4, 0x84, 0x71, + 0x11, 0x05, 0xa1, 0x0c, 0x32, 0x1c, 0xcc, 0x63, 0x42, 0x20, 0xfe, 0x16, + 0x14, 0xe0, 0xbf, 0x0b, 0x81, 0x75, 0x61, 0x40, 0x51, 0x10, 0xca, 0x20, + 0x03, 0x13, 0x4d, 0x26, 0x04, 0xe2, 0x6f, 0x45, 0x00, 0xfe, 0xbb, 0x10, + 0x9d, 0x18, 0x98, 0x81, 0x46, 0x41, 0x28, 0x83, 0x0c, 0x91, 0x75, 0x99, + 0x10, 0x88, 0xbf, 0x15, 0x01, 0xf8, 0xef, 0x42, 0x84, 0xc1, 0x19, 0xac, + 0x01, 0x18, 0x50, 0x10, 0xca, 0x20, 0x43, 0xa0, 0x7d, 0x16, 0x54, 0xe2, + 0x3f, 0xc8, 0x30, 0x74, 0x60, 0x60, 0xc1, 0x24, 0xfe, 0x36, 0x04, 0xe0, + 0x3f, 0xc8, 0x60, 0x80, 0x81, 0x18, 0x58, 0x10, 0x89, 0xbf, 0x0d, 0x01, + 0xf8, 0x0f, 0x32, 0x24, 0x63, 0x40, 0x06, 0x16, 0x3c, 0xe2, 0x6f, 0x43, + 0x00, 0xfe, 0xbb, 0x10, 0x6e, 0x40, 0x07, 0x78, 0xc0, 0x06, 0x14, 0x84, + 0x32, 0xc8, 0x10, 0x9c, 0x01, 0x1b, 0x58, 0x20, 0x06, 0xe2, 0x3f, 0xc8, + 0x30, 0xa8, 0x41, 0x1b, 0x58, 0x00, 0x06, 0xe2, 0x3f, 0xc8, 0x50, 0xb0, + 0x81, 0x1b, 0x58, 0xd0, 0x89, 0xff, 0x20, 0xc3, 0xe1, 0x06, 0x6f, 0x60, + 0x81, 0x26, 0xfe, 0x83, 0x0c, 0x7c, 0xe0, 0x06, 0x74, 0x60, 0x59, 0x20, + 0xfe, 0x83, 0x0c, 0x7e, 0x00, 0x07, 0x75, 0x60, 0x4e, 0x20, 0xfe, 0x96, + 0x0c, 0xe0, 0x6f, 0x01, 0x03, 0xfe, 0x16, 0x24, 0xe0, 0x6f, 0x01, 0x02, + 0xfe, 0x16, 0x14, 0xe0, 0x3f, 0xdb, 0x60, 0x07, 0x01, 0x30, 0xdb, 0x10, + 0x94, 0x42, 0x30, 0xdb, 0x10, 0x94, 0x82, 0x90, 0x41, 0x40, 0x0c, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, 0x20, 0x85, 0xa3, 0x14, + 0x10, 0x53, 0xd8, 0x72, 0x0c, 0x01, 0x29, 0x1c, 0xa6, 0x80, 0x94, 0xc2, + 0x96, 0xe3, 0x08, 0x48, 0xe1, 0x30, 0x05, 0xa4, 0x14, 0xb6, 0x1c, 0x4c, + 0x40, 0x0a, 0x87, 0x29, 0x20, 0xa5, 0xb0, 0xe5, 0x88, 0x02, 0x52, 0x38, + 0x4c, 0x01, 0x29, 0x85, 0x2d, 0x87, 0x15, 0x90, 0xc2, 0x51, 0x0a, 0x88, + 0x29, 0x6c, 0x39, 0xc6, 0x20, 0x20, 0x85, 0xa3, 0x14, 0x10, 0x53, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xde, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x12, 0x03, 0x94, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x0f, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x12, 0x03, 0x94, 0x78, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, + 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x61, 0x69, 0x72, + 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x74, 0x76, 0x6f, + 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, + 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xf8, 0x0d, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, + 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x41, 0x03, 0x00, + 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, + 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, + 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32, + 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x42, 0x88, 0x48, 0x90, 0x14, + 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, + 0x90, 0x11, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, + 0x8a, 0x04, 0x21, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x71, 0x00, 0x00, + 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0x03, + 0x40, 0x02, 0x28, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0, + 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, + 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, + 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, 0x60, 0x87, + 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, 0x18, 0x07, + 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, 0xa0, 0x07, + 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda, + 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, + 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, + 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, + 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07, + 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, + 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, + 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, + 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87, + 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, + 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc, + 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, + 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87, + 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, + 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, + 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca, + 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda, + 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, + 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, + 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87, + 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, + 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda, + 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, + 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, + 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88, + 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07, + 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, + 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0xe0, 0x09, 0x03, 0xb0, 0x00, 0x55, 0x90, + 0x06, 0x60, 0x30, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, + 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, + 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x84, 0x40, 0x00, 0x89, 0x20, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08, 0x09, 0x20, 0x64, 0x85, + 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, 0xe3, 0x84, 0xa1, 0x90, + 0x14, 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, 0x4c, 0x10, 0x3c, 0x33, + 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, 0x67, 0x49, 0x53, 0x44, + 0x09, 0x93, 0xcf, 0x1e, 0xc0, 0x40, 0x44, 0x9c, 0xd3, 0x48, 0x13, 0xd0, + 0x4c, 0x12, 0x42, 0x00, 0x00, 0x00, 0x00, 0x06, 0x11, 0x06, 0xa1, 0x10, + 0x21, 0x41, 0x54, 0x03, 0x01, 0x73, 0x04, 0x60, 0x90, 0x02, 0x38, 0x47, + 0x00, 0x0a, 0x83, 0x08, 0x80, 0x30, 0x8c, 0x30, 0x00, 0xc3, 0x08, 0x04, + 0x32, 0x02, 0x00, 0x00, 0x00, 0x13, 0xc0, 0x20, 0x1c, 0xd2, 0x41, 0x1e, + 0xec, 0x80, 0x0e, 0xda, 0x20, 0x1c, 0xe0, 0x01, 0x1e, 0xd8, 0xa1, 0x1c, + 0xda, 0x80, 0x1e, 0xec, 0xe1, 0x1d, 0xe6, 0x21, 0x0e, 0xe6, 0xc0, 0x0d, + 0xe0, 0xc0, 0x0d, 0xe0, 0xa0, 0x0d, 0xe6, 0x21, 0x1d, 0xda, 0xa1, 0x1e, + 0xd8, 0x21, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0x61, 0xc3, 0x6d, 0x94, 0x43, + 0x1b, 0xc0, 0x83, 0x1e, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, + 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1e, 0xe0, 0x81, + 0x1e, 0xe0, 0x41, 0x1b, 0xa4, 0x03, 0x1e, 0xe8, 0x01, 0x1e, 0xe8, 0x01, + 0x1e, 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, + 0x1e, 0xc4, 0x81, 0x1d, 0xb4, 0x41, 0x3a, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, + 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x41, 0x3a, 0xd8, 0x01, + 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, + 0x39, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, + 0x1c, 0xb4, 0x81, 0x39, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, + 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1d, 0xe8, 0x41, + 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x01, + 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, + 0x3d, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, + 0x1c, 0xb4, 0x81, 0x3d, 0xd0, 0x01, 0x1e, 0xe8, 0x81, 0x1d, 0xd0, 0x81, + 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xd8, 0x01, 0x1d, 0xe8, 0x81, + 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xe4, 0x81, + 0x1d, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xe8, 0x41, 0x1c, 0xc8, 0x01, + 0x1e, 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, + 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x41, 0x1b, 0xd8, 0x43, + 0x1c, 0xe4, 0x81, 0x1c, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xe8, 0x81, + 0x1c, 0xd4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x41, 0x1d, 0xd8, 0x81, + 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x41, + 0x1b, 0xd8, 0x43, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, + 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xc4, 0x01, + 0x1c, 0xc8, 0x01, 0x1d, 0xe8, 0x41, 0x1c, 0xc0, 0x81, 0x1c, 0xd0, 0x81, + 0x1e, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, 0xb4, 0x81, 0x3b, 0xe0, 0x81, + 0x1e, 0xc4, 0x81, 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43, + 0x4a, 0x6c, 0x57, 0xfe, 0xac, 0xb3, 0x20, 0xc3, 0x5f, 0x44, 0x80, 0xc1, + 0x10, 0xcd, 0x34, 0x24, 0x02, 0xa4, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x36, 0x08, 0x14, 0x1d, 0x1a, 0x00, + 0x00, 0xc8, 0x02, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, + 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, + 0xc2, 0x22, 0x28, 0x81, 0x42, 0x18, 0x01, 0x28, 0xa0, 0x82, 0x28, 0x8c, + 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0xd2, 0x11, 0x80, 0x42, 0x28, 0x88, + 0xc2, 0x28, 0x90, 0x42, 0x29, 0x98, 0xc2, 0xa1, 0x1c, 0x4b, 0x90, 0x04, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, @@ -1184,103 +870,89 @@ const unsigned char sdl_metallib[] = { 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, - 0x00, 0x20, 0x01, 0x00, 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, - 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4, 0xde, 0x00, 0x0d, 0x44, - 0x0b, 0x8b, 0xf2, 0x06, 0xc5, 0xc6, 0x91, 0x41, 0x14, 0x19, 0x8c, 0x22, - 0x31, 0x88, 0x64, 0x3d, 0x45, 0x66, 0x20, 0xca, 0x23, 0x21, 0x54, 0xc1, - 0x30, 0xca, 0xe2, 0x3c, 0xcf, 0x13, 0x5d, 0x4f, 0xb0, 0x28, 0xd8, 0xb0, - 0x1c, 0x01, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, - 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32, - 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, 0x20, 0x28, 0x6d, 0x65, 0x74, 0x61, - 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, - 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, - 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, - 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, - 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, - 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x6e, 0x6f, 0x5f, 0x70, 0x65, - 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, - 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x61, 0x69, 0x72, - 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, - 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69, 0x72, 0x2e, - 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, - 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x63, 0x6f, - 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74, 0x6f, 0x6e, - 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x74, - 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, - 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, - 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77, 0x68, 0x69, - 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e, - 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x74, 0x73, 0x63, 0x61, 0x69, 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, - 0x75, 0x72, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, - 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x3e, 0x74, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, - 0x6c, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x00, - 0x00, 0x84, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0xe0, - 0x08, 0x23, 0x08, 0xd3, 0x35, 0x82, 0xe0, 0x0c, 0x23, 0x08, 0x0e, 0x31, - 0x82, 0xe0, 0x14, 0x23, 0x08, 0x0a, 0x30, 0x82, 0xe0, 0x18, 0x23, 0x08, - 0xce, 0x31, 0x82, 0xe0, 0x20, 0x23, 0x08, 0x4e, 0x32, 0x82, 0xe0, 0x28, - 0x23, 0x08, 0xce, 0x32, 0x82, 0xe0, 0x30, 0x23, 0x08, 0x4e, 0x33, 0x82, - 0xe0, 0x38, 0x33, 0x0c, 0x70, 0x10, 0xc4, 0xc1, 0x0c, 0x83, 0x1c, 0x08, - 0x73, 0x30, 0x43, 0x30, 0xcc, 0x30, 0xc0, 0x01, 0x1c, 0xd0, 0xc1, 0x0c, - 0x04, 0x21, 0x07, 0x72, 0x40, 0x07, 0x33, 0x04, 0xc5, 0x0c, 0x81, 0x31, - 0x43, 0x70, 0xcc, 0x50, 0x20, 0x74, 0x40, 0x07, 0x89, 0x32, 0x43, 0x70, - 0x0a, 0x33, 0x20, 0x74, 0xb0, 0x30, 0x4d, 0xa2, 0x38, 0xcf, 0x0c, 0x89, - 0x1c, 0x40, 0x11, 0x23, 0x25, 0x8a, 0x33, 0xcd, 0x90, 0xc0, 0x01, 0x44, - 0x31, 0x52, 0x52, 0x39, 0xd6, 0x0c, 0x68, 0x40, 0x07, 0x73, 0x40, 0x07, - 0x5c, 0x37, 0x07, 0x73, 0x40, 0x07, 0x9c, 0x87, 0x07, 0x73, 0x40, 0x07, - 0xdc, 0x97, 0x07, 0x73, 0x40, 0x07, 0x1c, 0x18, 0xe8, 0xc1, 0x1c, 0xd0, - 0x01, 0x17, 0x06, 0x7b, 0x30, 0x07, 0x74, 0xc0, 0x89, 0x01, 0x1f, 0xcc, - 0x01, 0x1d, 0x70, 0x63, 0xd0, 0x07, 0x73, 0x40, 0x07, 0x1c, 0x19, 0xcc, - 0x20, 0xd9, 0xc1, 0x85, 0xdd, 0x41, 0x46, 0x07, 0x72, 0xa0, 0x6d, 0xac, - 0x50, 0x06, 0x77, 0x60, 0x06, 0x73, 0x90, 0x9c, 0x81, 0x83, 0x06, 0x33, - 0x28, 0x73, 0x90, 0x06, 0x19, 0x1d, 0xc8, 0x81, 0x1a, 0x24, 0x6b, 0xe0, - 0xb0, 0xc1, 0x0c, 0x89, 0x1f, 0xb4, 0x41, 0x46, 0x07, 0x72, 0x90, 0xb8, - 0x81, 0xf3, 0x06, 0x33, 0x18, 0xa9, 0xa0, 0x0a, 0xab, 0xd0, 0x0a, 0xae, - 0xf0, 0x0a, 0x33, 0x0c, 0x75, 0x80, 0x0a, 0xb0, 0x50, 0x62, 0x00, 0x70, - 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xe7, 0x06, - 0x6e, 0x60, 0xd1, 0x81, 0x1e, 0x58, 0x96, 0xa5, 0x07, 0x9c, 0x29, 0xb0, - 0x02, 0x2b, 0xd0, 0x8d, 0x5f, 0xd8, 0x83, 0x3a, 0xe0, 0x82, 0x8c, 0x04, - 0x26, 0xe8, 0x22, 0x36, 0x36, 0xbb, 0x36, 0x97, 0xb6, 0x37, 0xb2, 0x3a, - 0xb6, 0x32, 0x17, 0x33, 0xb6, 0xb0, 0xb3, 0xb9, 0x51, 0x04, 0x3f, 0xf8, - 0x83, 0x53, 0xd8, 0xd8, 0xec, 0xda, 0x5c, 0xd2, 0xc8, 0xca, 0xdc, 0xe8, - 0x46, 0x09, 0x40, 0xe1, 0x96, 0xb0, 0x34, 0x39, 0x17, 0xbb, 0x32, 0xb9, - 0xb9, 0xb4, 0x37, 0xb7, 0x51, 0x82, 0x50, 0x38, 0x2a, 0x2c, 0x4d, 0xce, - 0x85, 0x2d, 0xcc, 0xed, 0xac, 0x2e, 0xec, 0xac, 0xec, 0xcb, 0xae, 0x4c, - 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x94, 0x40, 0x14, 0x6e, 0x0a, 0x4b, 0x93, - 0x73, 0x19, 0x7b, 0x6b, 0x83, 0x4b, 0x63, 0x2b, 0xfb, 0x7a, 0x83, 0xa3, - 0x4b, 0x7b, 0x73, 0x9b, 0x1b, 0x65, 0x18, 0x05, 0x52, 0x28, 0x85, 0x63, - 0xc2, 0xd2, 0xe4, 0x5c, 0xcc, 0xe4, 0xc2, 0xce, 0xda, 0xca, 0xdc, 0xe8, - 0x46, 0x09, 0x60, 0x01, 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, + 0x00, 0xf6, 0x00, 0x00, 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, + 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4, 0xca, 0x00, 0x0c, 0x66, + 0x09, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x41, 0x14, 0x19, 0x52, 0xa6, + 0x3c, 0x06, 0x83, 0x58, 0x85, 0xf2, 0x48, 0x08, 0x55, 0x30, 0x8c, 0xb2, + 0x38, 0xcf, 0xf3, 0x44, 0xd7, 0x13, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b, + 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, + 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, + 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, + 0x28, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, + 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, + 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, + 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, + 0x69, 0x72, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x28, 0x38, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73, + 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x32, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, + 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, + 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, + 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, + 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x00, 0x44, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0x80, 0x04, 0x23, 0x08, 0x09, + 0x35, 0x82, 0x80, 0x08, 0x23, 0x08, 0xc8, 0x30, 0x82, 0x80, 0x10, 0x23, + 0x08, 0x06, 0x30, 0x82, 0x80, 0x14, 0x23, 0x08, 0x88, 0x31, 0x82, 0x80, + 0x1c, 0x23, 0x08, 0x08, 0x32, 0x82, 0x80, 0x24, 0x23, 0x08, 0x88, 0x32, + 0x82, 0x80, 0x2c, 0x33, 0x0c, 0x66, 0x10, 0x9c, 0xc1, 0x0c, 0x03, 0x1a, + 0x08, 0x69, 0x30, 0x43, 0x30, 0xcc, 0x30, 0x98, 0x81, 0x19, 0xa8, 0xc1, + 0x0c, 0x04, 0x81, 0x06, 0x68, 0xa0, 0x06, 0x33, 0x04, 0xc5, 0x0c, 0x81, + 0x31, 0x43, 0x70, 0xcc, 0x50, 0x20, 0x6a, 0xa0, 0x06, 0x89, 0x32, 0x43, + 0xb0, 0x07, 0x33, 0x24, 0x6a, 0xb0, 0x30, 0x8d, 0x93, 0x3c, 0x50, 0x34, + 0x43, 0x82, 0x06, 0x8b, 0xd4, 0x38, 0x89, 0x02, 0x4d, 0x33, 0xa0, 0x81, + 0x1a, 0xa4, 0x81, 0x1a, 0x64, 0x5a, 0x1a, 0xa4, 0x81, 0x1a, 0x64, 0x5b, + 0x1b, 0xa4, 0x81, 0x1a, 0x64, 0x9c, 0x1b, 0xa4, 0x81, 0x1a, 0x64, 0xdd, + 0x1b, 0xa4, 0x81, 0x1a, 0x64, 0x1e, 0x1c, 0xa4, 0x81, 0x1a, 0x64, 0x5f, + 0x1c, 0xa4, 0x81, 0x1a, 0x64, 0x60, 0x20, 0x07, 0x69, 0xa0, 0x06, 0x59, + 0x18, 0xcc, 0x20, 0x99, 0x01, 0x55, 0xb1, 0x81, 0xa5, 0x06, 0x68, 0x70, + 0x61, 0x7f, 0x20, 0x06, 0x6c, 0x30, 0x06, 0x69, 0x90, 0x90, 0x01, 0x54, + 0x06, 0x33, 0x0c, 0x7d, 0xe0, 0x07, 0xa0, 0x30, 0xc3, 0xb0, 0x06, 0x7c, + 0x10, 0x0a, 0xd5, 0x01, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, + 0x71, 0x9c, 0x1b, 0xb8, 0x81, 0x45, 0x07, 0x7a, 0x60, 0x59, 0x96, 0x1e, + 0x70, 0xac, 0xc0, 0x0a, 0x62, 0xe3, 0x17, 0x74, 0x20, 0x23, 0x81, 0x09, + 0xba, 0x88, 0x8d, 0xcd, 0xae, 0xcd, 0xa5, 0xed, 0x8d, 0xac, 0x8e, 0xad, + 0xcc, 0xc5, 0x8c, 0x2d, 0xec, 0x6c, 0x6e, 0x14, 0x41, 0x0e, 0xe6, 0xe0, + 0x14, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2, 0x32, 0x37, 0xba, 0x51, + 0x02, 0x3a, 0xb8, 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x6e, 0x2e, + 0xed, 0xcd, 0x6d, 0x94, 0xa0, 0x0e, 0x8e, 0x0a, 0x4b, 0x93, 0x73, 0x61, + 0x0b, 0x73, 0x3b, 0xab, 0x0b, 0x3b, 0x2b, 0xfb, 0xb2, 0x2b, 0x93, 0x9b, + 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0xb0, 0x83, 0x9b, 0xc2, 0xd2, 0xe4, 0x5c, + 0xc6, 0xde, 0xda, 0xe0, 0xd2, 0xd8, 0xca, 0xbe, 0xde, 0xe0, 0xe8, 0xd2, + 0xde, 0xdc, 0xe6, 0x46, 0x19, 0xee, 0x00, 0x0f, 0xf2, 0xe0, 0x98, 0xb0, + 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, 0x51, + 0x82, 0x50, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, @@ -1296,72 +968,57 @@ const unsigned char sdl_metallib[] = { 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, - 0x00, 0x61, 0x20, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, - 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xd4, 0x6a, 0x60, - 0x04, 0x80, 0xdc, 0x0c, 0x00, 0xbd, 0x11, 0x00, 0xb2, 0x63, 0x0d, 0x40, - 0x20, 0x8c, 0x00, 0x10, 0x9e, 0x83, 0x28, 0x06, 0x01, 0x0c, 0xc6, 0x22, - 0x80, 0x40, 0x38, 0x08, 0x8c, 0x00, 0x50, 0x98, 0x01, 0xa0, 0x3b, 0x03, - 0x00, 0xf1, 0x30, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, - 0x90, 0x51, 0x1e, 0x08, 0x59, 0x00, 0x00, 0x00, 0x00, 0x63, 0x80, 0x61, - 0x56, 0xf5, 0x3c, 0x00, 0x00, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, - 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, + 0x00, 0x61, 0x20, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, + 0x2c, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x84, 0x65, 0x30, + 0x03, 0x40, 0x5a, 0x06, 0xd4, 0x73, 0x10, 0x04, 0x41, 0x64, 0x04, 0x63, + 0x04, 0x20, 0x08, 0x82, 0xf8, 0x47, 0x3c, 0x03, 0x00, 0xf1, 0x30, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0x48, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x90, 0x81, 0x05, 0x00, 0x00, + 0x00, 0x5f, 0x5a, 0x54, 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, + 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, + 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, + 0x54, 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, + 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, + 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, - 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x73, 0x61, 0x6d, 0x70, - 0x6c, 0x65, 0x72, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, - 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x74, 0x65, 0x78, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, - 0x33, 0x29, 0x5f, 0x5a, 0x54, 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, - 0x6d, 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, - 0x61, 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, - 0x20, 0x54, 0x42, 0x41, 0x41, 0x13, 0x04, 0xea, 0x99, 0x20, 0x50, 0xd0, - 0x04, 0x81, 0x8a, 0x26, 0x08, 0x94, 0x34, 0x41, 0xa0, 0xa6, 0x09, 0x02, - 0x45, 0x4d, 0x10, 0xa8, 0x6a, 0x82, 0x40, 0x59, 0x2b, 0x84, 0x70, 0x90, - 0x85, 0x15, 0x83, 0x38, 0x84, 0xc3, 0x2c, 0xac, 0x18, 0xc6, 0x21, 0x1c, - 0x68, 0x61, 0xc5, 0x40, 0x0e, 0xe1, 0x50, 0x0b, 0x1b, 0x84, 0x71, 0x10, - 0x87, 0x0d, 0x01, 0x39, 0x6c, 0x08, 0x70, 0x61, 0xc3, 0x70, 0x0b, 0xe7, - 0x90, 0x0b, 0x1b, 0x06, 0x0e, 0x1d, 0x72, 0x61, 0x43, 0x64, 0x0b, 0xe9, - 0x90, 0x0b, 0xe9, 0xa0, 0x0b, 0xe9, 0xb0, 0x0b, 0xe9, 0xc0, 0x0b, 0xe9, - 0xd0, 0x0b, 0xe9, 0xe0, 0x0b, 0xe9, 0xf0, 0x0b, 0xe9, 0x00, 0x0e, 0x1b, - 0x06, 0x75, 0x48, 0x07, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x23, 0x06, 0xcd, - 0x10, 0x82, 0x60, 0x00, 0xa1, 0x41, 0xc3, 0x3c, 0x0b, 0xa2, 0x0c, 0x03, - 0x19, 0x8c, 0x26, 0x04, 0xc0, 0x1e, 0x03, 0xc4, 0x95, 0x01, 0x05, 0x60, - 0x0c, 0x32, 0x0c, 0xc6, 0x32, 0xc7, 0x60, 0x08, 0xdf, 0x20, 0x43, 0x70, - 0x30, 0x16, 0x0c, 0xe2, 0x3f, 0xc8, 0x10, 0x24, 0xcd, 0x20, 0x43, 0x80, - 0x34, 0x16, 0x68, 0xe2, 0x9f, 0x41, 0x40, 0x0c, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x5b, 0x0a, 0xe0, 0x20, 0x07, 0xa4, 0x1c, 0xb6, 0x1c, 0x43, 0xa0, - 0x0e, 0x47, 0x39, 0x20, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x71, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, - 0x22, 0x84, 0x00, 0xc6, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x65, 0x0c, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, - 0x28, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x34, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x1b, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, - 0xb4, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, - 0x79, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x69, - 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, - 0x74, 0x75, 0x72, 0x65, 0x5f, 0x32, 0x64, 0x2e, 0x76, 0x34, 0x66, 0x33, - 0x32, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, 0x61, 0x69, 0x72, - 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x74, 0x76, 0x6f, - 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, - 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x29, 0x00, 0x00, 0x00, 0x13, 0x04, 0x85, 0x99, 0x20, 0x28, 0xcd, + 0x04, 0x41, 0x71, 0x26, 0x08, 0xca, 0x33, 0x41, 0x50, 0xa0, 0x09, 0x82, + 0x12, 0x4d, 0x10, 0x14, 0x69, 0x82, 0xa0, 0x4c, 0x2b, 0x04, 0x58, 0x30, + 0x85, 0x15, 0x43, 0x2c, 0xc0, 0xc2, 0x29, 0x6c, 0x08, 0x4a, 0x61, 0xc3, + 0x40, 0x0a, 0xb2, 0x80, 0x0a, 0x1b, 0x86, 0x6c, 0x16, 0x50, 0x61, 0x43, + 0x34, 0x0a, 0xb4, 0x80, 0x0a, 0xb4, 0x90, 0x0a, 0xb4, 0xa0, 0x0a, 0xb4, + 0xb0, 0x0a, 0xb4, 0xc0, 0x0a, 0xb4, 0xd0, 0x0a, 0xb4, 0xe0, 0x0a, 0xb4, + 0xf0, 0x0a, 0x1b, 0x86, 0x5a, 0xa0, 0x85, 0x55, 0xd8, 0x10, 0xc4, 0x02, + 0x00, 0x7b, 0x86, 0x43, 0x32, 0x28, 0x80, 0x31, 0xc7, 0x30, 0x04, 0xd4, + 0x20, 0x43, 0x40, 0x18, 0x73, 0x0c, 0x81, 0x81, 0x58, 0xd0, 0x88, 0x7f, + 0x06, 0x01, 0x31, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5b, 0x8a, 0x20, + 0xa8, 0x85, 0xc3, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xf3, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, + 0x00, 0x1f, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, + 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, + 0x00, 0x12, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x7b, 0x00, 0x00, 0x00, + 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x33, 0x32, 0x30, 0x32, 0x33, + 0x2e, 0x34, 0x30, 0x34, 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, + 0x70, 0x6c, 0x65, 0x2d, 0x74, 0x76, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, + 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xa8, 0x1d, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x30, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, - 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0xa2, 0x06, 0x00, + 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, @@ -1369,7 +1026,675 @@ const unsigned char sdl_metallib[] = { 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, - 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x9b, 0x00, 0x00, + 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x64, 0x01, 0x00, + 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x58, 0x03, + 0x40, 0x02, 0x2a, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0, + 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, + 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, + 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, 0x60, 0x87, + 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, 0x18, 0x07, + 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, 0xa0, 0x07, + 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda, + 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, + 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, + 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, + 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07, + 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, + 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, + 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, + 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87, + 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, + 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc, + 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, + 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87, + 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, + 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, + 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca, + 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda, + 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, + 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, + 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87, + 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, + 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda, + 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, + 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, + 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88, + 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07, + 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, + 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0xe0, 0x09, 0x04, 0xb0, 0x00, 0x55, 0x90, + 0x06, 0x60, 0x30, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, + 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, + 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0xc1, 0x18, 0x0a, + 0x60, 0x01, 0xaa, 0x0d, 0x06, 0x61, 0x00, 0x0b, 0x50, 0x6d, 0x08, 0x93, + 0xe2, 0xff, 0xff, 0xff, 0xff, 0x07, 0x60, 0x0d, 0x00, 0x09, 0xa8, 0x88, + 0x70, 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, + 0x7a, 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, + 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, + 0xa2, 0x1d, 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, + 0x81, 0x1d, 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, + 0xa1, 0x0d, 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, + 0x39, 0xc0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, + 0x74, 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, + 0x77, 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, + 0x78, 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, + 0x72, 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, + 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, + 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, + 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, + 0xe1, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, + 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, + 0x74, 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, + 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, + 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, + 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, + 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, + 0x36, 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, + 0x7d, 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, + 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, + 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, + 0x01, 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, + 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, + 0x79, 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, + 0x77, 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, + 0x71, 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, + 0x74, 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, + 0x21, 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, + 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, + 0x60, 0x43, 0x62, 0x08, 0xc0, 0x02, 0x54, 0x41, 0x1a, 0x80, 0xc1, 0x06, + 0xe3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0x83, 0x8f, + 0x20, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00, + 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0, + 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, + 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b, + 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b, + 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b, + 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03, 0x90, 0x07, 0x76, 0x00, + 0x0c, 0xee, 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5, 0x90, 0x0e, 0xec, 0x40, + 0x0f, 0xe9, 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x60, + 0x0e, 0xf2, 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0xef, 0x90, + 0x0e, 0xee, 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d, 0x50, 0x0e, 0xec, 0x90, + 0x0e, 0xed, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, + 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94, 0x43, 0x1b, + 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, 0x43, 0x1b, + 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81, 0x3b, 0xbc, 0x83, 0x3b, + 0xb4, 0x01, 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03, 0x40, 0x0f, 0xf2, 0x50, + 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x90, 0x0e, 0xee, 0x60, + 0x0e, 0xf3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, + 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, + 0xbc, 0x43, 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3, 0x3c, 0xb4, 0x81, 0x39, + 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, + 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xf3, 0x90, + 0x0e, 0xe7, 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d, 0xa0, 0x0f, 0xe5, 0x20, + 0x0f, 0xef, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, + 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, + 0xb8, 0xc3, 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43, 0x38, 0xc0, 0x03, 0x3c, + 0xa4, 0x83, 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, + 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0x31, 0x0f, 0xf4, 0x10, + 0x0e, 0xe3, 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2, 0xf0, 0x0e, 0xf4, 0x50, + 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d, 0x20, 0x0e, 0xf5, 0x60, + 0x0e, 0xe6, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xfa, 0x50, + 0x0e, 0x00, 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3, 0x3c, 0x84, 0x83, 0x39, + 0x94, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, + 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x6c, 0x50, 0x92, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x36, 0x00, 0xd6, 0x00, 0x90, 0x80, + 0x6a, 0x83, 0xa1, 0x04, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x45, 0x00, 0x16, + 0xa0, 0xda, 0xa0, 0x30, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x6d, 0x00, + 0xac, 0x01, 0x20, 0x01, 0xd5, 0x86, 0xa9, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x58, 0x03, 0x40, 0x19, 0xdc, 0xe1, 0x1d, 0xda, 0x40, 0x1c, 0xea, + 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, 0x01, 0xd8, 0x50, + 0x38, 0x42, 0x90, 0x06, 0x60, 0xb0, 0xc1, 0x78, 0xfe, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0x24, 0x80, 0xda, 0x10, 0x41, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x00, 0xca, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe9, 0xc0, + 0x0e, 0xf4, 0x90, 0x0e, 0xee, 0x30, 0x0f, 0x00, 0x00, 0x49, 0x18, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x42, + 0x61, 0x4c, 0x08, 0x8e, 0x09, 0x01, 0x32, 0x61, 0x48, 0x94, 0x65, 0xc2, + 0xc0, 0x28, 0xcb, 0x04, 0xa1, 0x71, 0x26, 0x04, 0xcf, 0x84, 0x00, 0x02, + 0x00, 0x89, 0x20, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, + 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, + 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, + 0x4c, 0x10, 0xb4, 0xc1, 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, + 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, + 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x41, 0x84, 0x41, 0x38, 0x4a, 0x9a, 0x22, 0x4a, 0x98, 0xfc, + 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, 0xdf, 0x1e, 0xfe, 0x69, 0x8c, 0x00, + 0x18, 0x44, 0x28, 0x82, 0x8b, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x25, + 0x80, 0x79, 0x16, 0x22, 0xfa, 0xa7, 0x31, 0x02, 0x60, 0x10, 0xe1, 0x10, + 0xca, 0x11, 0x04, 0x81, 0x40, 0x18, 0x08, 0x25, 0x65, 0x08, 0x02, 0x82, + 0x96, 0x61, 0x84, 0x01, 0x28, 0x44, 0xd3, 0x34, 0x0d, 0x39, 0x65, 0x00, + 0x00, 0x80, 0xa0, 0x22, 0x00, 0x00, 0x49, 0x73, 0x04, 0x41, 0x11, 0x28, + 0x80, 0xaa, 0x32, 0x00, 0x4d, 0x43, 0x57, 0x31, 0x9a, 0x06, 0x00, 0x00, + 0x80, 0xb2, 0x32, 0x34, 0x4d, 0x43, 0x5b, 0x11, 0x9a, 0x86, 0xba, 0x39, + 0x02, 0xc4, 0x08, 0xc1, 0x37, 0x47, 0x00, 0x06, 0xc3, 0x08, 0x42, 0x18, + 0x14, 0x05, 0x34, 0x10, 0x81, 0x12, 0x29, 0x00, 0x08, 0x69, 0x1c, 0x08, + 0x48, 0x81, 0x70, 0x04, 0x60, 0x8e, 0x00, 0x14, 0x06, 0x11, 0x00, 0x61, + 0x0a, 0x60, 0x18, 0x61, 0x08, 0x83, 0x61, 0x04, 0x22, 0x0c, 0x00, 0x00, + 0x00, 0x13, 0xc0, 0x20, 0x1c, 0xd2, 0x41, 0x1e, 0xec, 0x80, 0x0e, 0xda, + 0x20, 0x1c, 0xe0, 0x01, 0x1e, 0xd8, 0xa1, 0x1c, 0xda, 0x80, 0x1e, 0xec, + 0xe1, 0x1d, 0xe6, 0x21, 0x0e, 0xe6, 0xc0, 0x0d, 0xe0, 0xc0, 0x0d, 0xe0, + 0xa0, 0x0d, 0xe6, 0x21, 0x1d, 0xda, 0xa1, 0x1e, 0xd8, 0x21, 0x1c, 0xe8, + 0xe1, 0x1d, 0xe4, 0x61, 0xc3, 0x6d, 0x94, 0x43, 0x1b, 0xc0, 0x83, 0x1e, + 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, + 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1e, 0xe0, 0x81, 0x1e, 0xe0, 0x41, 0x1b, + 0xa4, 0x03, 0x1e, 0xe8, 0x01, 0x1e, 0xe8, 0x01, 0x1e, 0xb4, 0x41, 0x3a, + 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d, + 0xb4, 0x41, 0x3a, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, + 0xcc, 0x81, 0x1c, 0xb4, 0x41, 0x3a, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, + 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x39, 0xcc, 0x81, 0x1c, + 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x39, + 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, + 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e, + 0xc4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x01, 0x1d, 0xe8, 0xc1, 0x1c, + 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xcc, 0x81, 0x1c, + 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d, + 0xd0, 0x01, 0x1e, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, + 0xb4, 0x81, 0x3d, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, + 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xe4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, + 0xc8, 0x01, 0x1e, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xb4, 0x81, 0x3d, + 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, + 0xc4, 0x81, 0x1c, 0xe0, 0x41, 0x1b, 0xd8, 0x43, 0x1c, 0xe4, 0x81, 0x1c, + 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, + 0xb4, 0x81, 0x3d, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, + 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x41, 0x1b, 0xd8, 0x43, 0x1d, + 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, + 0xc4, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, + 0xe8, 0x41, 0x1c, 0xc0, 0x81, 0x1c, 0xd0, 0x81, 0x1e, 0xc4, 0x01, 0x1c, + 0xc8, 0x01, 0x1d, 0xb4, 0x81, 0x3b, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1d, + 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43, 0x46, 0x6c, 0x57, 0xfe, + 0x9c, 0xf3, 0x60, 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34, 0xd3, 0x90, 0x08, + 0x88, 0x12, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x18, 0x12, 0x45, 0x78, 0xb0, 0x20, 0xc0, 0x20, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0xc0, 0x90, 0x28, 0x15, 0x28, 0x07, 0x08, 0x80, 0x01, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x86, 0x44, 0xbd, 0x00, 0x41, + 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x24, + 0x6a, 0x87, 0x48, 0x02, 0x02, 0x60, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x80, 0x21, 0x91, 0x3f, 0x58, 0x15, 0x10, 0x00, 0x03, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x89, 0x68, 0xa2, 0xb9, 0x80, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, 0x48, 0x14, 0x16, + 0x59, 0x86, 0x00, 0x03, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x22, 0xbd, 0x88, 0x20, 0x20, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x18, 0x12, 0xad, 0x86, 0xb4, 0x01, 0x01, 0x30, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xc0, 0x90, 0xa8, 0x37, 0xa6, 0x0e, + 0x08, 0x80, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x86, 0x44, + 0xf0, 0x31, 0x6d, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x30, 0x24, 0x1a, 0x91, 0x6d, 0x0c, 0x80, 0x00, 0x28, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x62, 0x83, 0x40, 0xd1, 0x82, 0x03, + 0x00, 0x80, 0x2c, 0x10, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, + 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, + 0x0a, 0x8b, 0xa0, 0x04, 0x0a, 0x61, 0x04, 0xa0, 0x0c, 0x0a, 0xa8, 0x20, + 0x0a, 0xa3, 0x40, 0x0a, 0xa5, 0x60, 0x0a, 0xa7, 0x14, 0x08, 0x1d, 0x01, + 0x28, 0x84, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0x32, + 0xc7, 0x12, 0x24, 0x01, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, + 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, + 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, + 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, + 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, + 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, + 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, + 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, + 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, + 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, + 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, + 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, + 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, + 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, + 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, + 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, + 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, + 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, + 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, + 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, + 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, + 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, + 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, + 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, + 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, + 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, + 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, + 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, + 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, + 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, + 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, + 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, + 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, + 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, + 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, + 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, + 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, + 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, + 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, + 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, + 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, + 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, + 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, + 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, + 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, + 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, + 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, + 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, + 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, + 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, + 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, + 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, + 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, + 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, + 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, + 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x79, 0x20, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x32, 0x9a, 0x08, + 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4, + 0xde, 0x00, 0x0d, 0x48, 0x0b, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x41, + 0x14, 0x19, 0x8c, 0x22, 0x31, 0x88, 0x64, 0x3d, 0x45, 0x66, 0x20, 0xca, + 0x23, 0x21, 0x54, 0xc1, 0x30, 0xca, 0xe2, 0x3c, 0xcf, 0x13, 0x5d, 0x4f, + 0xb0, 0x28, 0xd8, 0xb0, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b, + 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, + 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, + 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, + 0x28, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, + 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, + 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, + 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, + 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x69, 0x72, + 0x2e, 0x6e, 0x6f, 0x5f, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x69, 0x72, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, + 0x5f, 0x66, 0x29, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, + 0x72, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, + 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, + 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, + 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, + 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, + 0x64, 0x72, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, + 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x61, 0x69, + 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x61, 0x69, 0x72, + 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x78, 0x74, 0x75, + 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x61, 0x69, + 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x72, 0x73, 0x24, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x82, 0x10, 0x06, 0xcd, 0x08, 0x82, 0x19, 0x88, 0xc1, 0x08, + 0x42, 0x18, 0x38, 0x23, 0x08, 0x61, 0xf0, 0x8c, 0x20, 0x84, 0x01, 0x34, + 0x82, 0xa0, 0x00, 0x23, 0x08, 0x61, 0x10, 0x8d, 0x20, 0x84, 0x81, 0x34, + 0x82, 0x10, 0x06, 0xd3, 0x08, 0x42, 0x18, 0x50, 0x23, 0x08, 0x61, 0x50, + 0x8d, 0x20, 0x84, 0x81, 0x35, 0x82, 0x10, 0x06, 0xd7, 0x08, 0x42, 0x18, + 0x60, 0x23, 0x08, 0x61, 0x90, 0xcd, 0x30, 0xc0, 0x41, 0x10, 0x07, 0x33, + 0x0c, 0x72, 0x20, 0xcc, 0xc1, 0x0c, 0xc1, 0x30, 0xc3, 0x00, 0x07, 0x70, + 0x40, 0x07, 0x33, 0x10, 0x84, 0x1c, 0xc8, 0x01, 0x1d, 0xcc, 0x10, 0x14, + 0x33, 0x04, 0xc6, 0x0c, 0xc1, 0x31, 0x43, 0x81, 0xd0, 0x01, 0x1d, 0x24, + 0xca, 0x0c, 0xc1, 0x29, 0xcc, 0x80, 0xd0, 0xc1, 0xc2, 0x34, 0x89, 0xe2, + 0x3c, 0x33, 0x24, 0x72, 0x00, 0x45, 0x8c, 0x94, 0x28, 0xce, 0x34, 0x43, + 0x02, 0x07, 0x10, 0xc5, 0x48, 0x49, 0xe5, 0x58, 0x33, 0xa0, 0x01, 0x1d, + 0xcc, 0x01, 0x1d, 0x70, 0xdd, 0x1c, 0xcc, 0x01, 0x1d, 0x70, 0x1e, 0x1e, + 0xcc, 0x01, 0x1d, 0x70, 0x5f, 0x1e, 0xcc, 0x01, 0x1d, 0x70, 0x60, 0xa0, + 0x07, 0x73, 0x40, 0x07, 0x5c, 0x18, 0xec, 0xc1, 0x1c, 0xd0, 0x01, 0x27, + 0x06, 0x7c, 0x30, 0x07, 0x74, 0xc0, 0x8d, 0x41, 0x1f, 0xcc, 0x01, 0x1d, + 0x70, 0x64, 0x30, 0x83, 0x64, 0x07, 0x17, 0x76, 0x07, 0x19, 0x1d, 0xc8, + 0x81, 0xb6, 0xb1, 0x42, 0x19, 0xdc, 0x81, 0x19, 0xcc, 0x41, 0x72, 0x06, + 0x0e, 0x1a, 0xcc, 0xa0, 0xcc, 0x41, 0x1a, 0x64, 0x74, 0x20, 0x07, 0x6a, + 0x90, 0xac, 0x81, 0xc3, 0x06, 0x33, 0x24, 0x7e, 0xd0, 0x06, 0x19, 0x1d, + 0xc8, 0x41, 0xe2, 0x06, 0xce, 0x1b, 0xcc, 0x60, 0xa4, 0x82, 0x2a, 0xac, + 0x42, 0x2b, 0xb8, 0xc2, 0x2b, 0xcc, 0x30, 0xd4, 0x01, 0x2a, 0xc0, 0x42, + 0x89, 0x01, 0x20, 0x06, 0x68, 0x20, 0x06, 0x62, 0x20, 0x06, 0x9c, 0x18, + 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, + 0xb8, 0x81, 0x1b, 0x58, 0x74, 0xa0, 0x07, 0x96, 0x65, 0xe9, 0x01, 0x67, + 0x0a, 0xac, 0xc0, 0x0a, 0x74, 0xe3, 0x17, 0xf6, 0xa0, 0x0e, 0xb8, 0x20, + 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d, 0xcd, 0xae, 0xcd, 0xa5, 0xed, 0x8d, + 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c, 0x2d, 0xec, 0x6c, 0x6e, 0x14, 0xc1, + 0x0f, 0xfe, 0xe0, 0x14, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2, 0x32, + 0x37, 0xba, 0x51, 0x02, 0x50, 0xb8, 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae, + 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x94, 0x20, 0x14, 0x8e, 0x0a, 0x4b, + 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b, 0xab, 0x0b, 0x3b, 0x2b, 0xfb, 0xb2, + 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0x10, 0x85, 0x9b, 0xc2, + 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda, 0xe0, 0xd2, 0xd8, 0xca, 0xbe, 0xde, + 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0x46, 0x19, 0x46, 0x81, 0x14, 0x4a, + 0xe1, 0x98, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, 0xb6, 0x32, + 0x37, 0xba, 0x51, 0x02, 0x58, 0x00, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00, + 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, + 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, + 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, + 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, + 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4, + 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81, + 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08, + 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01, + 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c, + 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c, + 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c, + 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1, + 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, + 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, + 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x3e, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x44, 0xd5, 0xc0, 0x08, 0x00, 0x89, 0x23, 0x00, 0x04, 0x8c, 0x00, + 0x00, 0xf1, 0x30, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, + 0x90, 0x51, 0x12, 0x44, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x63, 0x80, 0x61, + 0x16, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, + 0x70, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, + 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2d, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, + 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x00, 0x00, + 0x00, 0x2b, 0x04, 0x5b, 0x90, 0x85, 0x15, 0xc3, 0x2d, 0xd8, 0xc2, 0x2c, + 0xac, 0x18, 0x70, 0xc1, 0x16, 0x68, 0x61, 0xc5, 0x90, 0x0b, 0xb6, 0x50, + 0x0b, 0x1b, 0x04, 0x5c, 0xb8, 0x85, 0x0d, 0x41, 0x2e, 0x00, 0x00, 0x00, + 0x00, 0x23, 0x06, 0x8d, 0x11, 0x82, 0x60, 0x30, 0x06, 0x61, 0x60, 0x14, + 0x08, 0x21, 0x0c, 0x41, 0xd0, 0x8d, 0x26, 0x04, 0xc0, 0x88, 0xc1, 0x71, + 0xc4, 0x20, 0x58, 0xf8, 0xc7, 0xe2, 0x06, 0x41, 0x62, 0x01, 0x23, 0xfe, + 0x19, 0x04, 0xc4, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0, + 0xc8, 0x05, 0x44, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0xe3, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00, + 0x00, 0x4f, 0x00, 0x00, 0x00, 0x14, 0x96, 0xc3, 0x0c, 0x40, 0x31, 0x10, + 0x5a, 0x02, 0x45, 0x40, 0xeb, 0x58, 0x03, 0x10, 0x08, 0x23, 0x00, 0xc4, + 0xce, 0x41, 0x40, 0x4e, 0x63, 0x06, 0x63, 0x11, 0x40, 0x20, 0x1c, 0x04, + 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x18, 0x81, 0x2c, 0xba, 0x3d, + 0x0d, 0x06, 0x63, 0x04, 0xb5, 0x5a, 0xab, 0xed, 0x37, 0x46, 0xd0, 0xc7, + 0xa2, 0x8b, 0x7f, 0x63, 0x04, 0x6e, 0x1f, 0x8b, 0xb6, 0x2f, 0x8c, 0x11, + 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, + 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, + 0x8d, 0x11, 0xbc, 0x7b, 0x5a, 0xde, 0xdf, 0x18, 0x81, 0xce, 0x9a, 0x73, + 0x08, 0x06, 0x23, 0x00, 0x63, 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, 0x8c, + 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x03, 0x40, 0xc1, 0x0c, 0xc0, + 0x0c, 0xc0, 0x1c, 0xc4, 0x1c, 0xe4, 0xc1, 0x1c, 0xf0, 0x01, 0x35, 0x33, + 0x00, 0x23, 0x00, 0x33, 0x00, 0x63, 0x0d, 0x20, 0x08, 0x82, 0xf8, 0x07, + 0x82, 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82, 0xf8, 0x37, 0xd6, 0xc0, 0xb6, + 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4, 0xc7, 0xb6, 0xf3, 0x4f, 0x7a, + 0x63, 0x0d, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, 0xc8, 0xd6, 0xbf, + 0x00, 0x82, 0x20, 0x5b, 0xff, 0xc2, 0x58, 0x03, 0x08, 0x82, 0x6b, 0x0e, + 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x80, 0x20, 0xb8, 0xe6, 0x60, 0x30, + 0xd6, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, 0x6d, 0x0e, 0x06, + 0x20, 0x48, 0xb7, 0x39, 0x18, 0x8c, 0x35, 0xac, 0x23, 0x1e, 0xb3, 0x60, + 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x3a, 0xe2, 0x31, 0x0b, 0x06, 0x63, + 0x0d, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, 0x87, 0x63, 0x00, + 0x82, 0x30, 0x1e, 0x8e, 0xc1, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, + 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, + 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, + 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, + 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x00, 0xf1, 0x30, 0x00, + 0x00, 0x32, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x0e, 0xc4, + 0x1d, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x00, 0x00, 0x5f, 0x5a, 0x54, + 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f, + 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d, + 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, + 0x00, 0x13, 0x04, 0x34, 0xd0, 0x26, 0x08, 0x68, 0xb0, 0x4d, 0x10, 0xd0, + 0x80, 0x9b, 0x20, 0xa0, 0x41, 0x37, 0x41, 0x40, 0x03, 0x6f, 0x82, 0x80, + 0x06, 0xdf, 0x04, 0x01, 0x0d, 0xc0, 0x60, 0x82, 0x80, 0x06, 0x61, 0xb0, + 0x21, 0xa0, 0x85, 0x0d, 0xc3, 0x2c, 0xf4, 0x42, 0x2d, 0x6c, 0x18, 0x38, + 0x5f, 0xa8, 0x85, 0x0d, 0x91, 0x2c, 0xfc, 0x42, 0x2d, 0xfc, 0x82, 0x2d, + 0xfc, 0xc2, 0x2d, 0xfc, 0x02, 0x2e, 0xfc, 0x42, 0x2e, 0xfc, 0x82, 0x2e, + 0xfc, 0xc2, 0x2e, 0xfc, 0x02, 0x2f, 0x6c, 0x18, 0xc0, 0xe1, 0x17, 0x6e, + 0x61, 0xc3, 0x00, 0x0e, 0xbf, 0xc0, 0x0b, 0x1b, 0x06, 0x70, 0xf8, 0x85, + 0x5c, 0xd8, 0x30, 0x80, 0xc3, 0x2f, 0xe8, 0xc2, 0x86, 0x01, 0x1c, 0x7e, + 0x61, 0x17, 0x36, 0x0c, 0xe0, 0xf0, 0x0b, 0xb6, 0xb0, 0x61, 0x00, 0x87, + 0x5f, 0xc0, 0x85, 0x0d, 0x03, 0x38, 0xfc, 0x42, 0x2d, 0x00, 0x00, 0x00, + 0x00, 0x7b, 0x18, 0xd2, 0x60, 0x0e, 0x40, 0x81, 0x02, 0x60, 0x0c, 0x47, + 0x04, 0x55, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0x0c, 0x32, 0xb4, 0xc1, + 0x64, 0x06, 0x7b, 0x18, 0xda, 0xe0, 0x0e, 0xd8, 0x80, 0x02, 0x60, 0x8c, + 0x18, 0x18, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x74, 0xa9, 0x30, 0x8c, 0x18, + 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x6c, 0xab, 0x10, 0x40, 0x16, 0x40, + 0xe0, 0x3f, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0xb1, 0xad, 0x42, + 0x50, 0xd9, 0x10, 0x89, 0xbf, 0x45, 0x41, 0xf8, 0xdb, 0x10, 0x90, 0xff, + 0x88, 0x81, 0x81, 0x84, 0x20, 0x58, 0xf8, 0x47, 0x07, 0x0b, 0xc1, 0x88, + 0xc1, 0x81, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0x26, 0x0b, 0xc1, 0x64, 0xc1, + 0x24, 0xfe, 0x73, 0x0c, 0xdd, 0x32, 0x0a, 0x83, 0x0c, 0x81, 0x37, 0x07, + 0x36, 0x04, 0xe4, 0x3f, 0xc8, 0x10, 0x80, 0x01, 0x1d, 0x0c, 0x32, 0x04, + 0x7e, 0x40, 0x07, 0xb3, 0x04, 0xc2, 0x40, 0x45, 0x20, 0x04, 0xfe, 0x00, + 0xec, 0x61, 0xf8, 0x83, 0x54, 0xa0, 0x05, 0x0a, 0x80, 0x31, 0x1c, 0x11, + 0xb0, 0x81, 0xe3, 0x1f, 0xb3, 0x0c, 0x03, 0x11, 0x0c, 0x32, 0x10, 0x69, + 0xc0, 0x07, 0x7b, 0x18, 0x46, 0xa1, 0x15, 0x5c, 0x81, 0x02, 0x60, 0xec, + 0x61, 0x28, 0x85, 0x57, 0x10, 0x05, 0x0a, 0x80, 0x31, 0x62, 0xa0, 0x24, + 0x31, 0x08, 0x16, 0xfe, 0x91, 0x91, 0x43, 0xd1, 0x1d, 0x43, 0x30, 0xc8, + 0x10, 0xb0, 0x01, 0x28, 0x0c, 0x32, 0x04, 0x0b, 0x28, 0xcc, 0x12, 0x10, + 0x03, 0x15, 0x81, 0x30, 0x60, 0xc2, 0x70, 0x44, 0x18, 0xf0, 0x41, 0xe0, + 0x1f, 0xb3, 0x0c, 0xc5, 0x14, 0xec, 0x61, 0x60, 0x05, 0x5b, 0x10, 0x07, + 0x0a, 0x80, 0x31, 0x1c, 0x11, 0xfc, 0x41, 0xe0, 0x1f, 0xb3, 0x0c, 0xc6, + 0x11, 0x0c, 0x32, 0x14, 0x76, 0x90, 0x0a, 0x7b, 0x18, 0x60, 0x41, 0x17, + 0xc6, 0x81, 0x02, 0x60, 0xcc, 0x31, 0xd8, 0x41, 0xc0, 0x0b, 0x83, 0x0c, + 0xc1, 0x1d, 0xb0, 0x82, 0x05, 0x85, 0xf8, 0x0f, 0x32, 0x04, 0x79, 0xd0, + 0x0a, 0xb3, 0x04, 0x6d, 0xb0, 0x87, 0xc1, 0x16, 0xc0, 0x41, 0x1d, 0x28, + 0x00, 0xc6, 0x1e, 0x06, 0x5c, 0x10, 0x87, 0x75, 0xa0, 0x00, 0x18, 0x83, + 0x0c, 0x50, 0x28, 0xc8, 0xc2, 0x88, 0x41, 0x81, 0x84, 0x20, 0x18, 0x54, + 0xfa, 0x40, 0xcc, 0x32, 0x20, 0x52, 0x30, 0x86, 0x20, 0x99, 0xc3, 0x70, + 0x44, 0xd0, 0x0a, 0x8a, 0x7f, 0xcc, 0x32, 0x28, 0x49, 0x60, 0x42, 0x2b, + 0x88, 0xff, 0x2c, 0xc1, 0x62, 0x43, 0x2b, 0x80, 0xff, 0x88, 0x81, 0x81, + 0x84, 0x20, 0x58, 0xf8, 0x87, 0x04, 0x12, 0x81, 0x05, 0xae, 0x20, 0xfe, + 0x23, 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0xd0, 0x48, 0x04, 0xae, + 0x30, 0x4b, 0xb0, 0x0c, 0x54, 0x00, 0x4a, 0x22, 0x28, 0x73, 0x0c, 0xaa, + 0x10, 0xb8, 0xc3, 0x18, 0xc2, 0x16, 0x0e, 0xc3, 0x11, 0x81, 0x2d, 0x28, + 0xfe, 0x31, 0xcb, 0xd0, 0x30, 0x81, 0x09, 0xb6, 0x20, 0xfe, 0xb3, 0x04, + 0x8e, 0x0d, 0xb6, 0x00, 0xfe, 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1, + 0x1f, 0x52, 0x4a, 0x04, 0x16, 0xdc, 0x82, 0xf8, 0x8f, 0x18, 0x1c, 0x48, + 0x08, 0x82, 0x85, 0x7f, 0x40, 0x2c, 0x11, 0xdc, 0xc2, 0x2c, 0x81, 0x33, + 0x50, 0x01, 0x28, 0x8c, 0xd0, 0xcc, 0x31, 0x24, 0x41, 0x3a, 0x8c, 0x21, + 0x90, 0x41, 0x3a, 0x0c, 0x47, 0x04, 0xbf, 0xa0, 0xf8, 0xc7, 0x2c, 0x03, + 0xf4, 0x04, 0x26, 0xfc, 0x82, 0xf8, 0xcf, 0x12, 0x44, 0x36, 0xfc, 0x02, + 0xf8, 0x8f, 0x18, 0x18, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x48, 0x32, 0x11, + 0x58, 0x00, 0x0e, 0xe2, 0x3f, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, + 0x01, 0xd5, 0x44, 0x00, 0x0e, 0xb3, 0x04, 0xd1, 0x40, 0x05, 0xa0, 0x3c, + 0x02, 0x34, 0xc7, 0x90, 0x04, 0xf1, 0x30, 0x4b, 0x20, 0x0d, 0x54, 0x04, + 0x42, 0xa4, 0x07, 0xc7, 0x20, 0x43, 0xf0, 0x0b, 0xf2, 0x30, 0xc7, 0xd0, + 0x0b, 0x60, 0x30, 0x12, 0x83, 0x0c, 0x81, 0x2f, 0xcc, 0x83, 0x0d, 0x81, + 0xf8, 0x0f, 0x32, 0x04, 0xe0, 0x40, 0x0f, 0xb3, 0x04, 0x6d, 0x30, 0x1c, + 0x31, 0x0b, 0xe6, 0x10, 0xf8, 0xc7, 0x2c, 0x03, 0x05, 0x06, 0xc1, 0x20, + 0x03, 0x1d, 0x94, 0x03, 0x3e, 0xec, 0x61, 0xf8, 0x87, 0x94, 0x98, 0x09, + 0x0a, 0x80, 0xb1, 0x87, 0x21, 0x24, 0x56, 0x82, 0x26, 0x28, 0x00, 0xc6, + 0x1c, 0xc3, 0x39, 0x04, 0x2d, 0x31, 0xc8, 0x10, 0xa0, 0x43, 0x3f, 0x58, + 0x70, 0x88, 0xff, 0x20, 0x43, 0xa0, 0x0e, 0xfe, 0x30, 0x62, 0x50, 0x20, + 0x21, 0x08, 0x06, 0x95, 0x59, 0x1c, 0xb3, 0x0c, 0x5f, 0x15, 0x8c, 0x21, + 0x0c, 0x32, 0x31, 0x1c, 0x11, 0xfc, 0x83, 0xe2, 0x1f, 0xb3, 0x0c, 0x97, + 0x15, 0x98, 0xf0, 0x0f, 0xe2, 0x3f, 0x4b, 0x80, 0x8d, 0x18, 0x18, 0x48, + 0x08, 0x82, 0x85, 0x7f, 0x48, 0x6b, 0x31, 0x8c, 0x18, 0x1c, 0x48, 0x08, + 0x82, 0x85, 0x7f, 0x40, 0x6d, 0x11, 0x80, 0x84, 0x05, 0x20, 0x21, 0xfe, + 0x16, 0x80, 0x04, 0xf8, 0xcf, 0x12, 0x60, 0x03, 0x15, 0x80, 0x62, 0x09, + 0xd7, 0x1c, 0x83, 0x3c, 0x04, 0x3a, 0x31, 0x86, 0xc0, 0xb4, 0xc4, 0x70, + 0x44, 0x80, 0x12, 0x8a, 0x7f, 0xcc, 0x32, 0x68, 0x59, 0x60, 0x02, 0x4a, + 0x88, 0xff, 0x2c, 0xc1, 0x36, 0x62, 0x60, 0x20, 0x21, 0x08, 0x16, 0xfe, + 0x21, 0xd1, 0xc5, 0x30, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x01, + 0xd9, 0x45, 0x90, 0x12, 0x16, 0xa4, 0x84, 0xf8, 0x5b, 0x90, 0x12, 0xe0, + 0x3f, 0x4b, 0xb0, 0x0d, 0x54, 0x00, 0x4a, 0x26, 0x68, 0x73, 0x0c, 0x49, + 0x50, 0x13, 0x63, 0x08, 0x55, 0x4d, 0x0c, 0x47, 0x04, 0x31, 0xa1, 0xf8, + 0xc7, 0x2c, 0x43, 0xc7, 0x05, 0x26, 0xc4, 0x84, 0xf8, 0xcf, 0x12, 0x78, + 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x52, 0x5f, 0x0c, 0x23, + 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0xd0, 0x5f, 0x04, 0x32, 0x61, + 0x81, 0x4c, 0x88, 0xbf, 0x05, 0x32, 0x01, 0xfe, 0xb3, 0x04, 0xde, 0x40, + 0x05, 0xa0, 0x70, 0x42, 0x37, 0xc7, 0x90, 0x04, 0x3d, 0x31, 0x62, 0x80, + 0x20, 0x21, 0x08, 0x16, 0xfe, 0xe1, 0x94, 0x46, 0x60, 0x12, 0x24, 0x31, + 0xc8, 0x10, 0xa0, 0x04, 0x4f, 0xcc, 0x12, 0x7c, 0x03, 0x15, 0x81, 0x1f, + 0x50, 0x82, 0x37, 0xc8, 0x10, 0xb4, 0x84, 0x4f, 0xcc, 0x12, 0xb4, 0xc1, + 0x2c, 0x43, 0x18, 0xb4, 0x01, 0x3f, 0x0c, 0x32, 0xf4, 0x82, 0x4b, 0x84, + 0xc5, 0x88, 0xc1, 0x81, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0x65, 0x1a, 0x81, + 0x48, 0xcc, 0x31, 0xac, 0x44, 0x30, 0x17, 0x23, 0x06, 0x07, 0x12, 0x82, + 0x60, 0xe1, 0x1f, 0x17, 0x6a, 0x0c, 0x23, 0x31, 0xc7, 0x20, 0x04, 0x67, + 0x31, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x71, 0xa9, 0x46, 0x41, + 0x12, 0x73, 0x0c, 0x42, 0x80, 0x16, 0x83, 0x0c, 0x81, 0x4c, 0x98, 0xc5, + 0x20, 0x43, 0x50, 0x0e, 0x66, 0xb1, 0x87, 0x01, 0x2e, 0xf4, 0x82, 0x34, + 0x28, 0x00, 0xc6, 0x1e, 0x06, 0xb9, 0xe0, 0x8b, 0xd2, 0xa0, 0x00, 0x18, + 0x73, 0x0c, 0x38, 0x11, 0xf8, 0xc5, 0x20, 0x43, 0x90, 0x13, 0x6e, 0x61, + 0x41, 0x22, 0xfe, 0x83, 0x0c, 0xc1, 0x4e, 0xbc, 0xc5, 0x88, 0x41, 0x81, + 0x84, 0x20, 0x18, 0x54, 0xb7, 0x71, 0xcc, 0x32, 0xb0, 0x81, 0x18, 0x04, + 0x63, 0x08, 0xc3, 0x68, 0x0c, 0x47, 0x04, 0x70, 0xa1, 0xf8, 0xc7, 0x2c, + 0x03, 0x19, 0x8c, 0x41, 0x60, 0x02, 0x5c, 0x88, 0xff, 0x2c, 0x41, 0x19, + 0x8c, 0x18, 0x18, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x48, 0xbc, 0x31, 0x8c, + 0x18, 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x40, 0xbe, 0x11, 0xc4, 0x85, + 0x05, 0x71, 0x21, 0xfe, 0x16, 0xc4, 0x05, 0xf8, 0xcf, 0x12, 0x94, 0xc1, + 0x40, 0x05, 0xa0, 0x8c, 0x81, 0x40, 0x06, 0x73, 0x0c, 0x63, 0x11, 0xac, + 0xc6, 0x18, 0x02, 0xe3, 0x17, 0xc3, 0x11, 0x41, 0x5e, 0x28, 0xfe, 0x31, + 0xcb, 0x70, 0x06, 0x66, 0x10, 0x98, 0x90, 0x17, 0xe2, 0x3f, 0x4b, 0x80, + 0x06, 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x52, 0x79, 0x0c, + 0x23, 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0xd0, 0x79, 0x04, 0x7a, + 0x61, 0x81, 0x5e, 0x88, 0xbf, 0x05, 0x7a, 0x01, 0xfe, 0xb3, 0x04, 0x68, + 0x30, 0x50, 0x01, 0x28, 0x66, 0x20, 0x9c, 0xc1, 0x1c, 0x43, 0x12, 0x98, + 0xc6, 0x18, 0x42, 0x65, 0x1a, 0xc3, 0x11, 0x81, 0x68, 0x28, 0xfe, 0x31, + 0xcb, 0xa0, 0x06, 0x69, 0x10, 0x98, 0x20, 0x1a, 0xe2, 0x3f, 0x4b, 0xb0, + 0x06, 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x92, 0x7b, 0x0c, + 0x23, 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x10, 0x7c, 0x04, 0xa3, + 0x61, 0xc1, 0x68, 0x88, 0xbf, 0x05, 0xa3, 0x01, 0xfe, 0xb3, 0x04, 0x6b, + 0x30, 0x50, 0x01, 0x28, 0x69, 0x20, 0xa8, 0xc1, 0x1c, 0x43, 0x12, 0xb8, + 0xc6, 0x88, 0x01, 0x82, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x63, 0x1f, 0xc1, + 0x5d, 0xd4, 0xc5, 0x20, 0x43, 0x90, 0x17, 0xad, 0x31, 0x4b, 0xc0, 0x06, + 0x03, 0x15, 0x81, 0x1f, 0x84, 0x81, 0xb0, 0x06, 0x83, 0x0c, 0x81, 0x5f, + 0xbc, 0xc6, 0x2c, 0x41, 0x1b, 0x0c, 0xb4, 0x04, 0x3c, 0x62, 0xf0, 0x88, + 0xc4, 0x23, 0x9f, 0x2c, 0xb0, 0x01, 0x8f, 0x80, 0xc1, 0x40, 0x4b, 0x80, + 0x22, 0x86, 0x5e, 0x48, 0xe6, 0xf0, 0x11, 0x6c, 0xc0, 0x2f, 0x60, 0x30, + 0xc8, 0x10, 0x08, 0xb1, 0x91, 0x41, 0x40, 0x0c, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x5b, 0x86, 0x20, 0x00, 0x87, 0x2d, 0x83, 0x11, 0x84, 0xc3, 0x96, + 0x21, 0x0b, 0xc4, 0x61, 0xcb, 0xe0, 0x05, 0xe3, 0xb0, 0x65, 0x00, 0x83, + 0x80, 0x1c, 0xb6, 0x0c, 0x69, 0x10, 0x94, 0xc3, 0x96, 0xc1, 0x0d, 0x02, + 0x73, 0xd8, 0x32, 0xd4, 0x41, 0x70, 0x0e, 0x5b, 0x86, 0x3b, 0x08, 0xcc, + 0x61, 0xcb, 0xb0, 0x0e, 0xc1, 0x39, 0x6c, 0x19, 0xda, 0x21, 0x30, 0x87, + 0x2d, 0x43, 0x5a, 0x04, 0xe7, 0xb0, 0x65, 0x58, 0x8b, 0xc0, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x73, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, + 0x00, 0x14, 0xce, 0x00, 0x10, 0x5a, 0x02, 0x45, 0x40, 0xeb, 0x58, 0x03, + 0x10, 0x08, 0x23, 0x00, 0xc4, 0xce, 0x41, 0x40, 0x4e, 0x83, 0x06, 0x04, + 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20, + 0x08, 0x06, 0x23, 0x00, 0x14, 0xcc, 0x00, 0xcc, 0x00, 0x50, 0x33, 0x03, + 0x30, 0xd6, 0xc0, 0xb2, 0x67, 0x28, 0x7f, 0xa8, 0x5f, 0xc6, 0xea, 0x97, + 0x9f, 0xba, 0x38, 0x7b, 0x63, 0x0d, 0x7a, 0x0d, 0xee, 0xb8, 0xa7, 0xe2, + 0xb9, 0x6d, 0x7f, 0x6f, 0x9f, 0xd2, 0xa3, 0x37, 0xd6, 0xb0, 0xce, 0x31, + 0x8b, 0x7a, 0x69, 0x08, 0xa3, 0xbb, 0x77, 0xb7, 0xb1, 0x6a, 0x7f, 0x63, + 0x0d, 0x62, 0x2e, 0xa6, 0xfd, 0x07, 0x96, 0x3c, 0x1b, 0xff, 0xc2, 0x98, + 0xae, 0x6a, 0xee, 0x0b, 0x63, 0x0d, 0xff, 0x4c, 0xfa, 0xbf, 0x2f, 0xd0, + 0x35, 0x28, 0xe6, 0x5f, 0x0b, 0xc7, 0x31, 0xe8, 0x0b, 0x63, 0x0d, 0x73, + 0xdf, 0xa6, 0xa9, 0x2f, 0xb4, 0x6e, 0xc8, 0xf3, 0xbe, 0xc0, 0xe7, 0xac, + 0x8f, 0x7f, 0x00, 0x00, 0x00, 0x83, 0x0c, 0xd7, 0xd1, 0x0c, 0x47, 0x58, + 0x4d, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0xcc, 0x31, 0x24, 0x96, 0x18, + 0x0c, 0x32, 0x04, 0x4a, 0x64, 0xc1, 0x26, 0xfe, 0x83, 0x0c, 0x01, 0x23, + 0xcd, 0x12, 0x24, 0xc3, 0x11, 0x5b, 0x14, 0xf8, 0xc7, 0x2c, 0xc3, 0x90, + 0x04, 0xc3, 0x11, 0x9d, 0x14, 0xf8, 0xc7, 0x2c, 0x03, 0x51, 0x04, 0x23, + 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x17, 0x1f, 0x7c, 0xce, 0x1c, + 0x43, 0x14, 0xa4, 0xc1, 0x88, 0xc1, 0x81, 0x84, 0x20, 0x58, 0xf8, 0xc7, + 0xe5, 0x07, 0x61, 0xf0, 0xcc, 0x31, 0x08, 0x01, 0x37, 0x62, 0x70, 0x20, + 0x21, 0x08, 0x16, 0xfe, 0x71, 0x81, 0xc2, 0x18, 0x40, 0x73, 0x0c, 0x42, + 0xd0, 0xcd, 0x12, 0x14, 0x03, 0x15, 0x81, 0x40, 0x70, 0xc3, 0x18, 0x42, + 0xf0, 0x06, 0x63, 0x08, 0x42, 0x18, 0x8c, 0x21, 0x0c, 0x61, 0x30, 0x62, + 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x01, 0x91, 0x82, 0x10, 0x8c, 0x18, + 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x40, 0xa5, 0x40, 0x04, 0xc3, 0x11, + 0x81, 0x27, 0xf8, 0xc7, 0x2c, 0x83, 0x71, 0x04, 0x83, 0x0c, 0x87, 0x47, + 0x06, 0x36, 0xa8, 0x81, 0xf8, 0x5b, 0x30, 0x06, 0xe0, 0x6f, 0xc5, 0x1a, + 0x88, 0xbf, 0x05, 0x65, 0x00, 0xfe, 0x36, 0x04, 0xe4, 0x3f, 0xc7, 0x20, + 0x06, 0xc1, 0x1e, 0x0c, 0x32, 0x04, 0x63, 0xa0, 0x06, 0x16, 0x20, 0xe2, + 0x3f, 0xc8, 0x10, 0x94, 0xc1, 0x1a, 0xcc, 0x12, 0x1c, 0x03, 0x15, 0x81, + 0x60, 0x88, 0x41, 0x31, 0xcb, 0x80, 0x24, 0xd9, 0x20, 0x43, 0x90, 0x06, + 0x6f, 0x30, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x71, 0xd5, 0x42, + 0x40, 0x06, 0x73, 0x0c, 0x6a, 0x10, 0x88, 0xc2, 0x88, 0xc1, 0x81, 0x84, + 0x20, 0x58, 0xf8, 0xc7, 0x75, 0x0b, 0x43, 0x19, 0xcc, 0x31, 0x08, 0x41, + 0x1d, 0x8c, 0x18, 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x5c, 0xb9, 0x50, + 0x98, 0xc1, 0x1c, 0x83, 0x10, 0xd8, 0xc1, 0x2c, 0x41, 0x32, 0x50, 0x12, + 0x90, 0x42, 0xe0, 0x0a, 0x82, 0x80, 0x40, 0xc7, 0x20, 0x43, 0x10, 0x07, + 0x77, 0x90, 0x01, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xeb, 0x08, 0x18, 0xb0, 0x9a, + 0x80, 0x07, 0x90, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, + 0x00, 0x67, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x30, 0x03, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, + 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x01, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x47, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x24, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x30, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x49, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x5d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, + 0x00, 0x7e, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x94, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, + 0x00, 0xa1, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x30, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0xba, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0xcb, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0xdd, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, + 0x00, 0x03, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, + 0x00, 0x55, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xa7, 0x02, 0x00, 0x00, + 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x5a, 0x31, 0x34, 0x47, 0x65, + 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, + 0x44, 0x76, 0x34, 0x5f, 0x66, 0x52, 0x55, 0x31, 0x31, 0x4d, 0x54, 0x4c, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x4b, 0x31, 0x35, 0x53, + 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x74, 0x73, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x63, + 0x6c, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, + 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x66, + 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, + 0x61, 0x62, 0x73, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x63, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x2e, 0x75, 0x2e, 0x69, 0x31, 0x2e, + 0x66, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x64, 0x6f, 0x74, + 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x5f, 0x5a, 0x31, 0x32, 0x41, 0x70, + 0x70, 0x6c, 0x79, 0x54, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x44, 0x76, + 0x33, 0x5f, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, 0x69, 0x72, 0x2e, 0x66, + 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78, 0x2e, 0x66, 0x33, 0x32, + 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, + 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, + 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, 0x76, 0x33, 0x66, 0x33, + 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, + 0x61, 0x78, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75, + 0x72, 0x65, 0x5f, 0x32, 0x64, 0x2e, 0x76, 0x34, 0x66, 0x33, 0x32, 0x33, + 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x61, 0x69, 0x72, 0x36, + 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x74, 0x76, 0x6f, 0x73, + 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, + 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xfc, 0x21, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, + 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0xa9, 0x07, 0x00, + 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, + 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, + 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, + 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, + 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, + 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, + 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x6e, 0x01, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x58, 0x03, 0x40, 0x02, 0x2a, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0, 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, @@ -1411,44 +1736,118 @@ const unsigned char sdl_metallib[] = { 0x60, 0x01, 0xaa, 0x20, 0x0d, 0x40, 0x61, 0x08, 0x87, 0x74, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x03, 0x77, 0x78, 0x87, 0x36, 0x08, 0x07, 0x76, 0x48, 0x87, 0x70, 0x98, 0x07, - 0x60, 0x83, 0x41, 0x20, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0xe2, 0xff, 0xff, - 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x89, 0x31, 0x00, 0x0b, 0x50, - 0x05, 0x69, 0x00, 0x0a, 0x1b, 0x8c, 0xc3, 0x00, 0x16, 0xa0, 0xda, 0xa0, - 0x20, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x6d, 0x00, 0xac, 0x01, 0x20, - 0x01, 0xd5, 0x06, 0x23, 0x09, 0x80, 0x05, 0xa8, 0x36, 0x18, 0x8a, 0x00, - 0x2c, 0x40, 0xb5, 0x61, 0x5a, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xd6, - 0x00, 0x50, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, - 0x76, 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x36, 0x14, 0xcc, 0x10, - 0xa4, 0x01, 0x28, 0x6c, 0x30, 0x9a, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, - 0x09, 0xa0, 0x36, 0x28, 0xce, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x40, 0x1b, - 0x00, 0x6b, 0x00, 0x48, 0x40, 0x05, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, - 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x41, - 0x31, 0x61, 0x08, 0x8c, 0x63, 0xc2, 0x80, 0x24, 0xca, 0x04, 0x61, 0x61, - 0x26, 0x04, 0xcd, 0x84, 0xc1, 0x49, 0x14, 0x00, 0x00, 0x89, 0x20, 0x00, - 0x00, 0x47, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, - 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, - 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xc8, 0xc1, - 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, - 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, - 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, - 0x41, 0x18, 0x46, 0x18, 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, - 0xe4, 0xa1, 0x1e, 0xc6, 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, - 0xc2, 0x81, 0x1d, 0xf4, 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, - 0xd2, 0x01, 0x1f, 0x50, 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, - 0xec, 0xbe, 0x1d, 0x21, 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, - 0x84, 0xa3, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, - 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0xb8, - 0x48, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, - 0x7f, 0x1a, 0x23, 0x00, 0x06, 0x11, 0x18, 0xa1, 0x24, 0x41, 0x10, 0x08, - 0x44, 0xb2, 0x2c, 0x0d, 0x39, 0x85, 0x28, 0x8a, 0xa2, 0x20, 0xa8, 0x0c, - 0x00, 0x00, 0x90, 0x54, 0x04, 0x00, 0x20, 0x6a, 0x8e, 0x20, 0x28, 0x82, - 0x05, 0xd0, 0x55, 0x06, 0xa0, 0x28, 0x28, 0x2b, 0x43, 0x51, 0x14, 0xb4, - 0x15, 0xa1, 0x28, 0xa8, 0x2b, 0x47, 0x20, 0x00, 0xc9, 0xb2, 0x34, 0xf4, - 0xcd, 0x11, 0x20, 0x46, 0x08, 0xc2, 0x39, 0x02, 0x30, 0x18, 0x46, 0x10, - 0xc6, 0xa0, 0x28, 0xe2, 0xd2, 0x08, 0x16, 0x69, 0x01, 0xc0, 0x48, 0xe5, - 0x40, 0x40, 0x0a, 0x8c, 0x73, 0x04, 0xa0, 0x30, 0x88, 0x00, 0x08, 0x53, - 0x00, 0x23, 0x00, 0xc3, 0x08, 0xc3, 0x18, 0x0c, 0x23, 0x10, 0x63, 0x30, - 0x88, 0x10, 0x08, 0x83, 0x08, 0x87, 0x30, 0x88, 0x50, 0x08, 0x00, 0x00, + 0x60, 0x83, 0x41, 0x18, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x02, 0x01, 0x16, + 0xa0, 0xda, 0x10, 0x26, 0xc6, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xc0, 0x1a, + 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00, 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80, + 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0, 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00, + 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, + 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b, 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b, + 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b, 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38, + 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b, 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d, + 0xa0, 0x03, 0x10, 0x07, 0x72, 0x80, 0x07, 0xc0, 0xe0, 0x0e, 0xef, 0xd0, + 0x06, 0xe2, 0x50, 0x0f, 0xe9, 0xc0, 0x0e, 0xf4, 0x90, 0x0e, 0xee, 0x30, + 0x0f, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xe6, 0x20, 0x0f, 0xe1, 0xd0, + 0x0e, 0xe5, 0xd0, 0x06, 0xf0, 0xf0, 0x0e, 0xe9, 0xe0, 0x0e, 0xf4, 0x50, + 0x0e, 0xf2, 0xd0, 0x06, 0xe5, 0xc0, 0x0e, 0xe9, 0xd0, 0x0e, 0x00, 0x3d, + 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3, 0x3b, 0xb4, 0x81, 0x39, + 0xc8, 0x43, 0x38, 0xb4, 0x43, 0x39, 0xb4, 0x01, 0x3c, 0xbc, 0x43, 0x3a, + 0xb8, 0x03, 0x3d, 0x94, 0x83, 0x3c, 0xb4, 0x41, 0x39, 0xb0, 0x43, 0x3a, + 0xb4, 0x43, 0x1b, 0xb8, 0xc3, 0x3b, 0xb8, 0x43, 0x1b, 0xb0, 0x43, 0x39, + 0x84, 0x83, 0x39, 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1, + 0x0e, 0xef, 0xd0, 0x06, 0xe9, 0xe0, 0x0e, 0xe6, 0x30, 0x0f, 0x6d, 0x60, + 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, + 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3, 0x3b, 0xb4, 0x81, 0x3b, + 0x84, 0x83, 0x3b, 0xcc, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, + 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, + 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x30, 0x0f, 0xe9, 0x70, 0x0e, 0xee, 0x50, + 0x0e, 0xe4, 0xd0, 0x06, 0xfa, 0x50, 0x0e, 0xf2, 0xf0, 0x0e, 0xf3, 0xd0, + 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, + 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, 0x1b, + 0xd0, 0x83, 0x3c, 0x84, 0x03, 0x3c, 0xc0, 0x43, 0x3a, 0xb8, 0xc3, 0x39, + 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, + 0x0f, 0xe5, 0x00, 0x10, 0xf3, 0x40, 0x0f, 0xe1, 0x30, 0x0e, 0xeb, 0xd0, + 0x06, 0xf0, 0x20, 0x0f, 0xef, 0x40, 0x0f, 0xe5, 0x30, 0x0e, 0xf4, 0xf0, + 0x0e, 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, 0x0e, 0xe5, 0x20, + 0x0f, 0x6d, 0x30, 0x0f, 0xe9, 0xa0, 0x0f, 0xe5, 0x00, 0xe0, 0x01, 0x40, + 0xd4, 0x83, 0x3b, 0xcc, 0x43, 0x38, 0x98, 0x43, 0x39, 0xb4, 0x81, 0x39, + 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, + 0x0f, 0xf5, 0x50, 0x0e, 0xc0, 0x86, 0xe4, 0x10, 0x80, 0x05, 0xa8, 0x82, + 0x34, 0x00, 0x83, 0x0d, 0x06, 0xf2, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, + 0x01, 0xd4, 0x06, 0x1f, 0x49, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x24, + 0xa0, 0x22, 0xc2, 0x01, 0x1e, 0xe0, 0x41, 0x1e, 0xde, 0x01, 0x1f, 0xda, + 0xc0, 0x1c, 0xea, 0xc1, 0x1d, 0xc6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, + 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, + 0x72, 0x00, 0x88, 0x76, 0x48, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87, + 0x73, 0x08, 0x07, 0x76, 0x68, 0x03, 0x7b, 0x28, 0x87, 0x71, 0xa0, 0x87, + 0x77, 0x90, 0x87, 0x36, 0xb8, 0x87, 0x74, 0x20, 0x07, 0x7a, 0x40, 0x07, + 0x20, 0x0f, 0xec, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda, 0x40, 0x1c, 0xea, + 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, 0x01, 0x20, 0xdc, + 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, + 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, + 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, + 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87, + 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87, + 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x68, 0x03, + 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87, 0x70, 0x30, 0x07, + 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, + 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, + 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, + 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87, 0x70, 0x70, 0x87, + 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, + 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, + 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca, 0x81, 0x1c, 0xda, + 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, + 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, + 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x7a, 0x90, 0x87, + 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87, 0x36, 0x68, 0x87, + 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, + 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda, 0x00, 0x1e, 0xe4, + 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, + 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xe6, + 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88, 0x7a, 0x70, 0x87, + 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, + 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, + 0x01, 0xd8, 0xa0, 0x28, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x6d, 0x00, + 0xac, 0x01, 0x20, 0x01, 0xd5, 0x06, 0x63, 0x09, 0x80, 0x05, 0xa8, 0x36, + 0x18, 0x8c, 0x00, 0x2c, 0x40, 0xb5, 0x41, 0x69, 0xfe, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0xda, 0x00, 0x58, 0x03, 0x40, 0x02, 0xaa, 0x0d, 0x86, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x01, 0xd4, 0x86, 0xe9, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0x01, 0x58, 0x03, 0x40, 0x19, 0xdc, 0xe1, 0x1d, 0xda, + 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, + 0x01, 0xd8, 0x50, 0x40, 0x42, 0x90, 0x06, 0x60, 0xb0, 0x21, 0x8a, 0xfe, + 0xff, 0xff, 0xff, 0x7f, 0x00, 0x94, 0xc1, 0x1d, 0xde, 0xa1, 0x0d, 0xc4, + 0xa1, 0x1e, 0xd2, 0x81, 0x1d, 0xe8, 0x21, 0x1d, 0xdc, 0x61, 0x1e, 0x00, + 0x00, 0x49, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x13, 0x8a, 0x40, + 0x18, 0x88, 0x62, 0x82, 0x60, 0x1c, 0x13, 0x02, 0x64, 0x42, 0x90, 0x4c, + 0x18, 0x94, 0x85, 0x99, 0x30, 0x34, 0x0b, 0x33, 0x21, 0x70, 0x26, 0x08, + 0x0f, 0x34, 0x21, 0x88, 0x00, 0x89, 0x20, 0x00, 0x00, 0x51, 0x00, 0x00, + 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, + 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, + 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xe0, 0xc1, 0x0c, 0xc0, 0x30, 0x02, + 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, + 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18, + 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6, + 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4, + 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50, + 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21, + 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29, + 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1, + 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0x38, 0x4d, 0x9a, 0x22, 0x4a, + 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, 0xdf, 0x1e, 0x7e, 0x20, + 0x8a, 0x00, 0xec, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x26, 0xb8, 0x48, + 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f, + 0x1a, 0x23, 0x00, 0x06, 0x11, 0x1c, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44, + 0xb2, 0x34, 0x0f, 0x41, 0x65, 0x08, 0x02, 0x82, 0xa4, 0x42, 0x14, 0x45, + 0x51, 0x10, 0x55, 0x06, 0x00, 0x00, 0xc8, 0x2a, 0x02, 0x00, 0x10, 0x36, + 0x47, 0x10, 0x14, 0x41, 0x03, 0x68, 0x2b, 0x03, 0x50, 0x14, 0xd4, 0x15, + 0xa3, 0x28, 0x00, 0x00, 0x00, 0xe8, 0x2b, 0x43, 0x51, 0x14, 0x14, 0x16, + 0xa1, 0x28, 0x68, 0x9c, 0x23, 0x40, 0x8c, 0x10, 0x94, 0x73, 0x04, 0x60, + 0x30, 0x8c, 0x20, 0x9c, 0x41, 0x59, 0xcc, 0xe6, 0x11, 0x4e, 0x0d, 0xd5, + 0x00, 0xe0, 0xa4, 0xb4, 0x28, 0xe6, 0xf2, 0x08, 0x1a, 0xaa, 0x01, 0xc0, + 0x49, 0xeb, 0x40, 0x40, 0x0a, 0x9c, 0x73, 0x04, 0xa0, 0x30, 0x8c, 0x30, + 0x9c, 0xc1, 0x20, 0x42, 0x20, 0x0c, 0x22, 0x1c, 0xc2, 0x20, 0x42, 0x21, + 0x8c, 0x00, 0x0c, 0x22, 0x00, 0xc2, 0x14, 0xc0, 0x30, 0x02, 0x71, 0x06, 0x00, 0x13, 0xc0, 0x20, 0x1c, 0xd2, 0x41, 0x1e, 0xec, 0x80, 0x0e, 0xda, 0x20, 0x1c, 0xe0, 0x01, 0x1e, 0xd8, 0xa1, 0x1c, 0xda, 0x80, 0x1e, 0xec, 0xe1, 0x1d, 0xe6, 0x21, 0x0e, 0xe6, 0xc0, 0x0d, 0xe0, 0xc0, 0x0d, 0xe0, @@ -1480,523 +1879,541 @@ const unsigned char sdl_metallib[] = { 0xc4, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, 0xe8, 0x41, 0x1c, 0xc0, 0x81, 0x1c, 0xd0, 0x81, 0x1e, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, 0xb4, 0x81, 0x3b, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1d, - 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43, 0x56, 0x6c, 0x57, 0xfe, - 0xda, 0x50, 0x01, 0x8d, 0x40, 0x0c, 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34, - 0xd3, 0x90, 0x08, 0xa8, 0x1c, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x18, 0x12, 0x55, 0x14, 0x04, 0x04, 0x80, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0xa2, 0x34, 0x80, 0x24, 0x20, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x12, 0xe5, - 0x41, 0x44, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0xc0, 0x90, 0x48, 0x15, 0xac, 0x0b, 0x08, 0x00, 0x01, 0x00, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x86, 0x44, 0xe0, 0xd0, 0x64, 0x40, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x24, 0x6a, 0x87, 0x48, - 0x02, 0x02, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, - 0x91, 0x3f, 0x48, 0x1b, 0x10, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x0c, 0x89, 0x60, 0x62, 0xea, 0x80, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, 0x48, 0x34, 0x16, 0xd3, 0x06, 0x04, - 0x80, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0x22, 0xbb, - 0x30, 0x87, 0x0f, 0x01, 0x86, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x86, 0x44, 0x3c, 0xb2, 0x95, 0x01, 0x10, 0x00, 0x04, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x48, 0x6c, 0x10, 0x28, 0x4a, 0x6a, 0x00, - 0x00, 0x90, 0x05, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, - 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, - 0x1a, 0x8b, 0xa0, 0x04, 0x0a, 0x61, 0x04, 0xa0, 0x0c, 0x0a, 0xa8, 0x20, - 0x0a, 0xa3, 0x40, 0x0a, 0xa5, 0x60, 0x0a, 0xa7, 0x00, 0x03, 0x0a, 0xac, - 0x14, 0x8a, 0xa1, 0x1c, 0x28, 0x1d, 0x01, 0x28, 0x84, 0x82, 0x28, 0x8c, - 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0x42, 0xc7, 0x12, 0x22, 0x01, 0x00, - 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, - 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, - 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, - 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, - 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, - 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, - 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, - 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, - 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, - 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, - 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, - 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, - 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, - 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, - 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, - 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, - 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, - 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, - 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, - 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, - 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, - 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, - 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, - 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, - 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, - 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, - 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, - 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, - 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, - 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, - 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, - 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, - 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, - 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, - 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, - 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, - 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, - 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, - 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, - 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, - 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, - 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, - 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, - 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, - 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, - 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, - 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, - 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, - 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, - 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, - 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, - 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, - 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, - 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, - 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, - 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, - 0x00, 0x47, 0x01, 0x00, 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, - 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4, 0xec, 0x80, 0x0d, 0xe8, - 0x0b, 0x8b, 0xf2, 0x06, 0xc5, 0xc6, 0x91, 0x41, 0x14, 0x19, 0x8c, 0x22, - 0x31, 0x88, 0x64, 0x3d, 0x45, 0x66, 0x20, 0xca, 0x23, 0x21, 0x54, 0xc1, - 0x30, 0xca, 0xe2, 0x3c, 0xcf, 0x13, 0x5d, 0x4f, 0x60, 0x18, 0x88, 0x91, - 0x18, 0x8b, 0x82, 0x11, 0xc4, 0x72, 0x04, 0x00, 0x00, 0x53, 0x44, 0x4b, - 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, - 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, - 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, 0x20, 0x28, - 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, - 0x33, 0x2e, 0x39, 0x38, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, - 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, - 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x61, 0x69, - 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, - 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, - 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x6e, - 0x6f, 0x5f, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, - 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, - 0x29, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, - 0x6f, 0x6f, 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, - 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, - 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, - 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, - 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, - 0x65, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, - 0x61, 0x63, 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, - 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, - 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x66, 0x6c, 0x6f, 0x61, - 0x74, 0x33, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x61, - 0x74, 0x33, 0x78, 0x33, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x59, 0x55, - 0x56, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x65, 0x63, 0x6f, 0x64, - 0x65, 0x61, 0x69, 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, - 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, - 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, - 0x78, 0x30, 0x74, 0x65, 0x78, 0x31, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, - 0x73, 0xe4, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0x30, - 0x06, 0xcc, 0x08, 0x02, 0x1a, 0x94, 0xc1, 0x08, 0xc2, 0x18, 0x34, 0x23, - 0x08, 0x63, 0xe0, 0x8c, 0x20, 0x8c, 0xc1, 0x33, 0x82, 0xf0, 0x00, 0x23, - 0x08, 0x63, 0x00, 0x8d, 0x20, 0x8c, 0x41, 0x34, 0x82, 0x30, 0x06, 0xd2, - 0x08, 0xc2, 0x18, 0x4c, 0x23, 0x08, 0x63, 0x40, 0x8d, 0x20, 0x8c, 0x41, - 0x35, 0x82, 0x30, 0x06, 0xd6, 0x08, 0xc2, 0x18, 0x5c, 0x23, 0x08, 0x63, - 0x80, 0x8d, 0x20, 0x8c, 0x41, 0x36, 0x82, 0x30, 0x06, 0xda, 0x08, 0xc2, - 0x18, 0x6c, 0x23, 0x08, 0x63, 0xc0, 0xcd, 0x30, 0xdc, 0x41, 0x80, 0x07, - 0x33, 0x0c, 0x79, 0x20, 0xe8, 0xc1, 0x0c, 0xc1, 0x30, 0xc3, 0x70, 0x07, - 0x77, 0xb0, 0x07, 0x33, 0x10, 0x44, 0x1e, 0xe4, 0xc1, 0x1e, 0xcc, 0x10, - 0x14, 0x33, 0x04, 0xc6, 0x0c, 0xc1, 0x31, 0x43, 0x81, 0xec, 0xc1, 0x1e, - 0x24, 0xca, 0x0c, 0x81, 0x2c, 0xcc, 0x80, 0xec, 0xc1, 0xc2, 0x34, 0x89, - 0xe2, 0x3c, 0x33, 0x24, 0x79, 0x00, 0x45, 0x8c, 0x94, 0x28, 0xce, 0x34, - 0x43, 0x72, 0x07, 0x10, 0xc5, 0x48, 0x49, 0xe5, 0x58, 0x33, 0xa0, 0xc1, - 0x1e, 0xe8, 0xc1, 0x1e, 0x70, 0x9d, 0x1e, 0xe8, 0xc1, 0x1e, 0x70, 0xde, - 0x1f, 0xe8, 0xc1, 0x1e, 0x70, 0x1f, 0x28, 0xe8, 0xc1, 0x1e, 0x70, 0x60, - 0x10, 0x0a, 0x7a, 0xb0, 0x07, 0x5c, 0x18, 0x88, 0x82, 0x1e, 0xec, 0x01, - 0x27, 0x06, 0xa3, 0xa0, 0x07, 0x7b, 0xc0, 0x8d, 0x01, 0x29, 0xe8, 0xc1, - 0x1e, 0x70, 0x64, 0x30, 0x83, 0xd4, 0x07, 0x17, 0xe6, 0x07, 0xd9, 0x1e, - 0xe4, 0x81, 0xb6, 0xdd, 0x42, 0x19, 0xf8, 0x81, 0x19, 0xe8, 0x41, 0x72, - 0x06, 0x0e, 0x1a, 0xcc, 0xa0, 0xec, 0x41, 0x28, 0xec, 0x41, 0x1a, 0xa8, - 0x41, 0x28, 0x98, 0xc2, 0x1e, 0xac, 0x01, 0x1b, 0xcc, 0x20, 0xe9, 0xc1, - 0x85, 0x95, 0x42, 0x96, 0x07, 0x79, 0xa0, 0x6d, 0xb9, 0x50, 0x06, 0xa5, - 0x60, 0x06, 0xa1, 0x90, 0xb4, 0x81, 0xe3, 0x06, 0x33, 0x28, 0xa7, 0xf0, - 0x06, 0xd9, 0x1e, 0xe4, 0x01, 0x1c, 0x24, 0x71, 0xe0, 0xc8, 0xc1, 0x0c, - 0x0a, 0x2a, 0xbc, 0x41, 0x96, 0x07, 0x79, 0x00, 0x07, 0x49, 0x1c, 0x38, - 0x73, 0x30, 0x43, 0x92, 0x0a, 0x74, 0x90, 0xed, 0x41, 0x1e, 0x24, 0x75, - 0xe0, 0xd8, 0xc1, 0x0c, 0x08, 0x2d, 0xd4, 0x82, 0x2d, 0xe0, 0x82, 0x2e, - 0xec, 0x02, 0x2f, 0xf4, 0xc2, 0x0c, 0x03, 0x1f, 0xcc, 0x82, 0x2f, 0x54, - 0x1a, 0x00, 0x62, 0x80, 0x06, 0x62, 0x20, 0x06, 0x62, 0xc0, 0x89, 0x81, - 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, - 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x1b, 0xb8, 0x81, 0x45, 0x07, 0x7a, - 0x60, 0x59, 0x96, 0x1e, 0x70, 0xa6, 0xc0, 0x0a, 0xac, 0x40, 0x37, 0x7e, - 0x81, 0x12, 0x7e, 0x61, 0x0f, 0xf6, 0xa0, 0x0e, 0xf0, 0x20, 0x23, 0x81, - 0x09, 0xba, 0x88, 0x8d, 0xcd, 0xae, 0xcd, 0xa5, 0xed, 0x8d, 0xac, 0x8e, - 0xad, 0xcc, 0xc5, 0x8c, 0x2d, 0xec, 0x6c, 0x6e, 0x14, 0x21, 0x15, 0x54, - 0xe1, 0x14, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2, 0x32, 0x37, 0xba, - 0x51, 0x82, 0x55, 0xb8, 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x6e, - 0x2e, 0xed, 0xcd, 0x6d, 0x94, 0x80, 0x15, 0x8e, 0x0a, 0x4b, 0x93, 0x73, - 0x61, 0x0b, 0x73, 0x3b, 0xab, 0x0b, 0x3b, 0x2b, 0xfb, 0xb2, 0x2b, 0x93, - 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0x68, 0x85, 0x9b, 0xc2, 0xd2, 0xe4, - 0x5c, 0xc6, 0xde, 0xda, 0xe0, 0xd2, 0xd8, 0xca, 0xbe, 0xde, 0xe0, 0xe8, - 0xd2, 0xde, 0xdc, 0xe6, 0x46, 0x19, 0x5c, 0xe1, 0x15, 0x60, 0xe1, 0x98, - 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, - 0x51, 0x02, 0x5f, 0x00, 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, - 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, - 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, - 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, - 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60, - 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20, - 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87, - 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07, - 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d, - 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc, - 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2, - 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, - 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, - 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, - 0x00, 0x61, 0x20, 0x00, 0x00, 0x3b, 0x02, 0x00, 0x00, 0x13, 0x04, 0x72, - 0x10, 0x0b, 0x04, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x34, 0xce, 0x00, - 0x50, 0x5a, 0x02, 0x45, 0x40, 0xed, 0x08, 0xc0, 0x58, 0x03, 0x10, 0x08, - 0xe4, 0xce, 0x41, 0x3c, 0x0d, 0xe3, 0x06, 0x63, 0x11, 0x40, 0x20, 0x1c, + 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43, 0x42, 0x6c, 0x57, 0xfe, + 0xb2, 0xfb, 0xfe, 0x45, 0x04, 0x18, 0x0c, 0xd1, 0x4c, 0x43, 0x22, 0x00, + 0x82, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, + 0x48, 0x04, 0xe1, 0x81, 0x84, 0x00, 0x83, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x43, 0x22, 0x54, 0xa0, 0x28, 0x20, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x12, 0xf1, 0x02, 0x64, 0x01, + 0x01, 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xc0, 0x90, 0x88, + 0x1d, 0x22, 0x0c, 0x08, 0x80, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x86, 0x44, 0xfd, 0x60, 0x6d, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x30, 0x24, 0x9a, 0x89, 0xa6, 0x03, 0x02, 0x60, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, 0x11, 0x58, 0x64, + 0x1f, 0x02, 0x0c, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x89, 0xf2, 0x22, 0xb2, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x60, 0x48, 0xa4, 0x1a, 0x52, 0x18, 0x00, 0x01, 0x30, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xc0, 0x90, 0x88, 0x37, 0xa6, 0x31, + 0x00, 0x02, 0x60, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, + 0xd1, 0x7b, 0x4c, 0x61, 0x00, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x43, 0x22, 0x11, 0x09, 0x83, 0x34, 0x00, 0x02, 0xa0, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, 0xd1, 0x98, 0x6c, + 0x6b, 0x00, 0x04, 0x40, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x12, 0x1b, 0x04, 0x8a, 0xaa, 0x1e, 0x00, 0x00, 0x64, 0x81, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, + 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x3a, 0x8b, 0xa0, 0x04, + 0x0a, 0x61, 0x04, 0xa0, 0x0c, 0x0a, 0xa8, 0x20, 0x0a, 0xa3, 0x40, 0x0a, + 0xa5, 0x60, 0x0a, 0xa7, 0x00, 0x03, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, + 0xe8, 0x1d, 0x01, 0x28, 0x84, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, + 0x29, 0x1c, 0x72, 0xc7, 0x12, 0x24, 0x01, 0x00, 0x00, 0xb1, 0x18, 0x00, + 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, + 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, + 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, + 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, + 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, + 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, + 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, + 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, + 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, + 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, + 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, + 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, + 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, + 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, + 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, + 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, + 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, + 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, + 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, + 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, + 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, + 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, + 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, + 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, + 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, + 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, + 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, + 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, + 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, + 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, + 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, + 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, + 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, + 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, + 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, + 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, + 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, + 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, + 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, + 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, + 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, + 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, + 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, + 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, + 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, + 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, + 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, + 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, + 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, + 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, + 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, + 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, + 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, + 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, + 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, 0x00, 0x50, 0x01, 0x00, + 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, + 0x11, 0x32, 0x64, 0xd4, 0xee, 0x80, 0x0d, 0x6a, 0x0c, 0x8b, 0x12, 0x07, + 0xc5, 0xc6, 0x91, 0x41, 0x14, 0x19, 0x8c, 0x22, 0x31, 0x88, 0x64, 0x3d, + 0x45, 0x66, 0x20, 0xca, 0x23, 0x21, 0x54, 0xc1, 0x30, 0xca, 0xe2, 0x3c, + 0xcf, 0x13, 0x5d, 0x4f, 0x60, 0x18, 0x88, 0x91, 0x18, 0x8b, 0x82, 0x11, + 0x5e, 0xb1, 0x1c, 0x01, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, + 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32, + 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74, + 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, + 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, + 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, + 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e, + 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x6e, 0x6f, 0x5f, + 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x61, + 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, + 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69, + 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, + 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74, + 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, + 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, + 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77, + 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69, + 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, + 0x78, 0x33, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x59, 0x55, 0x56, 0x44, + 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x61, 0x69, + 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x78, 0x74, + 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, + 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x59, + 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x55, 0x56, 0x61, + 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x00, 0x00, 0x00, 0xe4, 0xa8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0x70, 0x06, 0xce, 0x08, 0x82, + 0x1b, 0x9c, 0xc1, 0x08, 0xc2, 0x19, 0x3c, 0x23, 0x08, 0x67, 0x00, 0x8d, + 0x20, 0x9c, 0x41, 0x34, 0x82, 0x10, 0x01, 0x23, 0x08, 0x67, 0x20, 0x8d, + 0x20, 0x9c, 0xc1, 0x34, 0x82, 0x70, 0x06, 0xd4, 0x08, 0xc2, 0x19, 0x54, + 0x23, 0x08, 0x67, 0x60, 0x8d, 0x20, 0x9c, 0xc1, 0x35, 0x82, 0x70, 0x06, + 0xd8, 0x08, 0xc2, 0x19, 0x64, 0x23, 0x08, 0x67, 0xa0, 0x8d, 0x20, 0x9c, + 0xc1, 0x36, 0x82, 0x70, 0x06, 0xdc, 0x08, 0xc2, 0x19, 0x74, 0x23, 0x08, + 0x67, 0xe0, 0xcd, 0x30, 0xe0, 0x41, 0x90, 0x07, 0x33, 0x0c, 0x7a, 0x20, + 0xec, 0xc1, 0x0c, 0xc1, 0x30, 0xc3, 0x80, 0x07, 0x78, 0xc0, 0x07, 0x33, + 0x10, 0x84, 0x1e, 0xe8, 0x01, 0x1f, 0xcc, 0x10, 0x14, 0x33, 0x04, 0xc6, + 0x0c, 0xc1, 0x31, 0x43, 0x81, 0xf0, 0x01, 0x1f, 0x24, 0xca, 0x0c, 0xc1, + 0x2c, 0xcc, 0x80, 0xf0, 0xc1, 0xc2, 0x34, 0x89, 0xe2, 0x3c, 0x33, 0x24, + 0x7a, 0x00, 0x45, 0x8c, 0x94, 0x28, 0xce, 0x34, 0x43, 0x82, 0x07, 0x10, + 0xc5, 0x48, 0x49, 0xe5, 0x58, 0x33, 0xa0, 0x01, 0x1f, 0xec, 0x01, 0x1f, + 0x70, 0xdd, 0x1e, 0xec, 0x01, 0x1f, 0x70, 0x1e, 0x28, 0xec, 0x01, 0x1f, + 0x70, 0x5f, 0x28, 0xec, 0x01, 0x1f, 0x70, 0x60, 0x20, 0x0a, 0x7b, 0xc0, + 0x07, 0x5c, 0x18, 0x8c, 0xc2, 0x1e, 0xf0, 0x01, 0x27, 0x06, 0xa4, 0xb0, + 0x07, 0x7c, 0xc0, 0x8d, 0x41, 0x29, 0xec, 0x01, 0x1f, 0x70, 0x64, 0x30, + 0x83, 0xe4, 0x07, 0x17, 0xf6, 0x07, 0x19, 0x1f, 0xe8, 0x81, 0xb6, 0xe1, + 0x42, 0x19, 0xfc, 0x81, 0x19, 0xec, 0x41, 0x72, 0x06, 0x0e, 0x1a, 0xcc, + 0xa0, 0xf0, 0x81, 0x28, 0xf0, 0x41, 0x1a, 0xa8, 0x81, 0x28, 0x9c, 0x02, + 0x1f, 0xac, 0x01, 0x1b, 0xcc, 0x20, 0xed, 0xc1, 0x85, 0x99, 0x42, 0xa6, + 0x07, 0x7a, 0xa0, 0x6d, 0xba, 0x50, 0x06, 0xa6, 0x60, 0x06, 0xa2, 0x90, + 0xb4, 0x81, 0xe3, 0x06, 0x33, 0x28, 0xa8, 0xf0, 0x06, 0x19, 0x1f, 0xe8, + 0x01, 0x1c, 0x24, 0x71, 0xe0, 0xc8, 0xc1, 0x0c, 0x4a, 0x2a, 0xbc, 0x41, + 0xa6, 0x07, 0x7a, 0x00, 0x07, 0xc9, 0x1c, 0x38, 0x74, 0x30, 0x43, 0xa2, + 0x0a, 0x75, 0x90, 0xf1, 0x81, 0x1e, 0x24, 0x76, 0xe0, 0xdc, 0xc1, 0x0c, + 0x48, 0x2d, 0xd8, 0xc2, 0x2d, 0xe4, 0xc2, 0x2e, 0xf0, 0x42, 0x2f, 0xf8, + 0xc2, 0x0c, 0x43, 0x1f, 0xd0, 0xc2, 0x2f, 0x54, 0x1a, 0x00, 0x62, 0x80, + 0x06, 0x62, 0x20, 0x06, 0x62, 0xc0, 0x89, 0x81, 0x18, 0x88, 0x81, 0x18, + 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, + 0x88, 0x81, 0x1b, 0xb8, 0x81, 0x45, 0x07, 0x7a, 0x60, 0x59, 0x96, 0x1e, + 0x70, 0xa6, 0xc0, 0x0a, 0xac, 0x40, 0x37, 0x7e, 0x81, 0x12, 0x7e, 0x61, + 0x0f, 0xf6, 0xa0, 0x0e, 0xf0, 0x20, 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d, + 0xcd, 0xae, 0xcd, 0xa5, 0xed, 0x8d, 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c, + 0x2d, 0xec, 0x6c, 0x6e, 0x14, 0x41, 0x15, 0x56, 0xe1, 0x14, 0x36, 0x36, + 0xbb, 0x36, 0x97, 0x34, 0xb2, 0x32, 0x37, 0xba, 0x51, 0x02, 0x56, 0xb8, + 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, + 0x94, 0xa0, 0x15, 0x8e, 0x0a, 0x4b, 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b, + 0xab, 0x0b, 0x3b, 0x2b, 0xfb, 0xb2, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, + 0x1b, 0x25, 0x70, 0x85, 0x9b, 0xc2, 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda, + 0xe0, 0xd2, 0xd8, 0xca, 0xbe, 0xde, 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, + 0x46, 0x19, 0x5e, 0x01, 0x16, 0x62, 0xe1, 0x98, 0xb0, 0x34, 0x39, 0x17, + 0x33, 0xb9, 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, 0x51, 0x82, 0x5f, 0x00, + 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, + 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, + 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, + 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, + 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, + 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, + 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, + 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, + 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, + 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, + 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, + 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, + 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, + 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, + 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x8c, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0xa4, 0xd5, 0xc0, 0x08, 0x00, 0x9d, 0x33, + 0x00, 0x84, 0x8e, 0x00, 0xd0, 0x5b, 0x02, 0x45, 0x40, 0xf0, 0x58, 0x03, + 0x10, 0x08, 0x73, 0x0c, 0x91, 0x1c, 0xc8, 0x01, 0x01, 0x23, 0x00, 0x33, + 0x00, 0x63, 0x04, 0x20, 0x08, 0x82, 0xf8, 0x47, 0xc1, 0x0c, 0xc0, 0x0c, + 0xc0, 0x1c, 0x44, 0x1e, 0xe4, 0x41, 0x1e, 0xe8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xf1, 0x30, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, + 0x90, 0x51, 0x16, 0x88, 0x49, 0x00, 0x00, 0x00, 0x00, 0x62, 0x80, 0x61, + 0x96, 0x05, 0x00, 0x00, 0x00, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, + 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, + 0x4c, 0x5f, 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x72, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x34, + 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x00, + 0x00, 0x2b, 0x04, 0x73, 0x08, 0x87, 0x15, 0xc3, 0x39, 0x98, 0x83, 0x38, + 0xac, 0x18, 0xd0, 0xc1, 0x1c, 0xc6, 0x61, 0xc5, 0x90, 0x0e, 0xe6, 0x40, + 0x0e, 0x2b, 0x06, 0x75, 0x30, 0x87, 0x72, 0xd8, 0x20, 0xa0, 0xc3, 0x39, + 0x6c, 0x10, 0xd4, 0x21, 0x1d, 0x36, 0x04, 0xe9, 0xb0, 0x61, 0x50, 0x07, + 0x74, 0x38, 0x07, 0x00, 0x00, 0x23, 0x06, 0x8d, 0x11, 0x82, 0x60, 0xb0, + 0x06, 0x71, 0x10, 0x3d, 0x94, 0xb3, 0x34, 0x86, 0xd1, 0x06, 0xa3, 0x09, + 0x01, 0x30, 0x62, 0xe0, 0x18, 0x21, 0x08, 0x06, 0x69, 0x40, 0x07, 0x52, + 0x64, 0xbd, 0x01, 0xd4, 0x3c, 0x08, 0xf2, 0x06, 0xa3, 0x09, 0x01, 0x30, + 0x86, 0x10, 0x8c, 0xc1, 0x20, 0x03, 0x71, 0x30, 0x73, 0x0c, 0x81, 0x00, + 0x8d, 0x18, 0x38, 0x46, 0x08, 0x82, 0x41, 0x1a, 0xe4, 0xc1, 0x65, 0x6d, + 0x76, 0x50, 0x49, 0x54, 0xd3, 0xd0, 0xc1, 0x68, 0x42, 0x00, 0x8c, 0x21, + 0x04, 0x68, 0x30, 0xc7, 0x40, 0x04, 0xd3, 0x75, 0xf1, 0x52, 0x10, 0x94, + 0x41, 0x86, 0x00, 0xaa, 0x8c, 0x08, 0xc0, 0x7f, 0x23, 0x43, 0x18, 0xb8, + 0x81, 0x1f, 0x5c, 0x10, 0x2f, 0x05, 0x41, 0x19, 0x64, 0x08, 0x2a, 0x6d, + 0xc4, 0xe0, 0x38, 0x42, 0x10, 0x2c, 0xfc, 0xa3, 0x5b, 0x85, 0x22, 0xd8, + 0x48, 0x61, 0x06, 0x73, 0x30, 0x0a, 0xa1, 0xe0, 0x5d, 0x10, 0x2f, 0x05, + 0x41, 0x19, 0x64, 0x08, 0xb4, 0x6f, 0xc4, 0xe0, 0x38, 0x42, 0x10, 0x2c, + 0xfc, 0xa3, 0x83, 0x05, 0x25, 0xd8, 0x48, 0xb1, 0x06, 0x78, 0x80, 0x0a, + 0xa6, 0x20, 0x06, 0x17, 0xc4, 0x4b, 0x41, 0x50, 0x06, 0x19, 0x82, 0x8f, + 0x0c, 0x46, 0x0c, 0x8e, 0x23, 0x04, 0xc1, 0xc2, 0x3f, 0xba, 0x5a, 0x78, + 0x82, 0x39, 0x86, 0x6f, 0xe9, 0x83, 0x39, 0x86, 0xe0, 0x48, 0x83, 0x39, + 0x86, 0x60, 0x48, 0x83, 0x11, 0x83, 0x03, 0x89, 0x41, 0xb0, 0xf0, 0x0f, + 0xc9, 0x17, 0x02, 0x3a, 0xb0, 0xe0, 0x0e, 0xc4, 0x3f, 0x83, 0x80, 0x18, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0, 0x50, 0x07, 0x64, 0x1d, + 0xb6, 0x14, 0xc2, 0xa1, 0x0e, 0xc8, 0x3a, 0x6c, 0x29, 0x8e, 0x43, 0x1d, + 0x90, 0x75, 0xd8, 0x52, 0x30, 0x07, 0x3b, 0x20, 0xed, 0xb0, 0xa5, 0x88, + 0x0e, 0x76, 0x40, 0xda, 0x61, 0x4b, 0x61, 0x1d, 0xec, 0x80, 0xb4, 0xc3, + 0x96, 0x62, 0x3b, 0xd8, 0x01, 0x69, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x61, 0x20, 0x00, 0x00, 0xe5, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e, + 0x10, 0x0b, 0x04, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x74, 0xce, 0x00, + 0xd0, 0x5b, 0x02, 0x45, 0x40, 0xf0, 0x58, 0x03, 0x10, 0x08, 0x23, 0x00, + 0x74, 0xcf, 0x41, 0x44, 0x8f, 0xa3, 0x06, 0x63, 0x11, 0x40, 0x20, 0x1c, 0x04, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x18, 0x81, 0x2c, 0xba, 0x3d, 0x0d, 0x06, 0x63, 0x04, 0xb5, 0x5a, 0xab, 0xed, 0x37, 0x46, 0xd0, 0xc7, 0xa2, 0x8b, 0x7f, 0x63, 0x04, 0x6e, 0x1f, 0x8b, 0xb6, 0x2f, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xbc, 0x7b, 0x5a, 0xde, 0xdf, 0x18, 0x81, 0xce, 0x9a, - 0x73, 0x08, 0x06, 0x23, 0x00, 0x63, 0x04, 0x20, 0x08, 0x82, 0x20, 0x18, - 0x8c, 0x11, 0x80, 0x20, 0x08, 0x92, 0x60, 0x40, 0xc1, 0x0c, 0xc0, 0x0c, - 0x00, 0x15, 0x33, 0x00, 0x23, 0x00, 0x33, 0x00, 0x63, 0x0d, 0x20, 0x08, - 0x82, 0xf8, 0x07, 0x82, 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82, 0xf8, 0x37, - 0xd6, 0xc0, 0xb6, 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4, 0xc7, 0xb6, - 0xf3, 0x4f, 0x7a, 0x63, 0x0d, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, - 0xc8, 0xd6, 0xbf, 0x00, 0x82, 0x20, 0x5b, 0xff, 0xc2, 0x58, 0x03, 0x08, - 0x82, 0x6b, 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x80, 0x20, 0xb8, - 0xe6, 0x60, 0x30, 0xd6, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, - 0x6d, 0x0e, 0x06, 0x20, 0x48, 0xb7, 0x39, 0x18, 0x8c, 0x35, 0xac, 0x23, - 0x1e, 0xb3, 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x3a, 0xe2, 0x31, - 0x0b, 0x06, 0x63, 0x0d, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, - 0x87, 0x63, 0x00, 0x82, 0x30, 0x1e, 0x8e, 0xc1, 0x58, 0x83, 0x98, 0x8b, - 0x69, 0xff, 0x81, 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, - 0xc2, 0x58, 0xc3, 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, - 0xd7, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, - 0x0b, 0xad, 0x1b, 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x00, - 0x00, 0xf1, 0x30, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, - 0x90, 0x51, 0x22, 0x88, 0x5f, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x9c, - 0x81, 0x85, 0x61, 0x16, 0x00, 0x5f, 0x5a, 0x54, 0x53, 0x31, 0x35, 0x53, - 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x74, 0x73, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, - 0x20, 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, - 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, - 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, - 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, - 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x61, - 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x61, 0x69, 0x72, - 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2d, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x69, 0x72, - 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2d, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x61, 0x69, 0x72, - 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2d, 0x61, 0x72, 0x67, 0x28, 0x34, 0x29, 0x00, 0x00, 0x13, 0x84, 0x34, - 0xe8, 0x26, 0x08, 0x69, 0xe0, 0x4d, 0x10, 0xd2, 0xe0, 0x9b, 0x20, 0xa4, - 0x01, 0x18, 0x4c, 0x10, 0xd2, 0x20, 0x0c, 0x26, 0x08, 0x69, 0x20, 0x06, - 0x13, 0x84, 0x34, 0x18, 0x83, 0x09, 0x42, 0x1a, 0x90, 0xc1, 0x0a, 0x01, - 0x1e, 0xc6, 0x61, 0xc5, 0x10, 0x0f, 0xf0, 0x40, 0x0e, 0x2b, 0x06, 0x79, - 0x80, 0x87, 0x72, 0x58, 0x31, 0xcc, 0x03, 0x3c, 0x98, 0xc3, 0x8a, 0x81, - 0x1e, 0xe0, 0xe1, 0x1c, 0x36, 0x04, 0xe2, 0xb0, 0x61, 0x08, 0x87, 0x7a, - 0x40, 0x87, 0x0d, 0x03, 0x67, 0x0f, 0xe8, 0xb0, 0x21, 0x02, 0x87, 0x7b, - 0x40, 0x87, 0x7b, 0x48, 0x87, 0x7b, 0x50, 0x87, 0x7b, 0x58, 0x87, 0x7b, - 0x60, 0x87, 0x7b, 0x68, 0x87, 0x7b, 0x70, 0x87, 0x7b, 0x78, 0x87, 0x0d, - 0x03, 0x3e, 0xdc, 0x43, 0x3a, 0x6c, 0x08, 0xe2, 0x61, 0xc3, 0x40, 0x0f, - 0xf3, 0x20, 0x0f, 0x1b, 0x06, 0x7c, 0xb8, 0x07, 0x75, 0xd8, 0x30, 0xe0, - 0xc3, 0x3d, 0xbc, 0xc3, 0x86, 0x01, 0x1f, 0xee, 0x81, 0x1d, 0x36, 0x0c, - 0xf8, 0x70, 0x0f, 0xed, 0xb0, 0x61, 0xc0, 0x87, 0x7b, 0x70, 0x87, 0x0d, - 0x03, 0x3e, 0xdc, 0x03, 0x3a, 0x6c, 0x18, 0xf0, 0xe1, 0x1e, 0xd6, 0x01, - 0x00, 0x7b, 0x18, 0xd2, 0xa0, 0x0e, 0x4a, 0x81, 0x02, 0x60, 0x8c, 0x18, - 0x2c, 0x45, 0x0c, 0x82, 0x85, 0x7f, 0x7c, 0xaa, 0xc0, 0x06, 0x81, 0x1a, - 0xa4, 0x01, 0x1a, 0x9c, 0xc1, 0x1e, 0x06, 0x36, 0xc0, 0x83, 0x54, 0xa0, - 0x00, 0x18, 0xc3, 0x11, 0x41, 0x15, 0xf8, 0xc7, 0x2c, 0x43, 0x20, 0x04, - 0x83, 0x0c, 0x44, 0x65, 0x06, 0x7b, 0x18, 0xe0, 0x80, 0x0f, 0xfa, 0x80, - 0x02, 0x60, 0x8c, 0x18, 0x18, 0x46, 0x08, 0x82, 0x85, 0x7f, 0x74, 0xb3, - 0x30, 0x8c, 0x18, 0x1c, 0x46, 0x08, 0x82, 0x85, 0x7f, 0x6c, 0xb5, 0x10, - 0x4c, 0x16, 0x4c, 0xe0, 0x3f, 0x62, 0x70, 0x18, 0x21, 0x08, 0x16, 0xfe, - 0xb1, 0xd5, 0x42, 0x80, 0xd9, 0x40, 0x89, 0xbf, 0x51, 0x41, 0xf8, 0xdb, - 0x10, 0x90, 0xff, 0x88, 0x81, 0x61, 0x84, 0x20, 0x58, 0xf8, 0x47, 0xa7, - 0x0b, 0xc1, 0x88, 0xc1, 0x61, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0xc6, 0x0b, - 0x81, 0x65, 0x81, 0x25, 0xfe, 0x73, 0x0c, 0x60, 0xb0, 0xa0, 0xc2, 0x20, - 0x43, 0x10, 0x06, 0x75, 0x60, 0x43, 0x40, 0xfe, 0x83, 0x0c, 0xc1, 0x18, - 0xd4, 0xc1, 0x20, 0x43, 0x50, 0xd5, 0xc1, 0x2c, 0x81, 0x30, 0x50, 0x11, - 0x08, 0x01, 0x1b, 0x00, 0x7b, 0x18, 0x44, 0xc1, 0x15, 0x7a, 0x81, 0x02, - 0x60, 0x0c, 0x47, 0x04, 0x6d, 0xe0, 0xf8, 0xc7, 0x2c, 0xc3, 0x90, 0x04, - 0x83, 0x0c, 0xc4, 0x1a, 0xf0, 0xc1, 0x1e, 0x06, 0x53, 0x90, 0x85, 0x5a, - 0xa0, 0x00, 0x18, 0x7b, 0x18, 0x50, 0x81, 0x16, 0x6c, 0x81, 0x02, 0x60, - 0x0c, 0x32, 0x24, 0x70, 0x00, 0x0a, 0xc3, 0x11, 0x88, 0x1e, 0x04, 0xfe, - 0x31, 0xcb, 0x40, 0x14, 0xc1, 0x1c, 0x03, 0x1c, 0x14, 0xb8, 0x30, 0xc8, - 0x10, 0xc4, 0x41, 0x29, 0x58, 0x90, 0x88, 0xff, 0x20, 0x43, 0x30, 0x07, - 0xa5, 0x30, 0x4b, 0x80, 0x0c, 0x47, 0x34, 0x78, 0x10, 0xf8, 0xc7, 0x2c, - 0x83, 0x81, 0x04, 0x63, 0x08, 0x50, 0x2f, 0x8c, 0x21, 0x44, 0xac, 0x30, - 0x86, 0x20, 0xb1, 0xc2, 0x88, 0xc1, 0x61, 0x84, 0x20, 0x58, 0xf8, 0x87, - 0x74, 0x0f, 0x42, 0x30, 0x62, 0x70, 0x18, 0x21, 0x08, 0x16, 0xfe, 0x21, - 0xe1, 0x03, 0x11, 0x0c, 0x47, 0x04, 0x7f, 0x20, 0xf8, 0xc7, 0x2c, 0xc3, - 0x81, 0x04, 0x26, 0x40, 0xe2, 0x6f, 0xc1, 0x29, 0x80, 0xbf, 0x11, 0x90, - 0xf8, 0x5b, 0x90, 0x0a, 0xe0, 0x6f, 0x43, 0x40, 0xfe, 0x73, 0x0c, 0xa0, - 0x10, 0xa0, 0xc3, 0x20, 0x43, 0x10, 0x0a, 0xb5, 0x60, 0x41, 0x26, 0xfe, - 0x83, 0x0c, 0xc1, 0x28, 0xd4, 0xc2, 0x2c, 0x01, 0x32, 0x50, 0x12, 0x88, - 0x01, 0xc1, 0x06, 0x85, 0x70, 0xb0, 0x81, 0x31, 0xc8, 0x10, 0x80, 0x81, - 0x2d, 0xcc, 0x12, 0x24, 0x03, 0x15, 0x81, 0x80, 0x88, 0x82, 0x30, 0x1c, - 0x61, 0x07, 0xb2, 0x10, 0xf8, 0xc7, 0x2c, 0x83, 0x62, 0x05, 0x7b, 0x18, - 0xc8, 0x01, 0x1e, 0xfc, 0x81, 0x02, 0x60, 0xec, 0x61, 0x30, 0x07, 0x79, - 0xf8, 0x07, 0x0a, 0x80, 0x31, 0xc8, 0x60, 0xb8, 0x82, 0x2f, 0x8c, 0x18, - 0x14, 0x46, 0x08, 0x82, 0xc1, 0xe5, 0x12, 0xc4, 0x2c, 0xc3, 0x52, 0x05, - 0x63, 0x08, 0x88, 0x3d, 0x0c, 0x47, 0x04, 0xb9, 0xa0, 0xf8, 0xc7, 0x2c, - 0x43, 0xc3, 0x04, 0x26, 0xe4, 0x82, 0xf8, 0xcf, 0x12, 0x38, 0x36, 0xe4, - 0x02, 0xf8, 0x8f, 0x18, 0x18, 0x46, 0x08, 0x82, 0x85, 0x7f, 0x50, 0x34, - 0x11, 0x58, 0xa0, 0x0b, 0xe2, 0x3f, 0x62, 0x70, 0x18, 0x21, 0x08, 0x16, - 0xfe, 0x21, 0xdd, 0x44, 0xa0, 0x0b, 0xb3, 0x04, 0xce, 0x40, 0x05, 0xa0, - 0x30, 0x42, 0x33, 0xc7, 0x70, 0x0b, 0x81, 0x3f, 0x8c, 0x21, 0x44, 0xed, - 0x30, 0x1c, 0x11, 0x88, 0x83, 0xe2, 0x1f, 0xb3, 0x0c, 0xd0, 0x13, 0x98, - 0x20, 0x0e, 0xe2, 0x3f, 0x4b, 0x10, 0xd9, 0x20, 0x0e, 0xe0, 0x3f, 0x62, - 0x60, 0x18, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xf5, 0x44, 0x60, 0xc1, 0x38, - 0x88, 0xff, 0x88, 0xc1, 0x61, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x04, 0x16, - 0xc1, 0x38, 0xcc, 0x12, 0x44, 0x03, 0x15, 0x80, 0xf2, 0x08, 0xd0, 0x1c, - 0x43, 0x12, 0xd4, 0xc3, 0x18, 0x82, 0x56, 0x0f, 0xc3, 0x11, 0xc1, 0x3a, - 0x28, 0xfe, 0x31, 0xcb, 0x30, 0x49, 0x81, 0x09, 0xeb, 0x20, 0xfe, 0xb3, - 0x04, 0x94, 0x0d, 0xeb, 0x00, 0xfe, 0x23, 0x06, 0x86, 0x11, 0x82, 0x60, - 0xe1, 0x1f, 0x94, 0x59, 0x04, 0x16, 0xb0, 0x83, 0xf8, 0x8f, 0x18, 0x1c, - 0x46, 0x08, 0x82, 0x85, 0x7f, 0x48, 0x69, 0x11, 0xb0, 0xc3, 0x2c, 0x01, - 0x35, 0x50, 0x01, 0x28, 0x92, 0x30, 0xcd, 0x31, 0x24, 0x41, 0x3f, 0xcc, - 0x12, 0x54, 0x03, 0x15, 0x81, 0x40, 0xe9, 0x81, 0x32, 0xc8, 0x10, 0xb0, - 0x43, 0x3f, 0xcc, 0x31, 0xac, 0x03, 0x18, 0xcc, 0xc4, 0x20, 0x43, 0xc0, - 0x0e, 0x20, 0x61, 0x43, 0x20, 0xfe, 0x83, 0x0c, 0x81, 0x3b, 0x80, 0xc4, - 0x20, 0x43, 0x90, 0x06, 0x20, 0x31, 0x4b, 0x10, 0x07, 0xc3, 0x11, 0xbf, - 0x40, 0x0f, 0x81, 0x7f, 0xcc, 0x32, 0x5c, 0x63, 0x10, 0x0c, 0x32, 0xac, - 0xc1, 0x3c, 0x90, 0xc4, 0x1e, 0x06, 0x97, 0xd0, 0x09, 0xb4, 0xa0, 0x00, - 0x18, 0x7b, 0x18, 0x60, 0x82, 0x27, 0xd2, 0x82, 0x02, 0x60, 0xcc, 0x31, - 0xd8, 0x43, 0xe0, 0x13, 0x83, 0x0c, 0xc1, 0x3d, 0xac, 0x84, 0x05, 0x87, - 0xf8, 0x0f, 0x32, 0x04, 0xf9, 0xb0, 0x12, 0x23, 0x06, 0x85, 0x11, 0x82, - 0x60, 0x70, 0xed, 0xc5, 0x31, 0xcb, 0x20, 0x06, 0x58, 0x30, 0x86, 0x30, - 0x8c, 0xc5, 0x70, 0x44, 0xc0, 0x12, 0x8a, 0x7f, 0xcc, 0x32, 0x68, 0x59, - 0x60, 0x02, 0x4b, 0x88, 0xff, 0x2c, 0xc1, 0x36, 0x62, 0x60, 0x18, 0x21, - 0x08, 0x16, 0xfe, 0x41, 0x81, 0xc6, 0x30, 0x62, 0x70, 0x18, 0x21, 0x08, - 0x16, 0xfe, 0x21, 0x89, 0x46, 0xd0, 0x12, 0x16, 0xb4, 0x84, 0xf8, 0x5b, - 0xd0, 0x12, 0xe0, 0x3f, 0x4b, 0xb0, 0x0d, 0x54, 0x00, 0x4a, 0x26, 0x68, - 0x73, 0x0c, 0x21, 0x11, 0xac, 0xc5, 0x18, 0x02, 0xa3, 0x13, 0xc3, 0x11, - 0x41, 0x4d, 0x28, 0xfe, 0x31, 0xcb, 0xd0, 0x71, 0x81, 0x09, 0x35, 0x21, - 0xfe, 0xb3, 0x04, 0xde, 0x88, 0x81, 0x61, 0x84, 0x20, 0x58, 0xf8, 0x07, - 0x95, 0x1a, 0xc3, 0x88, 0xc1, 0x61, 0x84, 0x20, 0x58, 0xf8, 0x87, 0xb4, - 0x1a, 0x81, 0x4d, 0x58, 0x60, 0x13, 0xe2, 0x6f, 0x81, 0x4d, 0x80, 0xff, - 0x2c, 0x81, 0x37, 0x50, 0x01, 0x28, 0x9c, 0xd0, 0xcd, 0x31, 0x24, 0x81, - 0x58, 0x8c, 0x21, 0x54, 0x62, 0x31, 0x1c, 0x11, 0xf8, 0x84, 0xe2, 0x1f, - 0xb3, 0x0c, 0x60, 0xf0, 0x05, 0x26, 0xf8, 0x84, 0xf8, 0xcf, 0x12, 0x84, - 0xc1, 0x88, 0x81, 0x61, 0x84, 0x20, 0x58, 0xf8, 0x07, 0x25, 0x1b, 0xc3, - 0x88, 0xc1, 0x61, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x44, 0x1b, 0xc1, 0x4f, - 0x58, 0xf0, 0x13, 0xe2, 0x6f, 0xc1, 0x4f, 0x80, 0xff, 0x2c, 0x41, 0x18, - 0x0c, 0x54, 0x00, 0xca, 0x27, 0x80, 0xc1, 0x1c, 0x43, 0x12, 0xa8, 0xc5, - 0x88, 0x01, 0x62, 0x84, 0x20, 0x58, 0xf8, 0x07, 0xa4, 0x1b, 0x41, 0x4d, - 0xcc, 0xc4, 0x20, 0x43, 0x70, 0x13, 0x69, 0x31, 0x4b, 0x20, 0x06, 0x03, - 0x15, 0x81, 0x1f, 0x5c, 0x42, 0x18, 0x0c, 0x32, 0x04, 0xb3, 0xa0, 0x16, - 0xb3, 0x04, 0x71, 0x30, 0xcb, 0x40, 0x06, 0x70, 0x80, 0x12, 0x83, 0x0c, - 0xb4, 0xc0, 0x13, 0x6d, 0x31, 0x62, 0x70, 0x18, 0x21, 0x08, 0x16, 0xfe, - 0x91, 0xed, 0x46, 0x10, 0x13, 0x73, 0x0c, 0x3a, 0x11, 0x90, 0xc6, 0x88, - 0xc1, 0x61, 0x84, 0x20, 0x58, 0xf8, 0x47, 0xd6, 0x1b, 0x83, 0x4c, 0xcc, - 0x31, 0x08, 0x01, 0x5d, 0x8c, 0x18, 0x1c, 0x46, 0x08, 0x82, 0x85, 0x7f, - 0x64, 0xbf, 0x51, 0xcc, 0xc4, 0x1c, 0x83, 0x10, 0xd4, 0xc5, 0x1e, 0x86, - 0xbe, 0x48, 0x8d, 0xdb, 0xa0, 0x00, 0x18, 0x7b, 0x18, 0xfe, 0x62, 0x35, - 0x70, 0x83, 0x02, 0x60, 0xcc, 0x31, 0x94, 0x45, 0xd0, 0x1a, 0x83, 0x0c, - 0x81, 0x59, 0xe8, 0x85, 0x05, 0x87, 0xf8, 0x0f, 0x32, 0x04, 0x68, 0xa1, - 0x17, 0x23, 0x06, 0x85, 0x11, 0x82, 0x60, 0x70, 0xa9, 0xc7, 0x31, 0xcb, - 0xf0, 0x06, 0x65, 0x10, 0x8c, 0x21, 0x0c, 0xb2, 0x31, 0x1c, 0x11, 0xec, - 0x85, 0xe2, 0x1f, 0xb3, 0x0c, 0x67, 0x60, 0x06, 0x81, 0x09, 0x7b, 0x21, - 0xfe, 0xb3, 0x04, 0x68, 0x30, 0x62, 0x60, 0x18, 0x21, 0x08, 0x16, 0xfe, - 0x41, 0xbd, 0xc7, 0x30, 0x62, 0x70, 0x18, 0x21, 0x08, 0x16, 0xfe, 0x21, - 0xc5, 0x47, 0xc0, 0x17, 0x16, 0xf0, 0x85, 0xf8, 0x5b, 0xc0, 0x17, 0xe0, - 0x3f, 0x4b, 0x80, 0x06, 0x03, 0x15, 0x80, 0x62, 0x06, 0xc2, 0x19, 0xcc, - 0x31, 0xc0, 0x45, 0xa0, 0x1b, 0x63, 0x08, 0x4c, 0x6a, 0x0c, 0x47, 0x04, - 0xa4, 0xa1, 0xf8, 0xc7, 0x2c, 0x83, 0x1a, 0xa4, 0x41, 0x60, 0x02, 0x69, - 0x88, 0xff, 0x2c, 0xc1, 0x1a, 0x8c, 0x18, 0x18, 0x46, 0x08, 0x82, 0x85, - 0x7f, 0x50, 0xf8, 0x31, 0x8c, 0x18, 0x1c, 0x46, 0x08, 0x82, 0x85, 0x7f, - 0x48, 0xfa, 0x11, 0x94, 0x86, 0x05, 0xa5, 0x21, 0xfe, 0x16, 0x94, 0x06, - 0xf8, 0xcf, 0x12, 0xac, 0xc1, 0x40, 0x05, 0xa0, 0xa4, 0x81, 0xa0, 0x06, - 0x73, 0x0c, 0x49, 0x10, 0x1b, 0x63, 0x08, 0x55, 0x6c, 0x0c, 0x47, 0x04, - 0xad, 0xa1, 0xf8, 0xc7, 0x2c, 0x43, 0x1b, 0xb0, 0x41, 0x60, 0x42, 0x6b, - 0x88, 0xff, 0x2c, 0x81, 0x1b, 0x8c, 0x18, 0x18, 0x46, 0x08, 0x82, 0x85, - 0x7f, 0x50, 0x21, 0x32, 0x8c, 0x18, 0x1c, 0x46, 0x08, 0x82, 0x85, 0x7f, - 0x48, 0x23, 0x12, 0xb8, 0x86, 0x05, 0xae, 0x21, 0xfe, 0x16, 0xb8, 0x06, - 0xf8, 0xcf, 0x12, 0xb8, 0xc1, 0x40, 0x05, 0xa0, 0xb0, 0x81, 0xd0, 0x06, - 0x73, 0x0c, 0x49, 0x90, 0x1b, 0x23, 0x06, 0x88, 0x11, 0x82, 0x60, 0xe1, - 0x1f, 0x50, 0x8a, 0x04, 0xa4, 0x21, 0x1a, 0x83, 0x0c, 0x81, 0x69, 0xe0, - 0xc6, 0x2c, 0xc1, 0x1b, 0x0c, 0x54, 0x04, 0x7e, 0x40, 0x06, 0x82, 0x1b, - 0x0c, 0x32, 0x04, 0x22, 0x91, 0x1b, 0xb3, 0x04, 0x71, 0xb0, 0x87, 0xa1, - 0x3c, 0xe2, 0xc3, 0x3f, 0x28, 0x00, 0xc6, 0x20, 0x43, 0x49, 0xb4, 0x86, - 0x6f, 0xcc, 0x31, 0xb0, 0x86, 0x40, 0x1f, 0x83, 0x0c, 0x41, 0x6b, 0x84, - 0x87, 0x05, 0x83, 0xf8, 0x0f, 0x32, 0x04, 0xaf, 0x11, 0x1e, 0x83, 0x0c, - 0x81, 0x4a, 0x84, 0xc7, 0x2c, 0x41, 0x1c, 0x0c, 0x94, 0x04, 0xa4, 0x51, - 0xc1, 0x83, 0x18, 0x48, 0x6f, 0x20, 0xc0, 0x81, 0x05, 0xf0, 0x21, 0xfe, - 0x19, 0x04, 0xc4, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, - 0xc0, 0x87, 0x23, 0x1f, 0x10, 0x7d, 0xd8, 0x72, 0x10, 0xc1, 0x3e, 0x1c, - 0xf9, 0x80, 0xe8, 0xc3, 0x96, 0x23, 0x09, 0xf8, 0xe1, 0xc8, 0x07, 0x44, - 0x1f, 0xb6, 0x1c, 0x5c, 0xd0, 0x0f, 0x47, 0x3e, 0x20, 0xfa, 0xb0, 0xe5, - 0x08, 0x83, 0xc0, 0x1f, 0x8e, 0x7c, 0x40, 0xf4, 0x61, 0xcb, 0x31, 0x06, - 0xc1, 0x3f, 0x1c, 0xf9, 0x80, 0xe8, 0xc3, 0x96, 0xc3, 0x14, 0x02, 0x90, - 0x38, 0xf2, 0x01, 0xd1, 0x87, 0x2d, 0x07, 0x2a, 0x04, 0x21, 0x71, 0xe4, - 0x03, 0xa2, 0x0f, 0x5b, 0x8e, 0x7e, 0x08, 0x40, 0xe2, 0xc8, 0x07, 0x44, - 0x1f, 0xb6, 0x1c, 0xff, 0x10, 0x84, 0xc4, 0x91, 0x0f, 0x88, 0x3e, 0x6c, - 0x39, 0xf2, 0x22, 0x00, 0x89, 0x23, 0x1f, 0x10, 0x7d, 0xd8, 0x72, 0xec, - 0x45, 0x10, 0x12, 0x47, 0x3e, 0x20, 0xfa, 0xb0, 0xe5, 0x68, 0x8f, 0x20, - 0x24, 0x8e, 0x7c, 0x40, 0xf4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x61, 0x20, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x13, 0x04, 0x48, - 0x2c, 0x10, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x64, 0xd5, 0xc0, - 0x08, 0x00, 0x8d, 0x33, 0x00, 0x44, 0x8e, 0x00, 0x8c, 0x25, 0x04, 0x00, - 0xa5, 0x25, 0x50, 0x04, 0xd4, 0x8e, 0x35, 0x00, 0x81, 0x30, 0xc7, 0xf0, - 0xb8, 0x81, 0x1b, 0xcc, 0x31, 0x3c, 0x8d, 0x1b, 0x8c, 0x35, 0x00, 0x03, - 0x41, 0xc0, 0x08, 0xc0, 0x0c, 0xc0, 0x18, 0x01, 0x08, 0x82, 0x20, 0xfe, - 0x8d, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82, 0x20, - 0x48, 0x82, 0x01, 0x05, 0x33, 0x00, 0x33, 0x00, 0x73, 0x10, 0x78, 0x80, - 0x07, 0x78, 0x90, 0x07, 0x63, 0x11, 0x20, 0x08, 0x82, 0xf8, 0x07, 0x82, - 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82, 0xf8, 0x07, 0x82, 0x20, 0x88, 0x7f, - 0x63, 0x11, 0x20, 0x08, 0x82, 0xf8, 0x07, 0x00, 0x20, 0x08, 0x82, 0xf8, - 0x47, 0xc2, 0x0c, 0x00, 0x00, 0xc3, 0x11, 0xdb, 0x12, 0xf8, 0xc7, 0x2c, - 0xc3, 0x11, 0x04, 0xc3, 0x11, 0x9c, 0x12, 0xf8, 0xc7, 0x2c, 0x83, 0x30, - 0x04, 0x23, 0x06, 0xcd, 0x11, 0x82, 0x60, 0x50, 0x06, 0x79, 0xb0, 0x65, - 0x1e, 0x56, 0x5d, 0x4d, 0x53, 0x07, 0xa3, 0x09, 0x01, 0x30, 0x4b, 0x70, - 0x0c, 0x47, 0x7c, 0x4c, 0xe0, 0x1f, 0xb3, 0x0c, 0x44, 0x11, 0x8c, 0x18, - 0x34, 0x47, 0x08, 0x82, 0x41, 0x19, 0xf0, 0x81, 0xc7, 0x85, 0xc1, 0x86, - 0x69, 0x10, 0x84, 0x07, 0xa3, 0x09, 0x01, 0x30, 0x62, 0xd0, 0x1c, 0x21, - 0x08, 0x06, 0x65, 0xe0, 0x07, 0x9f, 0x37, 0x06, 0x9d, 0xc6, 0x49, 0x92, - 0x1e, 0x8c, 0x26, 0x04, 0xc0, 0x20, 0xc3, 0xe0, 0x5c, 0x83, 0x0c, 0x02, - 0x74, 0x0d, 0x32, 0x08, 0xc1, 0x75, 0x66, 0xf0, 0x2e, 0x05, 0x41, 0x19, - 0x64, 0x08, 0xa8, 0xce, 0x88, 0x00, 0xfc, 0x37, 0x32, 0xa8, 0x41, 0x1d, - 0x94, 0xc2, 0x05, 0xef, 0x52, 0x10, 0x94, 0x41, 0x86, 0x20, 0x13, 0x83, - 0x11, 0x83, 0xc3, 0x08, 0x41, 0xb0, 0xf0, 0x8f, 0x2c, 0x16, 0x8a, 0x60, - 0x23, 0xc5, 0x1b, 0xe8, 0x81, 0x2a, 0xa0, 0x82, 0x19, 0x5c, 0xf0, 0x2e, - 0x05, 0x41, 0x19, 0x64, 0x08, 0xbc, 0x33, 0x18, 0x31, 0x38, 0x8c, 0x10, - 0x04, 0x0b, 0xff, 0xc8, 0x6c, 0x41, 0x09, 0x36, 0x52, 0xd0, 0xc1, 0x1f, - 0xbc, 0x42, 0x2b, 0xa8, 0xc1, 0x05, 0xef, 0x52, 0x10, 0x94, 0x41, 0x86, - 0x60, 0x0c, 0xd8, 0x60, 0xc4, 0xe0, 0x30, 0x42, 0x10, 0x2c, 0xfc, 0x23, - 0xdb, 0x85, 0x27, 0x98, 0x63, 0x18, 0x83, 0x85, 0x14, 0xe6, 0x18, 0x82, - 0x23, 0x0e, 0xe6, 0x18, 0x82, 0x21, 0x0e, 0x66, 0x09, 0x8e, 0xe1, 0x88, - 0x3e, 0x48, 0x83, 0xc0, 0x3f, 0x66, 0x19, 0x8c, 0x23, 0x18, 0x31, 0x68, - 0x8e, 0x10, 0x04, 0x83, 0x32, 0xd0, 0x05, 0x3e, 0xd0, 0x83, 0x3f, 0xc8, - 0x03, 0x3b, 0xc0, 0x03, 0x37, 0x70, 0x03, 0x5b, 0x18, 0x4d, 0x08, 0x80, - 0x11, 0x83, 0xe6, 0x08, 0x41, 0x30, 0x28, 0x03, 0x5e, 0xe8, 0x03, 0x3e, - 0x08, 0x85, 0x3d, 0xc0, 0x03, 0x3d, 0x80, 0x03, 0x38, 0xc0, 0x85, 0xd1, - 0x84, 0x00, 0x18, 0x64, 0x08, 0xda, 0x20, 0x0f, 0x06, 0x19, 0x88, 0x36, - 0xb0, 0x83, 0x41, 0x06, 0x41, 0x0d, 0xec, 0x60, 0x90, 0x41, 0x08, 0xec, - 0xe0, 0x4a, 0xe1, 0x5d, 0x0a, 0x82, 0x32, 0xc8, 0x10, 0xcc, 0x01, 0x1f, - 0x18, 0x11, 0x80, 0xff, 0x46, 0x86, 0x54, 0xa0, 0x05, 0x72, 0xb8, 0xe0, - 0x5d, 0x0a, 0x82, 0x32, 0xc8, 0x10, 0xe0, 0x41, 0x28, 0x8c, 0x18, 0x1c, - 0x46, 0x08, 0x82, 0x85, 0x7f, 0x64, 0xf0, 0x50, 0x04, 0x1b, 0x29, 0x5c, - 0x21, 0x17, 0xd2, 0xe1, 0x1c, 0x4a, 0xe1, 0x82, 0x77, 0x29, 0x08, 0xca, - 0x20, 0x43, 0xd0, 0x07, 0xa6, 0x30, 0x62, 0x70, 0x18, 0x21, 0x08, 0x16, - 0xfe, 0x91, 0xd5, 0x83, 0x12, 0x6c, 0xa4, 0x98, 0x05, 0x5f, 0x70, 0x07, - 0x76, 0x48, 0x85, 0x0b, 0xde, 0xa5, 0x20, 0x28, 0x83, 0x0c, 0x81, 0x28, - 0xac, 0xc2, 0x88, 0xc1, 0x61, 0x84, 0x20, 0x58, 0xf8, 0x47, 0xa6, 0x0f, - 0x4f, 0x30, 0xc7, 0x20, 0x0a, 0xcb, 0x38, 0xcc, 0x31, 0x04, 0x07, 0x2c, - 0xcc, 0x31, 0x04, 0x03, 0x2c, 0xcc, 0x12, 0x1c, 0x03, 0x2d, 0x01, 0x3f, - 0x08, 0xa0, 0x40, 0x08, 0x06, 0x4a, 0x00, 0x26, 0x51, 0x64, 0x00, 0x00, - 0x00, 0x71, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, - 0x22, 0x84, 0x00, 0xd1, 0x07, 0xa8, 0xe0, 0xc8, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x65, 0x0c, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, - 0xf8, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x37, 0x01, 0x00, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3f, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x15, 0x00, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x15, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x29, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x39, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x4a, 0x00, 0x00, - 0x00, 0x16, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x6d, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x7e, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x90, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xa3, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xb6, 0x00, 0x00, - 0x00, 0x66, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x00, 0x00, 0x1c, 0x01, 0x00, - 0x00, 0x1b, 0x00, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, - 0xbf, 0x02, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x41, 0x64, 0x76, - 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x63, - 0x6c, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, - 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x66, - 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, - 0x61, 0x62, 0x73, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x63, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x2e, 0x75, 0x2e, 0x69, 0x31, 0x2e, - 0x66, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x64, 0x6f, 0x74, - 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, + 0x73, 0x08, 0x06, 0x23, 0x00, 0x63, 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, + 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x03, 0x40, 0xc1, 0x0c, + 0xc0, 0x0c, 0xc0, 0x1c, 0x84, 0x1d, 0xf0, 0x81, 0x1d, 0xfc, 0x01, 0x15, + 0x33, 0x00, 0x23, 0x00, 0x33, 0x00, 0x63, 0x0d, 0x20, 0x08, 0x82, 0xf8, + 0x07, 0x82, 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82, 0xf8, 0x37, 0xd6, 0xc0, + 0xb6, 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4, 0xc7, 0xb6, 0xf3, 0x4f, + 0x7a, 0x63, 0x0d, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, 0xc8, 0xd6, + 0xbf, 0x00, 0x82, 0x20, 0x5b, 0xff, 0xc2, 0x58, 0x03, 0x08, 0x82, 0x6b, + 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x80, 0x20, 0xb8, 0xe6, 0x60, + 0x30, 0xd6, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, 0x6d, 0x0e, + 0x06, 0x20, 0x48, 0xb7, 0x39, 0x18, 0x8c, 0x35, 0xac, 0x23, 0x1e, 0xb3, + 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x3a, 0xe2, 0x31, 0x0b, 0x06, + 0x63, 0x0d, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, 0x87, 0x63, + 0x00, 0x82, 0x30, 0x1e, 0x8e, 0xc1, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, + 0x81, 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, + 0xc3, 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, + 0x71, 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, + 0x1b, 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0xf1, 0x30, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, + 0x90, 0x51, 0x0e, 0xc4, 0x1d, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x00, + 0x00, 0x5f, 0x5a, 0x54, 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, + 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, + 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, + 0x54, 0x42, 0x41, 0x41, 0x00, 0x13, 0x84, 0x37, 0xf8, 0x26, 0x08, 0x6f, + 0x00, 0x06, 0x13, 0x84, 0x37, 0x08, 0x83, 0x09, 0xc2, 0x1b, 0x88, 0xc1, + 0x04, 0xe1, 0x0d, 0xc6, 0x60, 0x82, 0xf0, 0x06, 0x64, 0x30, 0x41, 0x78, + 0x83, 0x32, 0x98, 0x20, 0xbc, 0x81, 0x19, 0x6c, 0x08, 0xc6, 0x61, 0xc3, + 0x20, 0x0e, 0xec, 0x40, 0x0e, 0x1b, 0x06, 0xae, 0x1d, 0xc8, 0x61, 0x43, + 0x14, 0x0e, 0xee, 0x40, 0x0e, 0xee, 0x50, 0x0e, 0xee, 0x60, 0x0e, 0xee, + 0x70, 0x0e, 0xee, 0x80, 0x0e, 0xee, 0x90, 0x0e, 0xee, 0xa0, 0x0e, 0xee, + 0xb0, 0x0e, 0x1b, 0x86, 0x77, 0x70, 0x07, 0x73, 0xd8, 0x30, 0xbc, 0x83, + 0x3b, 0xac, 0xc3, 0x86, 0xe1, 0x1d, 0xdc, 0x01, 0x1d, 0x36, 0x0c, 0xef, + 0xe0, 0x0e, 0xe9, 0xb0, 0x61, 0x78, 0x07, 0x77, 0x50, 0x87, 0x0d, 0xc3, + 0x3b, 0xb8, 0x43, 0x39, 0x6c, 0x18, 0xde, 0xc1, 0x1d, 0xce, 0x61, 0xc3, + 0xf0, 0x0e, 0xee, 0x40, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x18, 0xce, + 0x20, 0x0e, 0x44, 0x81, 0x02, 0x60, 0x0c, 0x47, 0x04, 0x55, 0xe0, 0x1f, + 0xb3, 0x0c, 0x81, 0x10, 0x0c, 0x32, 0xac, 0xc1, 0x64, 0x06, 0x7b, 0x18, + 0xd6, 0xa0, 0x0e, 0xec, 0x80, 0x02, 0x60, 0x8c, 0x18, 0x18, 0x47, 0x08, + 0x82, 0x85, 0x7f, 0x8c, 0x01, 0x2b, 0x0c, 0x23, 0x06, 0xc7, 0x11, 0x82, + 0x60, 0xe1, 0x1f, 0x61, 0xe0, 0x0a, 0x01, 0x64, 0x01, 0x04, 0xfe, 0x23, + 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x61, 0xe0, 0x0a, 0x41, 0x65, + 0x43, 0x24, 0xfe, 0x16, 0x05, 0xe1, 0x6f, 0x43, 0x40, 0xfe, 0x23, 0x06, + 0xc6, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x63, 0x30, 0x0b, 0xc1, 0x88, 0xc1, + 0x71, 0x84, 0x20, 0x58, 0xf8, 0x47, 0x18, 0xd4, 0x42, 0x30, 0x59, 0x30, + 0x89, 0xff, 0x1c, 0x43, 0xb7, 0x84, 0xc2, 0x20, 0x43, 0xe0, 0xcd, 0x81, + 0x0d, 0x01, 0xf9, 0x0f, 0x32, 0x04, 0x60, 0x40, 0x07, 0x83, 0x0c, 0x01, + 0x1f, 0xd0, 0xc1, 0x2c, 0x81, 0x30, 0x50, 0x11, 0x08, 0x81, 0x3e, 0x00, + 0x7b, 0x18, 0xfa, 0xe0, 0x14, 0x6c, 0x81, 0x02, 0x60, 0x0c, 0x47, 0x04, + 0x6c, 0xe0, 0xf8, 0xc7, 0x2c, 0xc3, 0x40, 0x04, 0x83, 0x0c, 0x44, 0x1a, + 0xf0, 0xc1, 0x1e, 0x86, 0x50, 0x58, 0x05, 0x57, 0xa0, 0x00, 0x18, 0x7b, + 0x18, 0x46, 0xa1, 0x15, 0x5e, 0x81, 0x02, 0x60, 0x8c, 0x18, 0x28, 0x49, + 0x0c, 0x82, 0x85, 0x7f, 0x7c, 0xe7, 0x50, 0x74, 0xc7, 0x10, 0x0c, 0x32, + 0x04, 0x6c, 0x00, 0x0a, 0x83, 0x0c, 0xc1, 0x02, 0x0a, 0xb3, 0x04, 0xc4, + 0x40, 0x45, 0x20, 0x0c, 0x98, 0x30, 0x1c, 0x11, 0x06, 0x7c, 0x10, 0xf8, + 0xc7, 0x2c, 0x43, 0x31, 0x05, 0x7b, 0x18, 0x54, 0x81, 0x16, 0xc8, 0x81, + 0x02, 0x60, 0x0c, 0x47, 0x04, 0x7f, 0x10, 0xf8, 0xc7, 0x2c, 0x83, 0x71, + 0x04, 0x83, 0x0c, 0x85, 0x1d, 0xa4, 0xc2, 0x1e, 0x06, 0x57, 0xc0, 0x85, + 0x72, 0xa0, 0x00, 0x18, 0x73, 0x0c, 0x76, 0x10, 0xe8, 0xc2, 0x20, 0x43, + 0x70, 0x07, 0xac, 0x60, 0x41, 0x21, 0xfe, 0x83, 0x0c, 0x41, 0x1e, 0xb4, + 0xc2, 0x2c, 0x41, 0x1b, 0xec, 0x61, 0xa0, 0x05, 0x5f, 0x60, 0x07, 0x0a, + 0x80, 0xb1, 0x87, 0xc1, 0x16, 0xc0, 0xa1, 0x1d, 0x28, 0x00, 0xc6, 0x20, + 0x03, 0x14, 0x0a, 0xb2, 0x30, 0x62, 0x50, 0x1c, 0x21, 0x08, 0x06, 0x5b, + 0x3f, 0x10, 0xb3, 0x0c, 0x88, 0x14, 0x8c, 0x21, 0x48, 0xe4, 0x30, 0x1c, + 0x11, 0xb4, 0x82, 0xe2, 0x1f, 0xb3, 0x0c, 0x4a, 0x12, 0x98, 0xd0, 0x0a, + 0xe2, 0x3f, 0x4b, 0xb0, 0xd8, 0xd0, 0x0a, 0xe0, 0x3f, 0x62, 0x60, 0x1c, + 0x21, 0x08, 0x16, 0xfe, 0x81, 0x8d, 0x44, 0x60, 0x81, 0x2b, 0x88, 0xff, + 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x65, 0x12, 0x81, 0x2b, + 0xcc, 0x12, 0x2c, 0x03, 0x15, 0x80, 0x92, 0x08, 0xca, 0x1c, 0x83, 0x2a, + 0x04, 0xec, 0x30, 0x86, 0xb0, 0x85, 0xc3, 0x70, 0x44, 0x60, 0x0b, 0x8a, + 0x7f, 0xcc, 0x32, 0x34, 0x4c, 0x60, 0x82, 0x2d, 0x88, 0xff, 0x2c, 0x81, + 0x63, 0x83, 0x2d, 0x80, 0xff, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, + 0x07, 0xc6, 0x12, 0x81, 0x05, 0xb7, 0x20, 0xfe, 0x23, 0x06, 0xc7, 0x11, + 0x82, 0x60, 0xe1, 0x1f, 0xd6, 0x4b, 0x04, 0xb7, 0x30, 0x4b, 0xe0, 0x0c, + 0x54, 0x00, 0x0a, 0x23, 0x34, 0x73, 0x0c, 0x49, 0x90, 0x0e, 0x63, 0x08, + 0x64, 0x90, 0x0e, 0xc3, 0x11, 0xc1, 0x2f, 0x28, 0xfe, 0x31, 0xcb, 0x00, + 0x3d, 0x81, 0x09, 0xbf, 0x20, 0xfe, 0xb3, 0x04, 0x91, 0x0d, 0xbf, 0x00, + 0xfe, 0x23, 0x06, 0xc6, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x58, 0x4d, 0x04, + 0x16, 0x80, 0x83, 0xf8, 0x8f, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, + 0x58, 0x38, 0x11, 0x80, 0xc3, 0x2c, 0x41, 0x34, 0x50, 0x01, 0x28, 0x8f, + 0x00, 0xcd, 0x31, 0x24, 0x41, 0x3c, 0xcc, 0x12, 0x48, 0x03, 0x15, 0x81, + 0x10, 0xe9, 0xc1, 0x31, 0xc8, 0x10, 0xfc, 0x82, 0x3c, 0xcc, 0x31, 0xf4, + 0x02, 0x18, 0x84, 0xc4, 0x20, 0x43, 0xe0, 0x0b, 0xf3, 0x60, 0x43, 0x20, + 0xfe, 0x83, 0x0c, 0x01, 0x38, 0xd0, 0xc3, 0x2c, 0x41, 0x1b, 0x0c, 0x47, + 0xcc, 0x82, 0x39, 0x04, 0xfe, 0x31, 0xcb, 0x40, 0x81, 0x41, 0x30, 0xc8, + 0x40, 0x07, 0xe5, 0x80, 0x0f, 0x7b, 0x18, 0xfa, 0xe1, 0x24, 0x6a, 0x82, + 0x02, 0x60, 0xec, 0x61, 0xf8, 0x87, 0x94, 0xb0, 0x09, 0x0a, 0x80, 0x31, + 0xc7, 0x70, 0x0e, 0xc1, 0x4a, 0x0c, 0x32, 0x04, 0xe8, 0xd0, 0x0f, 0x16, + 0x1c, 0xe2, 0x3f, 0xc8, 0x10, 0xa8, 0x83, 0x3f, 0x8c, 0x18, 0x14, 0x47, + 0x08, 0x82, 0xc1, 0x96, 0x16, 0xc7, 0x2c, 0xc3, 0x57, 0x05, 0x63, 0x08, + 0x03, 0x4c, 0x0c, 0x47, 0x04, 0xff, 0xa0, 0xf8, 0xc7, 0x2c, 0xc3, 0x65, + 0x05, 0x26, 0xfc, 0x83, 0xf8, 0xcf, 0x12, 0x60, 0x23, 0x06, 0xc6, 0x11, + 0x82, 0x60, 0xe1, 0x1f, 0x98, 0x5b, 0x0c, 0x23, 0x06, 0xc7, 0x11, 0x82, + 0x60, 0xe1, 0x1f, 0x16, 0x5c, 0x04, 0x20, 0x61, 0x01, 0x48, 0x88, 0xbf, + 0x05, 0x20, 0x01, 0xfe, 0xb3, 0x04, 0xd8, 0x40, 0x05, 0xa0, 0x58, 0xc2, + 0x35, 0xc7, 0x20, 0x0f, 0x01, 0x4e, 0x8c, 0x21, 0x30, 0x2d, 0x31, 0x1c, + 0x11, 0xa0, 0x84, 0xe2, 0x1f, 0xb3, 0x0c, 0x5a, 0x16, 0x98, 0x80, 0x12, + 0xe2, 0x3f, 0x4b, 0xb0, 0x8d, 0x18, 0x18, 0x47, 0x08, 0x82, 0x85, 0x7f, + 0x60, 0x77, 0x31, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x58, + 0x79, 0x11, 0xa4, 0x84, 0x05, 0x29, 0x21, 0xfe, 0x16, 0xa4, 0x04, 0xf8, + 0xcf, 0x12, 0x6c, 0x03, 0x15, 0x80, 0x92, 0x09, 0xda, 0x1c, 0x43, 0x12, + 0xd4, 0xc4, 0x18, 0x42, 0x55, 0x13, 0xc3, 0x11, 0x41, 0x4c, 0x28, 0xfe, + 0x31, 0xcb, 0xd0, 0x71, 0x81, 0x09, 0x31, 0x21, 0xfe, 0xb3, 0x04, 0xde, + 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0x06, 0x1a, 0xc3, 0x88, + 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x25, 0x1a, 0x81, 0x4c, 0x58, + 0x20, 0x13, 0xe2, 0x6f, 0x81, 0x4c, 0x80, 0xff, 0x2c, 0x81, 0x37, 0x50, + 0x01, 0x28, 0x9c, 0xd0, 0xcd, 0x31, 0x24, 0x41, 0x4f, 0x8c, 0x18, 0x20, + 0x47, 0x08, 0x82, 0x85, 0x7f, 0x50, 0xa8, 0x11, 0x98, 0x04, 0x49, 0x0c, + 0x32, 0x04, 0x28, 0xc1, 0x13, 0xb3, 0x04, 0xdf, 0x40, 0x45, 0xe0, 0x07, + 0x94, 0xe0, 0x0d, 0x32, 0x04, 0x2d, 0xe1, 0x13, 0xb3, 0x04, 0x6d, 0x30, + 0xcb, 0x10, 0x06, 0x6d, 0xc0, 0x0f, 0x83, 0x0c, 0xbd, 0xe0, 0x12, 0x61, + 0x31, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0xd1, 0xa5, 0x46, 0x20, + 0x12, 0x73, 0x0c, 0x2b, 0x11, 0xc4, 0xc5, 0x88, 0xc1, 0x71, 0x84, 0x20, + 0x58, 0xf8, 0x47, 0xb7, 0x1a, 0xc3, 0x48, 0xcc, 0x31, 0x08, 0xc1, 0x59, + 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x74, 0xad, 0x51, 0x90, + 0xc4, 0x1c, 0x83, 0x10, 0xa0, 0xc5, 0x20, 0x43, 0x20, 0x13, 0x66, 0x31, + 0xc8, 0x10, 0x94, 0x83, 0x59, 0xec, 0x61, 0x70, 0x0b, 0xbc, 0x30, 0x0d, + 0x0a, 0x80, 0xb1, 0x87, 0x01, 0x2e, 0xf4, 0xe2, 0x34, 0x28, 0x00, 0xc6, + 0x1c, 0x03, 0x4e, 0x04, 0x7c, 0x31, 0xc8, 0x10, 0xe4, 0x84, 0x5b, 0x58, + 0x90, 0x88, 0xff, 0x20, 0x43, 0xb0, 0x13, 0x6f, 0x31, 0x62, 0x50, 0x1c, + 0x21, 0x08, 0x06, 0x9b, 0x6e, 0x1c, 0xb3, 0x0c, 0x6c, 0x20, 0x06, 0xc1, + 0x18, 0xc2, 0x10, 0x1a, 0xc3, 0x11, 0x01, 0x5c, 0x28, 0xfe, 0x31, 0xcb, + 0x40, 0x06, 0x63, 0x10, 0x98, 0x00, 0x17, 0xe2, 0x3f, 0x4b, 0x50, 0x06, + 0x23, 0x06, 0xc6, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0xd8, 0x6f, 0x0c, 0x23, + 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x56, 0x78, 0x04, 0x71, 0x61, + 0x41, 0x5c, 0x88, 0xbf, 0x05, 0x71, 0x01, 0xfe, 0xb3, 0x04, 0x65, 0x30, + 0x50, 0x01, 0x28, 0x63, 0x20, 0x90, 0xc1, 0x1c, 0xc3, 0x58, 0x04, 0xa9, + 0x31, 0x86, 0xc0, 0xf8, 0xc5, 0x70, 0x44, 0x90, 0x17, 0x8a, 0x7f, 0xcc, + 0x32, 0x9c, 0x81, 0x19, 0x04, 0x26, 0xe4, 0x85, 0xf8, 0xcf, 0x12, 0xa0, + 0xc1, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0x86, 0x1e, 0xc3, + 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0xa5, 0x1e, 0x81, 0x5e, + 0x58, 0xa0, 0x17, 0xe2, 0x6f, 0x81, 0x5e, 0x80, 0xff, 0x2c, 0x01, 0x1a, + 0x0c, 0x54, 0x00, 0x8a, 0x19, 0x08, 0x67, 0x30, 0xc7, 0x90, 0x04, 0xa6, + 0x31, 0x86, 0x50, 0x99, 0xc6, 0x70, 0x44, 0x20, 0x1a, 0x8a, 0x7f, 0xcc, + 0x32, 0xa8, 0x41, 0x1a, 0x04, 0x26, 0x88, 0x86, 0xf8, 0xcf, 0x12, 0xac, + 0xc1, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0x16, 0x1f, 0xc3, + 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x35, 0x1f, 0xc1, 0x68, + 0x58, 0x30, 0x1a, 0xe2, 0x6f, 0xc1, 0x68, 0x80, 0xff, 0x2c, 0xc1, 0x1a, + 0x0c, 0x54, 0x00, 0x4a, 0x1a, 0x08, 0x6a, 0x30, 0xc7, 0x90, 0x04, 0xae, + 0x31, 0x62, 0x80, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xe5, 0x47, 0x70, + 0x17, 0x75, 0x31, 0xc8, 0x10, 0xe4, 0x45, 0x6b, 0xcc, 0x12, 0xb0, 0xc1, + 0x40, 0x45, 0xe0, 0x07, 0x61, 0x20, 0xac, 0xc1, 0x20, 0x43, 0xe0, 0x17, + 0xaf, 0x31, 0x4b, 0xd0, 0x06, 0x03, 0x2d, 0x01, 0x8f, 0x18, 0x3c, 0x22, + 0xf1, 0xc8, 0x27, 0x0b, 0x6c, 0xc0, 0x23, 0x60, 0x30, 0xd0, 0x12, 0xa0, + 0x88, 0xa1, 0x17, 0x92, 0x39, 0x7c, 0x04, 0x1b, 0xf0, 0x0b, 0x18, 0x0c, + 0x32, 0x04, 0x42, 0x6c, 0x64, 0x10, 0x10, 0x03, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x5b, 0x86, 0x20, 0x78, 0x87, 0x2d, 0x83, 0x11, 0xc0, 0xc3, 0x96, + 0x21, 0x0b, 0xe2, 0x61, 0xcb, 0xe0, 0x05, 0xf2, 0xb0, 0x65, 0x00, 0x83, + 0x60, 0x1e, 0xb6, 0x0c, 0x69, 0x10, 0xd0, 0xc3, 0x96, 0xc1, 0x0d, 0x82, + 0x7a, 0xd8, 0x32, 0xd4, 0x41, 0x60, 0x0f, 0x5b, 0x86, 0x3b, 0x08, 0xea, + 0x61, 0xcb, 0xb0, 0x0e, 0x81, 0x3d, 0x6c, 0x19, 0xda, 0x21, 0xa8, 0x87, + 0x2d, 0x43, 0x5a, 0x04, 0xf6, 0xb0, 0x65, 0x58, 0x8b, 0xa0, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x73, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, + 0x00, 0x74, 0xce, 0x00, 0xd0, 0x5b, 0x02, 0x45, 0x40, 0xf0, 0x58, 0x03, + 0x10, 0x08, 0x23, 0x00, 0x74, 0xcf, 0x41, 0x44, 0x8f, 0xd3, 0x06, 0x04, + 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20, + 0x08, 0x06, 0x23, 0x00, 0x14, 0xcc, 0x00, 0xcc, 0x00, 0x50, 0x31, 0x03, + 0x30, 0xd6, 0xc0, 0xb2, 0x67, 0x28, 0x7f, 0xa8, 0x5f, 0xc6, 0xea, 0x97, + 0x9f, 0xba, 0x38, 0x7b, 0x63, 0x0d, 0x7a, 0x0d, 0xee, 0xb8, 0xa7, 0xe2, + 0xb9, 0x6d, 0x7f, 0x6f, 0x9f, 0xd2, 0xa3, 0x37, 0xd6, 0xb0, 0xce, 0x31, + 0x8b, 0x7a, 0x69, 0x08, 0xa3, 0xbb, 0x77, 0xb7, 0xb1, 0x6a, 0x7f, 0x63, + 0x0d, 0x62, 0x2e, 0xa6, 0xfd, 0x07, 0x96, 0x3c, 0x1b, 0xff, 0xc2, 0x98, + 0xae, 0x6a, 0xee, 0x0b, 0x63, 0x0d, 0xff, 0x4c, 0xfa, 0xbf, 0x2f, 0xd0, + 0x35, 0x28, 0xe6, 0x5f, 0x0b, 0xc7, 0x31, 0xe8, 0x0b, 0x63, 0x0d, 0x73, + 0xdf, 0xa6, 0xa9, 0x2f, 0xb4, 0x6e, 0xc8, 0xf3, 0xbe, 0xc0, 0xe7, 0xac, + 0x8f, 0x7f, 0x00, 0x00, 0x00, 0x83, 0x0c, 0xd7, 0xd1, 0x0c, 0x47, 0x58, + 0x4d, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0xcc, 0x31, 0x24, 0x96, 0x18, + 0x0c, 0x32, 0x04, 0x4a, 0x64, 0xc1, 0x26, 0xfe, 0x83, 0x0c, 0x01, 0x23, + 0xcd, 0x12, 0x24, 0xc3, 0x11, 0x5b, 0x14, 0xf8, 0xc7, 0x2c, 0xc3, 0x90, + 0x04, 0xc3, 0x11, 0x9d, 0x14, 0xf8, 0xc7, 0x2c, 0x03, 0x51, 0x04, 0x23, + 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x5d, 0x28, 0x7c, 0xce, 0x1c, + 0x43, 0x14, 0xa4, 0xc1, 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x47, + 0x37, 0x0a, 0x61, 0xf0, 0xcc, 0x31, 0x08, 0x01, 0x37, 0x62, 0x70, 0x1c, + 0x21, 0x08, 0x16, 0xfe, 0xd1, 0x95, 0xc2, 0x18, 0x40, 0x73, 0x0c, 0x42, + 0xd0, 0xcd, 0x12, 0x14, 0x03, 0x15, 0x81, 0x40, 0x70, 0xc3, 0x18, 0x42, + 0xf0, 0x06, 0x63, 0x08, 0x42, 0x18, 0x8c, 0x21, 0x0c, 0x61, 0x30, 0x62, + 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x61, 0xa5, 0x82, 0x10, 0x8c, 0x18, + 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x58, 0xaa, 0x40, 0x04, 0xc3, 0x11, + 0x81, 0x27, 0xf8, 0xc7, 0x2c, 0x83, 0x71, 0x04, 0x83, 0x0c, 0x87, 0x47, + 0x06, 0x36, 0xa8, 0x81, 0xf8, 0x5b, 0x30, 0x06, 0xe0, 0x6f, 0xc5, 0x1a, + 0x88, 0xbf, 0x05, 0x65, 0x00, 0xfe, 0x36, 0x04, 0xe4, 0x3f, 0xc7, 0x20, + 0x06, 0xc1, 0x1e, 0x0c, 0x32, 0x04, 0x63, 0xa0, 0x06, 0x16, 0x20, 0xe2, + 0x3f, 0xc8, 0x10, 0x94, 0xc1, 0x1a, 0xcc, 0x12, 0x1c, 0x03, 0x15, 0x81, + 0x60, 0x88, 0x41, 0x31, 0xcb, 0x80, 0x24, 0xd9, 0x20, 0x43, 0x90, 0x06, + 0x6f, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0xd1, 0xe9, 0x42, + 0x40, 0x06, 0x73, 0x0c, 0x6a, 0x10, 0x88, 0xc2, 0x88, 0xc1, 0x71, 0x84, + 0x20, 0x58, 0xf8, 0x47, 0xc7, 0x0b, 0x43, 0x19, 0xcc, 0x31, 0x08, 0x41, + 0x1d, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x74, 0xbe, 0x50, + 0x98, 0xc1, 0x1c, 0x83, 0x10, 0xd8, 0xc1, 0x2c, 0x41, 0x32, 0x50, 0x12, + 0x90, 0x42, 0xe0, 0x0a, 0x82, 0x80, 0x40, 0xc7, 0x20, 0x43, 0x10, 0x07, + 0x77, 0x90, 0x01, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xc0, 0x09, 0x18, 0xe0, 0xac, + 0x80, 0x07, 0xb5, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, + 0x00, 0x6d, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x68, 0x03, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, + 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x01, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x67, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x24, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x30, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x48, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x5c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x6c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, + 0x00, 0x7d, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x93, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, + 0x00, 0xa0, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x30, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0xb9, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0xca, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0xdc, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0xef, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, + 0x00, 0x02, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x23, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, + 0x00, 0x23, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, + 0x00, 0x5d, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xe7, 0x02, 0x00, 0x00, + 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x5a, 0x31, 0x34, 0x47, 0x65, 0x74, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, + 0x76, 0x34, 0x5f, 0x66, 0x52, 0x55, 0x31, 0x31, 0x4d, 0x54, 0x4c, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x4b, 0x31, 0x35, 0x53, 0x68, + 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x73, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6c, + 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, + 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x66, 0x33, + 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, + 0x62, 0x73, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x74, 0x2e, 0x75, 0x2e, 0x69, 0x31, 0x2e, 0x66, + 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x64, 0x6f, 0x74, 0x2e, + 0x76, 0x33, 0x66, 0x33, 0x32, 0x5f, 0x5a, 0x31, 0x32, 0x41, 0x70, 0x70, + 0x6c, 0x79, 0x54, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x44, 0x76, 0x33, + 0x5f, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x61, - 0x78, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x5f, 0x5a, 0x31, 0x33, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, - 0x44, 0x76, 0x32, 0x5f, 0x66, 0x66, 0x52, 0x55, 0x31, 0x31, 0x4d, 0x54, - 0x4c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x4b, 0x39, 0x59, - 0x55, 0x56, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x4e, 0x35, 0x6d, 0x65, - 0x74, 0x61, 0x6c, 0x39, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, - 0x64, 0x49, 0x66, 0x4c, 0x4e, 0x53, 0x33, 0x5f, 0x36, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x45, 0x30, 0x45, 0x76, 0x45, 0x45, 0x53, 0x36, 0x5f, - 0x4e, 0x53, 0x33, 0x5f, 0x37, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, - 0x45, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, - 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x32, 0x64, 0x2e, 0x76, - 0x34, 0x66, 0x33, 0x32, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, - 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, - 0x74, 0x76, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, - 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, + 0x65, 0x5f, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x76, + 0x34, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x32, + 0x64, 0x2e, 0x76, 0x34, 0x66, 0x33, 0x32, 0x33, 0x32, 0x30, 0x32, 0x33, + 0x2e, 0x34, 0x30, 0x34, 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, + 0x70, 0x6c, 0x65, 0x2d, 0x74, 0x76, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, + 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0xd0, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x00, 0x14, 0x00, 0x00, 0x00, 0xa4, 0x22, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00, - 0x00, 0x21, 0x0c, 0x00, 0x00, 0xb4, 0x04, 0x00, 0x00, 0x0b, 0x02, 0x21, + 0x00, 0x21, 0x0c, 0x00, 0x00, 0xe1, 0x07, 0x00, 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, @@ -2004,7 +2421,7 @@ const unsigned char sdl_metallib[] = { 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x31, 0x46, - 0x06, 0x51, 0x18, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, + 0x06, 0x51, 0x18, 0x00, 0x00, 0x6d, 0x01, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x58, 0x03, 0x40, 0x02, 0x2a, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0, 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, @@ -2045,19 +2462,94 @@ const unsigned char sdl_metallib[] = { 0x43, 0x38, 0xcc, 0x03, 0xb0, 0xc1, 0x1b, 0x0a, 0x60, 0x01, 0xaa, 0x20, 0x0d, 0x40, 0x61, 0x08, 0x87, 0x74, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x03, 0x77, 0x78, 0x87, 0x36, - 0x08, 0x07, 0x76, 0x48, 0x87, 0x70, 0x98, 0x07, 0x60, 0x83, 0x41, 0x18, - 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x02, 0x01, 0x16, 0xa0, 0xda, 0x60, 0x18, - 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, 0x40, 0x6d, 0x50, 0x8e, 0xff, - 0xff, 0xff, 0xff, 0x1f, 0x80, 0x36, 0x00, 0xd6, 0x00, 0x90, 0x80, 0x6a, - 0x83, 0x81, 0x04, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x44, 0x00, 0x16, 0xa0, - 0xda, 0xa0, 0x28, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x6d, 0x00, 0xac, - 0x01, 0x20, 0x01, 0xd5, 0x06, 0x63, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, - 0x90, 0x00, 0x0a, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x13, 0x8a, 0x40, 0x18, 0x88, 0x62, 0x42, 0x60, 0x4c, 0x18, 0x0e, - 0x24, 0x99, 0x30, 0x28, 0x48, 0x32, 0x21, 0x58, 0x00, 0x89, 0x20, 0x00, - 0x00, 0x4a, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, + 0x08, 0x07, 0x76, 0x48, 0x87, 0x70, 0x98, 0x07, 0x60, 0x83, 0x41, 0x20, + 0xc0, 0x02, 0x54, 0x1b, 0xc2, 0xa4, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, + 0x58, 0x03, 0x40, 0x02, 0x2a, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, + 0x1d, 0xf0, 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, + 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, + 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, + 0x60, 0x87, 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, + 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, + 0xa0, 0x07, 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1, + 0x1d, 0xda, 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, + 0x1d, 0xe6, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, + 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, + 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, + 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, + 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, + 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, + 0x48, 0x87, 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, + 0x28, 0x87, 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, + 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, + 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, + 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, + 0x70, 0x87, 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, + 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, + 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, + 0x1d, 0xca, 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, + 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, + 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, + 0x68, 0x03, 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, + 0x38, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, + 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, + 0x1d, 0xda, 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, + 0x1e, 0xde, 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, + 0x1c, 0xe4, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, + 0x00, 0x88, 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, + 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, + 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0x90, 0x18, 0x02, 0xb0, 0x00, + 0x55, 0x90, 0x06, 0x60, 0xb0, 0xc1, 0x38, 0xfe, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x24, 0x80, 0xda, 0xe0, 0x23, 0xc8, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x80, 0x04, 0x54, 0x44, 0x38, 0xc0, 0x03, 0x3c, 0xc8, 0xc3, 0x3b, 0xe0, + 0x43, 0x1b, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb4, 0x81, 0x39, 0xc0, + 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f, + 0xf5, 0x50, 0x0e, 0x00, 0xd1, 0x0e, 0xe9, 0xe0, 0x0e, 0x6d, 0xc0, 0x0e, + 0xe5, 0x70, 0x0e, 0xe1, 0xc0, 0x0e, 0x6d, 0x60, 0x0f, 0xe5, 0x30, 0x0e, + 0xf4, 0xf0, 0x0e, 0xf2, 0xd0, 0x06, 0xf7, 0x90, 0x0e, 0xe4, 0x40, 0x0f, + 0xe8, 0x00, 0xe4, 0x81, 0x1d, 0x00, 0x83, 0x3b, 0xbc, 0x43, 0x1b, 0x88, + 0x43, 0x3d, 0xa4, 0x03, 0x3b, 0xd0, 0x43, 0x3a, 0xb8, 0xc3, 0x3c, 0x00, + 0x84, 0x3b, 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94, + 0x43, 0x1b, 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, + 0x43, 0x1b, 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0x00, 0xf4, 0x20, 0x0f, + 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xe6, 0x20, 0x0f, + 0xe1, 0xd0, 0x0e, 0xe5, 0xd0, 0x06, 0xf0, 0xf0, 0x0e, 0xe9, 0xe0, 0x0e, + 0xf4, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xe5, 0xc0, 0x0e, 0xe9, 0xd0, 0x0e, + 0x6d, 0xe0, 0x0e, 0xef, 0xe0, 0x0e, 0x6d, 0xc0, 0x0e, 0xe5, 0x10, 0x0e, + 0xe6, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, + 0x43, 0x1b, 0xa4, 0x83, 0x3b, 0x98, 0xc3, 0x3c, 0xb4, 0x81, 0x39, 0xc0, + 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f, + 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xee, 0x10, 0x0e, + 0xee, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, 0x0e, + 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8, + 0xc3, 0x3b, 0xb4, 0xc1, 0x3c, 0xa4, 0xc3, 0x39, 0xb8, 0x43, 0x39, 0x90, + 0x43, 0x1b, 0xe8, 0x43, 0x39, 0xc8, 0xc3, 0x3b, 0xcc, 0x43, 0x1b, 0x98, + 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f, + 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x40, 0x0f, + 0xf2, 0x10, 0x0e, 0xf0, 0x00, 0x0f, 0xe9, 0xe0, 0x0e, 0xe7, 0xd0, 0x06, + 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, + 0x03, 0x40, 0xcc, 0x03, 0x3d, 0x84, 0xc3, 0x38, 0xac, 0x43, 0x1b, 0xc0, + 0x83, 0x3c, 0xbc, 0x03, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, + 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, + 0xc1, 0x3c, 0xa4, 0x83, 0x3e, 0x94, 0x03, 0x80, 0x07, 0x00, 0x51, 0x0f, + 0xee, 0x30, 0x0f, 0xe1, 0x60, 0x0e, 0xe5, 0xd0, 0x06, 0xe6, 0x00, 0x0f, + 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, + 0x43, 0x39, 0x00, 0x1b, 0x94, 0xe4, 0xff, 0xff, 0xff, 0xff, 0x07, 0xa0, + 0x0d, 0x80, 0x35, 0x00, 0x24, 0xa0, 0xda, 0x60, 0x28, 0x01, 0xb0, 0x00, + 0xd5, 0x06, 0x63, 0x11, 0x80, 0x05, 0xa8, 0x36, 0x28, 0xcc, 0xff, 0xff, + 0xff, 0xff, 0x0f, 0x40, 0x1b, 0x00, 0x6b, 0x00, 0x48, 0x40, 0xb5, 0xc1, + 0x68, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x24, 0x80, 0xda, 0x30, 0x39, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x6b, 0x00, 0x28, 0x83, 0x3b, 0xbc, + 0x43, 0x1b, 0x88, 0x43, 0x3d, 0xa4, 0x03, 0x3b, 0xd0, 0x43, 0x3a, 0xb8, + 0xc3, 0x3c, 0x00, 0x1b, 0x8a, 0x47, 0x08, 0xd2, 0x00, 0x0c, 0x36, 0x44, + 0xd0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x32, 0xb8, 0xc3, 0x3b, 0xb4, + 0x81, 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03, 0x3d, 0xa4, 0x83, 0x3b, 0xcc, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x42, 0x61, 0x4c, 0x08, 0x8e, + 0x09, 0x01, 0x32, 0x61, 0x48, 0x94, 0x65, 0xc2, 0xc0, 0x28, 0xcb, 0x84, + 0xa0, 0x99, 0x20, 0x38, 0xcf, 0x84, 0x00, 0x02, 0x00, 0x89, 0x20, 0x00, + 0x00, 0x48, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, - 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xb8, 0xc1, + 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xd0, 0xc1, 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, @@ -2067,68 +2559,75 @@ const unsigned char sdl_metallib[] = { 0xd2, 0x01, 0x1f, 0x50, 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21, 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, - 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0x38, - 0x4d, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, - 0xdf, 0x1e, 0x7e, 0x20, 0x8a, 0x00, 0xec, 0x9f, 0xc6, 0x08, 0x80, 0x41, - 0x04, 0x26, 0xb8, 0x48, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, - 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00, 0x06, 0x11, 0x1c, 0xa1, 0x24, - 0x41, 0x10, 0x08, 0x44, 0xb2, 0x34, 0x0f, 0x41, 0x65, 0x00, 0x00, 0x80, - 0xa4, 0x22, 0x00, 0x00, 0x51, 0x73, 0x04, 0x41, 0x11, 0x2c, 0x80, 0xae, - 0x32, 0x00, 0x45, 0x41, 0xd9, 0x1c, 0x01, 0x62, 0x84, 0x60, 0x9b, 0x23, - 0x00, 0x83, 0x61, 0x04, 0xa1, 0x2b, 0x0b, 0xd7, 0x3c, 0x42, 0x67, 0x79, - 0x16, 0x00, 0x74, 0xf4, 0x15, 0x85, 0x5b, 0x1e, 0xc1, 0xf2, 0x2c, 0x00, - 0xe8, 0x28, 0x1c, 0x08, 0x48, 0x81, 0x6e, 0x8e, 0x00, 0x14, 0x86, 0x11, - 0x86, 0x6e, 0x10, 0x21, 0x10, 0x06, 0x11, 0x0e, 0x61, 0x10, 0xa1, 0x10, - 0x06, 0x11, 0x00, 0x61, 0x0a, 0x60, 0x04, 0x60, 0x18, 0x81, 0xe8, 0x00, - 0x00, 0x13, 0xc0, 0x20, 0x1c, 0xd2, 0x41, 0x1e, 0xec, 0x80, 0x0e, 0xda, - 0x20, 0x1c, 0xe0, 0x01, 0x1e, 0xd8, 0xa1, 0x1c, 0xda, 0x80, 0x1e, 0xec, - 0xe1, 0x1d, 0xe6, 0x21, 0x0e, 0xe6, 0xc0, 0x0d, 0xe0, 0xc0, 0x0d, 0xe0, - 0xa0, 0x0d, 0xe6, 0x21, 0x1d, 0xda, 0xa1, 0x1e, 0xd8, 0x21, 0x1c, 0xe8, - 0xe1, 0x1d, 0xe4, 0x61, 0xc3, 0x6d, 0x94, 0x43, 0x1b, 0xc0, 0x83, 0x1e, - 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, - 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1e, 0xe0, 0x81, 0x1e, 0xe0, 0x41, 0x1b, - 0xa4, 0x03, 0x1e, 0xe8, 0x01, 0x1e, 0xe8, 0x01, 0x1e, 0xb4, 0x41, 0x3a, - 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d, - 0xb4, 0x41, 0x3a, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, - 0xcc, 0x81, 0x1c, 0xb4, 0x41, 0x3a, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, - 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x39, 0xcc, 0x81, 0x1c, - 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x39, - 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, - 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e, - 0xc4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x01, 0x1d, 0xe8, 0xc1, 0x1c, - 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xcc, 0x81, 0x1c, - 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d, - 0xd0, 0x01, 0x1e, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, - 0xb4, 0x81, 0x3d, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, - 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xe4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, - 0xc8, 0x01, 0x1e, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xb4, 0x81, 0x3d, - 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, - 0xc4, 0x81, 0x1c, 0xe0, 0x41, 0x1b, 0xd8, 0x43, 0x1c, 0xe4, 0x81, 0x1c, - 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, - 0xb4, 0x81, 0x3d, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, - 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x41, 0x1b, 0xd8, 0x43, 0x1d, - 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, - 0xc4, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, - 0xe8, 0x41, 0x1c, 0xc0, 0x81, 0x1c, 0xd0, 0x81, 0x1e, 0xc4, 0x01, 0x1c, - 0xc8, 0x01, 0x1d, 0xb4, 0x81, 0x3b, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1d, - 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43, 0x42, 0x6c, 0x57, 0xfe, - 0xb2, 0xfb, 0xfe, 0x45, 0x04, 0x18, 0x0c, 0xd1, 0x4c, 0x43, 0x22, 0x00, - 0x82, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, - 0x48, 0x04, 0x41, 0x12, 0x10, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x0c, 0x89, 0xc0, 0x20, 0xa2, 0x80, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, 0x48, 0x14, 0x07, 0xd6, 0x05, 0x04, - 0x80, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0xa2, 0x53, - 0x68, 0x32, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x18, 0x12, 0xd1, 0x42, 0x18, 0x7c, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x30, 0x24, 0xaa, 0x87, 0x2d, 0x0c, 0x80, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x62, 0x83, 0x40, - 0x51, 0x5b, 0x02, 0x00, 0x80, 0x2c, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0xb8, + 0x48, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, + 0x7f, 0x1a, 0x23, 0x00, 0x06, 0x11, 0x18, 0xa1, 0x24, 0x41, 0x10, 0x08, + 0x44, 0xb2, 0x2c, 0x0d, 0x39, 0x65, 0x08, 0x02, 0x82, 0xa0, 0x42, 0x14, + 0x45, 0x51, 0x90, 0x54, 0x06, 0x00, 0x00, 0x88, 0x2a, 0x02, 0x00, 0x90, + 0x35, 0x47, 0x10, 0x14, 0x01, 0x03, 0x28, 0x2b, 0x03, 0x50, 0x14, 0xb4, + 0x15, 0xa3, 0x28, 0x00, 0x00, 0x00, 0xa8, 0x2b, 0x43, 0x51, 0x14, 0xf4, + 0x15, 0xa1, 0x28, 0x28, 0x9c, 0x23, 0x40, 0x8c, 0x10, 0x8c, 0x73, 0x04, + 0x60, 0x30, 0x8c, 0x20, 0x94, 0x41, 0x51, 0xc8, 0xa5, 0x11, 0x30, 0x13, + 0x03, 0x80, 0x92, 0xce, 0x81, 0x80, 0x14, 0x28, 0xe7, 0x08, 0x40, 0x61, + 0x10, 0x01, 0x10, 0xa6, 0x00, 0x46, 0x00, 0x86, 0x11, 0x86, 0x32, 0x18, + 0x44, 0x08, 0x84, 0x41, 0x84, 0x43, 0x18, 0x44, 0x28, 0x84, 0x61, 0x04, + 0xa2, 0x0c, 0x00, 0x00, 0x00, 0x13, 0xc0, 0x20, 0x1c, 0xd2, 0x41, 0x1e, + 0xec, 0x80, 0x0e, 0xda, 0x20, 0x1c, 0xe0, 0x01, 0x1e, 0xd8, 0xa1, 0x1c, + 0xda, 0x80, 0x1e, 0xec, 0xe1, 0x1d, 0xe6, 0x21, 0x0e, 0xe6, 0xc0, 0x0d, + 0xe0, 0xc0, 0x0d, 0xe0, 0xa0, 0x0d, 0xe6, 0x21, 0x1d, 0xda, 0xa1, 0x1e, + 0xd8, 0x21, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0x61, 0xc3, 0x6d, 0x94, 0x43, + 0x1b, 0xc0, 0x83, 0x1e, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, + 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1e, 0xe0, 0x81, + 0x1e, 0xe0, 0x41, 0x1b, 0xa4, 0x03, 0x1e, 0xe8, 0x01, 0x1e, 0xe8, 0x01, + 0x1e, 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, + 0x1e, 0xc4, 0x81, 0x1d, 0xb4, 0x41, 0x3a, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, + 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x41, 0x3a, 0xd8, 0x01, + 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, + 0x39, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, + 0x1c, 0xb4, 0x81, 0x39, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, + 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1d, 0xe8, 0x41, + 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x01, + 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, + 0x3d, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, + 0x1c, 0xb4, 0x81, 0x3d, 0xd0, 0x01, 0x1e, 0xe8, 0x81, 0x1d, 0xd0, 0x81, + 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xd8, 0x01, 0x1d, 0xe8, 0x81, + 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xe4, 0x81, + 0x1d, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xe8, 0x41, 0x1c, 0xc8, 0x01, + 0x1e, 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, + 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x41, 0x1b, 0xd8, 0x43, + 0x1c, 0xe4, 0x81, 0x1c, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xe8, 0x81, + 0x1c, 0xd4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x41, 0x1d, 0xd8, 0x81, + 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x41, + 0x1b, 0xd8, 0x43, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, + 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xc4, 0x01, + 0x1c, 0xc8, 0x01, 0x1d, 0xe8, 0x41, 0x1c, 0xc0, 0x81, 0x1c, 0xd0, 0x81, + 0x1e, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, 0xb4, 0x81, 0x3b, 0xe0, 0x81, + 0x1e, 0xc4, 0x81, 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43, + 0x46, 0x6c, 0x57, 0xfe, 0xe7, 0x5b, 0xdb, 0x7f, 0x11, 0x01, 0x06, 0x43, + 0x34, 0xd3, 0x90, 0x08, 0x88, 0x1c, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x18, 0x12, 0x45, 0x78, 0x00, 0x21, 0xc0, 0x20, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xc0, 0x90, 0x28, 0x15, 0x28, + 0x09, 0x08, 0x80, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x86, + 0x44, 0xbd, 0x00, 0x51, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x30, 0x24, 0x6a, 0x87, 0xc8, 0x02, 0x02, 0x60, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, 0x91, 0x3f, 0x58, 0x19, 0x10, + 0x00, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x89, 0x68, + 0xa2, 0xd9, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x60, 0x48, 0x14, 0x16, 0x59, 0x87, 0x00, 0x03, 0x01, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x22, 0xbd, 0x88, 0x28, 0x20, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x12, 0xad, 0x86, 0xf4, + 0x01, 0x01, 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xc0, 0x90, + 0xa8, 0x37, 0xa6, 0x30, 0x00, 0x02, 0x60, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x80, 0x21, 0x11, 0x7c, 0x4c, 0x1f, 0x10, 0x00, 0x03, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x89, 0x46, 0x64, 0x3b, 0x03, + 0x20, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0xd8, + 0x20, 0x50, 0x54, 0xfc, 0x00, 0x00, 0x20, 0x0b, 0x04, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, - 0x47, 0xc6, 0x04, 0x43, 0xea, 0x8a, 0xa0, 0x04, 0x0a, 0x61, 0x04, 0xa0, + 0x47, 0xc6, 0x04, 0x43, 0x2a, 0x8b, 0xa0, 0x04, 0x0a, 0x61, 0x04, 0xa0, 0x0c, 0x0a, 0xa8, 0x20, 0x0a, 0xa3, 0x40, 0x0a, 0xa5, 0x60, 0x0a, 0xa7, - 0x00, 0x03, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, 0xa8, 0x1c, 0x01, 0x28, - 0x84, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0x22, 0xc7, - 0x12, 0x22, 0x01, 0x00, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, + 0x00, 0x03, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, 0x68, 0x1d, 0x01, 0x28, + 0x84, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0x52, 0xc7, + 0x12, 0x24, 0x01, 0x00, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, @@ -2184,261 +2683,473 @@ const unsigned char sdl_metallib[] = { 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x79, 0x20, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x32, 0x9a, 0x08, + 0x00, 0x79, 0x20, 0x00, 0x00, 0x71, 0x01, 0x00, 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4, - 0xee, 0x80, 0x0d, 0x66, 0x0c, 0x8b, 0xf2, 0x06, 0xc5, 0xc6, 0x91, 0x41, + 0xf2, 0x00, 0x0e, 0xdc, 0x0c, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x41, 0x14, 0x19, 0x8c, 0x22, 0x31, 0x88, 0x64, 0x3d, 0x45, 0x66, 0x20, 0xca, 0x23, 0x21, 0x54, 0xc1, 0x30, 0xca, 0xe2, 0x3c, 0xcf, 0x13, 0x5d, 0x4f, - 0x60, 0x18, 0x88, 0x91, 0x18, 0x8b, 0x82, 0x11, 0x5e, 0xb1, 0x1c, 0x01, - 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, - 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, - 0x39, 0x38, 0x20, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, - 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, 0x38, 0x29, 0x4d, 0x65, 0x74, - 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, - 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, - 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, - 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x34, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x61, - 0x69, 0x72, 0x2e, 0x6e, 0x6f, 0x5f, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, - 0x76, 0x34, 0x5f, 0x66, 0x29, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, - 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x63, 0x6f, 0x6c, 0x6f, - 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, - 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x74, 0x65, 0x78, 0x63, - 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, - 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, - 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, - 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, - 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, - 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, - 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, - 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, - 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, - 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, - 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, - 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x6d, 0x61, 0x74, 0x72, - 0x69, 0x78, 0x59, 0x55, 0x56, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, - 0x65, 0x63, 0x6f, 0x64, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x74, 0x65, 0x78, - 0x74, 0x75, 0x72, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, - 0x6c, 0x65, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x3e, 0x74, 0x65, 0x78, 0x59, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, - 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, + 0x60, 0x18, 0x88, 0x91, 0x18, 0x8b, 0x82, 0x11, 0xc5, 0x72, 0x04, 0xd5, + 0xf3, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, + 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32, + 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74, + 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, + 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, + 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, + 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e, + 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x6e, 0x6f, 0x5f, + 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x61, + 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, + 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69, + 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, + 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74, + 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, + 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, + 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77, + 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69, + 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, + 0x78, 0x33, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x59, 0x55, 0x56, 0x44, + 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x61, + 0x69, 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x61, 0x69, + 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x78, 0x74, + 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, + 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x59, 0x74, 0x65, 0x78, 0x55, 0x56, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, - 0x00, 0x84, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0xd0, - 0x1d, 0x23, 0x08, 0x64, 0x00, 0x06, 0x23, 0x08, 0x1d, 0x32, 0x82, 0xd0, - 0x25, 0x23, 0x08, 0x9d, 0x32, 0x82, 0x10, 0x01, 0x23, 0x08, 0xdd, 0x32, - 0x82, 0xd0, 0x31, 0x23, 0x08, 0x5d, 0x33, 0x82, 0xd0, 0x39, 0x23, 0x08, - 0xdd, 0x33, 0x82, 0xd0, 0x41, 0x23, 0x08, 0x5d, 0x34, 0x82, 0xd0, 0x49, - 0x23, 0x08, 0xdd, 0x34, 0x82, 0xd0, 0x51, 0x23, 0x08, 0x5d, 0x35, 0x82, - 0xd0, 0x59, 0x23, 0x08, 0xdd, 0x35, 0xc3, 0x80, 0x07, 0x41, 0x1e, 0xcc, - 0x30, 0xe8, 0x81, 0xb0, 0x07, 0x33, 0x04, 0xc3, 0x0c, 0x03, 0x1e, 0xe0, - 0x01, 0x1f, 0xcc, 0x40, 0x10, 0x7a, 0xa0, 0x07, 0x7c, 0x30, 0x43, 0x50, - 0xcc, 0x10, 0x18, 0x33, 0x04, 0xc7, 0x0c, 0x05, 0xc2, 0x07, 0x7c, 0x90, - 0x28, 0x33, 0x04, 0xb3, 0x30, 0x03, 0xc2, 0x07, 0x0b, 0xd3, 0x24, 0x8a, - 0xf3, 0xcc, 0x90, 0xe8, 0x01, 0x14, 0x31, 0x52, 0xa2, 0x38, 0xd3, 0x0c, - 0x09, 0x1e, 0x40, 0x14, 0x23, 0x25, 0x95, 0x63, 0xcd, 0x80, 0x06, 0x7c, - 0xb0, 0x07, 0x7c, 0xc0, 0x75, 0x7b, 0xb0, 0x07, 0x7c, 0xc0, 0x79, 0xa0, - 0xb0, 0x07, 0x7c, 0xc0, 0x7d, 0xa1, 0xb0, 0x07, 0x7c, 0xc0, 0x81, 0x81, - 0x28, 0xec, 0x01, 0x1f, 0x70, 0x61, 0x30, 0x0a, 0x7b, 0xc0, 0x07, 0x9c, - 0x18, 0x90, 0xc2, 0x1e, 0xf0, 0x01, 0x37, 0x06, 0xa5, 0xb0, 0x07, 0x7c, - 0xc0, 0x91, 0xc1, 0x0c, 0x92, 0x1f, 0x5c, 0xd8, 0x1f, 0x64, 0x7c, 0xa0, - 0x07, 0xda, 0x86, 0x0b, 0x65, 0xf0, 0x07, 0x66, 0xb0, 0x07, 0xc9, 0x19, - 0x38, 0x68, 0x30, 0x83, 0xc2, 0x07, 0xa2, 0xc0, 0x07, 0x69, 0xa0, 0x06, - 0xa2, 0x70, 0x0a, 0x7c, 0xb0, 0x06, 0x6c, 0x30, 0x83, 0xb4, 0x07, 0x17, - 0x66, 0x0a, 0x99, 0x1e, 0xe8, 0x81, 0xb6, 0xe9, 0x42, 0x19, 0x98, 0x82, - 0x19, 0x88, 0x42, 0xd2, 0x06, 0x8e, 0x1b, 0xcc, 0xa0, 0xa0, 0xc2, 0x1b, - 0x64, 0x7c, 0xa0, 0x07, 0x70, 0x90, 0xc4, 0x81, 0x23, 0x07, 0x33, 0x28, - 0xa9, 0xf0, 0x06, 0x99, 0x1e, 0xe8, 0x01, 0x1c, 0x24, 0x73, 0xe0, 0xd0, - 0xc1, 0x0c, 0x89, 0x2a, 0xd4, 0x41, 0xc6, 0x07, 0x7a, 0x90, 0xd8, 0x81, - 0x73, 0x07, 0x33, 0x20, 0xb5, 0x60, 0x0b, 0xb7, 0x90, 0x0b, 0xbb, 0xc0, - 0x0b, 0xbd, 0xe0, 0x0b, 0x33, 0x0c, 0x7d, 0x40, 0x0b, 0xbf, 0x50, 0x69, - 0x00, 0x70, 0x68, 0xc0, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, - 0xc7, 0x71, 0x1c, 0xc7, 0xb9, 0x81, 0x1b, 0x58, 0x74, 0xa0, 0x07, 0x96, - 0x65, 0xe9, 0x01, 0x67, 0x0a, 0xac, 0xc0, 0x0a, 0x74, 0xe3, 0x17, 0x28, - 0xe1, 0x17, 0xf6, 0x60, 0x0f, 0xea, 0x00, 0x0f, 0x32, 0x12, 0x98, 0xa0, - 0x8b, 0xd8, 0xd8, 0xec, 0xda, 0x5c, 0xda, 0xde, 0xc8, 0xea, 0xd8, 0xca, - 0x5c, 0xcc, 0xd8, 0xc2, 0xce, 0xe6, 0x46, 0x11, 0x54, 0x61, 0x15, 0x4e, - 0x61, 0x63, 0xb3, 0x6b, 0x73, 0x49, 0x23, 0x2b, 0x73, 0xa3, 0x1b, 0x25, - 0x60, 0x85, 0x5b, 0xc2, 0xd2, 0xe4, 0x5c, 0xec, 0xca, 0xe4, 0xe6, 0xd2, - 0xde, 0xdc, 0x46, 0x09, 0x5a, 0xe1, 0xa8, 0xb0, 0x34, 0x39, 0x17, 0xb6, - 0x30, 0xb7, 0xb3, 0xba, 0xb0, 0xb3, 0xb2, 0x2f, 0xbb, 0x32, 0xb9, 0xb9, - 0xb4, 0x37, 0xb7, 0x51, 0x02, 0x57, 0xb8, 0x29, 0x2c, 0x4d, 0xce, 0x65, - 0xec, 0xad, 0x0d, 0x2e, 0x8d, 0xad, 0xec, 0xeb, 0x0d, 0x8e, 0x2e, 0xed, - 0xcd, 0x6d, 0x6e, 0x94, 0xe1, 0x15, 0x60, 0x21, 0x16, 0x8e, 0x09, 0x4b, - 0x93, 0x73, 0x31, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, 0x73, 0xa3, 0x1b, 0x25, - 0xf8, 0x05, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, - 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, - 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, - 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, - 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60, - 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20, - 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87, - 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07, - 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d, - 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc, - 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2, - 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, - 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, - 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, - 0x00, 0x61, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x13, 0x04, 0x4c, - 0x2c, 0x10, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x64, 0xd5, 0xc0, - 0x08, 0x00, 0x75, 0x33, 0x00, 0xe4, 0x8d, 0x00, 0x50, 0x59, 0x02, 0x45, - 0x50, 0x06, 0x64, 0x8e, 0x35, 0x00, 0x81, 0x30, 0xc7, 0xa0, 0xac, 0xc1, - 0x1a, 0x8c, 0x00, 0x50, 0x3b, 0x07, 0xa1, 0x20, 0xc7, 0x1a, 0x10, 0x30, - 0x02, 0x30, 0x46, 0x60, 0xde, 0xeb, 0x2a, 0x7b, 0x63, 0x04, 0x31, 0x0f, - 0xf6, 0xb9, 0x37, 0x46, 0xe0, 0xf6, 0xb1, 0x68, 0x7b, 0x63, 0x04, 0xef, - 0x9e, 0x96, 0xf7, 0x37, 0x46, 0xa0, 0xb3, 0xe6, 0x1c, 0x82, 0xc1, 0x18, - 0x01, 0x08, 0x82, 0x20, 0xfe, 0x51, 0x30, 0x03, 0x30, 0x03, 0x40, 0xc5, - 0x0c, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x58, 0x00, 0x00, - 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x22, 0x48, 0x5e, 0x00, 0x00, 0x00, - 0x00, 0x62, 0x80, 0x61, 0x96, 0x55, 0x3d, 0x0f, 0x00, 0x61, 0x69, 0x72, + 0x5f, 0x5a, 0x54, 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, 0x6e, + 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, + 0x42, 0x41, 0x41, 0x00, 0x00, 0x04, 0xd5, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x82, 0x50, 0x06, 0xcd, 0x08, 0x82, 0x1a, 0x98, 0xc1, 0x08, + 0x42, 0x19, 0x38, 0x23, 0x08, 0x65, 0xf0, 0x8c, 0x20, 0x94, 0x01, 0x34, + 0x82, 0xf0, 0x00, 0x23, 0x08, 0x65, 0x10, 0x8d, 0x20, 0x94, 0x81, 0x34, + 0x82, 0x50, 0x06, 0xd3, 0x08, 0x42, 0x19, 0x50, 0x23, 0x08, 0x65, 0x50, + 0x8d, 0x20, 0x94, 0x81, 0x35, 0x82, 0x50, 0x06, 0xd7, 0x08, 0x42, 0x19, + 0x60, 0x23, 0x08, 0x65, 0x90, 0x8d, 0x20, 0x94, 0x81, 0x36, 0x82, 0x50, + 0x06, 0xdb, 0x08, 0x42, 0x19, 0x70, 0x23, 0x08, 0x65, 0xd0, 0x8d, 0x20, + 0xac, 0x81, 0x37, 0x82, 0xb0, 0x06, 0xdf, 0x08, 0xc2, 0x1a, 0x80, 0xc1, + 0x08, 0xc2, 0x1a, 0x84, 0xc1, 0x08, 0xc2, 0x1a, 0x88, 0xc1, 0x08, 0xc2, + 0x1a, 0x8c, 0xc1, 0x08, 0xc2, 0x1a, 0x90, 0xc1, 0x08, 0xc2, 0x1a, 0x94, + 0xc1, 0x0c, 0x83, 0x1e, 0x04, 0x7b, 0x30, 0xc3, 0xc0, 0x07, 0x42, 0x1f, + 0xcc, 0x10, 0x0c, 0x33, 0x0c, 0x7a, 0xa0, 0x07, 0x7e, 0x30, 0x03, 0x41, + 0xf0, 0x01, 0x1f, 0xf8, 0xc1, 0x0c, 0x41, 0x31, 0x43, 0x60, 0xcc, 0x10, + 0x1c, 0x33, 0x14, 0x88, 0x1f, 0xf8, 0x41, 0xa2, 0xcc, 0x10, 0xf4, 0xc2, + 0x0c, 0x88, 0x1f, 0x2c, 0x4c, 0x93, 0x28, 0xce, 0x33, 0x43, 0xc2, 0x07, + 0x50, 0xc4, 0x48, 0x89, 0xe2, 0x4c, 0x33, 0x24, 0x7a, 0x00, 0x51, 0x8c, + 0x94, 0x54, 0x8e, 0x35, 0x03, 0x1a, 0xf8, 0x41, 0x1f, 0xf8, 0x01, 0xd7, + 0xf5, 0x41, 0x1f, 0xf8, 0x01, 0xe7, 0x89, 0x42, 0x1f, 0xf8, 0x01, 0xf7, + 0x8d, 0x42, 0x1f, 0xf8, 0x01, 0x07, 0x06, 0xa4, 0xd0, 0x07, 0x7e, 0xc0, + 0x85, 0x41, 0x29, 0xf4, 0x81, 0x1f, 0x70, 0x62, 0x60, 0x0a, 0x7d, 0xe0, + 0x07, 0xdc, 0x18, 0x9c, 0x42, 0x1f, 0xf8, 0x01, 0x47, 0x06, 0x33, 0x48, + 0xa0, 0x70, 0x61, 0xa1, 0x90, 0xf9, 0x01, 0x1f, 0x68, 0x9b, 0x38, 0x94, + 0x41, 0x28, 0x98, 0x41, 0x1f, 0x24, 0x67, 0xe0, 0xa0, 0xc1, 0x0c, 0x8a, + 0x1f, 0x90, 0x82, 0x1f, 0xa4, 0x81, 0x1a, 0x90, 0x42, 0x2a, 0xf8, 0xc1, + 0x1a, 0xb0, 0xc1, 0x0c, 0x52, 0x1f, 0x5c, 0x18, 0x2a, 0x64, 0x7c, 0xc0, + 0x07, 0xda, 0x46, 0x0e, 0x65, 0x80, 0x0a, 0x66, 0x40, 0x0a, 0x49, 0x1b, + 0x38, 0x6e, 0x30, 0x83, 0xa2, 0x0a, 0x6f, 0x90, 0xf9, 0x01, 0x1f, 0xc0, + 0x41, 0x12, 0x07, 0x8e, 0x1c, 0xcc, 0xa0, 0xac, 0xc2, 0x1b, 0x64, 0x7c, + 0xc0, 0x07, 0x70, 0x90, 0xc4, 0x81, 0x33, 0x07, 0x33, 0x24, 0xac, 0x40, + 0x07, 0x99, 0x1f, 0xf0, 0x41, 0x52, 0x07, 0x8e, 0x1d, 0xcc, 0x80, 0xfc, + 0x02, 0x38, 0x84, 0xc3, 0x38, 0x94, 0x83, 0x39, 0x9c, 0x03, 0x3a, 0xcc, + 0x30, 0xfc, 0x81, 0x2f, 0xa4, 0xc3, 0x0c, 0x41, 0x1e, 0xcc, 0x30, 0xe0, + 0xc1, 0x3a, 0xb4, 0xc2, 0x0c, 0x03, 0xc7, 0x0e, 0xad, 0x30, 0x43, 0x74, + 0x07, 0xed, 0xd0, 0x0a, 0xed, 0xe0, 0x0a, 0xed, 0xf0, 0x0a, 0xed, 0x00, + 0x0b, 0xed, 0x10, 0x0b, 0xed, 0x20, 0x0b, 0xed, 0x30, 0x0b, 0xed, 0x40, + 0x0b, 0x33, 0x0c, 0xee, 0xd0, 0x0e, 0xae, 0x50, 0x76, 0x00, 0x88, 0x01, + 0x1a, 0x88, 0x81, 0x18, 0x88, 0x01, 0x27, 0x06, 0x62, 0x20, 0x06, 0x62, + 0x20, 0x06, 0x62, 0x20, 0x06, 0x62, 0x20, 0x06, 0x62, 0x20, 0x06, 0x62, + 0x20, 0x06, 0x62, 0x20, 0x06, 0x68, 0x80, 0x06, 0x68, 0x80, 0x06, 0x68, + 0x80, 0x06, 0x6e, 0xe0, 0x06, 0x16, 0x1d, 0xe8, 0x81, 0x65, 0x59, 0x7a, + 0xc0, 0x99, 0x02, 0x2b, 0xb0, 0x02, 0xdd, 0xf8, 0x05, 0x4a, 0xf8, 0x85, + 0x3d, 0xd8, 0x83, 0x3a, 0xc0, 0x03, 0x1d, 0x70, 0x74, 0xe0, 0x06, 0xbc, + 0x21, 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d, 0xcd, 0xae, 0xcd, 0xa5, 0xed, + 0x8d, 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c, 0x2d, 0xec, 0x6c, 0x6e, 0x14, + 0x81, 0x16, 0x6a, 0xe1, 0x14, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2, + 0x32, 0x37, 0xba, 0x51, 0x02, 0x5b, 0xb8, 0x25, 0x2c, 0x4d, 0xce, 0xc5, + 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x94, 0xe0, 0x16, 0x8e, 0x0a, + 0x4b, 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b, 0xab, 0x0b, 0x3b, 0x2b, 0xfb, + 0xb2, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0xc0, 0x85, 0x9b, + 0xc2, 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda, 0xe0, 0xd2, 0xd8, 0xca, 0xbe, + 0xde, 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0x46, 0x19, 0x72, 0x41, 0x17, + 0x76, 0xe1, 0x98, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, 0xb6, + 0x32, 0x37, 0xba, 0x51, 0x82, 0x74, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00, + 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, + 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, + 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, + 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, + 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4, + 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81, + 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08, + 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01, + 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c, + 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c, + 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c, + 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1, + 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, + 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, + 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0xd9, 0x00, 0x00, + 0x00, 0x13, 0x04, 0x45, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, + 0x00, 0x84, 0xd5, 0xc0, 0x08, 0x00, 0x95, 0x33, 0x00, 0x64, 0x8e, 0x00, + 0x8c, 0x25, 0x04, 0x00, 0xad, 0x25, 0x50, 0x04, 0x65, 0x40, 0xef, 0x58, + 0x03, 0x10, 0x08, 0x73, 0x0c, 0x50, 0x1c, 0xc4, 0xc1, 0x1c, 0x03, 0xe4, + 0xc4, 0xc1, 0x58, 0x03, 0x30, 0x10, 0x04, 0x8c, 0x00, 0x8c, 0x11, 0x80, + 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, 0x63, + 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, 0xcc, 0x00, 0x50, 0x30, 0x03, 0x30, + 0x03, 0x30, 0x07, 0xc1, 0x07, 0x7b, 0xc0, 0x07, 0x7f, 0x40, 0xc2, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x34, 0x00, 0x00, + 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0xc8, 0x49, 0x00, 0x00, 0x00, + 0x00, 0x63, 0x60, 0x61, 0x98, 0x05, 0x00, 0x00, 0x00, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, - 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x73, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x74, - 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, - 0x72, 0x67, 0x28, 0x34, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, - 0x28, 0x33, 0x29, 0x5f, 0x5a, 0x54, 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, - 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, - 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, - 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, - 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x00, 0x00, 0x00, 0x13, 0x84, 0x32, - 0xc0, 0x26, 0x08, 0x65, 0x90, 0x4d, 0x10, 0xca, 0x40, 0x9b, 0x20, 0x94, - 0xc1, 0x36, 0x41, 0x28, 0x03, 0x6e, 0x82, 0x50, 0x06, 0xdd, 0x04, 0xa1, - 0x0c, 0xbc, 0x09, 0x42, 0x19, 0x7c, 0x2b, 0x84, 0x78, 0x08, 0x87, 0x15, - 0x83, 0x3c, 0xc4, 0x83, 0x38, 0xac, 0x18, 0xe6, 0x21, 0x1e, 0xc6, 0x61, - 0xc5, 0x40, 0x0f, 0xf1, 0x40, 0x0e, 0x2b, 0x86, 0x7a, 0x88, 0x87, 0x72, - 0xd8, 0x20, 0xcc, 0x83, 0x3c, 0x6c, 0x10, 0xea, 0x81, 0x1e, 0x36, 0x04, - 0xf4, 0xb0, 0x61, 0xa8, 0x87, 0x79, 0x90, 0x87, 0x0d, 0x01, 0x3a, 0x6c, - 0x18, 0xce, 0x41, 0x1f, 0xd2, 0x61, 0xc3, 0xc0, 0xed, 0x43, 0x3a, 0x6c, - 0x88, 0xcc, 0x81, 0x1f, 0xd2, 0x81, 0x1f, 0xd4, 0x81, 0x1f, 0xd6, 0x81, - 0x1f, 0xd8, 0x81, 0x1f, 0xda, 0x81, 0x1f, 0xdc, 0x81, 0x1f, 0xde, 0x81, - 0x1f, 0xe0, 0x61, 0xc3, 0xd0, 0x0f, 0xfc, 0x90, 0x0e, 0x1b, 0x82, 0x7a, - 0xd8, 0x30, 0xd0, 0xc3, 0x3c, 0xc8, 0xc3, 0x86, 0xa1, 0x1f, 0xf8, 0x81, - 0x1d, 0x00, 0x00, 0x00, 0x00, 0x23, 0x06, 0x0d, 0x11, 0x82, 0x60, 0x10, - 0x06, 0x78, 0x80, 0x59, 0x5b, 0x25, 0x51, 0x8a, 0x42, 0x07, 0xa3, 0x09, - 0x01, 0x30, 0x62, 0xe0, 0x10, 0x21, 0x08, 0x06, 0xdf, 0x1e, 0x64, 0x58, - 0x67, 0x07, 0x17, 0x65, 0x31, 0x8c, 0x1d, 0x8c, 0x26, 0x04, 0xc0, 0x18, - 0x42, 0xa0, 0x06, 0x83, 0x0c, 0xc4, 0x21, 0xcd, 0x31, 0x04, 0xc2, 0x35, - 0x62, 0xe0, 0x10, 0x21, 0x08, 0x06, 0x1f, 0x28, 0x78, 0x9d, 0x18, 0xf4, - 0x01, 0x97, 0x6d, 0x51, 0xb4, 0x07, 0xa3, 0x09, 0x01, 0x30, 0x86, 0x10, - 0xbc, 0xc1, 0x1c, 0x03, 0x11, 0x68, 0x47, 0x06, 0xe7, 0x52, 0x10, 0x94, - 0x41, 0x86, 0x00, 0xda, 0x8c, 0x08, 0xc0, 0x7f, 0x23, 0x03, 0x1a, 0xd4, - 0x41, 0x29, 0x5c, 0x70, 0x2e, 0x05, 0x41, 0x19, 0x64, 0x08, 0x2a, 0x30, - 0x18, 0x31, 0x38, 0x8a, 0x10, 0x04, 0x0b, 0xff, 0xc8, 0x5a, 0xa1, 0x08, - 0xe6, 0x18, 0xac, 0x40, 0x0f, 0x36, 0x52, 0xb8, 0xc1, 0x1e, 0xac, 0x42, - 0x2a, 0x98, 0xc1, 0x05, 0xe7, 0x52, 0x10, 0x94, 0x41, 0x86, 0x60, 0x33, - 0x83, 0x11, 0x83, 0xa3, 0x08, 0x41, 0xb0, 0xf0, 0x8f, 0x6c, 0x16, 0x96, - 0x60, 0x8e, 0xc1, 0x08, 0xd6, 0x60, 0x23, 0x05, 0x1d, 0x84, 0x42, 0x2c, - 0xbc, 0xc2, 0x1a, 0x5c, 0x70, 0x2e, 0x05, 0x41, 0x19, 0x64, 0x08, 0xc2, - 0x80, 0x0d, 0x46, 0x0c, 0x8e, 0x22, 0x04, 0xc1, 0xc2, 0x3f, 0xb2, 0x5c, - 0x88, 0x82, 0x39, 0x06, 0x23, 0x80, 0x83, 0x3d, 0x0c, 0x7b, 0x70, 0x0a, - 0xb5, 0x40, 0x01, 0x30, 0xf6, 0x30, 0xf4, 0x41, 0x2a, 0xd8, 0x02, 0x05, - 0xc0, 0x18, 0x31, 0x28, 0x8a, 0x10, 0x04, 0x83, 0x0b, 0x1c, 0x86, 0x59, - 0x86, 0x60, 0x09, 0x86, 0x23, 0xa6, 0x37, 0x50, 0xfc, 0x63, 0x96, 0x61, - 0x10, 0x02, 0xa3, 0xde, 0x40, 0xfc, 0x67, 0x09, 0x08, 0xab, 0xde, 0x00, - 0xfc, 0x47, 0x0c, 0x8c, 0x22, 0x04, 0xc1, 0xc2, 0x3f, 0xa8, 0x72, 0x08, - 0x2c, 0x80, 0x03, 0xf1, 0x1f, 0x31, 0x38, 0x8a, 0x10, 0x04, 0x0b, 0xff, - 0x90, 0xd0, 0x21, 0x80, 0x83, 0x59, 0x02, 0x62, 0xa0, 0x02, 0x50, 0x04, - 0x61, 0x98, 0x63, 0x78, 0x83, 0x60, 0x16, 0x86, 0x23, 0xaa, 0x3b, 0x50, - 0xfc, 0x63, 0x96, 0xc1, 0x28, 0x02, 0xb3, 0xee, 0x40, 0xfc, 0x67, 0x09, - 0x0e, 0xbb, 0xee, 0x00, 0xfc, 0x47, 0x0c, 0x8c, 0x22, 0x04, 0xc1, 0xc2, - 0x3f, 0xa8, 0x76, 0x08, 0x2c, 0xc0, 0x03, 0xf1, 0x1f, 0x31, 0x38, 0x8a, - 0x10, 0x04, 0x0b, 0xff, 0x90, 0xe0, 0x21, 0xc0, 0x83, 0x59, 0x82, 0x63, - 0xa0, 0x02, 0x50, 0x0a, 0xc1, 0x98, 0x63, 0x40, 0x02, 0x53, 0x18, 0x8e, - 0xb8, 0xfe, 0x40, 0xf1, 0x8f, 0x59, 0x86, 0x04, 0x09, 0x0c, 0xfb, 0x03, - 0xf1, 0x9f, 0x25, 0x50, 0x2c, 0xfb, 0x03, 0xf0, 0x1f, 0x31, 0x30, 0x8a, - 0x10, 0x04, 0x0b, 0xff, 0xa0, 0xea, 0x21, 0xb0, 0x00, 0x14, 0xc4, 0x7f, - 0xc4, 0xe0, 0x28, 0x42, 0x10, 0x2c, 0xfc, 0x43, 0xc2, 0x87, 0x00, 0x14, - 0x66, 0x09, 0x94, 0x81, 0x0a, 0x40, 0x41, 0x84, 0x64, 0x8e, 0x01, 0x09, - 0x5a, 0x61, 0x96, 0x60, 0x19, 0xa8, 0x08, 0x04, 0x85, 0x0f, 0x80, 0x41, - 0x86, 0x40, 0x14, 0x5a, 0x61, 0x8e, 0x21, 0x14, 0x38, 0x73, 0x18, 0x64, - 0x08, 0x44, 0xa1, 0x15, 0x6c, 0x08, 0xc4, 0x7f, 0x90, 0x21, 0x20, 0x05, - 0x57, 0x98, 0x63, 0x08, 0x50, 0x61, 0x16, 0x2c, 0x08, 0x07, 0xf1, 0xcf, - 0x20, 0x20, 0x06, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0, - 0xa8, 0x07, 0xc4, 0x1e, 0xb6, 0x14, 0xc2, 0x51, 0x0f, 0x88, 0x3d, 0x6c, - 0x29, 0x8e, 0xa3, 0x1e, 0x10, 0x7b, 0xd8, 0x52, 0x30, 0xc7, 0x3d, 0x20, - 0xf8, 0xb0, 0xa5, 0x88, 0x8e, 0x7b, 0x40, 0xf0, 0x61, 0x4b, 0x71, 0x1d, - 0xf7, 0x80, 0xe0, 0xc3, 0x96, 0xa2, 0x3b, 0xee, 0x01, 0xc1, 0x87, 0x2d, - 0x87, 0x18, 0x04, 0xfd, 0x70, 0xf8, 0x03, 0xf2, 0x0f, 0x5b, 0x0e, 0x32, - 0x08, 0x40, 0xe2, 0xf0, 0x07, 0xe4, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x71, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, - 0x22, 0x84, 0x00, 0xb4, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x65, 0x0c, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, - 0x20, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x4e, 0x56, 0x31, 0x32, 0x5f, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x61, 0x69, 0x72, 0x2d, + 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, + 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x73, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x74, 0x65, + 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, + 0x67, 0x28, 0x34, 0x29, 0x00, 0x2b, 0x84, 0x7a, 0x80, 0x87, 0x15, 0x83, + 0x3d, 0xd4, 0x43, 0x3c, 0xac, 0x18, 0xee, 0xa1, 0x1e, 0xe4, 0x61, 0xc5, + 0x80, 0x0f, 0xf5, 0x30, 0x0f, 0x2b, 0x86, 0x7c, 0xa8, 0x07, 0x7a, 0xd8, + 0x10, 0xd8, 0xc3, 0x86, 0x21, 0x1f, 0xf0, 0xe1, 0x1e, 0x36, 0x08, 0xf8, + 0x70, 0x0f, 0x1b, 0x04, 0x7b, 0xc8, 0x87, 0x0d, 0x41, 0x3e, 0x6c, 0x18, + 0xec, 0x01, 0x1f, 0xee, 0x01, 0x7b, 0x18, 0x34, 0x33, 0xb0, 0x03, 0x0a, + 0x80, 0x31, 0x1c, 0x11, 0x24, 0x81, 0x7f, 0xcc, 0x32, 0x04, 0x42, 0x30, + 0x62, 0xd0, 0x18, 0x21, 0x08, 0x06, 0x67, 0xb0, 0x07, 0x5b, 0xe6, 0x61, + 0xd5, 0xc5, 0x30, 0x77, 0x30, 0x9a, 0x10, 0x00, 0x23, 0x06, 0x8d, 0x11, + 0x82, 0x60, 0x70, 0x06, 0x7d, 0xc0, 0x6d, 0x60, 0xa0, 0x5d, 0x99, 0xe3, + 0xe4, 0xc1, 0x68, 0x42, 0x00, 0x0c, 0x32, 0x0c, 0xca, 0x34, 0xc8, 0x20, + 0x30, 0xd3, 0x20, 0x83, 0x10, 0x4c, 0x37, 0x06, 0xf0, 0x52, 0x10, 0x94, + 0x41, 0x86, 0x00, 0xca, 0x8c, 0x08, 0xc0, 0x7f, 0x23, 0xc3, 0x19, 0xd0, + 0x01, 0x29, 0x5c, 0x00, 0x2f, 0x05, 0x41, 0x19, 0x64, 0x08, 0x2a, 0x6f, + 0xc4, 0xe0, 0x38, 0x42, 0x10, 0x2c, 0xfc, 0x63, 0x83, 0x85, 0x22, 0x98, + 0x63, 0xb0, 0x82, 0x3c, 0xd8, 0x48, 0xd1, 0x06, 0x7a, 0xa0, 0x0a, 0xa8, + 0x40, 0x06, 0x17, 0xc0, 0x4b, 0x41, 0x50, 0x06, 0x19, 0x82, 0x8d, 0x0c, + 0x46, 0x0c, 0x8e, 0x23, 0x04, 0xc1, 0xc2, 0x3f, 0x36, 0x5b, 0x58, 0x82, + 0x39, 0x06, 0x23, 0x48, 0x83, 0x8d, 0x14, 0x73, 0x00, 0x0a, 0xb0, 0xe0, + 0x0a, 0x69, 0x70, 0x01, 0xbc, 0x14, 0x04, 0x65, 0x90, 0x21, 0x08, 0x03, + 0x35, 0x18, 0x31, 0x38, 0x8e, 0x10, 0x04, 0x0b, 0xff, 0xd8, 0x78, 0x21, + 0x0a, 0xe6, 0x18, 0x8c, 0xc0, 0x0d, 0x66, 0x09, 0x88, 0xe1, 0x88, 0xcf, + 0x0c, 0x02, 0xff, 0x98, 0x65, 0x18, 0x88, 0x60, 0xc4, 0xa0, 0x31, 0x42, + 0x10, 0x0c, 0xce, 0x20, 0x17, 0xf2, 0xe0, 0x0e, 0xf8, 0xc0, 0x0e, 0xe6, + 0xa0, 0x0e, 0xd4, 0x40, 0x0d, 0x6a, 0x61, 0x34, 0x21, 0x00, 0x46, 0x0c, + 0x1a, 0x23, 0x04, 0xc1, 0xe0, 0x0c, 0x76, 0x41, 0x0f, 0xf2, 0xc0, 0x0f, + 0xf0, 0xa0, 0x0e, 0xee, 0x80, 0x0d, 0xd8, 0xe0, 0x16, 0x46, 0x13, 0x02, + 0x60, 0x90, 0x21, 0x48, 0x03, 0x3b, 0x18, 0x64, 0x20, 0xd2, 0x40, 0x0e, + 0x06, 0x19, 0x04, 0x34, 0x90, 0x83, 0x41, 0x06, 0x21, 0x90, 0x83, 0x13, + 0x05, 0x78, 0x29, 0x08, 0xca, 0x20, 0x43, 0xf0, 0x06, 0x78, 0x60, 0x44, + 0x00, 0xfe, 0x1b, 0x19, 0x4c, 0x61, 0x16, 0xc6, 0xe1, 0x02, 0x78, 0x29, + 0x08, 0xca, 0x20, 0x43, 0x40, 0x07, 0x7d, 0x30, 0x62, 0x70, 0x1c, 0x21, + 0x08, 0x16, 0xfe, 0xb1, 0xbd, 0x43, 0x11, 0xcc, 0x31, 0xd4, 0x41, 0x80, + 0x0b, 0x1b, 0x29, 0x58, 0x21, 0x17, 0xd2, 0xe1, 0x1c, 0x46, 0xe1, 0x02, + 0x78, 0x29, 0x08, 0xca, 0x20, 0x43, 0xa0, 0x07, 0xa3, 0x30, 0x62, 0x70, + 0x1c, 0x21, 0x08, 0x16, 0xfe, 0xb1, 0xd5, 0xc3, 0x12, 0xcc, 0x31, 0x18, + 0x01, 0x2a, 0x6c, 0xa4, 0x90, 0x85, 0x5f, 0x78, 0x87, 0x76, 0x40, 0x85, + 0x0b, 0xe0, 0xa5, 0x20, 0x28, 0x83, 0x0c, 0x01, 0x28, 0xa4, 0xc2, 0x88, + 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0xb6, 0x0f, 0x51, 0x30, 0xc7, + 0x60, 0x04, 0xad, 0x30, 0x4b, 0x40, 0x0c, 0x74, 0x04, 0xa0, 0x10, 0x08, + 0x83, 0x48, 0x08, 0x73, 0x0c, 0x01, 0x2a, 0xb8, 0xc2, 0x88, 0xc1, 0x81, + 0xc4, 0x20, 0x58, 0xf8, 0x07, 0x44, 0x12, 0xc1, 0x2e, 0x58, 0xe0, 0x0b, + 0xe2, 0x9f, 0x41, 0x40, 0x0c, 0x19, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, + 0x70, 0x87, 0x23, 0x1f, 0x10, 0x7d, 0xd8, 0x52, 0x10, 0xc7, 0x3e, 0x20, + 0xfc, 0xb0, 0xa5, 0x30, 0x8e, 0x7d, 0x40, 0xf8, 0x61, 0x4b, 0xc1, 0x1c, + 0xfd, 0x80, 0xf8, 0xc3, 0x96, 0x22, 0x3a, 0xfa, 0x01, 0xf1, 0x87, 0x2d, + 0xc5, 0x75, 0xf4, 0x03, 0xe2, 0x0f, 0x5b, 0x8a, 0xee, 0xe8, 0x07, 0xc4, + 0x1f, 0xb6, 0x14, 0x64, 0x70, 0xec, 0x03, 0xc2, 0x0f, 0x5b, 0x0a, 0x33, + 0x38, 0xf6, 0x01, 0xe1, 0x87, 0x2d, 0x45, 0x1b, 0x1c, 0xfd, 0x80, 0xf8, + 0xc3, 0x96, 0x42, 0x0e, 0x8e, 0x7e, 0x40, 0xfc, 0x61, 0x4b, 0x81, 0x07, + 0x47, 0x3f, 0x20, 0xfe, 0xb0, 0xa5, 0xf0, 0x83, 0xa3, 0x1f, 0x10, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0xbe, 0x01, 0x00, + 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00, 0x00, 0x4f, 0x00, 0x00, + 0x00, 0x54, 0xce, 0x00, 0xd0, 0x5a, 0x02, 0x45, 0x40, 0xef, 0x58, 0x03, + 0x10, 0x08, 0x23, 0x00, 0x34, 0xcf, 0x41, 0x40, 0x4e, 0x93, 0x06, 0x63, + 0x11, 0x40, 0x20, 0x1c, 0x04, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, + 0x18, 0x81, 0x2c, 0xba, 0x3d, 0x0d, 0x06, 0x63, 0x04, 0xb5, 0x5a, 0xab, + 0xed, 0x37, 0x46, 0xd0, 0xc7, 0xa2, 0x8b, 0x7f, 0x63, 0x04, 0x6e, 0x1f, + 0x8b, 0xb6, 0x2f, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, + 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, + 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xbc, 0x7b, 0x5a, 0xde, 0xdf, + 0x18, 0x81, 0xce, 0x9a, 0x73, 0x08, 0x06, 0x23, 0x00, 0x63, 0x04, 0x20, + 0x08, 0x82, 0x24, 0x18, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, + 0x03, 0x40, 0xc1, 0x0c, 0xc0, 0x0c, 0xc0, 0x1c, 0x44, 0x1d, 0xec, 0x41, + 0x1d, 0xf8, 0x01, 0x15, 0x33, 0x00, 0x23, 0x00, 0x33, 0x00, 0x63, 0x0d, + 0x20, 0x08, 0x82, 0xf8, 0x07, 0x82, 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82, + 0xf8, 0x37, 0xd6, 0xc0, 0xb6, 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4, + 0xc7, 0xb6, 0xf3, 0x4f, 0x7a, 0x63, 0x0d, 0x20, 0x08, 0xb2, 0xf5, 0x2f, + 0x80, 0x20, 0xc8, 0xd6, 0xbf, 0x00, 0x82, 0x20, 0x5b, 0xff, 0xc2, 0x58, + 0x03, 0x08, 0x82, 0x6b, 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x80, + 0x20, 0xb8, 0xe6, 0x60, 0x30, 0xd6, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, + 0x08, 0xd2, 0x6d, 0x0e, 0x06, 0x20, 0x48, 0xb7, 0x39, 0x18, 0x8c, 0x35, + 0xac, 0x23, 0x1e, 0xb3, 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x3a, + 0xe2, 0x31, 0x0b, 0x06, 0x63, 0x0d, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, + 0x20, 0x8c, 0x87, 0x63, 0x00, 0x82, 0x30, 0x1e, 0x8e, 0xc1, 0x58, 0x83, + 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, + 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, + 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, + 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0x00, 0x1b, 0x06, 0x77, 0x68, 0x87, 0x57, 0xd8, 0x30, 0xb8, 0x43, 0x3b, + 0xd0, 0xc2, 0x86, 0xc1, 0x1d, 0xda, 0x21, 0x16, 0x36, 0x0c, 0xee, 0xd0, + 0x0e, 0xb2, 0xb0, 0x61, 0x70, 0x87, 0x76, 0x98, 0x85, 0x0d, 0x83, 0x3b, + 0xb4, 0x03, 0x2c, 0x6c, 0x18, 0xdc, 0xa1, 0x1d, 0x5a, 0x01, 0x00, 0x00, + 0x00, 0x7b, 0x18, 0xce, 0x20, 0x0e, 0x44, 0x81, 0x02, 0x60, 0x0c, 0x47, + 0x04, 0x55, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0x0c, 0x32, 0xac, 0xc1, + 0x64, 0x06, 0x7b, 0x18, 0xd6, 0xa0, 0x0e, 0xec, 0x80, 0x02, 0x60, 0x8c, + 0x18, 0x18, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x84, 0xc1, 0x2a, 0x0c, 0x23, + 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x5f, 0x2b, 0x04, 0x90, 0x05, + 0x10, 0xf8, 0x8f, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x7c, 0xad, + 0x10, 0x54, 0x36, 0x44, 0xe2, 0x6f, 0x51, 0x10, 0xfe, 0x36, 0x04, 0xe4, + 0x3f, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x11, 0x06, 0xb2, 0x10, + 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x7c, 0xb4, 0x10, 0x4c, + 0x16, 0x4c, 0xe2, 0x3f, 0xc7, 0xd0, 0x2d, 0xa1, 0x30, 0xc8, 0x10, 0x78, + 0x73, 0x60, 0x43, 0x40, 0xfe, 0x83, 0x0c, 0x01, 0x18, 0xd0, 0xc1, 0x20, + 0x43, 0xc0, 0x07, 0x74, 0x30, 0x4b, 0x20, 0x0c, 0x54, 0x04, 0x42, 0xa0, + 0x0f, 0xc0, 0x1e, 0x86, 0x3e, 0x38, 0x05, 0x5b, 0xa0, 0x00, 0x18, 0xc3, + 0x11, 0x01, 0x1b, 0x38, 0xfe, 0x31, 0xcb, 0x30, 0x10, 0xc1, 0x20, 0x03, + 0x91, 0x06, 0x7c, 0xb0, 0x87, 0x21, 0x14, 0x56, 0xc1, 0x15, 0x28, 0x00, + 0xc6, 0x1e, 0x86, 0x51, 0x68, 0x85, 0x57, 0xa0, 0x00, 0x18, 0x23, 0x06, + 0x4a, 0x12, 0x83, 0x60, 0xe1, 0x1f, 0x9d, 0x39, 0x14, 0xdd, 0x31, 0x04, + 0x83, 0x0c, 0x01, 0x1b, 0x80, 0xc2, 0x20, 0x43, 0xb0, 0x80, 0xc2, 0x2c, + 0x01, 0x31, 0x50, 0x11, 0x08, 0x03, 0x26, 0x0c, 0x47, 0x84, 0x01, 0x1f, + 0x04, 0xfe, 0x31, 0xcb, 0x50, 0x4c, 0xc1, 0x1e, 0x06, 0x55, 0xa0, 0x05, + 0x72, 0xa0, 0x00, 0x18, 0xc3, 0x11, 0xc1, 0x1f, 0x04, 0xfe, 0x31, 0xcb, + 0x60, 0x1c, 0xc1, 0x20, 0x43, 0x61, 0x07, 0xa9, 0xb0, 0x87, 0xc1, 0x15, + 0x70, 0xa1, 0x1c, 0x28, 0x00, 0xc6, 0x1c, 0x83, 0x1d, 0x04, 0xba, 0x30, + 0xc8, 0x10, 0xdc, 0x01, 0x2b, 0x58, 0x50, 0x88, 0xff, 0x20, 0x43, 0x90, + 0x07, 0xad, 0x30, 0x4b, 0xd0, 0x06, 0x7b, 0x18, 0x68, 0xc1, 0x17, 0xd8, + 0x81, 0x02, 0x60, 0xec, 0x61, 0xb0, 0x05, 0x70, 0x68, 0x07, 0x0a, 0x80, + 0x31, 0xc8, 0x00, 0x85, 0x82, 0x2c, 0x8c, 0x18, 0x14, 0x47, 0x08, 0x82, + 0x41, 0xc6, 0x0f, 0xc4, 0x2c, 0x03, 0x22, 0x05, 0x63, 0x08, 0x12, 0x39, + 0x0c, 0x47, 0x04, 0xad, 0xa0, 0xf8, 0xc7, 0x2c, 0x83, 0x92, 0x04, 0x26, + 0xb4, 0x82, 0xf8, 0xcf, 0x12, 0x2c, 0x36, 0xb4, 0x02, 0xf8, 0x8f, 0x18, + 0x18, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x58, 0x22, 0x11, 0x58, 0xe0, 0x0a, + 0xe2, 0x3f, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0x95, 0x44, + 0xe0, 0x0a, 0xb3, 0x04, 0xcb, 0x40, 0x05, 0xa0, 0x24, 0x82, 0x32, 0xc7, + 0xa0, 0x0a, 0x01, 0x3b, 0x8c, 0x21, 0x6c, 0xe1, 0x30, 0x1c, 0x11, 0xd8, + 0x82, 0xe2, 0x1f, 0xb3, 0x0c, 0x0d, 0x13, 0x98, 0x60, 0x0b, 0xe2, 0x3f, + 0x4b, 0xe0, 0xd8, 0x60, 0x0b, 0xe0, 0x3f, 0x62, 0x60, 0x1c, 0x21, 0x08, + 0x16, 0xfe, 0x61, 0xad, 0x44, 0x60, 0xc1, 0x2d, 0x88, 0xff, 0x88, 0xc1, + 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0xe5, 0x12, 0xc1, 0x2d, 0xcc, 0x12, + 0x38, 0x03, 0x15, 0x80, 0xc2, 0x08, 0xcd, 0x1c, 0x43, 0x12, 0xa4, 0xc3, + 0x18, 0x02, 0x19, 0xa4, 0xc3, 0x70, 0x44, 0xf0, 0x0b, 0x8a, 0x7f, 0xcc, + 0x32, 0x40, 0x4f, 0x60, 0xc2, 0x2f, 0x88, 0xff, 0x2c, 0x41, 0x64, 0xc3, + 0x2f, 0x80, 0xff, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x45, + 0x13, 0x81, 0x05, 0xe0, 0x20, 0xfe, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, + 0xe1, 0x1f, 0xd4, 0x4d, 0x04, 0xe0, 0x30, 0x4b, 0x10, 0x0d, 0x54, 0x00, + 0xca, 0x23, 0x40, 0x73, 0x0c, 0x49, 0x10, 0x0f, 0xb3, 0x04, 0xd2, 0x40, + 0x45, 0x20, 0x44, 0x7a, 0x70, 0x0c, 0x32, 0x04, 0xbf, 0x20, 0x0f, 0x73, + 0x0c, 0xbd, 0x00, 0x06, 0x21, 0x31, 0xc8, 0x10, 0xf8, 0xc2, 0x3c, 0xd8, + 0x10, 0x88, 0xff, 0x20, 0x43, 0x00, 0x0e, 0xf4, 0x30, 0x4b, 0xd0, 0x06, + 0xc3, 0x11, 0xb3, 0x60, 0x0e, 0x81, 0x7f, 0xcc, 0x32, 0x50, 0x60, 0x10, + 0x0c, 0x32, 0xd0, 0x41, 0x39, 0xe0, 0xc3, 0x1e, 0x86, 0x7e, 0x38, 0x89, + 0x9a, 0xa0, 0x00, 0x18, 0x7b, 0x18, 0xfe, 0x21, 0x25, 0x6c, 0x82, 0x02, + 0x60, 0xcc, 0x31, 0x9c, 0x43, 0xb0, 0x12, 0x83, 0x0c, 0x01, 0x3a, 0xf4, + 0x83, 0x05, 0x87, 0xf8, 0x0f, 0x32, 0x04, 0xea, 0xe0, 0x0f, 0x23, 0x06, + 0xc5, 0x11, 0x82, 0x60, 0x90, 0xa1, 0xc5, 0x31, 0xcb, 0xf0, 0x55, 0xc1, + 0x18, 0xc2, 0x00, 0x13, 0xc3, 0x11, 0xc1, 0x3f, 0x28, 0xfe, 0x31, 0xcb, + 0x70, 0x59, 0x81, 0x09, 0xff, 0x20, 0xfe, 0xb3, 0x04, 0xd8, 0x88, 0x81, + 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0xd5, 0x16, 0xc3, 0x88, 0xc1, 0x71, + 0x84, 0x20, 0x58, 0xf8, 0x07, 0xf5, 0x16, 0x01, 0x48, 0x58, 0x00, 0x12, + 0xe2, 0x6f, 0x01, 0x48, 0x80, 0xff, 0x2c, 0x01, 0x36, 0x50, 0x01, 0x28, + 0x96, 0x70, 0xcd, 0x31, 0xc8, 0x43, 0x80, 0x13, 0x63, 0x08, 0x4c, 0x4b, + 0x0c, 0x47, 0x04, 0x28, 0xa1, 0xf8, 0xc7, 0x2c, 0x83, 0x96, 0x05, 0x26, + 0xa0, 0x84, 0xf8, 0xcf, 0x12, 0x6c, 0x23, 0x06, 0xc6, 0x11, 0x82, 0x60, + 0xe1, 0x1f, 0x96, 0x5d, 0x0c, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, + 0x1f, 0x14, 0x5e, 0x04, 0x29, 0x61, 0x41, 0x4a, 0x88, 0xbf, 0x05, 0x29, + 0x01, 0xfe, 0xb3, 0x04, 0xdb, 0x40, 0x05, 0xa0, 0x64, 0x82, 0x36, 0xc7, + 0x90, 0x04, 0x35, 0x31, 0x86, 0x50, 0xd5, 0xc4, 0x70, 0x44, 0x10, 0x13, + 0x8a, 0x7f, 0xcc, 0x32, 0x74, 0x5c, 0x60, 0x42, 0x4c, 0x88, 0xff, 0x2c, + 0x81, 0x37, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x61, 0xfd, 0xc5, + 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0x85, 0x46, 0x20, + 0x13, 0x16, 0xc8, 0x84, 0xf8, 0x5b, 0x20, 0x13, 0xe0, 0x3f, 0x4b, 0xe0, + 0x0d, 0x54, 0x00, 0x0a, 0x27, 0x74, 0x73, 0x0c, 0x49, 0xd0, 0x13, 0x23, + 0x06, 0xc8, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0xd2, 0x69, 0x04, 0x26, 0x41, + 0x12, 0x83, 0x0c, 0x01, 0x4a, 0xf0, 0xc4, 0x2c, 0xc1, 0x37, 0x50, 0x11, + 0xf8, 0x01, 0x25, 0x78, 0x83, 0x0c, 0x41, 0x4b, 0xf8, 0xc4, 0x2c, 0x41, + 0x1b, 0xcc, 0x32, 0x84, 0x41, 0x1b, 0xf0, 0xc3, 0x20, 0x43, 0x2f, 0xb8, + 0x44, 0x58, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x6c, 0xa8, + 0x11, 0x88, 0xc4, 0x1c, 0xc3, 0x4a, 0x04, 0x71, 0x31, 0x62, 0x70, 0x1c, + 0x21, 0x08, 0x16, 0xfe, 0xb1, 0xa9, 0xc6, 0x30, 0x12, 0x73, 0x0c, 0x42, + 0x70, 0x16, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x1b, 0x6b, + 0x14, 0x24, 0x31, 0xc7, 0x20, 0x04, 0x68, 0x31, 0xc8, 0x10, 0xc8, 0x84, + 0x59, 0x0c, 0x32, 0x04, 0xe5, 0x60, 0x16, 0x7b, 0x18, 0xdc, 0x02, 0x2f, + 0x4c, 0x83, 0x02, 0x60, 0xec, 0x61, 0x80, 0x0b, 0xbd, 0x38, 0x0d, 0x0a, + 0x80, 0x31, 0xc7, 0x80, 0x13, 0x01, 0x5f, 0x0c, 0x32, 0x04, 0x39, 0xe1, + 0x16, 0x16, 0x24, 0xe2, 0x3f, 0xc8, 0x10, 0xec, 0xc4, 0x5b, 0x8c, 0x18, + 0x14, 0x47, 0x08, 0x82, 0x41, 0x96, 0x1b, 0xc7, 0x2c, 0x03, 0x1b, 0x88, + 0x41, 0x30, 0x86, 0x30, 0x84, 0xc6, 0x70, 0x44, 0x00, 0x17, 0x8a, 0x7f, + 0xcc, 0x32, 0x90, 0xc1, 0x18, 0x04, 0x26, 0xc0, 0x85, 0xf8, 0xcf, 0x12, + 0x94, 0xc1, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0xe5, 0x1b, + 0xc3, 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0x05, 0x1e, 0x41, + 0x5c, 0x58, 0x10, 0x17, 0xe2, 0x6f, 0x41, 0x5c, 0x80, 0xff, 0x2c, 0x41, + 0x19, 0x0c, 0x54, 0x00, 0xca, 0x18, 0x08, 0x64, 0x30, 0xc7, 0x30, 0x16, + 0x41, 0x6a, 0x8c, 0x21, 0x30, 0x7e, 0x31, 0x1c, 0x11, 0xe4, 0x85, 0xe2, + 0x1f, 0xb3, 0x0c, 0x67, 0x60, 0x06, 0x81, 0x09, 0x79, 0x21, 0xfe, 0xb3, + 0x04, 0x68, 0x30, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x61, 0x9d, + 0xc7, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xa5, 0x47, + 0xa0, 0x17, 0x16, 0xe8, 0x85, 0xf8, 0x5b, 0xa0, 0x17, 0xe0, 0x3f, 0x4b, + 0x80, 0x06, 0x03, 0x15, 0x80, 0x62, 0x06, 0xc2, 0x19, 0xcc, 0x31, 0x24, + 0x81, 0x69, 0x8c, 0x21, 0x54, 0xa6, 0x31, 0x1c, 0x11, 0x88, 0x86, 0xe2, + 0x1f, 0xb3, 0x0c, 0x6a, 0x90, 0x06, 0x81, 0x09, 0xa2, 0x21, 0xfe, 0xb3, + 0x04, 0x6b, 0x30, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x61, 0xc1, + 0xc7, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xc9, 0x47, + 0x30, 0x1a, 0x16, 0x8c, 0x86, 0xf8, 0x5b, 0x30, 0x1a, 0xe0, 0x3f, 0x4b, + 0xb0, 0x06, 0x03, 0x15, 0x80, 0x92, 0x06, 0x82, 0x1a, 0xcc, 0x31, 0x24, + 0x81, 0x6b, 0x8c, 0x18, 0x20, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x48, 0xf8, + 0x11, 0xdc, 0x45, 0x5d, 0x0c, 0x32, 0x04, 0x79, 0xd1, 0x1a, 0xb3, 0x04, + 0x6c, 0x30, 0x50, 0x11, 0xf8, 0x41, 0x18, 0x08, 0x6b, 0x30, 0xc8, 0x10, + 0xf8, 0xc5, 0x6b, 0xcc, 0x12, 0xb4, 0xc1, 0x40, 0x4b, 0xc0, 0x23, 0x06, + 0x8f, 0x48, 0x3c, 0xf2, 0xc9, 0x02, 0x1b, 0xf0, 0x08, 0x18, 0x0c, 0xb4, + 0x04, 0x28, 0x62, 0xe8, 0x85, 0x64, 0x0e, 0x1f, 0xc1, 0x06, 0xfc, 0x02, + 0x06, 0x83, 0x0c, 0x81, 0x10, 0x1b, 0x19, 0x04, 0xc4, 0x00, 0x00, 0x00, + 0x00, 0x12, 0x00, 0x00, 0x00, 0x5b, 0x86, 0x20, 0x78, 0x87, 0x2d, 0x83, + 0x11, 0xc0, 0xc3, 0x96, 0x21, 0x0b, 0xe2, 0x61, 0xcb, 0xe0, 0x05, 0xf2, + 0xb0, 0x65, 0x00, 0x83, 0x60, 0x1e, 0xb6, 0x0c, 0x69, 0x10, 0xb8, 0xc3, + 0x96, 0xc1, 0x0d, 0x02, 0x7a, 0xd8, 0x32, 0xd4, 0x41, 0x50, 0x0f, 0x5b, + 0x86, 0x3b, 0x08, 0xe8, 0x61, 0xcb, 0xb0, 0x0e, 0x41, 0x3d, 0x6c, 0x19, + 0xda, 0x21, 0xa0, 0x87, 0x2d, 0x43, 0x5a, 0x04, 0xf5, 0xb0, 0x65, 0x58, + 0x8b, 0x80, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, + 0x00, 0x73, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, + 0x00, 0x25, 0x00, 0x00, 0x00, 0x54, 0xce, 0x00, 0xd0, 0x5a, 0x02, 0x45, + 0x40, 0xef, 0x58, 0x03, 0x10, 0x08, 0x23, 0x00, 0x34, 0xcf, 0x41, 0x40, + 0x4e, 0xc3, 0x06, 0x04, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, + 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, 0x23, 0x00, 0x14, 0xcc, 0x00, 0xcc, + 0x00, 0x50, 0x31, 0x03, 0x30, 0xd6, 0xc0, 0xb2, 0x67, 0x28, 0x7f, 0xa8, + 0x5f, 0xc6, 0xea, 0x97, 0x9f, 0xba, 0x38, 0x7b, 0x63, 0x0d, 0x7a, 0x0d, + 0xee, 0xb8, 0xa7, 0xe2, 0xb9, 0x6d, 0x7f, 0x6f, 0x9f, 0xd2, 0xa3, 0x37, + 0xd6, 0xb0, 0xce, 0x31, 0x8b, 0x7a, 0x69, 0x08, 0xa3, 0xbb, 0x77, 0xb7, + 0xb1, 0x6a, 0x7f, 0x63, 0x0d, 0x62, 0x2e, 0xa6, 0xfd, 0x07, 0x96, 0x3c, + 0x1b, 0xff, 0xc2, 0x98, 0xae, 0x6a, 0xee, 0x0b, 0x63, 0x0d, 0xff, 0x4c, + 0xfa, 0xbf, 0x2f, 0xd0, 0x35, 0x28, 0xe6, 0x5f, 0x0b, 0xc7, 0x31, 0xe8, + 0x0b, 0x63, 0x0d, 0x73, 0xdf, 0xa6, 0xa9, 0x2f, 0xb4, 0x6e, 0xc8, 0xf3, + 0xbe, 0xc0, 0xe7, 0xac, 0x8f, 0x7f, 0x00, 0x00, 0x00, 0x83, 0x0c, 0xd7, + 0xd1, 0x0c, 0x47, 0x58, 0x4d, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0xcc, + 0x31, 0x24, 0x96, 0x18, 0x0c, 0x32, 0x04, 0x4a, 0x64, 0xc1, 0x26, 0xfe, + 0x83, 0x0c, 0x01, 0x23, 0xcd, 0x12, 0x24, 0xc3, 0x11, 0x5b, 0x14, 0xf8, + 0xc7, 0x2c, 0xc3, 0x90, 0x04, 0xc3, 0x11, 0x9d, 0x14, 0xf8, 0xc7, 0x2c, + 0x03, 0x51, 0x04, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x1b, + 0x28, 0x7c, 0xce, 0x1c, 0x43, 0x14, 0xa4, 0xc1, 0x88, 0xc1, 0x71, 0x84, + 0x20, 0x58, 0xf8, 0xc7, 0x26, 0x0a, 0x61, 0xf0, 0xcc, 0x31, 0x08, 0x01, + 0x37, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0xb1, 0x91, 0xc2, 0x18, + 0x40, 0x73, 0x0c, 0x42, 0xd0, 0xcd, 0x12, 0x14, 0x03, 0x15, 0x81, 0x40, + 0x70, 0xc3, 0x18, 0x42, 0xf0, 0x06, 0x63, 0x08, 0x42, 0x18, 0x8c, 0x21, + 0x0c, 0x61, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xa1, + 0x82, 0x10, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x50, 0xa9, + 0x40, 0x04, 0xc3, 0x11, 0x81, 0x27, 0xf8, 0xc7, 0x2c, 0x83, 0x71, 0x04, + 0x83, 0x0c, 0x87, 0x47, 0x06, 0x36, 0xa8, 0x81, 0xf8, 0x5b, 0x30, 0x06, + 0xe0, 0x6f, 0xc5, 0x1a, 0x88, 0xbf, 0x05, 0x65, 0x00, 0xfe, 0x36, 0x04, + 0xe4, 0x3f, 0xc7, 0x20, 0x06, 0xc1, 0x1e, 0x0c, 0x32, 0x04, 0x63, 0xa0, + 0x06, 0x16, 0x20, 0xe2, 0x3f, 0xc8, 0x10, 0x94, 0xc1, 0x1a, 0xcc, 0x12, + 0x1c, 0x03, 0x15, 0x81, 0x60, 0x88, 0x41, 0x31, 0xcb, 0x80, 0x24, 0xd9, + 0x20, 0x43, 0x90, 0x06, 0x6f, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, + 0xfe, 0xb1, 0xe5, 0x42, 0x40, 0x06, 0x73, 0x0c, 0x6a, 0x10, 0x88, 0xc2, + 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0xb6, 0x0b, 0x43, 0x19, + 0xcc, 0x31, 0x08, 0x41, 0x1d, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, + 0x7f, 0x6c, 0xbd, 0x50, 0x98, 0xc1, 0x1c, 0x83, 0x10, 0xd8, 0xc1, 0x2c, + 0x41, 0x32, 0x50, 0x12, 0x90, 0x42, 0xe0, 0x0a, 0x82, 0x80, 0x40, 0xc7, + 0x20, 0x43, 0x10, 0x07, 0x77, 0x90, 0x01, 0x00, 0x00, 0x71, 0x20, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xd2, + 0x09, 0x18, 0xd0, 0xba, 0x80, 0x07, 0xed, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x65, 0x0c, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, + 0x30, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x01, 0x00, + 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, - 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x98, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x31, 0x00, 0x00, - 0x00, 0x16, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x47, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x54, 0x00, 0x00, - 0x00, 0x21, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x75, 0x00, 0x00, - 0x00, 0x1b, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x27, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x00, 0x00, 0x49, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x5d, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x6d, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x16, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x94, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xa1, 0x00, 0x00, + 0x00, 0x19, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x00, 0x00, 0xba, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xcb, 0x00, 0x00, + 0x00, 0x12, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xdd, 0x00, 0x00, + 0x00, 0x13, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x13, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x03, 0x01, 0x00, + 0x00, 0x1b, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, - 0x78, 0x01, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x59, 0x55, 0x56, - 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x69, 0x72, - 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x66, 0x33, - 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, - 0x62, 0x73, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x74, 0x2e, 0x75, 0x2e, 0x69, 0x31, 0x2e, 0x66, - 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x64, 0x6f, 0x74, 0x2e, - 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, - 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x76, 0x34, 0x66, - 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x32, 0x64, 0x2e, - 0x76, 0x34, 0x66, 0x33, 0x32, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x39, - 0x38, 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, - 0x2d, 0x74, 0x76, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, - 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00 + 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, + 0xa7, 0x02, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x4e, 0x56, 0x31, + 0x32, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x5a, + 0x31, 0x34, 0x47, 0x65, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, + 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x52, 0x55, 0x31, + 0x31, 0x4d, 0x54, 0x4c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x4b, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, + 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x33, 0x66, + 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, + 0x6f, 0x77, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, + 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, 0x66, 0x33, 0x32, 0x61, + 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x2e, 0x75, + 0x2e, 0x69, 0x31, 0x2e, 0x66, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, + 0x2e, 0x64, 0x6f, 0x74, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x5f, 0x5a, + 0x31, 0x32, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x54, 0x6f, 0x6e, 0x65, 0x6d, + 0x61, 0x70, 0x44, 0x76, 0x33, 0x5f, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, + 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78, + 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, + 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, + 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, + 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, + 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, + 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x32, 0x64, 0x2e, 0x76, 0x34, + 0x66, 0x33, 0x32, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, + 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, + 0x74, 0x76, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, + 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -const unsigned int sdl_metallib_len = 29281; +const unsigned int sdl_metallib_len = 37821; diff --git a/libs/SDL3/src/render/opengl/SDL_glfuncs.h b/libs/SDL3/src/render/opengl/SDL_glfuncs.h index 3c0f098d..7e9f2659 100644 --- a/libs/SDL3/src/render/opengl/SDL_glfuncs.h +++ b/libs/SDL3/src/render/opengl/SDL_glfuncs.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/opengl/SDL_render_gl.c b/libs/SDL3/src/render/opengl/SDL_render_gl.c index a721021e..64164a6d 100644 --- a/libs/SDL3/src/render/opengl/SDL_render_gl.c +++ b/libs/SDL3/src/render/opengl/SDL_render_gl.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -410,13 +410,13 @@ static bool convert_format(Uint32 pixel_format, GLint *internalFormat, GLenum *f case SDL_PIXELFORMAT_XRGB8888: *internalFormat = GL_RGBA8; *format = GL_BGRA; - *type = GL_UNSIGNED_INT_8_8_8_8_REV; + *type = GL_UNSIGNED_BYTE; // previously GL_UNSIGNED_INT_8_8_8_8_REV, seeing if this is better in modern times. break; case SDL_PIXELFORMAT_ABGR8888: case SDL_PIXELFORMAT_XBGR8888: *internalFormat = GL_RGBA8; *format = GL_RGBA; - *type = GL_UNSIGNED_INT_8_8_8_8_REV; + *type = GL_UNSIGNED_BYTE; // previously GL_UNSIGNED_INT_8_8_8_8_REV, seeing if this is better in modern times. break; case SDL_PIXELFORMAT_YV12: case SDL_PIXELFORMAT_IYUV: diff --git a/libs/SDL3/src/render/opengl/SDL_shaders_gl.c b/libs/SDL3/src/render/opengl/SDL_shaders_gl.c index cb5ba997..c70bcdb1 100644 --- a/libs/SDL3/src/render/opengl/SDL_shaders_gl.c +++ b/libs/SDL3/src/render/opengl/SDL_shaders_gl.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/opengl/SDL_shaders_gl.h b/libs/SDL3/src/render/opengl/SDL_shaders_gl.h index 7c976ddb..374940a6 100644 --- a/libs/SDL3/src/render/opengl/SDL_shaders_gl.h +++ b/libs/SDL3/src/render/opengl/SDL_shaders_gl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/opengles2/SDL_gles2funcs.h b/libs/SDL3/src/render/opengles2/SDL_gles2funcs.h index 480e029b..bbc47a45 100644 --- a/libs/SDL3/src/render/opengles2/SDL_gles2funcs.h +++ b/libs/SDL3/src/render/opengles2/SDL_gles2funcs.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/opengles2/SDL_render_gles2.c b/libs/SDL3/src/render/opengles2/SDL_render_gles2.c index f0139717..1a013d57 100644 --- a/libs/SDL3/src/render/opengles2/SDL_render_gles2.c +++ b/libs/SDL3/src/render/opengles2/SDL_render_gles2.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/opengles2/SDL_shaders_gles2.c b/libs/SDL3/src/render/opengles2/SDL_shaders_gles2.c index 91f7b267..13879685 100644 --- a/libs/SDL3/src/render/opengles2/SDL_shaders_gles2.c +++ b/libs/SDL3/src/render/opengles2/SDL_shaders_gles2.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/opengles2/SDL_shaders_gles2.h b/libs/SDL3/src/render/opengles2/SDL_shaders_gles2.h index e24cacd6..e71f8ce5 100644 --- a/libs/SDL3/src/render/opengles2/SDL_shaders_gles2.h +++ b/libs/SDL3/src/render/opengles2/SDL_shaders_gles2.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/ps2/SDL_render_ps2.c b/libs/SDL3/src/render/ps2/SDL_render_ps2.c index 28587c52..ddcab9e2 100644 --- a/libs/SDL3/src/render/ps2/SDL_render_ps2.c +++ b/libs/SDL3/src/render/ps2/SDL_render_ps2.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/psp/SDL_render_psp.c b/libs/SDL3/src/render/psp/SDL_render_psp.c index ad5f69fd..3ce5036f 100644 --- a/libs/SDL3/src/render/psp/SDL_render_psp.c +++ b/libs/SDL3/src/render/psp/SDL_render_psp.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/psp/SDL_render_psp_c.h b/libs/SDL3/src/render/psp/SDL_render_psp_c.h index 98bae20e..4d60847b 100644 --- a/libs/SDL3/src/render/psp/SDL_render_psp_c.h +++ b/libs/SDL3/src/render/psp/SDL_render_psp_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_blendfillrect.c b/libs/SDL3/src/render/software/SDL_blendfillrect.c index 785f6287..4e5c7f89 100644 --- a/libs/SDL3/src/render/software/SDL_blendfillrect.c +++ b/libs/SDL3/src/render/software/SDL_blendfillrect.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_blendfillrect.h b/libs/SDL3/src/render/software/SDL_blendfillrect.h index 89975ca1..c1ff4396 100644 --- a/libs/SDL3/src/render/software/SDL_blendfillrect.h +++ b/libs/SDL3/src/render/software/SDL_blendfillrect.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_blendline.c b/libs/SDL3/src/render/software/SDL_blendline.c index 18d51c68..53be2f13 100644 --- a/libs/SDL3/src/render/software/SDL_blendline.c +++ b/libs/SDL3/src/render/software/SDL_blendline.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_blendline.h b/libs/SDL3/src/render/software/SDL_blendline.h index 3c348ce1..c9a8b20e 100644 --- a/libs/SDL3/src/render/software/SDL_blendline.h +++ b/libs/SDL3/src/render/software/SDL_blendline.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_blendpoint.c b/libs/SDL3/src/render/software/SDL_blendpoint.c index 8a528efe..e408453a 100644 --- a/libs/SDL3/src/render/software/SDL_blendpoint.c +++ b/libs/SDL3/src/render/software/SDL_blendpoint.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_blendpoint.h b/libs/SDL3/src/render/software/SDL_blendpoint.h index 629f69f6..6dfe49a5 100644 --- a/libs/SDL3/src/render/software/SDL_blendpoint.h +++ b/libs/SDL3/src/render/software/SDL_blendpoint.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_draw.h b/libs/SDL3/src/render/software/SDL_draw.h index 2e82793c..ec775273 100644 --- a/libs/SDL3/src/render/software/SDL_draw.h +++ b/libs/SDL3/src/render/software/SDL_draw.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_drawline.c b/libs/SDL3/src/render/software/SDL_drawline.c index e43f222c..59ba2688 100644 --- a/libs/SDL3/src/render/software/SDL_drawline.c +++ b/libs/SDL3/src/render/software/SDL_drawline.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_drawline.h b/libs/SDL3/src/render/software/SDL_drawline.h index 8b883888..e88b2c3b 100644 --- a/libs/SDL3/src/render/software/SDL_drawline.h +++ b/libs/SDL3/src/render/software/SDL_drawline.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_drawpoint.c b/libs/SDL3/src/render/software/SDL_drawpoint.c index dc3ffa81..5aa28b36 100644 --- a/libs/SDL3/src/render/software/SDL_drawpoint.c +++ b/libs/SDL3/src/render/software/SDL_drawpoint.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_drawpoint.h b/libs/SDL3/src/render/software/SDL_drawpoint.h index 6a189949..631e7aa7 100644 --- a/libs/SDL3/src/render/software/SDL_drawpoint.h +++ b/libs/SDL3/src/render/software/SDL_drawpoint.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_render_sw.c b/libs/SDL3/src/render/software/SDL_render_sw.c index 77aebd2a..2231724a 100644 --- a/libs/SDL3/src/render/software/SDL_render_sw.c +++ b/libs/SDL3/src/render/software/SDL_render_sw.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_render_sw_c.h b/libs/SDL3/src/render/software/SDL_render_sw_c.h index a17e4120..40d3c3af 100644 --- a/libs/SDL3/src/render/software/SDL_render_sw_c.h +++ b/libs/SDL3/src/render/software/SDL_render_sw_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_rotate.h b/libs/SDL3/src/render/software/SDL_rotate.h index a33b1e3c..ecf84f72 100644 --- a/libs/SDL3/src/render/software/SDL_rotate.h +++ b/libs/SDL3/src/render/software/SDL_rotate.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_triangle.c b/libs/SDL3/src/render/software/SDL_triangle.c index 30a89b6f..c4e16d12 100644 --- a/libs/SDL3/src/render/software/SDL_triangle.c +++ b/libs/SDL3/src/render/software/SDL_triangle.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/software/SDL_triangle.h b/libs/SDL3/src/render/software/SDL_triangle.h index 1fe9ba65..1c5504cf 100644 --- a/libs/SDL3/src/render/software/SDL_triangle.h +++ b/libs/SDL3/src/render/software/SDL_triangle.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm.c b/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm.c index de0a9456..42477f34 100644 --- a/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm.c +++ b/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_memory.c b/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_memory.c index bf0c4553..e37a345c 100644 --- a/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_memory.c +++ b/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_memory.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_memory.h b/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_memory.h index 8bbca3ee..cc548b3b 100644 --- a/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_memory.h +++ b/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_memory.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_shaders.h b/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_shaders.h index ed3e3caa..ef80e039 100644 --- a/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_shaders.h +++ b/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_shaders.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_tools.c b/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_tools.c index e420700f..38d7fd9f 100644 --- a/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_tools.c +++ b/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_tools.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_tools.h b/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_tools.h index d6b80927..023f8598 100644 --- a/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_tools.h +++ b/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_tools.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_types.h b/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_types.h index 64e4808b..19962c73 100644 --- a/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_types.h +++ b/libs/SDL3/src/render/vitagxm/SDL_render_vita_gxm_types.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/vulkan/SDL_render_vulkan.c b/libs/SDL3/src/render/vulkan/SDL_render_vulkan.c index ee8b7dd2..e61a88f5 100644 --- a/libs/SDL3/src/render/vulkan/SDL_render_vulkan.c +++ b/libs/SDL3/src/render/vulkan/SDL_render_vulkan.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -399,7 +399,7 @@ static SDL_PixelFormat VULKAN_VkFormatToSDLPixelFormat(VkFormat vkFormat) case VK_FORMAT_B8G8R8A8_UNORM: return SDL_PIXELFORMAT_ARGB8888; case VK_FORMAT_A2R10G10B10_UNORM_PACK32: - return SDL_PIXELFORMAT_XBGR2101010; + return SDL_PIXELFORMAT_ABGR2101010; case VK_FORMAT_R16G16B16A16_SFLOAT: return SDL_PIXELFORMAT_RGBA64_FLOAT; default: @@ -445,10 +445,9 @@ static VkFormat SDLPixelFormatToVkTextureFormat(Uint32 format, Uint32 output_col switch (format) { case SDL_PIXELFORMAT_RGBA64_FLOAT: return VK_FORMAT_R16G16B16A16_SFLOAT; - case SDL_PIXELFORMAT_XBGR2101010: + case SDL_PIXELFORMAT_ABGR2101010: return VK_FORMAT_A2B10G10R10_UNORM_PACK32; case SDL_PIXELFORMAT_ARGB8888: - case SDL_PIXELFORMAT_XRGB8888: if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) { return VK_FORMAT_B8G8R8A8_SRGB; } @@ -4304,8 +4303,7 @@ static bool VULKAN_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SD renderer->name = VULKAN_RenderDriver.name; SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888); - SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888); - SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR2101010); + SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR2101010); SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT); SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 16384); diff --git a/libs/SDL3/src/render/vulkan/SDL_shaders_vulkan.c b/libs/SDL3/src/render/vulkan/SDL_shaders_vulkan.c index 4eb785c3..6c02cf2d 100644 --- a/libs/SDL3/src/render/vulkan/SDL_shaders_vulkan.c +++ b/libs/SDL3/src/render/vulkan/SDL_shaders_vulkan.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/render/vulkan/SDL_shaders_vulkan.h b/libs/SDL3/src/render/vulkan/SDL_shaders_vulkan.h index 63a81fc2..bc98aa36 100644 --- a/libs/SDL3/src/render/vulkan/SDL_shaders_vulkan.h +++ b/libs/SDL3/src/render/vulkan/SDL_shaders_vulkan.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/sensor/SDL_sensor.c b/libs/SDL3/src/sensor/SDL_sensor.c index 0ce5a766..60e829a9 100644 --- a/libs/SDL3/src/sensor/SDL_sensor.c +++ b/libs/SDL3/src/sensor/SDL_sensor.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/sensor/SDL_sensor_c.h b/libs/SDL3/src/sensor/SDL_sensor_c.h index 141603f7..26a988ef 100644 --- a/libs/SDL3/src/sensor/SDL_sensor_c.h +++ b/libs/SDL3/src/sensor/SDL_sensor_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/sensor/SDL_syssensor.h b/libs/SDL3/src/sensor/SDL_syssensor.h index 01d7286c..1ce63e5d 100644 --- a/libs/SDL3/src/sensor/SDL_syssensor.h +++ b/libs/SDL3/src/sensor/SDL_syssensor.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/sensor/android/SDL_androidsensor.c b/libs/SDL3/src/sensor/android/SDL_androidsensor.c index 33a0e305..87981a16 100644 --- a/libs/SDL3/src/sensor/android/SDL_androidsensor.c +++ b/libs/SDL3/src/sensor/android/SDL_androidsensor.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/sensor/android/SDL_androidsensor.h b/libs/SDL3/src/sensor/android/SDL_androidsensor.h index 7e84b1a4..4b0c6f8f 100644 --- a/libs/SDL3/src/sensor/android/SDL_androidsensor.h +++ b/libs/SDL3/src/sensor/android/SDL_androidsensor.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/sensor/coremotion/SDL_coremotionsensor.h b/libs/SDL3/src/sensor/coremotion/SDL_coremotionsensor.h index 75494fdd..09fc0dce 100644 --- a/libs/SDL3/src/sensor/coremotion/SDL_coremotionsensor.h +++ b/libs/SDL3/src/sensor/coremotion/SDL_coremotionsensor.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/sensor/coremotion/SDL_coremotionsensor.m b/libs/SDL3/src/sensor/coremotion/SDL_coremotionsensor.m index 9c14a537..e5f890ff 100644 --- a/libs/SDL3/src/sensor/coremotion/SDL_coremotionsensor.m +++ b/libs/SDL3/src/sensor/coremotion/SDL_coremotionsensor.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/sensor/dummy/SDL_dummysensor.c b/libs/SDL3/src/sensor/dummy/SDL_dummysensor.c index 1358bd36..ce8145da 100644 --- a/libs/SDL3/src/sensor/dummy/SDL_dummysensor.c +++ b/libs/SDL3/src/sensor/dummy/SDL_dummysensor.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/sensor/dummy/SDL_dummysensor.h b/libs/SDL3/src/sensor/dummy/SDL_dummysensor.h index 7e84b1a4..4b0c6f8f 100644 --- a/libs/SDL3/src/sensor/dummy/SDL_dummysensor.h +++ b/libs/SDL3/src/sensor/dummy/SDL_dummysensor.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/sensor/n3ds/SDL_n3dssensor.c b/libs/SDL3/src/sensor/n3ds/SDL_n3dssensor.c index e3716c28..ac36e700 100644 --- a/libs/SDL3/src/sensor/n3ds/SDL_n3dssensor.c +++ b/libs/SDL3/src/sensor/n3ds/SDL_n3dssensor.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/sensor/vita/SDL_vitasensor.c b/libs/SDL3/src/sensor/vita/SDL_vitasensor.c index 17c2b595..0acc2155 100644 --- a/libs/SDL3/src/sensor/vita/SDL_vitasensor.c +++ b/libs/SDL3/src/sensor/vita/SDL_vitasensor.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/sensor/vita/SDL_vitasensor.h b/libs/SDL3/src/sensor/vita/SDL_vitasensor.h index f9055a1d..f07b6597 100644 --- a/libs/SDL3/src/sensor/vita/SDL_vitasensor.h +++ b/libs/SDL3/src/sensor/vita/SDL_vitasensor.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/sensor/windows/SDL_windowssensor.c b/libs/SDL3/src/sensor/windows/SDL_windowssensor.c index 778d9d96..77da14d0 100644 --- a/libs/SDL3/src/sensor/windows/SDL_windowssensor.c +++ b/libs/SDL3/src/sensor/windows/SDL_windowssensor.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/sensor/windows/SDL_windowssensor.h b/libs/SDL3/src/sensor/windows/SDL_windowssensor.h index 7e84b1a4..4b0c6f8f 100644 --- a/libs/SDL3/src/sensor/windows/SDL_windowssensor.h +++ b/libs/SDL3/src/sensor/windows/SDL_windowssensor.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_casefolding.h b/libs/SDL3/src/stdlib/SDL_casefolding.h index a728b30c..6fbe0a7f 100644 --- a/libs/SDL3/src/stdlib/SDL_casefolding.h +++ b/libs/SDL3/src/stdlib/SDL_casefolding.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_crc16.c b/libs/SDL3/src/stdlib/SDL_crc16.c index 67cfaad5..828ce942 100644 --- a/libs/SDL3/src/stdlib/SDL_crc16.c +++ b/libs/SDL3/src/stdlib/SDL_crc16.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_crc32.c b/libs/SDL3/src/stdlib/SDL_crc32.c index 166ba196..9c2d0977 100644 --- a/libs/SDL3/src/stdlib/SDL_crc32.c +++ b/libs/SDL3/src/stdlib/SDL_crc32.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_getenv.c b/libs/SDL3/src/stdlib/SDL_getenv.c index 81d3bfbe..2659bd42 100644 --- a/libs/SDL3/src/stdlib/SDL_getenv.c +++ b/libs/SDL3/src/stdlib/SDL_getenv.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_getenv_c.h b/libs/SDL3/src/stdlib/SDL_getenv_c.h index f1be3d33..9cf997da 100644 --- a/libs/SDL3/src/stdlib/SDL_getenv_c.h +++ b/libs/SDL3/src/stdlib/SDL_getenv_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_iconv.c b/libs/SDL3/src/stdlib/SDL_iconv.c index e5d8fb57..fbea0331 100644 --- a/libs/SDL3/src/stdlib/SDL_iconv.c +++ b/libs/SDL3/src/stdlib/SDL_iconv.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_malloc.c b/libs/SDL3/src/stdlib/SDL_malloc.c index d3fc367e..ea09d1e5 100644 --- a/libs/SDL3/src/stdlib/SDL_malloc.c +++ b/libs/SDL3/src/stdlib/SDL_malloc.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -28,8 +28,8 @@ #define LACKS_STRINGS_H #define LACKS_STRING_H #define LACKS_STDLIB_H -#define FORCEINLINE #define ABORT +#define NO_MALLOC_STATS 1 #define USE_LOCKS 1 #define USE_DL_PREFIX @@ -816,6 +816,7 @@ struct mallinfo { inlining are defined as macros, so these aren't used for them. */ +#if 0 /* SDL */ #ifndef FORCEINLINE #if defined(__GNUC__) #define FORCEINLINE __inline __attribute__ ((always_inline)) @@ -823,6 +824,7 @@ struct mallinfo { #define FORCEINLINE __forceinline #endif #endif +#endif /* SDL */ #ifndef NOINLINE #if defined(__GNUC__) #define NOINLINE __attribute__ ((noinline)) @@ -835,13 +837,17 @@ struct mallinfo { #ifdef __cplusplus extern "C" { +#if 0 /* SDL */ #ifndef FORCEINLINE #define FORCEINLINE inline #endif +#endif /* SDL */ #endif /* __cplusplus */ +#if 0 /* SDL */ #ifndef FORCEINLINE #define FORCEINLINE #endif +#endif /* SDL_FORCE_INLINE */ #if !ONLY_MSPACES @@ -1697,20 +1703,20 @@ static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */ #else /* WIN32 */ /* Win32 MMAP via VirtualAlloc */ -static FORCEINLINE void* win32mmap(size_t size) { +SDL_FORCE_INLINE void* win32mmap(size_t size) { void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); return (ptr != 0)? ptr: MFAIL; } /* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ -static FORCEINLINE void* win32direct_mmap(size_t size) { +SDL_FORCE_INLINE void* win32direct_mmap(size_t size) { void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, PAGE_READWRITE); return (ptr != 0)? ptr: MFAIL; } /* This function supports releasing coalesed segments */ -static FORCEINLINE int win32munmap(void* ptr, size_t size) { +SDL_FORCE_INLINE int win32munmap(void* ptr, size_t size) { MEMORY_BASIC_INFORMATION minfo; char* cptr = (char*)ptr; while (size) { @@ -1863,7 +1869,7 @@ static FORCEINLINE int win32munmap(void* ptr, size_t size) { #elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))) /* Custom spin locks for older gcc on x86 */ -static FORCEINLINE int x86_cas_lock(int *sl) { +SDL_FORCE_INLINE int x86_cas_lock(int *sl) { int ret; int val = 1; int cmp = 0; @@ -1874,7 +1880,7 @@ static FORCEINLINE int x86_cas_lock(int *sl) { return ret; } -static FORCEINLINE void x86_clear_lock(int* sl) { +SDL_FORCE_INLINE void x86_clear_lock(int* sl) { assert(*sl != 0); int prev = 0; int ret; @@ -1952,14 +1958,14 @@ struct malloc_recursive_lock { #define MLOCK_T struct malloc_recursive_lock static MLOCK_T malloc_global_mutex = { 0, 0, (THREAD_ID_T)0}; -static FORCEINLINE void recursive_release_lock(MLOCK_T *lk) { +SDL_FORCE_INLINE void recursive_release_lock(MLOCK_T *lk) { assert(lk->sl != 0); if (--lk->c == 0) { CLEAR_LOCK(&lk->sl); } } -static FORCEINLINE int recursive_acquire_lock(MLOCK_T *lk) { +SDL_FORCE_INLINE int recursive_acquire_lock(MLOCK_T *lk) { THREAD_ID_T mythreadid = CURRENT_THREAD; int spins = 0; for (;;) { @@ -1980,7 +1986,7 @@ static FORCEINLINE int recursive_acquire_lock(MLOCK_T *lk) { } } -static FORCEINLINE int recursive_try_lock(MLOCK_T *lk) { +SDL_FORCE_INLINE int recursive_try_lock(MLOCK_T *lk) { THREAD_ID_T mythreadid = CURRENT_THREAD; if (*((volatile int *)(&lk->sl)) == 0) { if (!CAS_LOCK(&lk->sl)) { diff --git a/libs/SDL3/src/stdlib/SDL_memcpy.c b/libs/SDL3/src/stdlib/SDL_memcpy.c index f889916d..315edf02 100644 --- a/libs/SDL3/src/stdlib/SDL_memcpy.c +++ b/libs/SDL3/src/stdlib/SDL_memcpy.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_memmove.c b/libs/SDL3/src/stdlib/SDL_memmove.c index 0c244ca0..4e0d26c4 100644 --- a/libs/SDL3/src/stdlib/SDL_memmove.c +++ b/libs/SDL3/src/stdlib/SDL_memmove.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_memset.c b/libs/SDL3/src/stdlib/SDL_memset.c index a655f57c..324f9178 100644 --- a/libs/SDL3/src/stdlib/SDL_memset.c +++ b/libs/SDL3/src/stdlib/SDL_memset.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_mslibc.c b/libs/SDL3/src/stdlib/SDL_mslibc.c index 98e3a38f..6698403f 100644 --- a/libs/SDL3/src/stdlib/SDL_mslibc.c +++ b/libs/SDL3/src/stdlib/SDL_mslibc.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -728,14 +728,6 @@ void __declspec(naked) _alloca_probe_16(void) #endif // _M_IX86 -#ifdef _M_ARM64 - -void __chkstk(void); -void __chkstk() { -} - -#endif - #endif // MSC_VER #ifdef __ICL diff --git a/libs/SDL3/src/stdlib/SDL_mslibc_arm64.masm b/libs/SDL3/src/stdlib/SDL_mslibc_arm64.masm new file mode 100644 index 00000000..8125d4c8 --- /dev/null +++ b/libs/SDL3/src/stdlib/SDL_mslibc_arm64.masm @@ -0,0 +1,26 @@ +TeStackLimit EQU 0x00010 +PAGE_SIZE equ 0x1000 + + AREA CODE, READONLY + + EXPORT __chkstk + +__chkstk PROC + ldr x17,[x18, #TeStackLimit] + subs x16,sp,x15, LSL #0x4 + csel x16,xzr,x16,cc + cmp x16,x17 + b.cc chkstk_start_loop + ret +chkstk_start_loop + and x16,x16,#-PAGE_SIZE +chkstk_loop + sub x17,x17,#0x1, LSL #12 + ldr xzr,[x17] + cmp x17,x16 + b.ne chkstk_loop + ret + + ENDP + + END diff --git a/libs/SDL3/src/stdlib/SDL_murmur3.c b/libs/SDL3/src/stdlib/SDL_murmur3.c index 59e879c1..6b030bd9 100644 --- a/libs/SDL3/src/stdlib/SDL_murmur3.c +++ b/libs/SDL3/src/stdlib/SDL_murmur3.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_qsort.c b/libs/SDL3/src/stdlib/SDL_qsort.c index c6a06dde..901e9250 100644 --- a/libs/SDL3/src/stdlib/SDL_qsort.c +++ b/libs/SDL3/src/stdlib/SDL_qsort.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_random.c b/libs/SDL3/src/stdlib/SDL_random.c index 37c29cd8..a774d30c 100644 --- a/libs/SDL3/src/stdlib/SDL_random.c +++ b/libs/SDL3/src/stdlib/SDL_random.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_stdlib.c b/libs/SDL3/src/stdlib/SDL_stdlib.c index 2d08ed71..98faab95 100644 --- a/libs/SDL3/src/stdlib/SDL_stdlib.c +++ b/libs/SDL3/src/stdlib/SDL_stdlib.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_string.c b/libs/SDL3/src/stdlib/SDL_string.c index ec6b5e70..39c49e46 100644 --- a/libs/SDL3/src/stdlib/SDL_string.c +++ b/libs/SDL3/src/stdlib/SDL_string.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -368,7 +368,7 @@ static size_t SDL_ScanUnsignedLongLongInternal(const char *text, int count, int negative = *text == '-'; ++text; } - if ((radix == 0 || radix == 16) && *text == '0') { + if ((radix == 0 || radix == 16) && *text == '0' && text[1] != '\0') { ++text; if (*text == 'x' || *text == 'X') { radix = 16; @@ -2346,9 +2346,7 @@ int SDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, SDL_PRINTF_FO int SDL_vswprintf(SDL_OUT_Z_CAP(maxlen) wchar_t *text, size_t maxlen, const wchar_t *fmt, va_list ap) { - char *text_utf8 = NULL, *fmt_utf8 = NULL; - int result; - + char *fmt_utf8 = NULL; if (fmt) { fmt_utf8 = SDL_iconv_string("UTF-8", "WCHAR_T", (const char *)fmt, (SDL_wcslen(fmt) + 1) * sizeof(wchar_t)); if (!fmt_utf8) { @@ -2356,34 +2354,56 @@ int SDL_vswprintf(SDL_OUT_Z_CAP(maxlen) wchar_t *text, size_t maxlen, const wcha } } - if (!maxlen) { - // We still need to generate the text to find the final text length - maxlen = 1024; - } - text_utf8 = (char *)SDL_malloc(maxlen * 4); - if (!text_utf8) { + char tinybuf[64]; // for really small strings, calculate it once. + + // generate the text to find the final text length + va_list aq; + va_copy(aq, ap); + const int utf8len = SDL_vsnprintf(tinybuf, sizeof (tinybuf), fmt_utf8, aq); + va_end(aq); + + if (utf8len < 0) { SDL_free(fmt_utf8); return -1; } - result = SDL_vsnprintf(text_utf8, maxlen * 4, fmt_utf8, ap); + bool isstack = false; + char *smallbuf = NULL; + char *utf8buf; + int result; - if (result >= 0) { - wchar_t *text_wchar = (wchar_t *)SDL_iconv_string("WCHAR_T", "UTF-8", text_utf8, SDL_strlen(text_utf8) + 1); - if (text_wchar) { - if (text) { - SDL_wcslcpy(text, text_wchar, maxlen); - } - result = (int)SDL_wcslen(text_wchar); - SDL_free(text_wchar); - } else { - result = -1; + if (utf8len < sizeof (tinybuf)) { // whole thing fit in the stack buffer, just use that copy. + utf8buf = tinybuf; + } else { // didn't fit in the stack buffer, allocate the needed space and run it again. + utf8buf = smallbuf = SDL_small_alloc(char, utf8len + 1, &isstack); + if (!smallbuf) { + SDL_free(fmt_utf8); + return -1; // oh well. + } + const int utf8len2 = SDL_vsnprintf(smallbuf, utf8len + 1, fmt_utf8, ap); + if (utf8len2 > utf8len) { + SDL_free(fmt_utf8); + return SDL_SetError("Formatted output changed between two runs"); // race condition on the parameters, and we no longer have room...yikes. } } - SDL_free(text_utf8); SDL_free(fmt_utf8); + wchar_t *wbuf = (wchar_t *)SDL_iconv_string("WCHAR_T", "UTF-8", utf8buf, utf8len + 1); + if (wbuf) { + if (text) { + SDL_wcslcpy(text, wbuf, maxlen); + } + result = (int)SDL_wcslen(wbuf); + SDL_free(wbuf); + } else { + result = -1; + } + + if (smallbuf != NULL) { + SDL_small_free(smallbuf, isstack); + } + return result; } diff --git a/libs/SDL3/src/stdlib/SDL_strtokr.c b/libs/SDL3/src/stdlib/SDL_strtokr.c index 53026184..e6008089 100644 --- a/libs/SDL3/src/stdlib/SDL_strtokr.c +++ b/libs/SDL3/src/stdlib/SDL_strtokr.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_sysstdlib.h b/libs/SDL3/src/stdlib/SDL_sysstdlib.h index d5de2b8e..7d43ab0d 100644 --- a/libs/SDL3/src/stdlib/SDL_sysstdlib.h +++ b/libs/SDL3/src/stdlib/SDL_sysstdlib.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/stdlib/SDL_vacopy.h b/libs/SDL3/src/stdlib/SDL_vacopy.h index ef4d17dc..fee560e4 100644 --- a/libs/SDL3/src/stdlib/SDL_vacopy.h +++ b/libs/SDL3/src/stdlib/SDL_vacopy.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/storage/SDL_storage.c b/libs/SDL3/src/storage/SDL_storage.c index 6cb4164f..75952ffd 100644 --- a/libs/SDL3/src/storage/SDL_storage.c +++ b/libs/SDL3/src/storage/SDL_storage.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -56,6 +56,33 @@ struct SDL_Storage return result; \ } +// we don't make any effort to convert path separators here, because a) +// everything including Windows will accept a '/' separator and b) that +// conversion should probably happen in the storage backend anyhow. + +static bool ValidateStoragePath(const char *path) +{ + if (SDL_strchr(path, '\\')) { + return SDL_SetError("Windows-style path separators ('\\') not permitted, use '/' instead."); + } + + const char *ptr; + const char *prev = path; + while ((ptr = SDL_strchr(prev, '/')) != NULL) { + if ((SDL_strncmp(prev, "./", 2) == 0) || (SDL_strncmp(prev, "../", 3) == 0)) { + return SDL_SetError("Relative paths not permitted"); + } + prev = ptr + 1; + } + + // check the last path element (or the only path element). + if ((SDL_strcmp(prev, ".") == 0) || (SDL_strcmp(prev, "..") == 0)) { + return SDL_SetError("Relative paths not permitted"); + } + + return true; +} + SDL_Storage *SDL_OpenTitleStorage(const char *override, SDL_PropertiesID props) { SDL_Storage *storage = NULL; @@ -213,9 +240,9 @@ bool SDL_ReadStorageFile(SDL_Storage *storage, const char *path, void *destinati if (!path) { return SDL_InvalidParamError("path"); - } - - if (!storage->iface.read_file) { + } else if (!ValidateStoragePath(path)) { + return false; + } else if (!storage->iface.read_file) { return SDL_Unsupported(); } @@ -228,9 +255,9 @@ bool SDL_WriteStorageFile(SDL_Storage *storage, const char *path, const void *so if (!path) { return SDL_InvalidParamError("path"); - } - - if (!storage->iface.write_file) { + } else if (!ValidateStoragePath(path)) { + return false; + } else if (!storage->iface.write_file) { return SDL_Unsupported(); } @@ -243,9 +270,9 @@ bool SDL_CreateStorageDirectory(SDL_Storage *storage, const char *path) if (!path) { return SDL_InvalidParamError("path"); - } - - if (!storage->iface.mkdir) { + } else if (!ValidateStoragePath(path)) { + return false; + } else if (!storage->iface.mkdir) { return SDL_Unsupported(); } @@ -257,10 +284,12 @@ bool SDL_EnumerateStorageDirectory(SDL_Storage *storage, const char *path, SDL_E CHECK_STORAGE_MAGIC() if (!path) { - return SDL_InvalidParamError("path"); + path = ""; // we allow NULL to mean "root of the storage tree". } - if (!storage->iface.enumerate) { + if (!ValidateStoragePath(path)) { + return false; + } else if (!storage->iface.enumerate) { return SDL_Unsupported(); } @@ -273,9 +302,9 @@ bool SDL_RemoveStoragePath(SDL_Storage *storage, const char *path) if (!path) { return SDL_InvalidParamError("path"); - } - - if (!storage->iface.remove) { + } else if (!ValidateStoragePath(path)) { + return false; + } else if (!storage->iface.remove) { return SDL_Unsupported(); } @@ -288,12 +317,13 @@ bool SDL_RenameStoragePath(SDL_Storage *storage, const char *oldpath, const char if (!oldpath) { return SDL_InvalidParamError("oldpath"); - } - if (!newpath) { + } else if (!newpath) { return SDL_InvalidParamError("newpath"); - } - - if (!storage->iface.rename) { + } else if (!ValidateStoragePath(oldpath)) { + return false; + } else if (!ValidateStoragePath(newpath)) { + return false; + } else if (!storage->iface.rename) { return SDL_Unsupported(); } @@ -306,12 +336,13 @@ bool SDL_CopyStorageFile(SDL_Storage *storage, const char *oldpath, const char * if (!oldpath) { return SDL_InvalidParamError("oldpath"); - } - if (!newpath) { + } else if (!newpath) { return SDL_InvalidParamError("newpath"); - } - - if (!storage->iface.copy) { + } else if (!ValidateStoragePath(oldpath)) { + return false; + } else if (!ValidateStoragePath(newpath)) { + return false; + } else if (!storage->iface.copy) { return SDL_Unsupported(); } @@ -331,9 +362,9 @@ bool SDL_GetStoragePathInfo(SDL_Storage *storage, const char *path, SDL_PathInfo if (!path) { return SDL_InvalidParamError("path"); - } - - if (!storage->iface.info) { + } else if (!ValidateStoragePath(path)) { + return false; + } else if (!storage->iface.info) { return SDL_Unsupported(); } @@ -365,6 +396,15 @@ static bool GlobStorageDirectoryEnumerator(const char *path, SDL_EnumerateDirect char **SDL_GlobStorageDirectory(SDL_Storage *storage, const char *path, const char *pattern, SDL_GlobFlags flags, int *count) { CHECK_STORAGE_MAGIC_RET(NULL) + + if (!path) { + path = ""; // we allow NULL to mean "root of the storage tree". + } + + if (!ValidateStoragePath(path)) { + return NULL; + } + return SDL_InternalGlobDirectory(path, pattern, flags, count, GlobStorageDirectoryEnumerator, GlobStorageDirectoryGetPathInfo, storage); } diff --git a/libs/SDL3/src/storage/SDL_sysstorage.h b/libs/SDL3/src/storage/SDL_sysstorage.h index 460a7b59..57d60d64 100644 --- a/libs/SDL3/src/storage/SDL_sysstorage.h +++ b/libs/SDL3/src/storage/SDL_sysstorage.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/storage/generic/SDL_genericstorage.c b/libs/SDL3/src/storage/generic/SDL_genericstorage.c index 483ca5e2..cc0804fe 100644 --- a/libs/SDL3/src/storage/generic/SDL_genericstorage.c +++ b/libs/SDL3/src/storage/generic/SDL_genericstorage.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -26,15 +26,8 @@ static char *GENERIC_INTERNAL_CreateFullPath(const char *base, const char *relative) { - if (!base) { - return SDL_strdup(relative); - } - - size_t len = SDL_strlen(base) + SDL_strlen(relative) + 1; - char *result = (char*)SDL_malloc(len); - if (result != NULL) { - SDL_snprintf(result, len, "%s%s", base, relative); - } + char *result = NULL; + SDL_asprintf(&result, "%s%s", base ? base : "", relative); return result; } @@ -44,13 +37,53 @@ static bool GENERIC_CloseStorage(void *userdata) return true; } +typedef struct GenericEnumerateData +{ + size_t base_len; + SDL_EnumerateDirectoryCallback real_callback; + void *real_userdata; +} GenericEnumerateData; + +static SDL_EnumerationResult SDLCALL GENERIC_EnumerateDirectory(void *userdata, const char *dirname, const char *fname) +{ + // SDL_EnumerateDirectory will return the full path, so for Storage we + // can take the base directory and add its length to the dirname string, + // effectively trimming the root without having to strdup anything. + const GenericEnumerateData *wrap_data = (GenericEnumerateData *)userdata; + + dirname += wrap_data->base_len; // skip the base, just return the part inside of the Storage. + + #ifdef SDL_PLATFORM_WINDOWS + char *dirnamecpy = NULL; + const size_t slen = SDL_strlen(dirname); + if (slen && (dirname[slen - 1] == '\\')) { + dirnamecpy = SDL_strdup(dirname); + if (!dirnamecpy) { + return SDL_ENUM_FAILURE; + } + dirnamecpy[slen - 1] = '/'; // storage layer always uses '/' path separators. + dirname = dirnamecpy; + } + const SDL_EnumerationResult retval = wrap_data->real_callback(wrap_data->real_userdata, dirname, fname); + SDL_free(dirnamecpy); + return retval; + #else + return wrap_data->real_callback(wrap_data->real_userdata, dirname, fname); + #endif +} + static bool GENERIC_EnumerateStorageDirectory(void *userdata, const char *path, SDL_EnumerateDirectoryCallback callback, void *callback_userdata) { bool result = false; + GenericEnumerateData wrap_data; char *fullpath = GENERIC_INTERNAL_CreateFullPath((char *)userdata, path); if (fullpath) { - result = SDL_EnumerateDirectory(fullpath, callback, callback_userdata); + wrap_data.base_len = SDL_strlen((char *)userdata); + wrap_data.real_callback = callback; + wrap_data.real_userdata = callback_userdata; + + result = SDL_EnumerateDirectory(fullpath, GENERIC_EnumerateDirectory, &wrap_data); SDL_free(fullpath); } @@ -85,6 +118,8 @@ static bool GENERIC_ReadStorageFile(void *userdata, const char *path, void *dest // FIXME: Should SDL_ReadIO use u64 now...? if (SDL_ReadIO(stream, destination, (size_t)length) == length) { result = true; + } else { + SDL_SetError("File length did not exactly match the destination length"); } SDL_CloseIO(stream); } @@ -110,6 +145,8 @@ static bool GENERIC_WriteStorageFile(void *userdata, const char *path, const voi // FIXME: Should SDL_WriteIO use u64 now...? if (SDL_WriteIO(stream, source, (size_t)length) == length) { result = true; + } else { + SDL_SetError("Resulting file length did not exactly match the source length"); } SDL_CloseIO(stream); } @@ -199,10 +236,15 @@ static const SDL_StorageInterface GENERIC_title_iface = { static SDL_Storage *GENERIC_Title_Create(const char *override, SDL_PropertiesID props) { SDL_Storage *result = NULL; - char *basepath = NULL; + if (override != NULL) { - basepath = SDL_strdup(override); + // make sure override has a path separator at the end. If you're not on Windows and used '\\', that's on you. + const size_t slen = SDL_strlen(override); + const bool need_sep = (!slen || ((override[slen-1] != '/') && (override[slen-1] != '\\'))); + if (SDL_asprintf(&basepath, "%s%s", override, need_sep ? "/" : "") == -1) { + return NULL; + } } else { const char *base = SDL_GetBasePath(); basepath = base ? SDL_strdup(base) : NULL; @@ -285,7 +327,12 @@ SDL_Storage *GENERIC_OpenFileStorage(const char *path) len += SDL_strlen(path); } if (len > 0) { - if (path[len-1] == '/') { + #ifdef SDL_PLATFORM_WINDOWS + const bool appended_separator = (path[len-1] == '/') || (path[len-1] == '\\'); + #else + const bool appended_separator = (path[len-1] == '/'); + #endif + if (appended_separator) { basepath = SDL_strdup(path); if (!basepath) { return NULL; diff --git a/libs/SDL3/src/storage/steam/SDL_steamstorage.c b/libs/SDL3/src/storage/steam/SDL_steamstorage.c index 743d50f2..8f735f84 100644 --- a/libs/SDL3/src/storage/steam/SDL_steamstorage.c +++ b/libs/SDL3/src/storage/steam/SDL_steamstorage.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/test/SDL_test_assert.c b/libs/SDL3/src/test/SDL_test_assert.c index ad7b63a1..970e9869 100644 --- a/libs/SDL3/src/test/SDL_test_assert.c +++ b/libs/SDL3/src/test/SDL_test_assert.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/test/SDL_test_common.c b/libs/SDL3/src/test/SDL_test_common.c index 62602f66..8e0590ae 100644 --- a/libs/SDL3/src/test/SDL_test_common.c +++ b/libs/SDL3/src/test/SDL_test_common.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -145,10 +145,6 @@ static int SDLCALL SDLTest_CommonStateParseCommonArguments(void *data, char **ar SDL_SetLogPriorities(SDL_LOG_PRIORITY_VERBOSE); return 2; } - if (SDL_strcasecmp(argv[index], "error") == 0) { - SDL_SetLogPriority(SDL_LOG_CATEGORY_ERROR, SDL_LOG_PRIORITY_VERBOSE); - return 2; - } if (SDL_strcasecmp(argv[index], "system") == 0) { SDL_SetLogPriority(SDL_LOG_CATEGORY_SYSTEM, SDL_LOG_PRIORITY_VERBOSE); return 2; @@ -962,6 +958,9 @@ static void SDLTest_PrintModStateFlag(char *text, size_t maxlen, SDL_Keymod flag case SDL_KMOD_RSHIFT: SDL_snprintfcat(text, maxlen, "RSHIFT"); break; + case SDL_KMOD_LEVEL5: + SDL_snprintfcat(text, maxlen, "LEVEL5"); + break; case SDL_KMOD_LCTRL: SDL_snprintfcat(text, maxlen, "LCTRL"); break; @@ -1003,6 +1002,7 @@ static void SDLTest_PrintModState(char *text, size_t maxlen, SDL_Keymod keymod) const SDL_Keymod kmod_flags[] = { SDL_KMOD_LSHIFT, SDL_KMOD_RSHIFT, + SDL_KMOD_LEVEL5, SDL_KMOD_LCTRL, SDL_KMOD_RCTRL, SDL_KMOD_LALT, @@ -1226,6 +1226,7 @@ bool SDLTest_CommonInit(SDLTest_CommonState *state) SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, state->gl_accum_blue_size); SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, state->gl_accum_alpha_size); SDL_GL_SetAttribute(SDL_GL_STEREO, state->gl_stereo); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_RELEASE_BEHAVIOR, state->gl_release_behavior); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, state->gl_multisamplebuffers); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, state->gl_multisamplesamples); if (state->gl_accelerated >= 0) { @@ -1910,8 +1911,10 @@ void SDLTest_PrintEvent(const SDL_Event *event) break; case SDL_EVENT_FINGER_DOWN: case SDL_EVENT_FINGER_UP: + case SDL_EVENT_FINGER_CANCELED: SDL_Log("SDL EVENT: Finger: %s touch=%" SDL_PRIu64 ", finger=%" SDL_PRIu64 ", x=%f, y=%f, dx=%f, dy=%f, pressure=%f", - (event->type == SDL_EVENT_FINGER_DOWN) ? "down" : "up", + (event->type == SDL_EVENT_FINGER_DOWN) ? "down" : + (event->type == SDL_EVENT_FINGER_UP) ? "up" : "cancel", event->tfinger.touchID, event->tfinger.fingerID, event->tfinger.x, event->tfinger.y, @@ -2816,6 +2819,10 @@ void SDLTest_CommonDrawWindowInfo(SDL_Renderer *renderer, SDL_Window *window, fl SDLTest_DrawString(renderer, 0.0f, textY, text); textY += lineHeight; + (void)SDL_snprintf(text, sizeof(text), "SDL_GetDisplayContentScale: %g", SDL_GetDisplayContentScale(windowDisplayID)); + SDLTest_DrawString(renderer, 0.0f, textY, text); + textY += lineHeight; + /* Mouse */ SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); diff --git a/libs/SDL3/src/test/SDL_test_compare.c b/libs/SDL3/src/test/SDL_test_compare.c index f4a29912..c3ee0392 100644 --- a/libs/SDL3/src/test/SDL_test_compare.c +++ b/libs/SDL3/src/test/SDL_test_compare.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/test/SDL_test_crc32.c b/libs/SDL3/src/test/SDL_test_crc32.c index e2fd84ed..f3d94b89 100644 --- a/libs/SDL3/src/test/SDL_test_crc32.c +++ b/libs/SDL3/src/test/SDL_test_crc32.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/test/SDL_test_font.c b/libs/SDL3/src/test/SDL_test_font.c index 19e6bc9f..00268f6e 100644 --- a/libs/SDL3/src/test/SDL_test_font.c +++ b/libs/SDL3/src/test/SDL_test_font.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -123,7 +123,7 @@ void SDLTest_TextWindowAddTextWithLength(SDLTest_TextWindow *textwin, const char if (newline) { if (textwin->current == textwin->numlines - 1) { SDL_free(textwin->lines[0]); - SDL_memcpy(&textwin->lines[0], &textwin->lines[1], (textwin->numlines - 1) * sizeof(textwin->lines[1])); + SDL_memmove(&textwin->lines[0], &textwin->lines[1], (textwin->numlines - 1) * sizeof(textwin->lines[1])); textwin->lines[textwin->current] = NULL; } else { ++textwin->current; diff --git a/libs/SDL3/src/test/SDL_test_fuzzer.c b/libs/SDL3/src/test/SDL_test_fuzzer.c index 6820c9cf..caa330c9 100644 --- a/libs/SDL3/src/test/SDL_test_fuzzer.c +++ b/libs/SDL3/src/test/SDL_test_fuzzer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -142,9 +142,13 @@ Sint32 SDLTest_RandomIntegerInRange(Sint32 min, Sint32 max) max = temp; } - Sint32 range = (max - min); - SDL_assert(range < SDL_MAX_SINT32); - return min + SDL_rand_r(&rndContext, range + 1); + Uint64 range = (Sint64)max - (Sint64)min; + if (range < SDL_MAX_SINT32) { + return min + (Sint32) SDL_rand_r(&rndContext, (Sint32) range + 1); + } else { + Uint64 add = SDL_rand_bits_r(&rndContext) | ((Uint64) SDL_rand_bits_r(&rndContext) << 32); + return (Sint32) (min + (Sint64) (add % (range + 1))); + } } /** diff --git a/libs/SDL3/src/test/SDL_test_harness.c b/libs/SDL3/src/test/SDL_test_harness.c index 4dd651de..7156b112 100644 --- a/libs/SDL3/src/test/SDL_test_harness.c +++ b/libs/SDL3/src/test/SDL_test_harness.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/test/SDL_test_log.c b/libs/SDL3/src/test/SDL_test_log.c index a6061ab1..95bc2a11 100644 --- a/libs/SDL3/src/test/SDL_test_log.c +++ b/libs/SDL3/src/test/SDL_test_log.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/test/SDL_test_md5.c b/libs/SDL3/src/test/SDL_test_md5.c index b14dd83a..0cc08965 100644 --- a/libs/SDL3/src/test/SDL_test_md5.c +++ b/libs/SDL3/src/test/SDL_test_md5.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/test/SDL_test_memory.c b/libs/SDL3/src/test/SDL_test_memory.c index 594acb3d..8b853c62 100644 --- a/libs/SDL3/src/test/SDL_test_memory.c +++ b/libs/SDL3/src/test/SDL_test_memory.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -212,9 +212,7 @@ static void SDL_UntrackAllocation(void *mem) } prev = entry; } - if (s_tracked_allocations < 0) { - s_unknown_frees += 1; - } + s_unknown_frees += 1; UNLOCK_ALLOCATOR(); } diff --git a/libs/SDL3/src/thread/SDL_systhread.h b/libs/SDL3/src/thread/SDL_systhread.h index c6217617..596b248b 100644 --- a/libs/SDL3/src/thread/SDL_systhread.h +++ b/libs/SDL3/src/thread/SDL_systhread.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/SDL_thread.c b/libs/SDL3/src/thread/SDL_thread.c index fcb11019..884a6cd6 100644 --- a/libs/SDL3/src/thread/SDL_thread.c +++ b/libs/SDL3/src/thread/SDL_thread.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -306,6 +306,11 @@ SDL_error *SDL_GetErrBuf(bool create) #endif // SDL_THREADS_DISABLED } +static bool ThreadValid(SDL_Thread *thread) +{ + return SDL_ObjectValid(thread, SDL_OBJECT_TYPE_THREAD); +} + void SDL_RunThread(SDL_Thread *thread) { void *userdata = thread->userdata; @@ -326,9 +331,10 @@ void SDL_RunThread(SDL_Thread *thread) SDL_CleanupTLS(); // Mark us as ready to be joined (or detached) - if (!SDL_CompareAndSwapAtomicInt(&thread->state, SDL_THREAD_STATE_ALIVE, SDL_THREAD_STATE_ZOMBIE)) { + if (!SDL_CompareAndSwapAtomicInt(&thread->state, SDL_THREAD_ALIVE, SDL_THREAD_COMPLETE)) { // Clean up if something already detached us. - if (SDL_CompareAndSwapAtomicInt(&thread->state, SDL_THREAD_STATE_DETACHED, SDL_THREAD_STATE_CLEANED)) { + if (SDL_GetThreadState(thread) == SDL_THREAD_DETACHED) { + SDL_SetObjectValid(thread, SDL_OBJECT_TYPE_THREAD, false); SDL_free(thread->name); // Can't free later, we've already cleaned up TLS SDL_free(thread); } @@ -364,7 +370,7 @@ SDL_Thread *SDL_CreateThreadWithPropertiesRuntime(SDL_PropertiesID props, return NULL; } thread->status = -1; - SDL_SetAtomicInt(&thread->state, SDL_THREAD_STATE_ALIVE); + SDL_SetAtomicInt(&thread->state, SDL_THREAD_ALIVE); // Set up the arguments for the thread if (name) { @@ -379,9 +385,12 @@ SDL_Thread *SDL_CreateThreadWithPropertiesRuntime(SDL_PropertiesID props, thread->userdata = userdata; thread->stacksize = stacksize; + SDL_SetObjectValid(thread, SDL_OBJECT_TYPE_THREAD, true); + // Create the thread and go! if (!SDL_SYS_CreateThread(thread, pfnBeginThread, pfnEndThread)) { // Oops, failed. Gotta free everything + SDL_SetObjectValid(thread, SDL_OBJECT_TYPE_THREAD, false); SDL_free(thread->name); SDL_free(thread); thread = NULL; @@ -420,10 +429,12 @@ SDL_Thread *SDL_CreateThreadWithStackSize(SDL_ThreadFunction fn, const char *nam SDL_ThreadID SDL_GetThreadID(SDL_Thread *thread) { - SDL_ThreadID id; + SDL_ThreadID id = 0; if (thread) { - id = thread->threadid; + if (ThreadValid(thread)) { + id = thread->threadid; + } } else { id = SDL_GetCurrentThreadID(); } @@ -432,7 +443,7 @@ SDL_ThreadID SDL_GetThreadID(SDL_Thread *thread) const char *SDL_GetThreadName(SDL_Thread *thread) { - if (thread) { + if (ThreadValid(thread)) { return SDL_GetPersistentString(thread->name); } else { return NULL; @@ -446,39 +457,47 @@ bool SDL_SetCurrentThreadPriority(SDL_ThreadPriority priority) void SDL_WaitThread(SDL_Thread *thread, int *status) { - if (thread) { - SDL_SYS_WaitThread(thread); + if (!ThreadValid(thread) || SDL_GetThreadState(thread) == SDL_THREAD_DETACHED) { if (status) { - *status = thread->status; + *status = -1; } - SDL_free(thread->name); - SDL_free(thread); + return; } + + SDL_SYS_WaitThread(thread); + if (status) { + *status = thread->status; + } + SDL_SetObjectValid(thread, SDL_OBJECT_TYPE_THREAD, false); + SDL_free(thread->name); + SDL_free(thread); } SDL_ThreadState SDL_GetThreadState(SDL_Thread *thread) { + if (!ThreadValid(thread)) { + return SDL_THREAD_UNKNOWN; + } + return (SDL_ThreadState)SDL_GetAtomicInt(&thread->state); } void SDL_DetachThread(SDL_Thread *thread) { - if (!thread) { + if (!ThreadValid(thread)) { return; } // Grab dibs if the state is alive+joinable. - if (SDL_CompareAndSwapAtomicInt(&thread->state, SDL_THREAD_STATE_ALIVE, SDL_THREAD_STATE_DETACHED)) { + if (SDL_CompareAndSwapAtomicInt(&thread->state, SDL_THREAD_ALIVE, SDL_THREAD_DETACHED)) { SDL_SYS_DetachThread(thread); } else { // all other states are pretty final, see where we landed. - const int thread_state = SDL_GetAtomicInt(&thread->state); - if ((thread_state == SDL_THREAD_STATE_DETACHED) || (thread_state == SDL_THREAD_STATE_CLEANED)) { + SDL_ThreadState thread_state = SDL_GetThreadState(thread); + if (thread_state == SDL_THREAD_DETACHED) { return; // already detached (you shouldn't call this twice!) - } else if (thread_state == SDL_THREAD_STATE_ZOMBIE) { + } else if (thread_state == SDL_THREAD_COMPLETE) { SDL_WaitThread(thread, NULL); // already done, clean it up. - } else { - SDL_assert(0 && "Unexpected thread state"); } } } diff --git a/libs/SDL3/src/thread/SDL_thread_c.h b/libs/SDL3/src/thread/SDL_thread_c.h index f8b3fb89..3368016a 100644 --- a/libs/SDL3/src/thread/SDL_thread_c.h +++ b/libs/SDL3/src/thread/SDL_thread_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -50,7 +50,7 @@ struct SDL_Thread SDL_ThreadID threadid; SYS_ThreadHandle handle; int status; - SDL_AtomicInt state; /* SDL_THREAD_STATE_* */ + SDL_AtomicInt state; /* SDL_ThreadState */ SDL_error errbuf; char *name; size_t stacksize; // 0 for default, >0 for user-specified stack size. diff --git a/libs/SDL3/src/thread/generic/SDL_syscond.c b/libs/SDL3/src/thread/generic/SDL_syscond.c index 47ea1499..5fdfe842 100644 --- a/libs/SDL3/src/thread/generic/SDL_syscond.c +++ b/libs/SDL3/src/thread/generic/SDL_syscond.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/generic/SDL_syscond_c.h b/libs/SDL3/src/thread/generic/SDL_syscond_c.h index c7086631..253c3945 100644 --- a/libs/SDL3/src/thread/generic/SDL_syscond_c.h +++ b/libs/SDL3/src/thread/generic/SDL_syscond_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/generic/SDL_sysmutex.c b/libs/SDL3/src/thread/generic/SDL_sysmutex.c index be0ad7a8..e58da67b 100644 --- a/libs/SDL3/src/thread/generic/SDL_sysmutex.c +++ b/libs/SDL3/src/thread/generic/SDL_sysmutex.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/generic/SDL_sysmutex_c.h b/libs/SDL3/src/thread/generic/SDL_sysmutex_c.h index 7e84b1a4..4b0c6f8f 100644 --- a/libs/SDL3/src/thread/generic/SDL_sysmutex_c.h +++ b/libs/SDL3/src/thread/generic/SDL_sysmutex_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/generic/SDL_sysrwlock.c b/libs/SDL3/src/thread/generic/SDL_sysrwlock.c index 222fb478..24caf51b 100644 --- a/libs/SDL3/src/thread/generic/SDL_sysrwlock.c +++ b/libs/SDL3/src/thread/generic/SDL_sysrwlock.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/generic/SDL_sysrwlock_c.h b/libs/SDL3/src/thread/generic/SDL_sysrwlock_c.h index 1d8e7214..9589d253 100644 --- a/libs/SDL3/src/thread/generic/SDL_sysrwlock_c.h +++ b/libs/SDL3/src/thread/generic/SDL_sysrwlock_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/generic/SDL_syssem.c b/libs/SDL3/src/thread/generic/SDL_syssem.c index 015b4c57..dcd6fcc6 100644 --- a/libs/SDL3/src/thread/generic/SDL_syssem.c +++ b/libs/SDL3/src/thread/generic/SDL_syssem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/generic/SDL_systhread.c b/libs/SDL3/src/thread/generic/SDL_systhread.c index 5c716e58..ecfa4e13 100644 --- a/libs/SDL3/src/thread/generic/SDL_systhread.c +++ b/libs/SDL3/src/thread/generic/SDL_systhread.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/generic/SDL_systhread_c.h b/libs/SDL3/src/thread/generic/SDL_systhread_c.h index 204177a3..9ba55fd8 100644 --- a/libs/SDL3/src/thread/generic/SDL_systhread_c.h +++ b/libs/SDL3/src/thread/generic/SDL_systhread_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/generic/SDL_systls.c b/libs/SDL3/src/thread/generic/SDL_systls.c index 8af5b7b9..b8ebafe8 100644 --- a/libs/SDL3/src/thread/generic/SDL_systls.c +++ b/libs/SDL3/src/thread/generic/SDL_systls.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/n3ds/SDL_syscond.c b/libs/SDL3/src/thread/n3ds/SDL_syscond.c index 8e2e7c98..d5c4067d 100644 --- a/libs/SDL3/src/thread/n3ds/SDL_syscond.c +++ b/libs/SDL3/src/thread/n3ds/SDL_syscond.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/n3ds/SDL_sysmutex.c b/libs/SDL3/src/thread/n3ds/SDL_sysmutex.c index 3be2d0b2..0abb9f55 100644 --- a/libs/SDL3/src/thread/n3ds/SDL_sysmutex.c +++ b/libs/SDL3/src/thread/n3ds/SDL_sysmutex.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/n3ds/SDL_sysmutex_c.h b/libs/SDL3/src/thread/n3ds/SDL_sysmutex_c.h index d0c29601..ddf80691 100644 --- a/libs/SDL3/src/thread/n3ds/SDL_sysmutex_c.h +++ b/libs/SDL3/src/thread/n3ds/SDL_sysmutex_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/n3ds/SDL_syssem.c b/libs/SDL3/src/thread/n3ds/SDL_syssem.c index 3505696e..3207a2df 100644 --- a/libs/SDL3/src/thread/n3ds/SDL_syssem.c +++ b/libs/SDL3/src/thread/n3ds/SDL_syssem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/n3ds/SDL_systhread.c b/libs/SDL3/src/thread/n3ds/SDL_systhread.c index a535cfd0..6bd826b1 100644 --- a/libs/SDL3/src/thread/n3ds/SDL_systhread.c +++ b/libs/SDL3/src/thread/n3ds/SDL_systhread.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -126,7 +126,7 @@ void SDL_SYS_WaitThread(SDL_Thread *thread) Detached threads can be waited on, but should NOT be cleaned manually as it would result in a fatal error. */ - if (R_SUCCEEDED(res) && SDL_GetAtomicInt(&thread->state) != SDL_THREAD_STATE_DETACHED) { + if (R_SUCCEEDED(res) && SDL_GetThreadState(thread) != SDL_THREAD_DETACHED) { threadFree(thread->handle); } } diff --git a/libs/SDL3/src/thread/n3ds/SDL_systhread_c.h b/libs/SDL3/src/thread/n3ds/SDL_systhread_c.h index 38ea71e2..d87d6367 100644 --- a/libs/SDL3/src/thread/n3ds/SDL_systhread_c.h +++ b/libs/SDL3/src/thread/n3ds/SDL_systhread_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/ps2/SDL_syssem.c b/libs/SDL3/src/thread/ps2/SDL_syssem.c index a6ff2991..ccd09c08 100644 --- a/libs/SDL3/src/thread/ps2/SDL_syssem.c +++ b/libs/SDL3/src/thread/ps2/SDL_syssem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/ps2/SDL_systhread.c b/libs/SDL3/src/thread/ps2/SDL_systhread.c index a6107cde..a13da421 100644 --- a/libs/SDL3/src/thread/ps2/SDL_systhread.c +++ b/libs/SDL3/src/thread/ps2/SDL_systhread.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/ps2/SDL_systhread_c.h b/libs/SDL3/src/thread/ps2/SDL_systhread_c.h index 649bf517..2a811ce9 100644 --- a/libs/SDL3/src/thread/ps2/SDL_systhread_c.h +++ b/libs/SDL3/src/thread/ps2/SDL_systhread_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/psp/SDL_sysmutex.c b/libs/SDL3/src/thread/psp/SDL_sysmutex.c index 45830294..c8ed80d3 100644 --- a/libs/SDL3/src/thread/psp/SDL_sysmutex.c +++ b/libs/SDL3/src/thread/psp/SDL_sysmutex.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/psp/SDL_sysmutex_c.h b/libs/SDL3/src/thread/psp/SDL_sysmutex_c.h index 7e84b1a4..4b0c6f8f 100644 --- a/libs/SDL3/src/thread/psp/SDL_sysmutex_c.h +++ b/libs/SDL3/src/thread/psp/SDL_sysmutex_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/psp/SDL_syssem.c b/libs/SDL3/src/thread/psp/SDL_syssem.c index 9f76973f..27e332f2 100644 --- a/libs/SDL3/src/thread/psp/SDL_syssem.c +++ b/libs/SDL3/src/thread/psp/SDL_syssem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/psp/SDL_systhread.c b/libs/SDL3/src/thread/psp/SDL_systhread.c index cfba63dd..3d607189 100644 --- a/libs/SDL3/src/thread/psp/SDL_systhread.c +++ b/libs/SDL3/src/thread/psp/SDL_systhread.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/psp/SDL_systhread_c.h b/libs/SDL3/src/thread/psp/SDL_systhread_c.h index ffa84492..9e951ecb 100644 --- a/libs/SDL3/src/thread/psp/SDL_systhread_c.h +++ b/libs/SDL3/src/thread/psp/SDL_systhread_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/pthread/SDL_syscond.c b/libs/SDL3/src/thread/pthread/SDL_syscond.c index 6e6f021c..c3e4098f 100644 --- a/libs/SDL3/src/thread/pthread/SDL_syscond.c +++ b/libs/SDL3/src/thread/pthread/SDL_syscond.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/pthread/SDL_sysmutex.c b/libs/SDL3/src/thread/pthread/SDL_sysmutex.c index 4f0ef7b6..7bba286e 100644 --- a/libs/SDL3/src/thread/pthread/SDL_sysmutex.c +++ b/libs/SDL3/src/thread/pthread/SDL_sysmutex.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/pthread/SDL_sysmutex_c.h b/libs/SDL3/src/thread/pthread/SDL_sysmutex_c.h index 4cd703b4..f69e7b31 100644 --- a/libs/SDL3/src/thread/pthread/SDL_sysmutex_c.h +++ b/libs/SDL3/src/thread/pthread/SDL_sysmutex_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/pthread/SDL_sysrwlock.c b/libs/SDL3/src/thread/pthread/SDL_sysrwlock.c index 17895e3e..3cf02e5d 100644 --- a/libs/SDL3/src/thread/pthread/SDL_sysrwlock.c +++ b/libs/SDL3/src/thread/pthread/SDL_sysrwlock.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/pthread/SDL_syssem.c b/libs/SDL3/src/thread/pthread/SDL_syssem.c index ccfe4c07..d5d32982 100644 --- a/libs/SDL3/src/thread/pthread/SDL_syssem.c +++ b/libs/SDL3/src/thread/pthread/SDL_syssem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/pthread/SDL_systhread.c b/libs/SDL3/src/thread/pthread/SDL_systhread.c index 9ece7312..ae4a94c2 100644 --- a/libs/SDL3/src/thread/pthread/SDL_systhread.c +++ b/libs/SDL3/src/thread/pthread/SDL_systhread.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -40,7 +40,7 @@ #include "../../core/linux/SDL_dbus.h" #endif // SDL_PLATFORM_LINUX -#if (defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_IOS)) && defined(HAVE_DLOPEN) +#if (defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_ANDROID) || defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_IOS)) && defined(HAVE_DLOPEN) #include #ifndef RTLD_DEFAULT #define RTLD_DEFAULT NULL @@ -77,7 +77,7 @@ static void *RunThread(void *data) #if (defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_IOS)) && defined(HAVE_DLOPEN) static bool checked_setname = false; static int (*ppthread_setname_np)(const char *) = NULL; -#elif defined(SDL_PLATFORM_LINUX) && defined(HAVE_DLOPEN) +#elif (defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_ANDROID)) && defined(HAVE_DLOPEN) static bool checked_setname = false; static int (*ppthread_setname_np)(pthread_t, const char *) = NULL; #endif @@ -88,17 +88,17 @@ bool SDL_SYS_CreateThread(SDL_Thread *thread, pthread_attr_t type; // do this here before any threads exist, so there's no race condition. -#if (defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_IOS) || defined(SDL_PLATFORM_LINUX)) && defined(HAVE_DLOPEN) +#if (defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_IOS) || defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_ANDROID)) && defined(HAVE_DLOPEN) if (!checked_setname) { void *fn = dlsym(RTLD_DEFAULT, "pthread_setname_np"); #if defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_IOS) ppthread_setname_np = (int (*)(const char *))fn; -#elif defined(SDL_PLATFORM_LINUX) +#elif defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_ANDROID) ppthread_setname_np = (int (*)(pthread_t, const char *))fn; #endif checked_setname = true; } -#endif + #endif // Set the thread attributes if (pthread_attr_init(&type) != 0) { @@ -127,12 +127,12 @@ void SDL_SYS_SetupThread(const char *name) #endif if (name) { -#if (defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_IOS) || defined(SDL_PLATFORM_LINUX)) && defined(HAVE_DLOPEN) +#if (defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_IOS) || defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_ANDROID)) && defined(HAVE_DLOPEN) SDL_assert(checked_setname); if (ppthread_setname_np) { #if defined(SDL_PLATFORM_MACOS) || defined(SDL_PLATFORM_IOS) ppthread_setname_np(name); -#elif defined(SDL_PLATFORM_LINUX) +#elif defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_ANDROID) if (ppthread_setname_np(pthread_self(), name) == ERANGE) { char namebuf[16]; // Limited to 16 char SDL_strlcpy(namebuf, name, sizeof(namebuf)); diff --git a/libs/SDL3/src/thread/pthread/SDL_systhread_c.h b/libs/SDL3/src/thread/pthread/SDL_systhread_c.h index e8593c46..bdfcd68c 100644 --- a/libs/SDL3/src/thread/pthread/SDL_systhread_c.h +++ b/libs/SDL3/src/thread/pthread/SDL_systhread_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/pthread/SDL_systls.c b/libs/SDL3/src/thread/pthread/SDL_systls.c index cc7a0a50..18e9a01e 100644 --- a/libs/SDL3/src/thread/pthread/SDL_systls.c +++ b/libs/SDL3/src/thread/pthread/SDL_systls.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/vita/SDL_sysmutex.c b/libs/SDL3/src/thread/vita/SDL_sysmutex.c index d88c798c..8a3664cb 100644 --- a/libs/SDL3/src/thread/vita/SDL_sysmutex.c +++ b/libs/SDL3/src/thread/vita/SDL_sysmutex.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/vita/SDL_sysmutex_c.h b/libs/SDL3/src/thread/vita/SDL_sysmutex_c.h index 7e84b1a4..4b0c6f8f 100644 --- a/libs/SDL3/src/thread/vita/SDL_sysmutex_c.h +++ b/libs/SDL3/src/thread/vita/SDL_sysmutex_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/vita/SDL_syssem.c b/libs/SDL3/src/thread/vita/SDL_syssem.c index ff005b36..3c6d28a4 100644 --- a/libs/SDL3/src/thread/vita/SDL_syssem.c +++ b/libs/SDL3/src/thread/vita/SDL_syssem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/vita/SDL_systhread.c b/libs/SDL3/src/thread/vita/SDL_systhread.c index 78c780d1..344d911f 100644 --- a/libs/SDL3/src/thread/vita/SDL_systhread.c +++ b/libs/SDL3/src/thread/vita/SDL_systhread.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/vita/SDL_systhread_c.h b/libs/SDL3/src/thread/vita/SDL_systhread_c.h index eb5b1c73..b231ec73 100644 --- a/libs/SDL3/src/thread/vita/SDL_systhread_c.h +++ b/libs/SDL3/src/thread/vita/SDL_systhread_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/windows/SDL_syscond_cv.c b/libs/SDL3/src/thread/windows/SDL_syscond_cv.c index ba959c2b..b29ef634 100644 --- a/libs/SDL3/src/thread/windows/SDL_syscond_cv.c +++ b/libs/SDL3/src/thread/windows/SDL_syscond_cv.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/windows/SDL_sysmutex.c b/libs/SDL3/src/thread/windows/SDL_sysmutex.c index bd82322d..88ec0047 100644 --- a/libs/SDL3/src/thread/windows/SDL_sysmutex.c +++ b/libs/SDL3/src/thread/windows/SDL_sysmutex.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/windows/SDL_sysmutex_c.h b/libs/SDL3/src/thread/windows/SDL_sysmutex_c.h index cc6b2b30..762dc7c9 100644 --- a/libs/SDL3/src/thread/windows/SDL_sysmutex_c.h +++ b/libs/SDL3/src/thread/windows/SDL_sysmutex_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/windows/SDL_sysrwlock_srw.c b/libs/SDL3/src/thread/windows/SDL_sysrwlock_srw.c index 025aff4c..ca1a48eb 100644 --- a/libs/SDL3/src/thread/windows/SDL_sysrwlock_srw.c +++ b/libs/SDL3/src/thread/windows/SDL_sysrwlock_srw.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/windows/SDL_syssem.c b/libs/SDL3/src/thread/windows/SDL_syssem.c index f3b34b08..ba35add7 100644 --- a/libs/SDL3/src/thread/windows/SDL_syssem.c +++ b/libs/SDL3/src/thread/windows/SDL_syssem.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/windows/SDL_systhread.c b/libs/SDL3/src/thread/windows/SDL_systhread.c index 2dcfe8f8..c30694a2 100644 --- a/libs/SDL3/src/thread/windows/SDL_systhread.c +++ b/libs/SDL3/src/thread/windows/SDL_systhread.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/windows/SDL_systhread_c.h b/libs/SDL3/src/thread/windows/SDL_systhread_c.h index fcc70823..5787abb8 100644 --- a/libs/SDL3/src/thread/windows/SDL_systhread_c.h +++ b/libs/SDL3/src/thread/windows/SDL_systhread_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/thread/windows/SDL_systls.c b/libs/SDL3/src/thread/windows/SDL_systls.c index 1235a7ff..354016a7 100644 --- a/libs/SDL3/src/thread/windows/SDL_systls.c +++ b/libs/SDL3/src/thread/windows/SDL_systls.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/time/SDL_time.c b/libs/SDL3/src/time/SDL_time.c index d24d1ce4..54059de0 100644 --- a/libs/SDL3/src/time/SDL_time.c +++ b/libs/SDL3/src/time/SDL_time.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/time/SDL_time_c.h b/libs/SDL3/src/time/SDL_time_c.h index 3114128c..46b8cb4a 100644 --- a/libs/SDL3/src/time/SDL_time_c.h +++ b/libs/SDL3/src/time/SDL_time_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/time/n3ds/SDL_systime.c b/libs/SDL3/src/time/n3ds/SDL_systime.c index 139e6865..61ab9faa 100644 --- a/libs/SDL3/src/time/n3ds/SDL_systime.c +++ b/libs/SDL3/src/time/n3ds/SDL_systime.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/time/ps2/SDL_systime.c b/libs/SDL3/src/time/ps2/SDL_systime.c index 7e9c838e..e49d7d5c 100644 --- a/libs/SDL3/src/time/ps2/SDL_systime.c +++ b/libs/SDL3/src/time/ps2/SDL_systime.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/time/psp/SDL_systime.c b/libs/SDL3/src/time/psp/SDL_systime.c index 4ba4077f..cab24290 100644 --- a/libs/SDL3/src/time/psp/SDL_systime.c +++ b/libs/SDL3/src/time/psp/SDL_systime.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/time/unix/SDL_systime.c b/libs/SDL3/src/time/unix/SDL_systime.c index 79610558..296175a5 100644 --- a/libs/SDL3/src/time/unix/SDL_systime.c +++ b/libs/SDL3/src/time/unix/SDL_systime.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/time/vita/SDL_systime.c b/libs/SDL3/src/time/vita/SDL_systime.c index 3429a5f2..44386996 100644 --- a/libs/SDL3/src/time/vita/SDL_systime.c +++ b/libs/SDL3/src/time/vita/SDL_systime.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/time/windows/SDL_systime.c b/libs/SDL3/src/time/windows/SDL_systime.c index cf97152e..4bc1e992 100644 --- a/libs/SDL3/src/time/windows/SDL_systime.c +++ b/libs/SDL3/src/time/windows/SDL_systime.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/timer/SDL_timer.c b/libs/SDL3/src/timer/SDL_timer.c index c2dc0954..2fa65530 100644 --- a/libs/SDL3/src/timer/SDL_timer.c +++ b/libs/SDL3/src/timer/SDL_timer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/timer/SDL_timer_c.h b/libs/SDL3/src/timer/SDL_timer_c.h index 252de76e..18d81716 100644 --- a/libs/SDL3/src/timer/SDL_timer_c.h +++ b/libs/SDL3/src/timer/SDL_timer_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/timer/haiku/SDL_systimer.c b/libs/SDL3/src/timer/haiku/SDL_systimer.c index 3a3b72c5..67447b10 100644 --- a/libs/SDL3/src/timer/haiku/SDL_systimer.c +++ b/libs/SDL3/src/timer/haiku/SDL_systimer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/timer/n3ds/SDL_systimer.c b/libs/SDL3/src/timer/n3ds/SDL_systimer.c index 8b7bed93..2e1881b0 100644 --- a/libs/SDL3/src/timer/n3ds/SDL_systimer.c +++ b/libs/SDL3/src/timer/n3ds/SDL_systimer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/timer/ps2/SDL_systimer.c b/libs/SDL3/src/timer/ps2/SDL_systimer.c index 7bc6677a..6d4ef04f 100644 --- a/libs/SDL3/src/timer/ps2/SDL_systimer.c +++ b/libs/SDL3/src/timer/ps2/SDL_systimer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/timer/psp/SDL_systimer.c b/libs/SDL3/src/timer/psp/SDL_systimer.c index 24186759..0a8fdc89 100644 --- a/libs/SDL3/src/timer/psp/SDL_systimer.c +++ b/libs/SDL3/src/timer/psp/SDL_systimer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/timer/unix/SDL_systimer.c b/libs/SDL3/src/timer/unix/SDL_systimer.c index 3bfd3b90..0f96319a 100644 --- a/libs/SDL3/src/timer/unix/SDL_systimer.c +++ b/libs/SDL3/src/timer/unix/SDL_systimer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/timer/vita/SDL_systimer.c b/libs/SDL3/src/timer/vita/SDL_systimer.c index 826f71ce..811a4bb5 100644 --- a/libs/SDL3/src/timer/vita/SDL_systimer.c +++ b/libs/SDL3/src/timer/vita/SDL_systimer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/timer/windows/SDL_systimer.c b/libs/SDL3/src/timer/windows/SDL_systimer.c index 591dda3d..01e908c6 100644 --- a/libs/SDL3/src/timer/windows/SDL_systimer.c +++ b/libs/SDL3/src/timer/windows/SDL_systimer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/tray/SDL_tray_utils.c b/libs/SDL3/src/tray/SDL_tray_utils.c new file mode 100644 index 00000000..35cf5593 --- /dev/null +++ b/libs/SDL3/src/tray/SDL_tray_utils.c @@ -0,0 +1,91 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "SDL_internal.h" + +#include "../video/SDL_sysvideo.h" +#include "../events/SDL_events_c.h" +#include "SDL_tray_utils.h" + + +static int active_trays = 0; + +void SDL_RegisterTray(SDL_Tray *tray) +{ + SDL_SetObjectValid(tray, SDL_OBJECT_TYPE_TRAY, true); + + ++active_trays; +} + +void SDL_UnregisterTray(SDL_Tray *tray) +{ + SDL_assert(SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY)); + + SDL_SetObjectValid(tray, SDL_OBJECT_TYPE_TRAY, false); + + --active_trays; + if (active_trays > 0) { + return; + } + + if (!SDL_GetHintBoolean(SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE, true)) { + return; + } + + int toplevel_count = 0; + SDL_Window **windows = SDL_GetWindows(NULL); + if (windows) { + for (int i = 0; windows[i]; ++i) { + SDL_Window *window = windows[i]; + if (!window->parent && !(window->flags & SDL_WINDOW_HIDDEN)) { + ++toplevel_count; + } + } + SDL_free(windows); + } + + if (toplevel_count == 0) { + SDL_SendQuit(); + } +} + +void SDL_CleanupTrays(void) +{ + if (active_trays == 0) { + return; + } + + void **trays = (void **)SDL_malloc(active_trays * sizeof(*trays)); + if (!trays) { + return; + } + + int count = SDL_GetObjects(SDL_OBJECT_TYPE_TRAY, trays, active_trays); + SDL_assert(count == active_trays); + for (int i = 0; i < count; ++i) { + SDL_DestroyTray((SDL_Tray *)trays[i]); + } + SDL_free(trays); +} + +bool SDL_HasActiveTrays(void) +{ + return (active_trays > 0); +} diff --git a/libs/SDL3/src/tray/SDL_tray_utils.h b/libs/SDL3/src/tray/SDL_tray_utils.h new file mode 100644 index 00000000..e9e64fc6 --- /dev/null +++ b/libs/SDL3/src/tray/SDL_tray_utils.h @@ -0,0 +1,26 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "SDL_internal.h" + +extern void SDL_RegisterTray(SDL_Tray *tray); +extern void SDL_UnregisterTray(SDL_Tray *tray); +extern void SDL_CleanupTrays(void); +extern bool SDL_HasActiveTrays(void); diff --git a/libs/SDL3/src/tray/cocoa/SDL_tray.m b/libs/SDL3/src/tray/cocoa/SDL_tray.m index 5197b7da..ae8d6be8 100644 --- a/libs/SDL3/src/tray/cocoa/SDL_tray.m +++ b/libs/SDL3/src/tray/cocoa/SDL_tray.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -25,6 +25,7 @@ #include +#include "../SDL_tray_utils.h" #include "../../video/SDL_surface_c.h" /* applicationDockMenu */ @@ -57,31 +58,6 @@ struct SDL_Tray { SDL_TrayMenu *menu; }; -static NSApplication *app = NULL; - -@interface AppDelegate: NSObject - - (IBAction)menu:(id)sender; -@end - -@implementation AppDelegate{} - - (IBAction)menu:(id)sender - { - SDL_TrayEntry *entry = [[sender representedObject] pointerValue]; - - if (!entry) { - return; - } - - if (entry->flags & SDL_TRAYENTRY_CHECKBOX) { - SDL_SetTrayEntryChecked(entry, !SDL_GetTrayEntryChecked(entry)); - } - - if (entry->callback) { - entry->callback(entry->userdata, entry); - } - } -@end - static void DestroySDLMenu(SDL_TrayMenu *menu) { for (int i = 0; i < menu->nEntries; i++) { @@ -102,22 +78,34 @@ static void DestroySDLMenu(SDL_TrayMenu *menu) SDL_free(menu); } +void SDL_UpdateTrays(void) +{ +} + SDL_Tray *SDL_CreateTray(SDL_Surface *icon, const char *tooltip) { + if (!SDL_IsMainThread()) { + SDL_SetError("This function should be called on the main thread"); + return NULL; + } + + if (icon) { + icon = SDL_ConvertSurface(icon, SDL_PIXELFORMAT_RGBA32); + if (!icon) { + return NULL; + } + } + SDL_Tray *tray = (SDL_Tray *)SDL_calloc(1, sizeof(*tray)); - - AppDelegate *delegate = [[AppDelegate alloc] init]; - app = [NSApplication sharedApplication]; - [app setDelegate:delegate]; - if (!tray) { + SDL_DestroySurface(icon); return NULL; } tray->statusItem = nil; tray->statusBar = [NSStatusBar systemStatusBar]; tray->statusItem = [tray->statusBar statusItemWithLength:NSVariableStatusItemLength]; - [app activateIgnoringOtherApps:TRUE]; + [[NSApplication sharedApplication] activateIgnoringOtherApps:TRUE]; if (tooltip) { tray->statusItem.button.toolTip = [NSString stringWithUTF8String:tooltip]; @@ -126,22 +114,17 @@ SDL_Tray *SDL_CreateTray(SDL_Surface *icon, const char *tooltip) } if (icon) { - SDL_Surface *iconfmt = SDL_ConvertSurface(icon, SDL_PIXELFORMAT_RGBA32); - if (!iconfmt) { - goto skip_putting_an_icon; - } - - NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:(unsigned char **)&iconfmt->pixels - pixelsWide:iconfmt->w - pixelsHigh:iconfmt->h + NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:(unsigned char **)&icon->pixels + pixelsWide:icon->w + pixelsHigh:icon->h bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace - bytesPerRow:iconfmt->pitch + bytesPerRow:icon->pitch bitsPerPixel:32]; - NSImage *iconimg = [[NSImage alloc] initWithSize:NSMakeSize(iconfmt->w, iconfmt->h)]; + NSImage *iconimg = [[NSImage alloc] initWithSize:NSMakeSize(icon->w, icon->h)]; [iconimg addRepresentation:bitmap]; /* A typical icon size is 22x22 on macOS. Failing to resize the icon @@ -154,37 +137,42 @@ SDL_Tray *SDL_CreateTray(SDL_Surface *icon, const char *tooltip) tray->statusItem.button.image = iconimg22; - SDL_DestroySurface(iconfmt); + SDL_DestroySurface(icon); } -skip_putting_an_icon: + SDL_RegisterTray(tray); + return tray; } void SDL_SetTrayIcon(SDL_Tray *tray, SDL_Surface *icon) { + if (!SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY)) { + return; + } + if (!icon) { tray->statusItem.button.image = nil; return; } - SDL_Surface *iconfmt = SDL_ConvertSurface(icon, SDL_PIXELFORMAT_RGBA32); - if (!iconfmt) { + icon = SDL_ConvertSurface(icon, SDL_PIXELFORMAT_RGBA32); + if (!icon) { tray->statusItem.button.image = nil; return; } - NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:(unsigned char **)&iconfmt->pixels - pixelsWide:iconfmt->w - pixelsHigh:iconfmt->h + NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:(unsigned char **)&icon->pixels + pixelsWide:icon->w + pixelsHigh:icon->h bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace - bytesPerRow:iconfmt->pitch + bytesPerRow:icon->pitch bitsPerPixel:32]; - NSImage *iconimg = [[NSImage alloc] initWithSize:NSMakeSize(iconfmt->w, iconfmt->h)]; + NSImage *iconimg = [[NSImage alloc] initWithSize:NSMakeSize(icon->w, icon->h)]; [iconimg addRepresentation:bitmap]; /* A typical icon size is 22x22 on macOS. Failing to resize the icon @@ -197,11 +185,15 @@ void SDL_SetTrayIcon(SDL_Tray *tray, SDL_Surface *icon) tray->statusItem.button.image = iconimg22; - SDL_DestroySurface(iconfmt); + SDL_DestroySurface(icon); } void SDL_SetTrayTooltip(SDL_Tray *tray, const char *tooltip) { + if (!SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY)) { + return; + } + if (tooltip) { tray->statusItem.button.toolTip = [NSString stringWithUTF8String:tooltip]; } else { @@ -211,6 +203,11 @@ void SDL_SetTrayTooltip(SDL_Tray *tray, const char *tooltip) SDL_TrayMenu *SDL_CreateTrayMenu(SDL_Tray *tray) { + if (!SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY)) { + SDL_InvalidParamError("tray"); + return NULL; + } + SDL_TrayMenu *menu = (SDL_TrayMenu *)SDL_calloc(1, sizeof(*menu)); if (!menu) { return NULL; @@ -233,11 +230,21 @@ SDL_TrayMenu *SDL_CreateTrayMenu(SDL_Tray *tray) SDL_TrayMenu *SDL_GetTrayMenu(SDL_Tray *tray) { + if (!SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY)) { + SDL_InvalidParamError("tray"); + return NULL; + } + return tray->menu; } SDL_TrayMenu *SDL_CreateTraySubmenu(SDL_TrayEntry *entry) { + if (!entry) { + SDL_InvalidParamError("entry"); + return NULL; + } + if (entry->submenu) { SDL_SetError("Tray entry submenu already exists"); return NULL; @@ -270,16 +277,25 @@ SDL_TrayMenu *SDL_CreateTraySubmenu(SDL_TrayEntry *entry) SDL_TrayMenu *SDL_GetTraySubmenu(SDL_TrayEntry *entry) { + if (!entry) { + SDL_InvalidParamError("entry"); + return NULL; + } + return entry->submenu; } const SDL_TrayEntry **SDL_GetTrayEntries(SDL_TrayMenu *menu, int *size) { + if (!menu) { + SDL_InvalidParamError("menu"); + return NULL; + } + if (size) { *size = menu->nEntries; } - - return (const SDL_TrayEntry **) menu->entries; + return (const SDL_TrayEntry **)menu->entries; } void SDL_RemoveTrayEntry(SDL_TrayEntry *entry) @@ -306,11 +322,12 @@ void SDL_RemoveTrayEntry(SDL_TrayEntry *entry) } menu->nEntries--; - SDL_TrayEntry **new_entries = (SDL_TrayEntry **)SDL_realloc(menu->entries, menu->nEntries * sizeof(*new_entries)); + SDL_TrayEntry **new_entries = (SDL_TrayEntry **)SDL_realloc(menu->entries, (menu->nEntries + 1) * sizeof(*new_entries)); /* Not sure why shrinking would fail, but even if it does, we can live with a "too big" array */ if (new_entries) { menu->entries = new_entries; + menu->entries[menu->nEntries] = NULL; } [menu->nsmenu removeItem:entry->nsitem]; @@ -320,6 +337,11 @@ void SDL_RemoveTrayEntry(SDL_TrayEntry *entry) SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *label, SDL_TrayEntryFlags flags) { + if (!menu) { + SDL_InvalidParamError("menu"); + return NULL; + } + if (pos < -1 || pos > menu->nEntries) { SDL_InvalidParamError("pos"); return NULL; @@ -334,7 +356,7 @@ SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *la return NULL; } - SDL_TrayEntry **new_entries = (SDL_TrayEntry **)SDL_realloc(menu->entries, (menu->nEntries + 1) * sizeof(*new_entries)); + SDL_TrayEntry **new_entries = (SDL_TrayEntry **)SDL_realloc(menu->entries, (menu->nEntries + 2) * sizeof(*new_entries)); if (!new_entries) { SDL_free(entry); return NULL; @@ -348,6 +370,7 @@ SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *la } new_entries[pos] = entry; + new_entries[menu->nEntries] = NULL; NSMenuItem *nsitem; if (label == NULL) { @@ -373,28 +396,44 @@ SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *la void SDL_SetTrayEntryLabel(SDL_TrayEntry *entry, const char *label) { + if (!entry) { + return; + } + [entry->nsitem setTitle:[NSString stringWithUTF8String:label]]; } const char *SDL_GetTrayEntryLabel(SDL_TrayEntry *entry) { + if (!entry) { + SDL_InvalidParamError("entry"); + return NULL; + } + return [[entry->nsitem title] UTF8String]; } void SDL_SetTrayEntryChecked(SDL_TrayEntry *entry, bool checked) { + if (!entry) { + return; + } + [entry->nsitem setState:(checked ? NSControlStateValueOn : NSControlStateValueOff)]; } bool SDL_GetTrayEntryChecked(SDL_TrayEntry *entry) { + if (!entry) { + return false; + } + return entry->nsitem.state == NSControlStateValueOn; } void SDL_SetTrayEntryEnabled(SDL_TrayEntry *entry, bool enabled) { - if (!(entry->flags & SDL_TRAYENTRY_CHECKBOX)) { - SDL_SetError("Cannot update check for entry not created with SDL_TRAYENTRY_CHECKBOX"); + if (!entry || !(entry->flags & SDL_TRAYENTRY_CHECKBOX)) { return; } @@ -403,8 +442,7 @@ void SDL_SetTrayEntryEnabled(SDL_TrayEntry *entry, bool enabled) bool SDL_GetTrayEntryEnabled(SDL_TrayEntry *entry) { - if (!(entry->flags & SDL_TRAYENTRY_CHECKBOX)) { - SDL_SetError("Cannot fetch check for entry not created with SDL_TRAYENTRY_CHECKBOX"); + if (!entry || !(entry->flags & SDL_TRAYENTRY_CHECKBOX)) { return false; } @@ -413,31 +451,67 @@ bool SDL_GetTrayEntryEnabled(SDL_TrayEntry *entry) void SDL_SetTrayEntryCallback(SDL_TrayEntry *entry, SDL_TrayCallback callback, void *userdata) { + if (!entry) { + return; + } + entry->callback = callback; entry->userdata = userdata; } +void SDL_ClickTrayEntry(SDL_TrayEntry *entry) +{ + if (!entry) { + return; + } + + if (entry->flags & SDL_TRAYENTRY_CHECKBOX) { + SDL_SetTrayEntryChecked(entry, !SDL_GetTrayEntryChecked(entry)); + } + + if (entry->callback) { + entry->callback(entry->userdata, entry); + } +} + SDL_TrayMenu *SDL_GetTrayEntryParent(SDL_TrayEntry *entry) { + if (!entry) { + SDL_InvalidParamError("entry"); + return NULL; + } + return entry->parent; } SDL_TrayEntry *SDL_GetTrayMenuParentEntry(SDL_TrayMenu *menu) { + if (!menu) { + SDL_InvalidParamError("menu"); + return NULL; + } + return menu->parent_entry; } SDL_Tray *SDL_GetTrayMenuParentTray(SDL_TrayMenu *menu) { + if (!menu) { + SDL_InvalidParamError("menu"); + return NULL; + } + return menu->parent_tray; } void SDL_DestroyTray(SDL_Tray *tray) { - if (!tray) { + if (!SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY)) { return; } + SDL_UnregisterTray(tray); + [[NSStatusBar systemStatusBar] removeStatusItem:tray->statusItem]; if (tray->menu) { diff --git a/libs/SDL3/src/tray/dummy/SDL_tray.c b/libs/SDL3/src/tray/dummy/SDL_tray.c index e8eaebd3..db76db25 100644 --- a/libs/SDL3/src/tray/dummy/SDL_tray.c +++ b/libs/SDL3/src/tray/dummy/SDL_tray.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -23,6 +23,12 @@ #ifndef SDL_PLATFORM_MACOS +#include "../SDL_tray_utils.h" + +void SDL_UpdateTrays(void) +{ +} + SDL_Tray *SDL_CreateTray(SDL_Surface *icon, const char *tooltip) { SDL_Unsupported(); @@ -31,29 +37,27 @@ SDL_Tray *SDL_CreateTray(SDL_Surface *icon, const char *tooltip) void SDL_SetTrayIcon(SDL_Tray *tray, SDL_Surface *icon) { - SDL_Unsupported(); } void SDL_SetTrayTooltip(SDL_Tray *tray, const char *tooltip) { - SDL_Unsupported(); } SDL_TrayMenu *SDL_CreateTrayMenu(SDL_Tray *tray) { - SDL_Unsupported(); + SDL_InvalidParamError("tray"); return NULL; } SDL_TrayMenu *SDL_GetTrayMenu(SDL_Tray *tray) { - SDL_Unsupported(); + SDL_InvalidParamError("tray"); return NULL; } SDL_TrayMenu *SDL_CreateTraySubmenu(SDL_TrayEntry *entry) { - SDL_Unsupported(); + SDL_InvalidParamError("entry"); return NULL; } @@ -64,80 +68,76 @@ SDL_TrayMenu *SDL_GetTraySubmenu(SDL_TrayEntry *entry) const SDL_TrayEntry **SDL_GetTrayEntries(SDL_TrayMenu *menu, int *size) { - SDL_Unsupported(); + SDL_InvalidParamError("menu"); return NULL; } void SDL_RemoveTrayEntry(SDL_TrayEntry *entry) { - SDL_Unsupported(); } SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *label, SDL_TrayEntryFlags flags) { - SDL_Unsupported(); + SDL_InvalidParamError("menu"); return NULL; } void SDL_SetTrayEntryLabel(SDL_TrayEntry *entry, const char *label) { - SDL_Unsupported(); } const char *SDL_GetTrayEntryLabel(SDL_TrayEntry *entry) { - SDL_Unsupported(); + SDL_InvalidParamError("entry"); return NULL; } void SDL_SetTrayEntryChecked(SDL_TrayEntry *entry, bool checked) { - SDL_Unsupported(); } bool SDL_GetTrayEntryChecked(SDL_TrayEntry *entry) { - SDL_Unsupported(); - return false; + return SDL_InvalidParamError("entry"); } void SDL_SetTrayEntryEnabled(SDL_TrayEntry *entry, bool enabled) { - SDL_Unsupported(); } bool SDL_GetTrayEntryEnabled(SDL_TrayEntry *entry) { - SDL_Unsupported(); - return false; + return SDL_InvalidParamError("entry"); } void SDL_SetTrayEntryCallback(SDL_TrayEntry *entry, SDL_TrayCallback callback, void *userdata) { - SDL_Unsupported(); +} + +void SDL_ClickTrayEntry(SDL_TrayEntry *entry) +{ } SDL_TrayMenu *SDL_GetTrayEntryParent(SDL_TrayEntry *entry) { - SDL_Unsupported(); + SDL_InvalidParamError("entry"); return NULL; } SDL_TrayEntry *SDL_GetTrayMenuParentEntry(SDL_TrayMenu *menu) { - SDL_Unsupported(); + SDL_InvalidParamError("menu"); return NULL; } SDL_Tray *SDL_GetTrayMenuParentTray(SDL_TrayMenu *menu) { - SDL_Unsupported(); + SDL_InvalidParamError("menu"); return NULL; } void SDL_DestroyTray(SDL_Tray *tray) { - SDL_Unsupported(); } #endif // !SDL_PLATFORM_MACOS diff --git a/libs/SDL3/src/tray/unix/SDL_tray.c b/libs/SDL3/src/tray/unix/SDL_tray.c index b2e81640..5f017c2f 100644 --- a/libs/SDL3/src/tray/unix/SDL_tray.c +++ b/libs/SDL3/src/tray/unix/SDL_tray.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -21,7 +21,10 @@ #include "SDL_internal.h" +#include "../SDL_tray_utils.h" + #include +#include /* getpid() */ #include @@ -51,7 +54,10 @@ typedef enum G_CONNECT_AFTER = 1 << 0, G_CONNECT_SWAPPED = 1 << 1 } GConnectFlags; -gulong (*g_signal_connect_data)(gpointer instance, const gchar *detailed_signal, GCallback c_handler, gpointer data, GClosureNotify destroy_data, GConnectFlags connect_flags); + +static gulong (*g_signal_connect_data)(gpointer instance, const gchar *detailed_signal, GCallback c_handler, gpointer data, GClosureNotify destroy_data, GConnectFlags connect_flags); +static void (*g_object_unref)(gpointer object); +static gchar *(*g_mkdtemp)(gchar *template); #define g_signal_connect(instance, detailed_signal, c_handler, data) \ g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0) @@ -73,24 +79,23 @@ typedef struct _GtkMenuShell GtkMenuShell; typedef struct _GtkWidget GtkWidget; typedef struct _GtkCheckMenuItem GtkCheckMenuItem; -gboolean (*gtk_init_check)(int *argc, char ***argv); -void (*gtk_main)(void); - -GtkWidget* (*gtk_menu_new)(void); -GtkWidget* (*gtk_separator_menu_item_new)(void); -GtkWidget* (*gtk_menu_item_new_with_label)(const gchar *label); -void (*gtk_menu_item_set_submenu)(GtkMenuItem *menu_item, GtkWidget *submenu); -GtkWidget* (*gtk_check_menu_item_new_with_label)(const gchar *label); -void (*gtk_check_menu_item_set_active)(GtkCheckMenuItem *check_menu_item, gboolean is_active); -void (*gtk_widget_set_sensitive)(GtkWidget *widget, gboolean sensitive); -void (*gtk_widget_show)(GtkWidget *widget); -void (*gtk_menu_shell_append)(GtkMenuShell *menu_shell, GtkWidget *child); -void (*gtk_menu_shell_insert)(GtkMenuShell *menu_shell, GtkWidget *child, gint position); -void (*gtk_widget_destroy)(GtkWidget *widget); -const gchar *(*gtk_menu_item_get_label)(GtkMenuItem *menu_item); -void (*gtk_menu_item_set_label)(GtkMenuItem *menu_item, const gchar *label); -gboolean (*gtk_check_menu_item_get_active)(GtkCheckMenuItem *check_menu_item); -gboolean (*gtk_widget_get_sensitive)(GtkWidget *widget); +static gboolean (*gtk_init_check)(int *argc, char ***argv); +static gboolean (*gtk_main_iteration_do)(gboolean blocking); +static GtkWidget* (*gtk_menu_new)(void); +static GtkWidget* (*gtk_separator_menu_item_new)(void); +static GtkWidget* (*gtk_menu_item_new_with_label)(const gchar *label); +static void (*gtk_menu_item_set_submenu)(GtkMenuItem *menu_item, GtkWidget *submenu); +static GtkWidget* (*gtk_check_menu_item_new_with_label)(const gchar *label); +static void (*gtk_check_menu_item_set_active)(GtkCheckMenuItem *check_menu_item, gboolean is_active); +static void (*gtk_widget_set_sensitive)(GtkWidget *widget, gboolean sensitive); +static void (*gtk_widget_show)(GtkWidget *widget); +static void (*gtk_menu_shell_append)(GtkMenuShell *menu_shell, GtkWidget *child); +static void (*gtk_menu_shell_insert)(GtkMenuShell *menu_shell, GtkWidget *child, gint position); +static void (*gtk_widget_destroy)(GtkWidget *widget); +static const gchar *(*gtk_menu_item_get_label)(GtkMenuItem *menu_item); +static void (*gtk_menu_item_set_label)(GtkMenuItem *menu_item, const gchar *label); +static gboolean (*gtk_check_menu_item_get_active)(GtkCheckMenuItem *check_menu_item); +static gboolean (*gtk_widget_get_sensitive)(GtkWidget *widget); #define GTK_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_MENU_ITEM, GtkMenuItem)) #define GTK_WIDGET(widget) (G_TYPE_CHECK_INSTANCE_CAST ((widget), GTK_TYPE_WIDGET, GtkWidget)) @@ -114,21 +119,17 @@ typedef enum { } AppIndicatorStatus; typedef struct _AppIndicator AppIndicator; -AppIndicator *(*app_indicator_new)(const gchar *id, const gchar *icon_name, AppIndicatorCategory category); -void (*app_indicator_set_status)(AppIndicator *self, AppIndicatorStatus status); -void (*app_indicator_set_icon)(AppIndicator *self, const gchar *icon_name); -void (*app_indicator_set_menu)(AppIndicator *self, GtkMenu *menu); + +static AppIndicator *(*app_indicator_new)(const gchar *id, const gchar *icon_name, AppIndicatorCategory category); +static void (*app_indicator_set_status)(AppIndicator *self, AppIndicatorStatus status); +static void (*app_indicator_set_icon)(AppIndicator *self, const gchar *icon_name); +static void (*app_indicator_set_menu)(AppIndicator *self, GtkMenu *menu); + /* ------------------------------------------------------------------------- */ /* END THIRD-PARTY HEADER CONTENT */ /* ------------------------------------------------------------------------- */ #endif -static int main_gtk_thread(void *data) -{ - gtk_main(); - return 0; -} - #ifdef APPINDICATOR_HEADER static void quit_gtk(void) @@ -137,7 +138,7 @@ static void quit_gtk(void) static bool init_gtk(void) { - SDL_DetachThread(SDL_CreateThread(main_gtk_thread, "tray gtk", NULL)); + return true; } #else @@ -169,25 +170,31 @@ static void quit_gtk(void) } const char *appindicator_names[] = { +#ifdef SDL_PLATFORM_OPENBSD "libayatana-appindicator3.so", - "libayatana-appindicator3.so.1", - "libayatana-appindicator.so", "libappindicator3.so", +#else + "libayatana-appindicator3.so.1", "libappindicator3.so.1", - "libappindicator.so", - "libappindicator.so.1", +#endif NULL }; const char *gtk_names[] = { +#ifdef SDL_PLATFORM_OPENBSD "libgtk-3.so", +#else "libgtk-3.so.0", +#endif NULL }; const char *gdk_names[] = { +#ifdef SDL_PLATFORM_OPENBSD "libgdk-3.so", +#else "libgdk-3.so.0", +#endif NULL }; @@ -219,7 +226,7 @@ static bool init_gtk(void) } gtk_init_check = dlsym(libgtk, "gtk_init_check"); - gtk_main = dlsym(libgtk, "gtk_main"); + gtk_main_iteration_do = dlsym(libgtk, "gtk_main_iteration_do"); gtk_menu_new = dlsym(libgtk, "gtk_menu_new"); gtk_separator_menu_item_new = dlsym(libgtk, "gtk_separator_menu_item_new"); gtk_menu_item_new_with_label = dlsym(libgtk, "gtk_menu_item_new_with_label"); @@ -236,7 +243,11 @@ static bool init_gtk(void) gtk_check_menu_item_get_active = dlsym(libgtk, "gtk_check_menu_item_get_active"); gtk_widget_get_sensitive = dlsym(libgtk, "gtk_widget_get_sensitive"); + /* Technically these are GLib or GObject functions, but we can find + * them via GDK */ + g_mkdtemp = dlsym(libgdk, "g_mkdtemp"); g_signal_connect_data = dlsym(libgdk, "g_signal_connect_data"); + g_object_unref = dlsym(libgdk, "g_object_unref"); app_indicator_new = dlsym(libappindicator, "app_indicator_new"); app_indicator_set_status = dlsym(libappindicator, "app_indicator_set_status"); @@ -244,7 +255,7 @@ static bool init_gtk(void) app_indicator_set_menu = dlsym(libappindicator, "app_indicator_set_menu"); if (!gtk_init_check || - !gtk_main || + !gtk_main_iteration_do || !gtk_menu_new || !gtk_separator_menu_item_new || !gtk_menu_item_new_with_label || @@ -256,7 +267,9 @@ static bool init_gtk(void) !gtk_menu_shell_append || !gtk_menu_shell_insert || !gtk_widget_destroy || + !g_mkdtemp || !g_signal_connect_data || + !g_object_unref || !app_indicator_new || !app_indicator_set_status || !app_indicator_set_icon || @@ -276,8 +289,6 @@ static bool init_gtk(void) gtk_is_init = true; - SDL_DetachThread(SDL_CreateThread(main_gtk_thread, "tray gtk", NULL)); - return true; } #endif @@ -285,7 +296,7 @@ static bool init_gtk(void) struct SDL_TrayMenu { GtkMenuShell *menu; - size_t nEntries; + int nEntries; SDL_TrayEntry **entries; SDL_Tray *parent_tray; @@ -306,9 +317,14 @@ struct SDL_TrayEntry { SDL_TrayMenu *submenu; }; +/* Template for g_mkdtemp(). The Xs will get replaced with a random + * directory name, which is created safely and atomically. */ +#define ICON_DIR_TEMPLATE "/tmp/SDL-tray-XXXXXX" + struct SDL_Tray { AppIndicator *indicator; SDL_TrayMenu *menu; + char icon_dir[sizeof(ICON_DIR_TEMPLATE)]; char icon_path[256]; }; @@ -330,19 +346,19 @@ static void call_callback(GtkMenuItem *item, gpointer ptr) } } -/* Since AppIndicator deals only in filenames, which are inherently subject to - timing attacks, don't bother generating a secure filename. */ -static bool get_tmp_filename(char *buffer, size_t size) +static bool new_tmp_filename(SDL_Tray *tray) { static int count = 0; - if (size < 64) { - return SDL_SetError("Can't create temporary file for icon: size %ld < 64", size); + int would_have_written = SDL_snprintf(tray->icon_path, sizeof(tray->icon_path), "%s/%d.bmp", tray->icon_dir, count++); + + if (would_have_written > 0 && ((unsigned) would_have_written) < sizeof(tray->icon_path) - 1) { + return true; } - int would_have_written = SDL_snprintf(buffer, size, "/tmp/sdl_appindicator_icon_%d_%d.bmp", getpid(), count++); - - return would_have_written > 0 && would_have_written < size - 1; + tray->icon_path[0] = '\0'; + SDL_SetError("Failed to format new temporary filename"); + return false; } static const char *get_appindicator_id(void) @@ -353,7 +369,7 @@ static const char *get_appindicator_id(void) int would_have_written = SDL_snprintf(buffer, sizeof(buffer), "sdl-appindicator-%d-%d", getpid(), count++); if (would_have_written <= 0 || would_have_written >= sizeof(buffer) - 1) { - SDL_SetError("Couldn't fit %d bytes in buffer of size %ld", would_have_written, sizeof(buffer)); + SDL_SetError("Couldn't fit %d bytes in buffer of size %d", would_have_written, (int) sizeof(buffer)); return NULL; } @@ -372,21 +388,44 @@ static void DestroySDLMenu(SDL_TrayMenu *menu) SDL_free(menu); } +void SDL_UpdateTrays(void) +{ + if (SDL_HasActiveTrays()) { + gtk_main_iteration_do(FALSE); + } +} + SDL_Tray *SDL_CreateTray(SDL_Surface *icon, const char *tooltip) { + if (!SDL_IsMainThread()) { + SDL_SetError("This function should be called on the main thread"); + return NULL; + } + if (init_gtk() != true) { return NULL; } - SDL_Tray *tray = (SDL_Tray *) SDL_malloc(sizeof(SDL_Tray)); - + SDL_Tray *tray = (SDL_Tray *)SDL_calloc(1, sizeof(*tray)); if (!tray) { return NULL; } - SDL_memset((void *) tray, 0, sizeof(*tray)); + /* On success, g_mkdtemp edits its argument in-place to replace the Xs + * with a random directory name, which it creates safely and atomically. + * On failure, it sets errno. */ + SDL_strlcpy(tray->icon_dir, ICON_DIR_TEMPLATE, sizeof(tray->icon_dir)); + if (!g_mkdtemp(tray->icon_dir)) { + SDL_SetError("Cannot create directory for tray icon: %s", strerror(errno)); + SDL_free(tray); + return NULL; + } + + if (!new_tmp_filename(tray)) { + SDL_free(tray); + return NULL; + } - get_tmp_filename(tray->icon_path, sizeof(tray->icon_path)); SDL_SaveBMP(icon, tray->icon_path); tray->indicator = app_indicator_new(get_appindicator_id(), tray->icon_path, @@ -394,19 +433,24 @@ SDL_Tray *SDL_CreateTray(SDL_Surface *icon, const char *tooltip) app_indicator_set_status(tray->indicator, APP_INDICATOR_STATUS_ACTIVE); + SDL_RegisterTray(tray); + return tray; } void SDL_SetTrayIcon(SDL_Tray *tray, SDL_Surface *icon) { + if (!SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY)) { + return; + } + if (*tray->icon_path) { SDL_RemovePath(tray->icon_path); } /* AppIndicator caches the icon files; always change filename to avoid caching */ - if (icon) { - get_tmp_filename(tray->icon_path, sizeof(tray->icon_path)); + if (icon && new_tmp_filename(tray)) { SDL_SaveBMP(icon, tray->icon_path); app_indicator_set_icon(tray->indicator, tray->icon_path); } else { @@ -422,8 +466,12 @@ void SDL_SetTrayTooltip(SDL_Tray *tray, const char *tooltip) SDL_TrayMenu *SDL_CreateTrayMenu(SDL_Tray *tray) { - tray->menu = SDL_malloc(sizeof(SDL_TrayMenu)); + if (!SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY)) { + SDL_InvalidParamError("tray"); + return NULL; + } + tray->menu = (SDL_TrayMenu *)SDL_calloc(1, sizeof(*tray->menu)); if (!tray->menu) { return NULL; } @@ -441,11 +489,21 @@ SDL_TrayMenu *SDL_CreateTrayMenu(SDL_Tray *tray) SDL_TrayMenu *SDL_GetTrayMenu(SDL_Tray *tray) { + if (!SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY)) { + SDL_InvalidParamError("tray"); + return NULL; + } + return tray->menu; } SDL_TrayMenu *SDL_CreateTraySubmenu(SDL_TrayEntry *entry) { + if (!entry) { + SDL_InvalidParamError("entry"); + return NULL; + } + if (entry->submenu) { SDL_SetError("Tray entry submenu already exists"); return NULL; @@ -456,8 +514,7 @@ SDL_TrayMenu *SDL_CreateTraySubmenu(SDL_TrayEntry *entry) return NULL; } - entry->submenu = SDL_malloc(sizeof(SDL_TrayMenu)); - + entry->submenu = (SDL_TrayMenu *)SDL_calloc(1, sizeof(*entry->submenu)); if (!entry->submenu) { return NULL; } @@ -475,16 +532,25 @@ SDL_TrayMenu *SDL_CreateTraySubmenu(SDL_TrayEntry *entry) SDL_TrayMenu *SDL_GetTraySubmenu(SDL_TrayEntry *entry) { + if (!entry) { + SDL_InvalidParamError("entry"); + return NULL; + } + return entry->submenu; } const SDL_TrayEntry **SDL_GetTrayEntries(SDL_TrayMenu *menu, int *size) { + if (!menu) { + SDL_InvalidParamError("menu"); + return NULL; + } + if (size) { *size = menu->nEntries; } - - return (const SDL_TrayEntry **) menu->entries; + return (const SDL_TrayEntry **)menu->entries; } void SDL_RemoveTrayEntry(SDL_TrayEntry *entry) @@ -511,11 +577,12 @@ void SDL_RemoveTrayEntry(SDL_TrayEntry *entry) } menu->nEntries--; - SDL_TrayEntry ** new_entries = SDL_realloc(menu->entries, menu->nEntries * sizeof(SDL_TrayEntry *)); + SDL_TrayEntry **new_entries = (SDL_TrayEntry **)SDL_realloc(menu->entries, (menu->nEntries + 1) * sizeof(*new_entries)); /* Not sure why shrinking would fail, but even if it does, we can live with a "too big" array */ if (new_entries) { menu->entries = new_entries; + menu->entries[menu->nEntries] = NULL; } gtk_widget_destroy(entry->item); @@ -524,7 +591,12 @@ void SDL_RemoveTrayEntry(SDL_TrayEntry *entry) SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *label, SDL_TrayEntryFlags flags) { - if (pos < -1 || pos > (int) menu->nEntries) { + if (!menu) { + SDL_InvalidParamError("menu"); + return NULL; + } + + if (pos < -1 || pos > menu->nEntries) { SDL_InvalidParamError("pos"); return NULL; } @@ -533,13 +605,11 @@ SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *la pos = menu->nEntries; } - SDL_TrayEntry *entry = SDL_malloc(sizeof(SDL_TrayEntry)); - + SDL_TrayEntry *entry = (SDL_TrayEntry *)SDL_calloc(1, sizeof(*entry)); if (!entry) { return NULL; } - SDL_memset((void *) entry, 0, sizeof(*entry)); entry->parent = menu; entry->item = NULL; entry->ignore_signal = false; @@ -552,14 +622,16 @@ SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *la entry->item = gtk_separator_menu_item_new(); } else if (flags & SDL_TRAYENTRY_CHECKBOX) { entry->item = gtk_check_menu_item_new_with_label(label); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(entry->item), !!(flags & SDL_TRAYENTRY_CHECKED)); + gboolean active = ((flags & SDL_TRAYENTRY_CHECKED) != 0); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(entry->item), active); } else { entry->item = gtk_menu_item_new_with_label(label); } - gtk_widget_set_sensitive(entry->item, !(flags & SDL_TRAYENTRY_DISABLED)); + gboolean sensitive = ((flags & SDL_TRAYENTRY_DISABLED) == 0); + gtk_widget_set_sensitive(entry->item, sensitive); - SDL_TrayEntry **new_entries = (SDL_TrayEntry **) SDL_realloc(menu->entries, (menu->nEntries + 1) * sizeof(SDL_TrayEntry *)); + SDL_TrayEntry **new_entries = (SDL_TrayEntry **)SDL_realloc(menu->entries, (menu->nEntries + 2) * sizeof(*new_entries)); if (!new_entries) { SDL_free(entry); @@ -574,6 +646,7 @@ SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *la } new_entries[pos] = entry; + new_entries[menu->nEntries] = NULL; gtk_widget_show(entry->item); gtk_menu_shell_insert(menu->menu, entry->item, (pos == menu->nEntries) ? -1 : pos); @@ -585,18 +658,26 @@ SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *la void SDL_SetTrayEntryLabel(SDL_TrayEntry *entry, const char *label) { + if (!entry) { + return; + } + gtk_menu_item_set_label(GTK_MENU_ITEM(entry->item), label); } const char *SDL_GetTrayEntryLabel(SDL_TrayEntry *entry) { + if (!entry) { + SDL_InvalidParamError("entry"); + return NULL; + } + return gtk_menu_item_get_label(GTK_MENU_ITEM(entry->item)); } void SDL_SetTrayEntryChecked(SDL_TrayEntry *entry, bool checked) { - if (!(entry->flags & SDL_TRAYENTRY_CHECKBOX)) { - SDL_SetError("Cannot update check for entry not created with SDL_TRAYENTRY_CHECKBOX"); + if (!entry || !(entry->flags & SDL_TRAYENTRY_CHECKBOX)) { return; } @@ -607,8 +688,7 @@ void SDL_SetTrayEntryChecked(SDL_TrayEntry *entry, bool checked) bool SDL_GetTrayEntryChecked(SDL_TrayEntry *entry) { - if (!(entry->flags & SDL_TRAYENTRY_CHECKBOX)) { - SDL_SetError("Cannot fetch check for entry not created with SDL_TRAYENTRY_CHECKBOX"); + if (!entry || !(entry->flags & SDL_TRAYENTRY_CHECKBOX)) { return false; } @@ -617,22 +697,54 @@ bool SDL_GetTrayEntryChecked(SDL_TrayEntry *entry) void SDL_SetTrayEntryEnabled(SDL_TrayEntry *entry, bool enabled) { + if (!entry) { + return; + } + gtk_widget_set_sensitive(entry->item, enabled); } bool SDL_GetTrayEntryEnabled(SDL_TrayEntry *entry) { + if (!entry) { + return false; + } + return gtk_widget_get_sensitive(entry->item); } void SDL_SetTrayEntryCallback(SDL_TrayEntry *entry, SDL_TrayCallback callback, void *userdata) { + if (!entry) { + return; + } + entry->callback = callback; entry->userdata = userdata; } +void SDL_ClickTrayEntry(SDL_TrayEntry *entry) +{ + if (!entry) { + return; + } + + if (entry->flags & SDL_TRAYENTRY_CHECKBOX) { + SDL_SetTrayEntryChecked(entry, !SDL_GetTrayEntryChecked(entry)); + } + + if (entry->callback) { + entry->callback(entry->userdata, entry); + } +} + SDL_TrayMenu *SDL_GetTrayEntryParent(SDL_TrayEntry *entry) { + if (!entry) { + SDL_InvalidParamError("entry"); + return NULL; + } + return entry->parent; } @@ -643,15 +755,22 @@ SDL_TrayEntry *SDL_GetTrayMenuParentEntry(SDL_TrayMenu *menu) SDL_Tray *SDL_GetTrayMenuParentTray(SDL_TrayMenu *menu) { + if (!menu) { + SDL_InvalidParamError("menu"); + return NULL; + } + return menu->parent_tray; } void SDL_DestroyTray(SDL_Tray *tray) { - if (!tray) { + if (!SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY)) { return; } + SDL_UnregisterTray(tray); + if (tray->menu) { DestroySDLMenu(tray->menu); } @@ -660,5 +779,13 @@ void SDL_DestroyTray(SDL_Tray *tray) SDL_RemovePath(tray->icon_path); } + if (*tray->icon_dir) { + SDL_RemovePath(tray->icon_dir); + } + + if (tray->indicator) { + g_object_unref(tray->indicator); + } + SDL_free(tray); } diff --git a/libs/SDL3/src/tray/windows/SDL_tray.c b/libs/SDL3/src/tray/windows/SDL_tray.c index e2823a1c..a7e27c06 100644 --- a/libs/SDL3/src/tray/windows/SDL_tray.c +++ b/libs/SDL3/src/tray/windows/SDL_tray.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -21,20 +21,28 @@ #include "SDL_internal.h" -#include "../../video/windows/SDL_surface_utils.h" +#include "../SDL_tray_utils.h" +#include "../../core/windows/SDL_windows.h" +#include "../../video/windows/SDL_windowswindow.h" -#include #include #include -#include +#include "../../video/windows/SDL_surface_utils.h" + +#ifndef NOTIFYICON_VERSION_4 +#define NOTIFYICON_VERSION_4 4 +#endif +#ifndef NIF_SHOWTIP +#define NIF_SHOWTIP 0x00000080 +#endif #define WM_TRAYICON (WM_USER + 1) struct SDL_TrayMenu { HMENU hMenu; - size_t nEntries; + int nEntries; SDL_TrayEntry **entries; SDL_Tray *parent_tray; @@ -67,7 +75,7 @@ static UINT_PTR get_next_id(void) static SDL_TrayEntry *find_entry_in_menu(SDL_TrayMenu *menu, UINT_PTR id) { - for (size_t i = 0; i < menu->nEntries; i++) { + for (int i = 0; i < menu->nEntries; i++) { SDL_TrayEntry *entry = menu->entries[i]; if (entry->id == id) { @@ -123,6 +131,12 @@ LRESULT CALLBACK TrayWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPar } break; + case WM_SETTINGCHANGE: + if (wParam == 0 && lParam != 0 && SDL_wcscmp((wchar_t *)lParam, L"ImmersiveColorSet") == 0) { + WIN_UpdateDarkModeForHWND(hwnd); + } + break; + default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } @@ -131,7 +145,7 @@ LRESULT CALLBACK TrayWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPar static void DestroySDLMenu(SDL_TrayMenu *menu) { - for (size_t i = 0; i < menu->nEntries; i++) { + for (int i = 0; i < menu->nEntries; i++) { if (menu->entries[i] && menu->entries[i]->submenu) { DestroySDLMenu(menu->entries[i]->submenu); } @@ -142,7 +156,7 @@ static void DestroySDLMenu(SDL_TrayMenu *menu) SDL_free(menu); } -static wchar_t *convert_label(const char *in) +static wchar_t *escape_label(const char *in) { const char *c; char *c2; @@ -152,8 +166,7 @@ static wchar_t *convert_label(const char *in) len += (*c == '&') ? 2 : 1; } - char *escaped = SDL_malloc(SDL_strlen(in) + len + 1); - + char *escaped = (char *)SDL_malloc(SDL_strlen(in) + len + 1); if (!escaped) { return NULL; } @@ -168,24 +181,46 @@ static wchar_t *convert_label(const char *in) *c2 = '\0'; - int len_w = MultiByteToWideChar(CP_UTF8, 0, escaped, len + 1, NULL, 0); - wchar_t *out = (wchar_t *)SDL_malloc(len_w * sizeof(wchar_t)); - - if (!out) { - SDL_free(escaped); - return NULL; - } - - MultiByteToWideChar(CP_UTF8, 0, escaped, -1, out, len_w); - + wchar_t *out = WIN_UTF8ToStringW(escaped); SDL_free(escaped); return out; } +static HICON load_default_icon() +{ + HINSTANCE hInstance = GetModuleHandle(NULL); + if (!hInstance) { + return LoadIcon(NULL, IDI_APPLICATION); + } + + const char *hint = SDL_GetHint(SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL); + if (hint && *hint) { + HICON icon = LoadIcon(hInstance, MAKEINTRESOURCE(SDL_atoi(hint))); + return icon ? icon : LoadIcon(NULL, IDI_APPLICATION); + } + + hint = SDL_GetHint(SDL_HINT_WINDOWS_INTRESOURCE_ICON); + if (hint && *hint) { + HICON icon = LoadIcon(hInstance, MAKEINTRESOURCE(SDL_atoi(hint))); + return icon ? icon : LoadIcon(NULL, IDI_APPLICATION); + } + + return LoadIcon(NULL, IDI_APPLICATION); +} + +void SDL_UpdateTrays(void) +{ +} + SDL_Tray *SDL_CreateTray(SDL_Surface *icon, const char *tooltip) { - SDL_Tray *tray = SDL_malloc(sizeof(SDL_Tray)); + if (!SDL_IsMainThread()) { + SDL_SetError("This function should be called on the main thread"); + return NULL; + } + + SDL_Tray *tray = (SDL_Tray *)SDL_calloc(1, sizeof(*tray)); if (!tray) { return NULL; @@ -195,25 +230,29 @@ SDL_Tray *SDL_CreateTray(SDL_Surface *icon, const char *tooltip) tray->hwnd = CreateWindowEx(0, TEXT("Message"), NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL); SetWindowLongPtr(tray->hwnd, GWLP_WNDPROC, (LONG_PTR) TrayWindowProc); - ZeroMemory(&tray->nid, sizeof(NOTIFYICONDATAW)); + WIN_UpdateDarkModeForHWND(tray->hwnd); + + SDL_zero(tray->nid); tray->nid.cbSize = sizeof(NOTIFYICONDATAW); tray->nid.hWnd = tray->hwnd; tray->nid.uID = (UINT) get_next_id(); tray->nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_SHOWTIP; tray->nid.uCallbackMessage = WM_TRAYICON; tray->nid.uVersion = NOTIFYICON_VERSION_4; - mbstowcs_s(NULL, tray->nid.szTip, sizeof(tray->nid.szTip) / sizeof(*tray->nid.szTip), tooltip, _TRUNCATE); + wchar_t *tooltipw = WIN_UTF8ToStringW(tooltip); + SDL_wcslcpy(tray->nid.szTip, tooltipw, sizeof(tray->nid.szTip) / sizeof(*tray->nid.szTip)); + SDL_free(tooltipw); if (icon) { tray->nid.hIcon = CreateIconFromSurface(icon); if (!tray->nid.hIcon) { - tray->nid.hIcon = LoadIcon(NULL, IDI_APPLICATION); + tray->nid.hIcon = load_default_icon(); } tray->icon = tray->nid.hIcon; } else { - tray->nid.hIcon = LoadIcon(NULL, IDI_APPLICATION); + tray->nid.hIcon = load_default_icon(); tray->icon = tray->nid.hIcon; } @@ -222,11 +261,17 @@ SDL_Tray *SDL_CreateTray(SDL_Surface *icon, const char *tooltip) SetWindowLongPtr(tray->hwnd, GWLP_USERDATA, (LONG_PTR) tray); + SDL_RegisterTray(tray); + return tray; } void SDL_SetTrayIcon(SDL_Tray *tray, SDL_Surface *icon) { + if (!SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY)) { + return; + } + if (tray->icon) { DestroyIcon(tray->icon); } @@ -235,12 +280,12 @@ void SDL_SetTrayIcon(SDL_Tray *tray, SDL_Surface *icon) tray->nid.hIcon = CreateIconFromSurface(icon); if (!tray->nid.hIcon) { - tray->nid.hIcon = LoadIcon(NULL, IDI_APPLICATION); + tray->nid.hIcon = load_default_icon(); } tray->icon = tray->nid.hIcon; } else { - tray->nid.hIcon = LoadIcon(NULL, IDI_APPLICATION); + tray->nid.hIcon = load_default_icon(); tray->icon = tray->nid.hIcon; } @@ -249,8 +294,14 @@ void SDL_SetTrayIcon(SDL_Tray *tray, SDL_Surface *icon) void SDL_SetTrayTooltip(SDL_Tray *tray, const char *tooltip) { + if (!SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY)) { + return; + } + if (tooltip) { - mbstowcs_s(NULL, tray->nid.szTip, sizeof(tray->nid.szTip) / sizeof(*tray->nid.szTip), tooltip, _TRUNCATE); + wchar_t *tooltipw = WIN_UTF8ToStringW(tooltip); + SDL_wcslcpy(tray->nid.szTip, tooltipw, sizeof(tray->nid.szTip) / sizeof(*tray->nid.szTip)); + SDL_free(tooltipw); } else { tray->nid.szTip[0] = '\0'; } @@ -260,29 +311,44 @@ void SDL_SetTrayTooltip(SDL_Tray *tray, const char *tooltip) SDL_TrayMenu *SDL_CreateTrayMenu(SDL_Tray *tray) { - tray->menu = SDL_malloc(sizeof(SDL_TrayMenu)); + if (!SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY)) { + SDL_InvalidParamError("tray"); + return NULL; + } + + tray->menu = (SDL_TrayMenu *)SDL_calloc(1, sizeof(*tray->menu)); if (!tray->menu) { return NULL; } - SDL_memset((void *) tray->menu, 0, sizeof(*tray->menu)); - tray->menu->hMenu = CreatePopupMenu(); tray->menu->parent_tray = tray; + tray->menu->parent_entry = NULL; return tray->menu; } SDL_TrayMenu *SDL_GetTrayMenu(SDL_Tray *tray) { + if (!SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY)) { + SDL_InvalidParamError("tray"); + return NULL; + } + return tray->menu; } SDL_TrayMenu *SDL_CreateTraySubmenu(SDL_TrayEntry *entry) { + if (!entry) { + SDL_InvalidParamError("entry"); + return NULL; + } + if (!entry->submenu) { SDL_SetError("Cannot create submenu for entry not created with SDL_TRAYENTRY_SUBMENU"); + return NULL; } return entry->submenu; @@ -290,16 +356,25 @@ SDL_TrayMenu *SDL_CreateTraySubmenu(SDL_TrayEntry *entry) SDL_TrayMenu *SDL_GetTraySubmenu(SDL_TrayEntry *entry) { + if (!entry) { + SDL_InvalidParamError("entry"); + return NULL; + } + return entry->submenu; } const SDL_TrayEntry **SDL_GetTrayEntries(SDL_TrayMenu *menu, int *size) { - if (size) { - *size = (int) menu->nEntries; + if (!menu) { + SDL_InvalidParamError("menu"); + return NULL; } - return (const SDL_TrayEntry **) menu->entries; + if (size) { + *size = menu->nEntries; + } + return (const SDL_TrayEntry **)menu->entries; } void SDL_RemoveTrayEntry(SDL_TrayEntry *entry) @@ -311,7 +386,7 @@ void SDL_RemoveTrayEntry(SDL_TrayEntry *entry) SDL_TrayMenu *menu = entry->parent; bool found = false; - for (size_t i = 0; i < menu->nEntries - 1; i++) { + for (int i = 0; i < menu->nEntries - 1; i++) { if (menu->entries[i] == entry) { found = true; } @@ -326,11 +401,12 @@ void SDL_RemoveTrayEntry(SDL_TrayEntry *entry) } menu->nEntries--; - SDL_TrayEntry ** new_entries = SDL_realloc(menu->entries, menu->nEntries * sizeof(SDL_TrayEntry *)); + SDL_TrayEntry **new_entries = (SDL_TrayEntry **)SDL_realloc(menu->entries, (menu->nEntries + 1) * sizeof(*new_entries)); /* Not sure why shrinking would fail, but even if it does, we can live with a "too big" array */ if (new_entries) { menu->entries = new_entries; + menu->entries[menu->nEntries] = NULL; } if (!DeleteMenu(menu->hMenu, (UINT) entry->id, MF_BYCOMMAND)) { @@ -343,7 +419,12 @@ void SDL_RemoveTrayEntry(SDL_TrayEntry *entry) SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *label, SDL_TrayEntryFlags flags) { - if (pos < -1 || pos > (int) menu->nEntries) { + if (!menu) { + SDL_InvalidParamError("menu"); + return NULL; + } + + if (pos < -1 || pos > menu->nEntries) { SDL_InvalidParamError("pos"); return NULL; } @@ -351,20 +432,19 @@ SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *la int windows_compatible_pos = pos; if (pos == -1) { - pos = (int) menu->nEntries; + pos = menu->nEntries; } else if (pos == menu->nEntries) { windows_compatible_pos = -1; } - SDL_TrayEntry *entry = SDL_malloc(sizeof(SDL_TrayEntry)); - + SDL_TrayEntry *entry = (SDL_TrayEntry *)SDL_calloc(1, sizeof(*entry)); if (!entry) { return NULL; } wchar_t *label_w = NULL; - if (label && !(label_w = convert_label(label))) { + if (label && (label_w = escape_label(label)) == NULL) { SDL_free(entry); return NULL; } @@ -377,8 +457,7 @@ SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *la SDL_snprintf(entry->label_cache, sizeof(entry->label_cache), "%s", label ? label : ""); if (label != NULL && flags & SDL_TRAYENTRY_SUBMENU) { - entry->submenu = SDL_malloc(sizeof(SDL_TrayMenu)); - + entry->submenu = (SDL_TrayMenu *)SDL_calloc(1, sizeof(*entry->submenu)); if (!entry->submenu) { SDL_free(entry); SDL_free(label_w); @@ -388,14 +467,15 @@ SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *la entry->submenu->hMenu = CreatePopupMenu(); entry->submenu->nEntries = 0; entry->submenu->entries = NULL; + entry->submenu->parent_entry = entry; + entry->submenu->parent_tray = NULL; entry->id = (UINT_PTR) entry->submenu->hMenu; } else { entry->id = get_next_id(); } - SDL_TrayEntry **new_entries = (SDL_TrayEntry **) SDL_realloc(menu->entries, (menu->nEntries + 1) * sizeof(SDL_TrayEntry **)); - + SDL_TrayEntry **new_entries = (SDL_TrayEntry **)SDL_realloc(menu->entries, (menu->nEntries + 2) * sizeof(*new_entries)); if (!new_entries) { SDL_free(entry); SDL_free(label_w); @@ -409,11 +489,12 @@ SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *la menu->entries = new_entries; menu->nEntries++; - for (int i = (int) menu->nEntries - 1; i > pos; i--) { + for (int i = menu->nEntries - 1; i > pos; i--) { menu->entries[i] = menu->entries[i - 1]; } new_entries[pos] = entry; + new_entries[menu->nEntries] = NULL; if (label == NULL) { InsertMenuW(menu->hMenu, windows_compatible_pos, MF_SEPARATOR | MF_BYPOSITION, entry->id, NULL); @@ -441,9 +522,13 @@ SDL_TrayEntry *SDL_InsertTrayEntryAt(SDL_TrayMenu *menu, int pos, const char *la void SDL_SetTrayEntryLabel(SDL_TrayEntry *entry, const char *label) { + if (!entry) { + return; + } + SDL_snprintf(entry->label_cache, sizeof(entry->label_cache), "%s", label); - wchar_t *label_w = convert_label(label); + wchar_t *label_w = escape_label(label); if (!label_w) { return; @@ -454,7 +539,7 @@ void SDL_SetTrayEntryLabel(SDL_TrayEntry *entry, const char *label) mii.fMask = MIIM_STRING; mii.dwTypeData = label_w; - mii.cch = (UINT) wcslen(label_w); + mii.cch = (UINT) SDL_wcslen(label_w); if (!SetMenuItemInfoW(entry->parent->hMenu, (UINT) entry->id, TRUE, &mii)) { SDL_SetError("Couldn't update tray entry label"); @@ -465,13 +550,17 @@ void SDL_SetTrayEntryLabel(SDL_TrayEntry *entry, const char *label) const char *SDL_GetTrayEntryLabel(SDL_TrayEntry *entry) { + if (!entry) { + SDL_InvalidParamError("entry"); + return NULL; + } + return entry->label_cache; } void SDL_SetTrayEntryChecked(SDL_TrayEntry *entry, bool checked) { - if (!(entry->flags & SDL_TRAYENTRY_CHECKBOX)) { - SDL_SetError("Can't check/uncheck tray entry not created with SDL_TRAYENTRY_CHECKBOX"); + if (!entry || !(entry->flags & SDL_TRAYENTRY_CHECKBOX)) { return; } @@ -480,8 +569,7 @@ void SDL_SetTrayEntryChecked(SDL_TrayEntry *entry, bool checked) bool SDL_GetTrayEntryChecked(SDL_TrayEntry *entry) { - if (!(entry->flags & SDL_TRAYENTRY_CHECKBOX)) { - SDL_SetError("Can't get check status of tray entry not created with SDL_TRAYENTRY_CHECKBOX"); + if (!entry || !(entry->flags & SDL_TRAYENTRY_CHECKBOX)) { return false; } @@ -491,13 +579,12 @@ bool SDL_GetTrayEntryChecked(SDL_TrayEntry *entry) GetMenuItemInfoW(entry->parent->hMenu, (UINT) entry->id, FALSE, &mii); - return !!(mii.fState & MFS_CHECKED); + return ((mii.fState & MFS_CHECKED) != 0); } void SDL_SetTrayEntryEnabled(SDL_TrayEntry *entry, bool enabled) { - if (!(entry->flags & SDL_TRAYENTRY_CHECKBOX)) { - SDL_SetError("Cannot update check for entry not created with SDL_TRAYENTRY_CHECKBOX"); + if (!entry) { return; } @@ -506,8 +593,7 @@ void SDL_SetTrayEntryEnabled(SDL_TrayEntry *entry, bool enabled) bool SDL_GetTrayEntryEnabled(SDL_TrayEntry *entry) { - if (!(entry->flags & SDL_TRAYENTRY_CHECKBOX)) { - SDL_SetError("Cannot fetch check for entry not created with SDL_TRAYENTRY_CHECKBOX"); + if (!entry) { return false; } @@ -517,36 +603,72 @@ bool SDL_GetTrayEntryEnabled(SDL_TrayEntry *entry) GetMenuItemInfoW(entry->parent->hMenu, (UINT) entry->id, FALSE, &mii); - return !!(mii.fState & MFS_ENABLED); + return ((mii.fState & MFS_ENABLED) != 0); } void SDL_SetTrayEntryCallback(SDL_TrayEntry *entry, SDL_TrayCallback callback, void *userdata) { + if (!entry) { + return; + } + entry->callback = callback; entry->userdata = userdata; } +void SDL_ClickTrayEntry(SDL_TrayEntry *entry) +{ + if (!entry) { + return; + } + + if (entry->flags & SDL_TRAYENTRY_CHECKBOX) { + SDL_SetTrayEntryChecked(entry, !SDL_GetTrayEntryChecked(entry)); + } + + if (entry->callback) { + entry->callback(entry->userdata, entry); + } +} + SDL_TrayMenu *SDL_GetTrayEntryParent(SDL_TrayEntry *entry) { + if (!entry) { + SDL_InvalidParamError("entry"); + return NULL; + } + return entry->parent; } SDL_TrayEntry *SDL_GetTrayMenuParentEntry(SDL_TrayMenu *menu) { + if (!menu) { + SDL_InvalidParamError("menu"); + return NULL; + } + return menu->parent_entry; } SDL_Tray *SDL_GetTrayMenuParentTray(SDL_TrayMenu *menu) { + if (!menu) { + SDL_InvalidParamError("menu"); + return NULL; + } + return menu->parent_tray; } void SDL_DestroyTray(SDL_Tray *tray) { - if (!tray) { + if (!SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY)) { return; } + SDL_UnregisterTray(tray); + Shell_NotifyIconW(NIM_DELETE, &tray->nid); if (tray->menu) { diff --git a/libs/SDL3/src/video/SDL_RLEaccel.c b/libs/SDL3/src/video/SDL_RLEaccel.c index 665bf985..890b8250 100644 --- a/libs/SDL3/src/video/SDL_RLEaccel.c +++ b/libs/SDL3/src/video/SDL_RLEaccel.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_RLEaccel_c.h b/libs/SDL3/src/video/SDL_RLEaccel_c.h index 8b9ff36d..5a89a09d 100644 --- a/libs/SDL3/src/video/SDL_RLEaccel_c.h +++ b/libs/SDL3/src/video/SDL_RLEaccel_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_blit.c b/libs/SDL3/src/video/SDL_blit.c index 805f914a..5ffd1814 100644 --- a/libs/SDL3/src/video/SDL_blit.c +++ b/libs/SDL3/src/video/SDL_blit.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_blit.h b/libs/SDL3/src/video/SDL_blit.h index 375446f3..714feebe 100644 --- a/libs/SDL3/src/video/SDL_blit.h +++ b/libs/SDL3/src/video/SDL_blit.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_blit_0.c b/libs/SDL3/src/video/SDL_blit_0.c index 6bbefb98..0d05bddf 100644 --- a/libs/SDL3/src/video/SDL_blit_0.c +++ b/libs/SDL3/src/video/SDL_blit_0.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_blit_1.c b/libs/SDL3/src/video/SDL_blit_1.c index 26dec82f..e0856102 100644 --- a/libs/SDL3/src/video/SDL_blit_1.c +++ b/libs/SDL3/src/video/SDL_blit_1.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_blit_A.c b/libs/SDL3/src/video/SDL_blit_A.c index a24aa85c..5d6d92da 100644 --- a/libs/SDL3/src/video/SDL_blit_A.c +++ b/libs/SDL3/src/video/SDL_blit_A.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_blit_N.c b/libs/SDL3/src/video/SDL_blit_N.c index 54341e93..c710e468 100644 --- a/libs/SDL3/src/video/SDL_blit_N.c +++ b/libs/SDL3/src/video/SDL_blit_N.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_blit_auto.c b/libs/SDL3/src/video/SDL_blit_auto.c index 8e08991d..d9bf6733 100644 --- a/libs/SDL3/src/video/SDL_blit_auto.c +++ b/libs/SDL3/src/video/SDL_blit_auto.c @@ -1,7 +1,7 @@ // DO NOT EDIT! This file is generated by sdlgenblit.pl /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_blit_auto.h b/libs/SDL3/src/video/SDL_blit_auto.h index c1011e6b..cd3f0d88 100644 --- a/libs/SDL3/src/video/SDL_blit_auto.h +++ b/libs/SDL3/src/video/SDL_blit_auto.h @@ -1,7 +1,7 @@ // DO NOT EDIT! This file is generated by sdlgenblit.pl /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_blit_copy.c b/libs/SDL3/src/video/SDL_blit_copy.c index afa5f8f3..05ce0a41 100644 --- a/libs/SDL3/src/video/SDL_blit_copy.c +++ b/libs/SDL3/src/video/SDL_blit_copy.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_blit_copy.h b/libs/SDL3/src/video/SDL_blit_copy.h index 6f720e03..485e3d1e 100644 --- a/libs/SDL3/src/video/SDL_blit_copy.h +++ b/libs/SDL3/src/video/SDL_blit_copy.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_blit_slow.c b/libs/SDL3/src/video/SDL_blit_slow.c index 4b551b24..d0dd4cf3 100644 --- a/libs/SDL3/src/video/SDL_blit_slow.c +++ b/libs/SDL3/src/video/SDL_blit_slow.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_blit_slow.h b/libs/SDL3/src/video/SDL_blit_slow.h index 4f98367c..d8867130 100644 --- a/libs/SDL3/src/video/SDL_blit_slow.h +++ b/libs/SDL3/src/video/SDL_blit_slow.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_bmp.c b/libs/SDL3/src/video/SDL_bmp.c index b3df4247..d8b1c9db 100644 --- a/libs/SDL3/src/video/SDL_bmp.c +++ b/libs/SDL3/src/video/SDL_bmp.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_clipboard.c b/libs/SDL3/src/video/SDL_clipboard.c index 93493673..105c2889 100644 --- a/libs/SDL3/src/video/SDL_clipboard.c +++ b/libs/SDL3/src/video/SDL_clipboard.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -42,7 +42,7 @@ void SDL_CancelClipboardData(Uint32 sequence) { SDL_VideoDevice *_this = SDL_GetVideoDevice(); - if (sequence != _this->clipboard_sequence) { + if (sequence && sequence != _this->clipboard_sequence) { // This clipboard data was already canceled return; } @@ -58,13 +58,39 @@ void SDL_CancelClipboardData(Uint32 sequence) _this->clipboard_userdata = NULL; } +bool SDL_SaveClipboardMimeTypes(const char **mime_types, size_t num_mime_types) +{ + SDL_VideoDevice *_this = SDL_GetVideoDevice(); + + SDL_FreeClipboardMimeTypes(_this); + + if (mime_types && num_mime_types > 0) { + size_t num_allocated = 0; + + _this->clipboard_mime_types = (char **)SDL_malloc(num_mime_types * sizeof(char *)); + if (_this->clipboard_mime_types) { + for (size_t i = 0; i < num_mime_types; ++i) { + _this->clipboard_mime_types[i] = SDL_strdup(mime_types[i]); + if (_this->clipboard_mime_types[i]) { + ++num_allocated; + } + } + } + if (num_allocated < num_mime_types) { + SDL_FreeClipboardMimeTypes(_this); + return false; + } + _this->num_clipboard_mime_types = num_mime_types; + } + return true; +} + bool SDL_SetClipboardData(SDL_ClipboardDataCallback callback, SDL_ClipboardCleanupCallback cleanup, void *userdata, const char **mime_types, size_t num_mime_types) { SDL_VideoDevice *_this = SDL_GetVideoDevice(); - size_t i; if (!_this) { - return SDL_SetError("Video subsystem must be initialized to set clipboard text"); + return SDL_UninitializedVideo(); } // Parameter validation @@ -73,12 +99,7 @@ bool SDL_SetClipboardData(SDL_ClipboardDataCallback callback, SDL_ClipboardClean return SDL_SetError("Invalid parameters"); } - if (!callback && !_this->clipboard_callback) { - // Nothing to do, don't modify the system clipboard - return true; - } - - SDL_CancelClipboardData(_this->clipboard_sequence); + SDL_CancelClipboardData(0); ++_this->clipboard_sequence; if (!_this->clipboard_sequence) { @@ -88,23 +109,9 @@ bool SDL_SetClipboardData(SDL_ClipboardDataCallback callback, SDL_ClipboardClean _this->clipboard_cleanup = cleanup; _this->clipboard_userdata = userdata; - if (mime_types && num_mime_types > 0) { - size_t num_allocated = 0; - - _this->clipboard_mime_types = (char **)SDL_malloc(num_mime_types * sizeof(char *)); - if (_this->clipboard_mime_types) { - for (i = 0; i < num_mime_types; ++i) { - _this->clipboard_mime_types[i] = SDL_strdup(mime_types[i]); - if (_this->clipboard_mime_types[i]) { - ++num_allocated; - } - } - } - if (num_allocated < num_mime_types) { - SDL_ClearClipboardData(); - return false; - } - _this->num_clipboard_mime_types = num_mime_types; + if (!SDL_SaveClipboardMimeTypes(mime_types, num_mime_types)) { + SDL_ClearClipboardData(); + return false; } if (_this->SetClipboardData) { @@ -115,7 +122,7 @@ bool SDL_SetClipboardData(SDL_ClipboardDataCallback callback, SDL_ClipboardClean char *text = NULL; size_t size; - for (i = 0; i < num_mime_types; ++i) { + for (size_t i = 0; i < num_mime_types; ++i) { const char *mime_type = _this->clipboard_mime_types[i]; if (SDL_IsTextMimeType(mime_type)) { const void *data = _this->clipboard_callback(_this->clipboard_userdata, mime_type, &size); @@ -174,9 +181,10 @@ void *SDL_GetInternalClipboardData(SDL_VideoDevice *_this, const char *mime_type void *SDL_GetClipboardData(const char *mime_type, size_t *size) { SDL_VideoDevice *_this = SDL_GetVideoDevice(); + size_t unused; if (!_this) { - SDL_SetError("Video subsystem must be initialized to get clipboard data"); + SDL_UninitializedVideo(); return NULL; } @@ -185,8 +193,7 @@ void *SDL_GetClipboardData(const char *mime_type, size_t *size) return NULL; } if (!size) { - SDL_InvalidParamError("size"); - return NULL; + size = &unused; } // Initialize size to empty, so implementations don't have to worry about it @@ -227,7 +234,7 @@ bool SDL_HasClipboardData(const char *mime_type) SDL_VideoDevice *_this = SDL_GetVideoDevice(); if (!_this) { - SDL_SetError("Video subsystem must be initialized to check clipboard data"); + SDL_UninitializedVideo(); return false; } @@ -284,12 +291,18 @@ char **SDL_GetClipboardMimeTypes(size_t *num_mime_types) { SDL_VideoDevice *_this = SDL_GetVideoDevice(); + if (num_mime_types) { + *num_mime_types = 0; + } + if (!_this) { - SDL_SetError("Video subsystem must be initialized to query clipboard mime types"); + SDL_UninitializedVideo(); return NULL; } - *num_mime_types = _this->num_clipboard_mime_types; + if (num_mime_types) { + *num_mime_types = _this->num_clipboard_mime_types; + } return SDL_CopyClipboardMimeTypes((const char **)_this->clipboard_mime_types, _this->num_clipboard_mime_types, false); } @@ -332,7 +345,7 @@ bool SDL_SetClipboardText(const char *text) const char **text_mime_types; if (!_this) { - return SDL_SetError("Video subsystem must be initialized to set clipboard text"); + return SDL_UninitializedVideo(); } if (text && *text) { @@ -352,7 +365,7 @@ char *SDL_GetClipboardText(void) char *text = NULL; if (!_this) { - SDL_SetError("Video subsystem must be initialized to get clipboard text"); + SDL_UninitializedVideo(); return SDL_strdup(""); } @@ -378,8 +391,7 @@ bool SDL_HasClipboardText(void) const char **text_mime_types; if (!_this) { - SDL_SetError("Video subsystem must be initialized to check clipboard text"); - return false; + return SDL_UninitializedVideo(); } text_mime_types = SDL_GetTextMimeTypes(_this, &num_mime_types); @@ -398,7 +410,7 @@ bool SDL_SetPrimarySelectionText(const char *text) SDL_VideoDevice *_this = SDL_GetVideoDevice(); if (!_this) { - return SDL_SetError("Video subsystem must be initialized to set primary selection text"); + return SDL_UninitializedVideo(); } if (!text) { @@ -426,7 +438,7 @@ char *SDL_GetPrimarySelectionText(void) SDL_VideoDevice *_this = SDL_GetVideoDevice(); if (!_this) { - SDL_SetError("Video subsystem must be initialized to get primary selection text"); + SDL_UninitializedVideo(); return SDL_strdup(""); } @@ -446,8 +458,7 @@ bool SDL_HasPrimarySelectionText(void) SDL_VideoDevice *_this = SDL_GetVideoDevice(); if (!_this) { - SDL_SetError("Video subsystem must be initialized to check primary selection text"); - return false; + return SDL_UninitializedVideo(); } if (_this->HasPrimarySelectionText) { diff --git a/libs/SDL3/src/video/SDL_clipboard_c.h b/libs/SDL3/src/video/SDL_clipboard_c.h index 7cc670b9..11e5a0c6 100644 --- a/libs/SDL3/src/video/SDL_clipboard_c.h +++ b/libs/SDL3/src/video/SDL_clipboard_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -39,7 +39,8 @@ extern bool SDL_HasInternalClipboardData(SDL_VideoDevice *_this, const char *mim // General purpose clipboard text callback const void * SDLCALL SDL_ClipboardTextCallback(void *userdata, const char *mime_type, size_t *size); -void SDLCALL SDL_FreeClipboardMimeTypes(SDL_VideoDevice *_this); -char ** SDLCALL SDL_CopyClipboardMimeTypes(const char **clipboard_mime_types, size_t num_mime_types, bool temporary); +bool SDL_SaveClipboardMimeTypes(const char **mime_types, size_t num_mime_types); +void SDL_FreeClipboardMimeTypes(SDL_VideoDevice *_this); +char **SDL_CopyClipboardMimeTypes(const char **clipboard_mime_types, size_t num_mime_types, bool temporary); #endif // SDL_clipboard_c_h_ diff --git a/libs/SDL3/src/video/SDL_egl.c b/libs/SDL3/src/video/SDL_egl.c index 703984d0..edeb033f 100644 --- a/libs/SDL3/src/video/SDL_egl.c +++ b/libs/SDL3/src/video/SDL_egl.c @@ -1,6 +1,6 @@ /* * Simple DirectMedia Layer - * Copyright (C) 1997-2024 Sam Lantinga + * Copyright (C) 1997-2025 Sam Lantinga * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -344,7 +344,7 @@ static bool SDL_EGL_LoadLibraryInternal(SDL_VideoDevice *_this, const char *egl_ #if !defined(SDL_VIDEO_STATIC_ANGLE) && !defined(SDL_VIDEO_DRIVER_VITA) /* A funny thing, loading EGL.so first does not work on the Raspberry, so we load libGL* first */ - path = SDL_getenv("SDL_VIDEO_GL_DRIVER"); + path = SDL_GetHint(SDL_HINT_OPENGL_LIBRARY); if (path) { opengl_dll_handle = SDL_LoadObject(path); } @@ -404,7 +404,7 @@ static bool SDL_EGL_LoadLibraryInternal(SDL_VideoDevice *_this, const char *egl_ if (egl_dll_handle) { SDL_UnloadObject(egl_dll_handle); } - path = SDL_getenv("SDL_VIDEO_EGL_DRIVER"); + path = SDL_GetHint(SDL_HINT_EGL_LIBRARY); if (!path) { path = DEFAULT_EGL; } diff --git a/libs/SDL3/src/video/SDL_egl_c.h b/libs/SDL3/src/video/SDL_egl_c.h index d655d09e..24dd392e 100644 --- a/libs/SDL3/src/video/SDL_egl_c.h +++ b/libs/SDL3/src/video/SDL_egl_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_fillrect.c b/libs/SDL3/src/video/SDL_fillrect.c index f8b0ce2b..3ab24a9d 100644 --- a/libs/SDL3/src/video/SDL_fillrect.c +++ b/libs/SDL3/src/video/SDL_fillrect.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_pixels.c b/libs/SDL3/src/video/SDL_pixels.c index 2859b7c5..1a1b59ca 100644 --- a/libs/SDL3/src/video/SDL_pixels.c +++ b/libs/SDL3/src/video/SDL_pixels.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_pixels_c.h b/libs/SDL3/src/video/SDL_pixels_c.h index 754b0cd3..92c34016 100644 --- a/libs/SDL3/src/video/SDL_pixels_c.h +++ b/libs/SDL3/src/video/SDL_pixels_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_rect.c b/libs/SDL3/src/video/SDL_rect.c index b284baf2..dadb5887 100644 --- a/libs/SDL3/src/video/SDL_rect.c +++ b/libs/SDL3/src/video/SDL_rect.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_rect_c.h b/libs/SDL3/src/video/SDL_rect_c.h index e30014ac..9d98551e 100644 --- a/libs/SDL3/src/video/SDL_rect_c.h +++ b/libs/SDL3/src/video/SDL_rect_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_rect_impl.h b/libs/SDL3/src/video/SDL_rect_impl.h index 46d56ea0..d35f0733 100644 --- a/libs/SDL3/src/video/SDL_rect_impl.h +++ b/libs/SDL3/src/video/SDL_rect_impl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_stretch.c b/libs/SDL3/src/video/SDL_stretch.c index b3916bdd..acdc63bd 100644 --- a/libs/SDL3/src/video/SDL_stretch.c +++ b/libs/SDL3/src/video/SDL_stretch.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_surface.c b/libs/SDL3/src/video/SDL_surface.c index f6e4f5e2..84db8bb4 100644 --- a/libs/SDL3/src/video/SDL_surface.c +++ b/libs/SDL3/src/video/SDL_surface.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_surface_c.h b/libs/SDL3/src/video/SDL_surface_c.h index ce7be8db..1dc430f5 100644 --- a/libs/SDL3/src/video/SDL_surface_c.h +++ b/libs/SDL3/src/video/SDL_surface_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_sysvideo.h b/libs/SDL3/src/video/SDL_sysvideo.h index 2633f5e0..418b8239 100644 --- a/libs/SDL3/src/video/SDL_sysvideo.h +++ b/libs/SDL3/src/video/SDL_sysvideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -528,6 +528,7 @@ extern VideoBootStrap OFFSCREEN_bootstrap; extern VideoBootStrap QNX_bootstrap; extern VideoBootStrap OPENVR_bootstrap; +extern bool SDL_UninitializedVideo(void); // Use SDL_OnVideoThread() sparingly, to avoid regressions in use cases that currently happen to work extern bool SDL_OnVideoThread(void); extern SDL_VideoDevice *SDL_GetVideoDevice(void); @@ -585,6 +586,8 @@ extern bool SDL_ShouldAllowTopmost(void); extern void SDL_ToggleDragAndDropSupport(void); +extern void SDL_UpdateDesktopBounds(void); + extern SDL_TextInputType SDL_GetTextInputType(SDL_PropertiesID props); extern SDL_Capitalization SDL_GetTextInputCapitalization(SDL_PropertiesID props); extern bool SDL_GetTextInputAutocorrect(SDL_PropertiesID props); diff --git a/libs/SDL3/src/video/SDL_video.c b/libs/SDL3/src/video/SDL_video.c index 1a0cb998..80b1bb02 100644 --- a/libs/SDL3/src/video/SDL_video.c +++ b/libs/SDL3/src/video/SDL_video.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -24,6 +24,7 @@ // The high-level video driver subsystem #include "SDL_sysvideo.h" +#include "SDL_clipboard_c.h" #include "SDL_egl_c.h" #include "SDL_surface_c.h" #include "SDL_pixels_c.h" @@ -50,10 +51,14 @@ #include #endif // SDL_VIDEO_OPENGL_ES2 && !SDL_VIDEO_OPENGL -#ifndef SDL_VIDEO_OPENGL -#ifndef GL_CONTEXT_RELEASE_BEHAVIOR_KHR -#define GL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x82FB +// GL_CONTEXT_RELEASE_BEHAVIOR and GL_CONTEXT_RELEASE_BEHAVIOR_KHR have the same number. +#ifndef GL_CONTEXT_RELEASE_BEHAVIOR +#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB #endif + +// GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH and GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR have the same number. +#ifndef GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC #endif #ifdef SDL_PLATFORM_EMSCRIPTEN @@ -171,6 +176,10 @@ extern bool Cocoa_IsWindowInFullscreenSpace(SDL_Window *window); extern bool Cocoa_SetWindowFullscreenSpace(SDL_Window *window, bool state, bool blocking); #endif +#ifdef SDL_VIDEO_DRIVER_UIKIT +extern void SDL_UpdateLifecycleObserver(void); +#endif + static void SDL_CheckWindowDisplayChanged(SDL_Window *window); static void SDL_CheckWindowDisplayScaleChanged(SDL_Window *window); static void SDL_CheckWindowSafeAreaChanged(SDL_Window *window); @@ -312,10 +321,9 @@ static bool SDL_CreateWindowTexture(SDL_VideoDevice *_this, SDL_Window *window, if (!data) { SDL_Renderer *renderer = NULL; const char *render_driver = NULL; - const char *hint; // See if there's a render driver being requested - hint = SDL_GetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION); + const char *hint = SDL_GetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION); if (hint && *hint != '0' && *hint != '1' && SDL_strcasecmp(hint, "true") != 0 && SDL_strcasecmp(hint, "false") != 0 && @@ -324,20 +332,45 @@ static bool SDL_CreateWindowTexture(SDL_VideoDevice *_this, SDL_Window *window, } if (!render_driver) { - hint = SDL_GetHint(SDL_HINT_RENDER_DRIVER); - if (hint && *hint && SDL_strcasecmp(hint, SDL_SOFTWARE_RENDERER) != 0) { - render_driver = hint; + render_driver = SDL_GetHint(SDL_HINT_RENDER_DRIVER); + } + + char *render_driver_copy = NULL; + if (render_driver && *render_driver) { + render_driver_copy = SDL_strdup(render_driver); + render_driver = render_driver_copy; + if (render_driver_copy) { // turn any "software" requests into "xxxxxxxx" so we don't end up in infinite recursion. + char *prev = render_driver_copy; + char *ptr = prev; + while ((ptr = SDL_strchr(ptr, ',')) != NULL) { + *ptr = '\0'; + const bool is_sw = (SDL_strcasecmp(prev, SDL_SOFTWARE_RENDERER) == 0); + *ptr = ','; + if (is_sw) { + SDL_memset(prev, 'x', SDL_strlen(SDL_SOFTWARE_RENDERER)); + ptr = prev; + } else { + ptr++; + prev = ptr; + } + } + + if (SDL_strcasecmp(prev, SDL_SOFTWARE_RENDERER) == 0) { + SDL_memset(prev, 'x', SDL_strlen(SDL_SOFTWARE_RENDERER)); + } } } // Check to see if there's a specific driver requested if (render_driver) { renderer = SDL_CreateRenderer(window, render_driver); + SDL_free(render_driver_copy); if (!renderer) { // The error for this specific renderer has already been set return false; } } else { + SDL_assert(render_driver_copy == NULL); const int total = SDL_GetNumRenderDrivers(); for (i = 0; i < total; ++i) { const char *name = SDL_GetRenderDriver(i); @@ -519,7 +552,7 @@ static int SDLCALL cmpmodes(const void *A, const void *B) return 0; } -static bool SDL_UninitializedVideo(void) +bool SDL_UninitializedVideo(void) { return SDL_SetError("Video subsystem has not been initialized"); } @@ -742,7 +775,7 @@ SDL_SystemTheme SDL_GetSystemTheme(void) } } -static void SDL_UpdateDesktopBounds(void) +void SDL_UpdateDesktopBounds(void) { SDL_Rect rect; SDL_zero(rect); @@ -1561,6 +1594,10 @@ void SDL_RelativeToGlobalForWindow(SDL_Window *window, int rel_x, int rel_y, int for (w = window->parent; w; w = w->parent) { rel_x += w->x; rel_y += w->y; + + if (!SDL_WINDOW_IS_POPUP(w)) { + break; + } } } @@ -1581,6 +1618,10 @@ void SDL_GlobalToRelativeForWindow(SDL_Window *window, int abs_x, int abs_y, int for (w = window->parent; w; w = w->parent) { abs_x -= w->x; abs_y -= w->y; + + if (!SDL_WINDOW_IS_POPUP(w)) { + break; + } } } @@ -2458,6 +2499,10 @@ SDL_Window *SDL_CreateWindowWithProperties(SDL_PropertiesID props) // Make sure window pixel size is up to date SDL_CheckWindowPixelSizeChanged(window); +#ifdef SDL_VIDEO_DRIVER_UIKIT + SDL_UpdateLifecycleObserver(); +#endif + SDL_ClearError(); return window; @@ -3069,8 +3114,6 @@ bool SDL_GetWindowSizeInPixels(SDL_Window *window, int *w, int *h) bool SDL_SetWindowMinimumSize(SDL_Window *window, int min_w, int min_h) { - int w, h; - CHECK_WINDOW_MAGIC(window, false); if (min_w < 0) { return SDL_InvalidParamError("min_w"); @@ -3092,8 +3135,10 @@ bool SDL_SetWindowMinimumSize(SDL_Window *window, int min_w, int min_h) } // Ensure that window is not smaller than minimal size - w = window->min_w ? SDL_max(window->floating.w, window->min_w) : window->floating.w; - h = window->min_h ? SDL_max(window->floating.h, window->min_h) : window->floating.h; + int w = window->last_size_pending ? window->pending.w : window->floating.w; + int h = window->last_size_pending ? window->pending.h : window->floating.h; + w = window->min_w ? SDL_max(w, window->min_w) : w; + h = window->min_h ? SDL_max(h, window->min_h) : h; return SDL_SetWindowSize(window, w, h); } @@ -3111,8 +3156,6 @@ bool SDL_GetWindowMinimumSize(SDL_Window *window, int *min_w, int *min_h) bool SDL_SetWindowMaximumSize(SDL_Window *window, int max_w, int max_h) { - int w, h; - CHECK_WINDOW_MAGIC(window, false); if (max_w < 0) { return SDL_InvalidParamError("max_w"); @@ -3134,8 +3177,10 @@ bool SDL_SetWindowMaximumSize(SDL_Window *window, int max_w, int max_h) } // Ensure that window is not larger than maximal size - w = window->max_w ? SDL_min(window->floating.w, window->max_w) : window->floating.w; - h = window->max_h ? SDL_min(window->floating.h, window->max_h) : window->floating.h; + int w = window->last_size_pending ? window->pending.w : window->floating.w; + int h = window->last_size_pending ? window->pending.h : window->floating.h; + w = window->max_w ? SDL_min(w, window->max_w) : w; + h = window->max_h ? SDL_min(h, window->max_h) : h; return SDL_SetWindowSize(window, w, h); } @@ -3930,6 +3975,8 @@ void SDL_OnWindowLiveResizeUpdate(SDL_Window *window) // Send an expose event so the application can redraw SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_EXPOSED, 0, 0); } + + SDL_PumpEventMaintenance(); } static void SDL_CheckWindowSafeAreaChanged(SDL_Window *window) @@ -4189,6 +4236,10 @@ void SDL_DestroyWindow(SDL_Window *window) } SDL_free(window); + +#ifdef SDL_VIDEO_DRIVER_UIKIT + SDL_UpdateLifecycleObserver(); +#endif } bool SDL_ScreenSaverEnabled(void) @@ -4263,6 +4314,8 @@ void SDL_VideoQuit(void) SDL_free(_this->displays); _this->displays = NULL; + SDL_CancelClipboardData(0); + if (_this->primary_selection_text) { SDL_free(_this->primary_selection_text); _this->primary_selection_text = NULL; @@ -4797,11 +4850,7 @@ bool SDL_GL_GetAttribute(SDL_GLAttr attr, int *value) attrib = GL_SAMPLES; break; case SDL_GL_CONTEXT_RELEASE_BEHAVIOR: -#ifdef SDL_VIDEO_OPENGL attrib = GL_CONTEXT_RELEASE_BEHAVIOR; -#else - attrib = GL_CONTEXT_RELEASE_BEHAVIOR_KHR; -#endif break; case SDL_GL_BUFFER_SIZE: { @@ -4899,7 +4948,22 @@ bool SDL_GL_GetAttribute(SDL_GLAttr attr, int *value) if (glBindFramebufferFunc && (current_fbo != 0)) { glBindFramebufferFunc(GL_DRAW_FRAMEBUFFER, 0); } - glGetFramebufferAttachmentParameterivFunc(GL_FRAMEBUFFER, attachment, attachmentattrib, (GLint *)value); + // glGetFramebufferAttachmentParameterivFunc may cause GL_INVALID_OPERATION when querying depth/stencil size if the + // bits is 0. From the GL docs: + // If the value of GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is GL_NONE, then either no framebuffer is bound to target; + // or a default framebuffer is queried, attachment is GL_DEPTH or GL_STENCIL, and the number of depth or stencil bits, + // respectively, is zero. In this case querying pname GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero, and all + // other queries will generate an error. + GLint fbo_type = GL_FRAMEBUFFER_DEFAULT; + if (attachment == GL_DEPTH || attachment == GL_STENCIL) { + glGetFramebufferAttachmentParameterivFunc(GL_FRAMEBUFFER, attachment, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &fbo_type); + } + if (fbo_type != GL_NONE) { + glGetFramebufferAttachmentParameterivFunc(GL_FRAMEBUFFER, attachment, attachmentattrib, (GLint *)value); + } + else { + *value = 0; + } if (glBindFramebufferFunc && (current_fbo != 0)) { glBindFramebufferFunc(GL_DRAW_FRAMEBUFFER, current_fbo); } @@ -4931,6 +4995,12 @@ bool SDL_GL_GetAttribute(SDL_GLAttr attr, int *value) } return SDL_SetError("OpenGL error: %08X", error); } + + // convert GL_CONTEXT_RELEASE_BEHAVIOR values back to SDL_GL_CONTEXT_RELEASE_BEHAVIOR values + if (attr == SDL_GL_CONTEXT_RELEASE_BEHAVIOR) { + *value = (*value == GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH) ? SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH : SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE; + } + return true; #else return SDL_Unsupported(); @@ -5476,7 +5546,7 @@ bool SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID) if (!titlecpy) { return false; } - SDL_strlcpy(titlecpy, messageboxdata->title, slen); + SDL_memcpy(titlecpy, messageboxdata->title, slen); } if (messageboxdata->message) { @@ -5486,7 +5556,7 @@ bool SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID) SDL_small_free(titlecpy, titleisstack); return false; } - SDL_strlcpy(msgcpy, messageboxdata->message, slen); + SDL_memcpy(msgcpy, messageboxdata->message, slen); } (void)SDL_AtomicIncRef(&SDL_messagebox_count); diff --git a/libs/SDL3/src/video/SDL_video_c.h b/libs/SDL3/src/video/SDL_video_c.h index f2da9217..b3f4350a 100644 --- a/libs/SDL3/src/video/SDL_video_c.h +++ b/libs/SDL3/src/video/SDL_video_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_video_unsupported.c b/libs/SDL3/src/video/SDL_video_unsupported.c index a4f1ec8f..52e5b8b4 100644 --- a/libs/SDL3/src/video/SDL_video_unsupported.c +++ b/libs/SDL3/src/video/SDL_video_unsupported.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_vulkan_internal.h b/libs/SDL3/src/video/SDL_vulkan_internal.h index be462e89..b8f9b855 100644 --- a/libs/SDL3/src/video/SDL_vulkan_internal.h +++ b/libs/SDL3/src/video/SDL_vulkan_internal.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_vulkan_utils.c b/libs/SDL3/src/video/SDL_vulkan_utils.c index 9bcf1aba..4fd950a3 100644 --- a/libs/SDL3/src/video/SDL_vulkan_utils.c +++ b/libs/SDL3/src/video/SDL_vulkan_utils.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_yuv.c b/libs/SDL3/src/video/SDL_yuv.c index 2ab78a03..da8116e9 100644 --- a/libs/SDL3/src/video/SDL_yuv.c +++ b/libs/SDL3/src/video/SDL_yuv.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/SDL_yuv_c.h b/libs/SDL3/src/video/SDL_yuv_c.h index 2e493374..af1d4843 100644 --- a/libs/SDL3/src/video/SDL_yuv_c.h +++ b/libs/SDL3/src/video/SDL_yuv_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidclipboard.c b/libs/SDL3/src/video/android/SDL_androidclipboard.c index 2d108b93..ec023507 100644 --- a/libs/SDL3/src/video/android/SDL_androidclipboard.c +++ b/libs/SDL3/src/video/android/SDL_androidclipboard.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidclipboard.h b/libs/SDL3/src/video/android/SDL_androidclipboard.h index 9d6a60aa..d102112e 100644 --- a/libs/SDL3/src/video/android/SDL_androidclipboard.h +++ b/libs/SDL3/src/video/android/SDL_androidclipboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidevents.c b/libs/SDL3/src/video/android/SDL_androidevents.c index 056a2024..e32d2722 100644 --- a/libs/SDL3/src/video/android/SDL_androidevents.c +++ b/libs/SDL3/src/video/android/SDL_androidevents.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidevents.h b/libs/SDL3/src/video/android/SDL_androidevents.h index 9d0de4b1..bb57d3bf 100644 --- a/libs/SDL3/src/video/android/SDL_androidevents.h +++ b/libs/SDL3/src/video/android/SDL_androidevents.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidgl.c b/libs/SDL3/src/video/android/SDL_androidgl.c index 35bab703..37fb2d5c 100644 --- a/libs/SDL3/src/video/android/SDL_androidgl.c +++ b/libs/SDL3/src/video/android/SDL_androidgl.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidgl.h b/libs/SDL3/src/video/android/SDL_androidgl.h index e58719dc..99c84d05 100644 --- a/libs/SDL3/src/video/android/SDL_androidgl.h +++ b/libs/SDL3/src/video/android/SDL_androidgl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidkeyboard.c b/libs/SDL3/src/video/android/SDL_androidkeyboard.c index f3c9a4a6..03af7c6c 100644 --- a/libs/SDL3/src/video/android/SDL_androidkeyboard.c +++ b/libs/SDL3/src/video/android/SDL_androidkeyboard.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidkeyboard.h b/libs/SDL3/src/video/android/SDL_androidkeyboard.h index 67a7a6c5..c192991a 100644 --- a/libs/SDL3/src/video/android/SDL_androidkeyboard.h +++ b/libs/SDL3/src/video/android/SDL_androidkeyboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidmessagebox.c b/libs/SDL3/src/video/android/SDL_androidmessagebox.c index 15d34234..93870826 100644 --- a/libs/SDL3/src/video/android/SDL_androidmessagebox.c +++ b/libs/SDL3/src/video/android/SDL_androidmessagebox.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidmessagebox.h b/libs/SDL3/src/video/android/SDL_androidmessagebox.h index c3f270e0..6cd5d7c5 100644 --- a/libs/SDL3/src/video/android/SDL_androidmessagebox.h +++ b/libs/SDL3/src/video/android/SDL_androidmessagebox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidmouse.c b/libs/SDL3/src/video/android/SDL_androidmouse.c index b243c2b4..2facf0d7 100644 --- a/libs/SDL3/src/video/android/SDL_androidmouse.c +++ b/libs/SDL3/src/video/android/SDL_androidmouse.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidmouse.h b/libs/SDL3/src/video/android/SDL_androidmouse.h index 37cf1804..3a5d01a4 100644 --- a/libs/SDL3/src/video/android/SDL_androidmouse.h +++ b/libs/SDL3/src/video/android/SDL_androidmouse.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidpen.c b/libs/SDL3/src/video/android/SDL_androidpen.c new file mode 100644 index 00000000..e287cabd --- /dev/null +++ b/libs/SDL3/src/video/android/SDL_androidpen.c @@ -0,0 +1,98 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "SDL_internal.h" + +#ifdef SDL_VIDEO_DRIVER_ANDROID + +#include "SDL_androidpen.h" +#include "../../events/SDL_pen_c.h" +#include "../../core/android/SDL_android.h" + +#define ACTION_DOWN 0 +#define ACTION_UP 1 +#define ACTION_CANCEL 3 +#define ACTION_POINTER_DOWN 5 +#define ACTION_POINTER_UP 6 +#define ACTION_HOVER_EXIT 10 + +void Android_OnPen(SDL_Window *window, int pen_id_in, int button, int action, float x, float y, float p) +{ + if (!window) { + return; + } + + // pointer index starts from zero. + pen_id_in++; + + SDL_PenID pen = SDL_FindPenByHandle((void *) (size_t) pen_id_in); + if (!pen) { + // TODO: Query JNI for pen device info + SDL_PenInfo peninfo; + SDL_zero(peninfo); + peninfo.capabilities = SDL_PEN_CAPABILITY_PRESSURE | SDL_PEN_CAPABILITY_ERASER; + peninfo.num_buttons = 2; + peninfo.subtype = SDL_PEN_TYPE_PEN; + pen = SDL_AddPenDevice(0, NULL, &peninfo, (void *) (size_t) pen_id_in); + if (!pen) { + SDL_Log("error: can't add a pen device %d", pen_id_in); + return; + } + } + + SDL_SendPenMotion(0, pen, window, x, y); + SDL_SendPenAxis(0, pen, window, SDL_PEN_AXIS_PRESSURE, p); + // TODO: add more axis + + SDL_PenInputFlags current = SDL_GetPenStatus(pen, NULL, 0); + int diff = current ^ button; + if (diff != 0) { + // Android only exposes BUTTON_STYLUS_PRIMARY and BUTTON_STYLUS_SECONDARY + if (diff & SDL_PEN_INPUT_BUTTON_1) + SDL_SendPenButton(0, pen, window, 1, (button & SDL_PEN_INPUT_BUTTON_1) != 0); + + if (diff & SDL_PEN_INPUT_BUTTON_2) + SDL_SendPenButton(0, pen, window, 2, (button & SDL_PEN_INPUT_BUTTON_2) != 0); + } + + // button contains DOWN/ERASER_TIP on DOWN/UP regardless of pressed state, use action to distinguish + // we don't compare tip flags above because MotionEvent.getButtonState doesn't return stylus tip/eraser state. + switch (action) { + case ACTION_CANCEL: + case ACTION_HOVER_EXIT: + SDL_RemovePenDevice(0, pen); + break; + + case ACTION_DOWN: + case ACTION_POINTER_DOWN: + SDL_SendPenTouch(0, pen, window, (button & SDL_PEN_INPUT_ERASER_TIP) != 0, true); + break; + + case ACTION_UP: + case ACTION_POINTER_UP: + SDL_SendPenTouch(0, pen, window, (button & SDL_PEN_INPUT_ERASER_TIP) != 0, false); + break; + + default: + break; + } +} + +#endif // SDL_VIDEO_DRIVER_ANDROID diff --git a/libs/SDL3/src/video/android/SDL_androidpen.h b/libs/SDL3/src/video/android/SDL_androidpen.h new file mode 100644 index 00000000..99a5aee0 --- /dev/null +++ b/libs/SDL3/src/video/android/SDL_androidpen.h @@ -0,0 +1,25 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "SDL_internal.h" + +#include "SDL_androidvideo.h" + +extern void Android_OnPen(SDL_Window *window, int pen_id_in, int button, int action, float x, float y, float p); diff --git a/libs/SDL3/src/video/android/SDL_androidtouch.c b/libs/SDL3/src/video/android/SDL_androidtouch.c index 75b0c041..661c9a16 100644 --- a/libs/SDL3/src/video/android/SDL_androidtouch.c +++ b/libs/SDL3/src/video/android/SDL_androidtouch.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -32,7 +32,7 @@ #define ACTION_DOWN 0 #define ACTION_UP 1 #define ACTION_MOVE 2 -// #define ACTION_CANCEL 3 +#define ACTION_CANCEL 3 // #define ACTION_OUTSIDE 4 #define ACTION_POINTER_DOWN 5 #define ACTION_POINTER_UP 6 @@ -72,7 +72,7 @@ void Android_OnTouch(SDL_Window *window, int touch_device_id_in, int pointer_fin switch (action) { case ACTION_DOWN: case ACTION_POINTER_DOWN: - SDL_SendTouch(0, touchDeviceId, fingerId, window, true, x, y, p); + SDL_SendTouch(0, touchDeviceId, fingerId, window, SDL_EVENT_FINGER_DOWN, x, y, p); break; case ACTION_MOVE: @@ -81,7 +81,11 @@ void Android_OnTouch(SDL_Window *window, int touch_device_id_in, int pointer_fin case ACTION_UP: case ACTION_POINTER_UP: - SDL_SendTouch(0, touchDeviceId, fingerId, window, false, x, y, p); + SDL_SendTouch(0, touchDeviceId, fingerId, window, SDL_EVENT_FINGER_UP, x, y, p); + break; + + case ACTION_CANCEL: + SDL_SendTouch(0, touchDeviceId, fingerId, window, SDL_EVENT_FINGER_CANCELED, x, y, p); break; default: diff --git a/libs/SDL3/src/video/android/SDL_androidtouch.h b/libs/SDL3/src/video/android/SDL_androidtouch.h index 1637b3f5..2aef8226 100644 --- a/libs/SDL3/src/video/android/SDL_androidtouch.h +++ b/libs/SDL3/src/video/android/SDL_androidtouch.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidvideo.c b/libs/SDL3/src/video/android/SDL_androidvideo.c index ee8d8893..ed8106aa 100644 --- a/libs/SDL3/src/video/android/SDL_androidvideo.c +++ b/libs/SDL3/src/video/android/SDL_androidvideo.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -63,6 +63,11 @@ static int Android_DeviceHeight = 0; static Uint32 Android_ScreenFormat = SDL_PIXELFORMAT_RGB565; // Default SurfaceView format, in case this is queried before being filled float Android_ScreenDensity = 1.0f; static float Android_ScreenRate = 0.0f; +static SDL_DisplayOrientation Android_ScreenOrientation = SDL_ORIENTATION_UNKNOWN; +int Android_SafeInsetLeft = 0; +int Android_SafeInsetRight = 0; +int Android_SafeInsetTop = 0; +int Android_SafeInsetBottom = 0; static SDL_SystemTheme Android_SystemTheme; static bool Android_SuspendScreenSaver(SDL_VideoDevice *_this) @@ -245,6 +250,29 @@ void Android_SetFormat(int format_wanted, int format_got) SDL_GetPixelFormatName(pf_got), format_got); } +static void Android_SendOrientationUpdate(void) +{ + /* If we've received a compatible resize event, update the + * orientation immediately, otherwise wait for the display + * resize event. + */ + SDL_VideoDevice *device = SDL_GetVideoDevice(); + if (device && device->num_displays > 0) { + SDL_VideoDisplay *display = device->displays[0]; + bool mode_landscape = (display->desktop_mode.w > display->desktop_mode.h); + bool sensor_landscape = (Android_ScreenOrientation == SDL_ORIENTATION_LANDSCAPE || Android_ScreenOrientation == SDL_ORIENTATION_LANDSCAPE_FLIPPED); + if (sensor_landscape == mode_landscape) { + SDL_SendDisplayEvent(display, SDL_EVENT_DISPLAY_ORIENTATION, Android_ScreenOrientation, 0); + } + } +} + +void Android_SetOrientation(SDL_DisplayOrientation orientation) +{ + Android_ScreenOrientation = orientation; + Android_SendOrientationUpdate(); +} + void Android_SendResize(SDL_Window *window) { /* @@ -264,6 +292,7 @@ void Android_SendResize(SDL_Window *window) desktop_mode.h = Android_DeviceHeight; desktop_mode.refresh_rate = Android_ScreenRate; SDL_SetDesktopDisplayMode(display, &desktop_mode); + Android_SendOrientationUpdate(); } if (window) { @@ -271,6 +300,18 @@ void Android_SendResize(SDL_Window *window) } } +void Android_SetWindowSafeAreaInsets(int left, int right, int top, int bottom) +{ + Android_SafeInsetLeft = left; + Android_SafeInsetRight = right; + Android_SafeInsetTop = top; + Android_SafeInsetBottom = bottom; + + if (Android_Window) { + SDL_SetWindowSafeAreaInsets(Android_Window, left, right, top, bottom); + } +} + void Android_SetDarkMode(bool enabled) { SDL_VideoDevice *device = SDL_GetVideoDevice(); diff --git a/libs/SDL3/src/video/android/SDL_androidvideo.h b/libs/SDL3/src/video/android/SDL_androidvideo.h index baead920..c5616372 100644 --- a/libs/SDL3/src/video/android/SDL_androidvideo.h +++ b/libs/SDL3/src/video/android/SDL_androidvideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -28,7 +28,9 @@ // Called by the JNI layer when the screen changes size or format extern void Android_SetScreenResolution(int surfaceWidth, int surfaceHeight, int deviceWidth, int deviceHeight, float density, float rate); extern void Android_SetFormat(int format_wanted, int format_got); +extern void Android_SetOrientation(SDL_DisplayOrientation orientation); extern void Android_SendResize(SDL_Window *window); +extern void Android_SetWindowSafeAreaInsets(int left, int right, int top, int bottom); extern void Android_SetDarkMode(bool enabled); // Private display data @@ -42,5 +44,9 @@ struct SDL_VideoData extern int Android_SurfaceWidth; extern int Android_SurfaceHeight; extern float Android_ScreenDensity; +extern int Android_SafeInsetLeft; +extern int Android_SafeInsetRight; +extern int Android_SafeInsetTop; +extern int Android_SafeInsetBottom; #endif // SDL_androidvideo_h_ diff --git a/libs/SDL3/src/video/android/SDL_androidvulkan.c b/libs/SDL3/src/video/android/SDL_androidvulkan.c index 60a3f672..4d38388f 100644 --- a/libs/SDL3/src/video/android/SDL_androidvulkan.c +++ b/libs/SDL3/src/video/android/SDL_androidvulkan.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidvulkan.h b/libs/SDL3/src/video/android/SDL_androidvulkan.h index bcbe1e23..4f7cd51f 100644 --- a/libs/SDL3/src/video/android/SDL_androidvulkan.h +++ b/libs/SDL3/src/video/android/SDL_androidvulkan.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/android/SDL_androidwindow.c b/libs/SDL3/src/video/android/SDL_androidwindow.c index f2a5757b..af840b22 100644 --- a/libs/SDL3/src/video/android/SDL_androidwindow.c +++ b/libs/SDL3/src/video/android/SDL_androidwindow.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -93,6 +93,8 @@ bool Android_CreateWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_Proper SDL_SetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_ANDROID_SURFACE_POINTER, data->egl_surface); #endif + SDL_SetWindowSafeAreaInsets(window, Android_SafeInsetLeft, Android_SafeInsetRight, Android_SafeInsetTop, Android_SafeInsetBottom); + window->internal = data; Android_Window = window; diff --git a/libs/SDL3/src/video/android/SDL_androidwindow.h b/libs/SDL3/src/video/android/SDL_androidwindow.h index 1a534146..5590b590 100644 --- a/libs/SDL3/src/video/android/SDL_androidwindow.h +++ b/libs/SDL3/src/video/android/SDL_androidwindow.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoaclipboard.h b/libs/SDL3/src/video/cocoa/SDL_cocoaclipboard.h index da2e6120..758f45af 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoaclipboard.h +++ b/libs/SDL3/src/video/cocoa/SDL_cocoaclipboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoaclipboard.m b/libs/SDL3/src/video/cocoa/SDL_cocoaclipboard.m index 9b266fcb..42c2ad64 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoaclipboard.m +++ b/libs/SDL3/src/video/cocoa/SDL_cocoaclipboard.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -23,11 +23,10 @@ #ifdef SDL_VIDEO_DRIVER_COCOA #include "SDL_cocoavideo.h" +#include "../../events/SDL_events_c.h" #include "../../events/SDL_clipboardevents_c.h" -#if MAC_OS_X_VERSION_MAX_ALLOWED < 101300 -typedef NSString *NSPasteboardType; // Defined in macOS 10.13+ -#endif +#include @interface Cocoa_PasteboardDataProvider : NSObject { @@ -72,6 +71,66 @@ provideDataForType:(NSPasteboardType)type @end +static char **GetMimeTypes(int *pnformats) +{ + char **new_mime_types = NULL; + + *pnformats = 0; + + int nformats = 0; + int formatsSz = 0; + NSArray *items = [[NSPasteboard generalPasteboard] pasteboardItems]; + NSUInteger nitems = [items count]; + if (nitems > 0) { + for (NSPasteboardItem *item in items) { + NSArray *types = [item types]; + for (NSString *type in types) { + if (@available(macOS 11.0, *)) { + UTType *uttype = [UTType typeWithIdentifier:type]; + NSString *mime_type = [uttype preferredMIMEType]; + if (mime_type) { + NSUInteger len = [mime_type lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; + formatsSz += len; + ++nformats; + } + } + NSUInteger len = [type lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; + formatsSz += len; + ++nformats; + } + } + + new_mime_types = SDL_AllocateTemporaryMemory((nformats + 1) * sizeof(char *) + formatsSz); + if (new_mime_types) { + int i = 0; + char *strPtr = (char *)(new_mime_types + nformats + 1); + for (NSPasteboardItem *item in items) { + NSArray *types = [item types]; + for (NSString *type in types) { + if (@available(macOS 11.0, *)) { + UTType *uttype = [UTType typeWithIdentifier:type]; + NSString *mime_type = [uttype preferredMIMEType]; + if (mime_type) { + NSUInteger len = [mime_type lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; + SDL_memcpy(strPtr, [mime_type UTF8String], len); + new_mime_types[i++] = strPtr; + strPtr += len; + } + } + NSUInteger len = [type lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; + SDL_memcpy(strPtr, [type UTF8String], len); + new_mime_types[i++] = strPtr; + strPtr += len; + } + } + + new_mime_types[nformats] = NULL; + *pnformats = nformats; + } + } + return new_mime_types; +} + void Cocoa_CheckClipboardUpdate(SDL_CocoaVideoData *data) { @@ -82,9 +141,12 @@ void Cocoa_CheckClipboardUpdate(SDL_CocoaVideoData *data) pasteboard = [NSPasteboard generalPasteboard]; count = [pasteboard changeCount]; if (count != data.clipboard_count) { - if (data.clipboard_count) { - // TODO: compute mime types - SDL_SendClipboardUpdate(false, NULL, 0); + if (count) { + int nformats = 0; + char **new_mime_types = GetMimeTypes(&nformats); + if (new_mime_types) { + SDL_SendClipboardUpdate(false, new_mime_types, nformats); + } } data.clipboard_count = count; } @@ -129,6 +191,33 @@ bool Cocoa_SetClipboardData(SDL_VideoDevice *_this) return true; } +static bool IsMimeType(const char *tag) +{ + if (SDL_strchr(tag, '/')) { + // MIME types have slashes + return true; + } else if (SDL_strchr(tag, '.')) { + // UTI identifiers have periods + return false; + } else { + // Not sure, but it's not a UTI identifier + return true; + } +} + +static CFStringRef GetUTIType(const char *tag) +{ + CFStringRef utiType; + if (IsMimeType(tag)) { + CFStringRef mimeType = CFStringCreateWithCString(NULL, tag, kCFStringEncodingUTF8); + utiType = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType, NULL); + CFRelease(mimeType); + } else { + utiType = CFStringCreateWithCString(NULL, tag, kCFStringEncodingUTF8); + } + return utiType; +} + void *Cocoa_GetClipboardData(SDL_VideoDevice *_this, const char *mime_type, size_t *size) { @autoreleasepool { @@ -137,9 +226,7 @@ void *Cocoa_GetClipboardData(SDL_VideoDevice *_this, const char *mime_type, size *size = 0; for (NSPasteboardItem *item in [pasteboard pasteboardItems]) { NSData *itemData; - CFStringRef mimeType = CFStringCreateWithCString(NULL, mime_type, kCFStringEncodingUTF8); - CFStringRef utiType = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType, NULL); - CFRelease(mimeType); + CFStringRef utiType = GetUTIType(mime_type); itemData = [item dataForType: (__bridge NSString *)utiType]; CFRelease(utiType); if (itemData != nil) { @@ -162,9 +249,7 @@ bool Cocoa_HasClipboardData(SDL_VideoDevice *_this, const char *mime_type) bool result = false; @autoreleasepool { NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; - CFStringRef mimeType = CFStringCreateWithCString(NULL, mime_type, kCFStringEncodingUTF8); - CFStringRef utiType = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType, NULL); - CFRelease(mimeType); + CFStringRef utiType = GetUTIType(mime_type); if ([pasteboard canReadItemWithDataConformingToTypes: @[(__bridge NSString *)utiType]]) { result = true; } diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoaevents.h b/libs/SDL3/src/video/cocoa/SDL_cocoaevents.h index 49ecfbb7..49442077 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoaevents.h +++ b/libs/SDL3/src/video/cocoa/SDL_cocoaevents.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoaevents.m b/libs/SDL3/src/video/cocoa/SDL_cocoaevents.m index ea7874a3..58cae995 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoaevents.m +++ b/libs/SDL3/src/video/cocoa/SDL_cocoaevents.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -25,10 +25,6 @@ #include "SDL_cocoavideo.h" #include "../../events/SDL_events_c.h" -#ifndef MAC_OS_X_VERSION_10_12 -#define NSEventTypeApplicationDefined NSApplicationDefined -#endif - static SDL_Window *FindSDLWindowForNSWindow(NSWindow *win) { SDL_Window *sdlwindow = NULL; @@ -80,6 +76,8 @@ static void Cocoa_DispatchEvent(NSEvent *theEvent) case NSEventTypeOtherMouseDragged: // usually middle mouse dragged case NSEventTypeMouseMoved: case NSEventTypeScrollWheel: + case NSEventTypeMouseEntered: + case NSEventTypeMouseExited: Cocoa_HandleMouseEvent(_this, theEvent); break; case NSEventTypeKeyDown: @@ -136,6 +134,7 @@ static void Cocoa_DispatchEvent(NSEvent *theEvent) change:(NSDictionary *)change context:(void *)context; - (BOOL)applicationSupportsSecureRestorableState:(NSApplication *)app; +- (IBAction)menu:(id)sender; @end @implementation SDL3AppDelegate : NSObject @@ -358,6 +357,13 @@ static void Cocoa_DispatchEvent(NSEvent *theEvent) return YES; } +- (IBAction)menu:(id)sender +{ + SDL_TrayEntry *entry = [[sender representedObject] pointerValue]; + + SDL_ClickTrayEntry(entry); +} + @end static SDL3AppDelegate *appDelegate = nil; diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoakeyboard.h b/libs/SDL3/src/video/cocoa/SDL_cocoakeyboard.h index a8f35577..145f6cfe 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoakeyboard.h +++ b/libs/SDL3/src/video/cocoa/SDL_cocoakeyboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoakeyboard.m b/libs/SDL3/src/video/cocoa/SDL_cocoakeyboard.m index 72614cb1..550f533f 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoakeyboard.m +++ b/libs/SDL3/src/video/cocoa/SDL_cocoakeyboard.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -369,6 +369,26 @@ static void UpdateKeymap(SDL_CocoaVideoData *data, bool send_event) SDL_SetKeymap(keymap, send_event); } +static void SDLCALL SDL_MacOptionAsAltChanged(void *userdata, const char *name, const char *oldValue, const char *hint) +{ + SDL_VideoDevice *_this = (SDL_VideoDevice *)userdata; + SDL_CocoaVideoData *data = (__bridge SDL_CocoaVideoData *)_this->internal; + + if (hint && *hint) { + if (SDL_strcmp(hint, "none") == 0) { + data.option_as_alt = OptionAsAltNone; + } else if (SDL_strcmp(hint, "only_left") == 0) { + data.option_as_alt = OptionAsAltOnlyLeft; + } else if (SDL_strcmp(hint, "only_right") == 0) { + data.option_as_alt = OptionAsAltOnlyRight; + } else if (SDL_strcmp(hint, "both") == 0) { + data.option_as_alt = OptionAsAltBoth; + } + } else { + data.option_as_alt = OptionAsAltNone; + } +} + void Cocoa_InitKeyboard(SDL_VideoDevice *_this) { SDL_CocoaVideoData *data = (__bridge SDL_CocoaVideoData *)_this->internal; @@ -385,6 +405,8 @@ void Cocoa_InitKeyboard(SDL_VideoDevice *_this) data.modifierFlags = (unsigned int)[NSEvent modifierFlags]; SDL_ToggleModState(SDL_KMOD_CAPS, (data.modifierFlags & NSEventModifierFlagCapsLock) ? true : false); + + SDL_AddHintCallback(SDL_HINT_MAC_OPTION_AS_ALT, SDL_MacOptionAsAltChanged, _this); } bool Cocoa_StartTextInput(SDL_VideoDevice *_this, SDL_Window *window, SDL_PropertiesID props) @@ -437,6 +459,51 @@ bool Cocoa_UpdateTextInputArea(SDL_VideoDevice *_this, SDL_Window *window) return true; } +static NSEvent *ReplaceEvent(NSEvent *event, OptionAsAlt option_as_alt) +{ + if (option_as_alt == OptionAsAltNone) { + return event; + } + + const unsigned int modflags = (unsigned int)[event modifierFlags]; + + bool ignore_alt_characters = false; + + bool lalt_pressed = IsModifierKeyPressed(modflags, NX_DEVICELALTKEYMASK, + NX_DEVICERALTKEYMASK, NX_ALTERNATEMASK); + bool ralt_pressed = IsModifierKeyPressed(modflags, NX_DEVICERALTKEYMASK, + NX_DEVICELALTKEYMASK, NX_ALTERNATEMASK); + + if (option_as_alt == OptionAsAltOnlyLeft && lalt_pressed) { + ignore_alt_characters = true; + } else if (option_as_alt == OptionAsAltOnlyRight && ralt_pressed) { + ignore_alt_characters = true; + } else if (option_as_alt == OptionAsAltBoth && (lalt_pressed || ralt_pressed)) { + ignore_alt_characters = true; + } + + bool cmd_pressed = modflags & NX_COMMANDMASK; + bool ctrl_pressed = modflags & NX_CONTROLMASK; + + ignore_alt_characters = ignore_alt_characters && !cmd_pressed && !ctrl_pressed; + + if (ignore_alt_characters) { + NSString *charactersIgnoringModifiers = [event charactersIgnoringModifiers]; + return [NSEvent keyEventWithType:[event type] + location:[event locationInWindow] + modifierFlags:modflags + timestamp:[event timestamp] + windowNumber:[event windowNumber] + context:nil + characters:charactersIgnoringModifiers + charactersIgnoringModifiers:charactersIgnoringModifiers + isARepeat:[event isARepeat] + keyCode:[event keyCode]]; + } + + return event; +} + void Cocoa_HandleKeyEvent(SDL_VideoDevice *_this, NSEvent *event) { unsigned short scancode; @@ -446,6 +513,10 @@ void Cocoa_HandleKeyEvent(SDL_VideoDevice *_this, NSEvent *event) return; // can happen when returning from fullscreen Space on shutdown } + if ([event type] == NSEventTypeKeyDown || [event type] == NSEventTypeKeyUp) { + event = ReplaceEvent(event, data.option_as_alt); + } + scancode = [event keyCode]; if ((scancode == 10 || scancode == 50) && KBGetLayoutType(LMGetKbdType()) == kKeyboardISO) { @@ -476,7 +547,7 @@ void Cocoa_HandleKeyEvent(SDL_VideoDevice *_this, NSEvent *event) [data.fieldEdit setPendingKey:scancode scancode:code timestamp:Cocoa_GetEventTimestamp([event timestamp])]; [data.fieldEdit interpretKeyEvents:[NSArray arrayWithObject:event]]; [data.fieldEdit sendPendingKey]; - } else { + } else if (SDL_GetKeyboardFocus()) { SDL_SendKeyboardKey(Cocoa_GetEventTimestamp([event timestamp]), SDL_DEFAULT_KEYBOARD_ID, scancode, code, true); } break; diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoamessagebox.h b/libs/SDL3/src/video/cocoa/SDL_cocoamessagebox.h index 74dbde41..ea020523 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoamessagebox.h +++ b/libs/SDL3/src/video/cocoa/SDL_cocoamessagebox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoamessagebox.m b/libs/SDL3/src/video/cocoa/SDL_cocoamessagebox.m index 689c47a7..d54adb12 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoamessagebox.m +++ b/libs/SDL3/src/video/cocoa/SDL_cocoamessagebox.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoametalview.h b/libs/SDL3/src/video/cocoa/SDL_cocoametalview.h index acc71143..3b768367 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoametalview.h +++ b/libs/SDL3/src/video/cocoa/SDL_cocoametalview.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoametalview.m b/libs/SDL3/src/video/cocoa/SDL_cocoametalview.m index 2f85a2d2..d8566451 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoametalview.m +++ b/libs/SDL3/src/video/cocoa/SDL_cocoametalview.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoamodes.h b/libs/SDL3/src/video/cocoa/SDL_cocoamodes.h index c4efd378..37f3aa58 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoamodes.h +++ b/libs/SDL3/src/video/cocoa/SDL_cocoamodes.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -40,5 +40,6 @@ extern bool Cocoa_GetDisplayUsableBounds(SDL_VideoDevice *_this, SDL_VideoDispla extern bool Cocoa_GetDisplayModes(SDL_VideoDevice *_this, SDL_VideoDisplay *display); extern bool Cocoa_SetDisplayMode(SDL_VideoDevice *_this, SDL_VideoDisplay *display, SDL_DisplayMode *mode); extern void Cocoa_QuitModes(SDL_VideoDevice *_this); +extern SDL_VideoDisplay *Cocoa_FindSDLDisplayByCGDirectDisplayID(SDL_VideoDevice *_this, CGDirectDisplayID displayid); #endif // SDL_cocoamodes_h_ diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoamodes.m b/libs/SDL3/src/video/cocoa/SDL_cocoamodes.m index 533b37b3..b4e151b9 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoamodes.m +++ b/libs/SDL3/src/video/cocoa/SDL_cocoamodes.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -23,6 +23,7 @@ #ifdef SDL_VIDEO_DRIVER_COCOA #include "SDL_cocoavideo.h" +#include "../../events/SDL_events_c.h" // We need this for IODisplayCreateInfoDictionary and kIODisplayOnlyPreferredName #include @@ -31,12 +32,6 @@ #include #include -// This gets us MAC_OS_X_VERSION_MIN_REQUIRED... -#include - -#ifndef MAC_OS_X_VERSION_10_13 -#define NSAppKitVersionNumber10_12 1504 -#endif #if (IOGRAPHICSTYPES_REV < 40) #define kDisplayModeNativeFlag 0x02000000 #endif @@ -97,6 +92,17 @@ static NSScreen *GetNSScreenForDisplayID(CGDirectDisplayID displayID) return nil; } +SDL_VideoDisplay *Cocoa_FindSDLDisplayByCGDirectDisplayID(SDL_VideoDevice *_this, CGDirectDisplayID displayid) +{ + for (int i = 0; i < _this->num_displays; i++) { + const SDL_DisplayData *displaydata = _this->displays[i]->internal; + if (displaydata && (displaydata->display == displayid)) { + return _this->displays[i]; + } + } + return NULL; +} + static float GetDisplayModeRefreshRate(CGDisplayModeRef vidmode, CVDisplayLinkRef link) { float refreshRate = (float)CGDisplayModeGetRefreshRate(vidmode); @@ -153,7 +159,7 @@ static Uint32 GetDisplayModePixelFormat(CGDisplayModeRef vidmode) return pixelformat; } -static bool GetDisplayMode(SDL_VideoDevice *_this, CGDisplayModeRef vidmode, bool vidmodeCurrent, CFArrayRef modelist, CVDisplayLinkRef link, SDL_DisplayMode *mode) +static bool GetDisplayMode(CGDisplayModeRef vidmode, bool vidmodeCurrent, CFArrayRef modelist, CVDisplayLinkRef link, SDL_DisplayMode *mode) { SDL_DisplayModeData *data; bool usableForGUI = CGDisplayModeIsUsableForDesktopGUI(vidmode); @@ -277,6 +283,16 @@ static bool GetDisplayMode(SDL_VideoDevice *_this, CGDisplayModeRef vidmode, boo static char *Cocoa_GetDisplayName(CGDirectDisplayID displayID) { + if (@available(macOS 10.15, *)) { + NSScreen *screen = GetNSScreenForDisplayID(displayID); + if (screen) { + const char *name = [screen.localizedName UTF8String]; + if (name) { + return SDL_strdup(name); + } + } + } + // This API is deprecated in 10.9 with no good replacement (as of 10.15). io_service_t servicePort = CGDisplayIOServicePort(displayID); CFDictionaryRef deviceInfo = IODisplayCreateInfoDictionary(servicePort, kIODisplayOnlyPreferredName); @@ -295,7 +311,6 @@ static void Cocoa_GetHDRProperties(CGDirectDisplayID displayID, SDL_HDROutputPro HDR->SDR_white_level = 1.0f; HDR->HDR_headroom = 1.0f; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101500 // Added in the 10.15 SDK if (@available(macOS 10.15, *)) { NSScreen *screen = GetNSScreenForDisplayID(displayID); if (screen) { @@ -306,24 +321,178 @@ static void Cocoa_GetHDRProperties(CGDirectDisplayID displayID, SDL_HDROutputPro } } } -#endif +} + + +bool Cocoa_AddDisplay(CGDirectDisplayID display, bool send_event) +{ + CGDisplayModeRef moderef = CGDisplayCopyDisplayMode(display); + if (!moderef) { + return false; + } + + SDL_DisplayData *displaydata = (SDL_DisplayData *)SDL_malloc(sizeof(*displaydata)); + if (!displaydata) { + CGDisplayModeRelease(moderef); + return false; + } + displaydata->display = display; + + CVDisplayLinkRef link = NULL; + CVDisplayLinkCreateWithCGDisplay(display, &link); + + SDL_VideoDisplay viddisplay; + SDL_zero(viddisplay); + viddisplay.name = Cocoa_GetDisplayName(display); // this returns a strdup'ed string + + SDL_DisplayMode mode; + if (!GetDisplayMode(moderef, true, NULL, link, &mode)) { + CVDisplayLinkRelease(link); + CGDisplayModeRelease(moderef); + SDL_free(viddisplay.name); + SDL_free(displaydata); + return false; + } + + CVDisplayLinkRelease(link); + CGDisplayModeRelease(moderef); + + Cocoa_GetHDRProperties(displaydata->display, &viddisplay.HDR); + + viddisplay.desktop_mode = mode; + viddisplay.internal = displaydata; + const bool retval = SDL_AddVideoDisplay(&viddisplay, send_event); + SDL_free(viddisplay.name); + return retval; +} + +static void Cocoa_DisplayReconfigurationCallback(CGDirectDisplayID displayid, CGDisplayChangeSummaryFlags flags, void *userInfo) +{ + #if 0 + SDL_Log("COCOA DISPLAY RECONFIG CALLBACK! display=%u", (unsigned int) displayid); + #define CHECK_DISPLAY_RECONFIG_FLAG(x) if (flags & x) { SDL_Log(" - " #x); } + CHECK_DISPLAY_RECONFIG_FLAG(kCGDisplayBeginConfigurationFlag); + CHECK_DISPLAY_RECONFIG_FLAG(kCGDisplayMovedFlag); + CHECK_DISPLAY_RECONFIG_FLAG(kCGDisplaySetMainFlag); + CHECK_DISPLAY_RECONFIG_FLAG(kCGDisplaySetModeFlag); + CHECK_DISPLAY_RECONFIG_FLAG(kCGDisplayAddFlag); + CHECK_DISPLAY_RECONFIG_FLAG(kCGDisplayRemoveFlag); + CHECK_DISPLAY_RECONFIG_FLAG(kCGDisplayEnabledFlag); + CHECK_DISPLAY_RECONFIG_FLAG(kCGDisplayDisabledFlag); + CHECK_DISPLAY_RECONFIG_FLAG(kCGDisplayMirrorFlag); + CHECK_DISPLAY_RECONFIG_FLAG(kCGDisplayUnMirrorFlag); + CHECK_DISPLAY_RECONFIG_FLAG(kCGDisplayDesktopShapeChangedFlag); + #undef CHECK_DISPLAY_RECONFIG_FLAG + #endif + + SDL_VideoDevice *_this = (SDL_VideoDevice *) userInfo; + SDL_VideoDisplay *display = Cocoa_FindSDLDisplayByCGDirectDisplayID(_this, displayid); // will be NULL for newly-added (or newly-unmirrored) displays! + + if (flags & kCGDisplayDisabledFlag) { + flags |= kCGDisplayRemoveFlag; // treat this like a display leaving, even though it's still plugged in. + } + + if (flags & kCGDisplayEnabledFlag) { + flags |= kCGDisplayAddFlag; // treat this like a display leaving, even though it's still plugged in. + } + + if (flags & kCGDisplayMirrorFlag) { + flags |= kCGDisplayRemoveFlag; // treat this like a display leaving, even though it's still actually here. + } + + if (flags & kCGDisplayUnMirrorFlag) { + flags |= kCGDisplayAddFlag; // treat this like a new display arriving, even though it was here all along. + } + + if ((flags & kCGDisplayAddFlag) && (flags & kCGDisplayRemoveFlag)) { + // sometimes you get a removed device that gets Add and Remove flags at the same time but the display dimensions are 0x0 or 1x1, hence the `> 1` test. + // Mirrored things are always removed, since they don't represent a discrete display in this state. + if (((flags & kCGDisplayMirrorFlag) == 0) && (CGDisplayPixelsWide(displayid) > 1)) { + // Final state is connected + flags &= ~kCGDisplayRemoveFlag; + } else { + // Final state is disconnected + flags &= ~kCGDisplayAddFlag; + } + } + + if (flags & kCGDisplayAddFlag) { + if (!display) { + if (!Cocoa_AddDisplay(displayid, true)) { + return; // oh well. + } + display = Cocoa_FindSDLDisplayByCGDirectDisplayID(_this, displayid); + SDL_assert(display != NULL); + } + } + + if (flags & kCGDisplayRemoveFlag) { + if (display) { + SDL_DelVideoDisplay(display->id, true); + display = NULL; + } + } + + if (flags & kCGDisplaySetModeFlag) { + if (display) { + CGDisplayModeRef moderef = CGDisplayCopyDisplayMode(displayid); + if (moderef) { + CVDisplayLinkRef link = NULL; + CVDisplayLinkCreateWithCGDisplay(displayid, &link); + if (link) { + SDL_DisplayMode mode; + if (GetDisplayMode(moderef, true, NULL, link, &mode)) { + SDL_SetDesktopDisplayMode(display, &mode); + } + CVDisplayLinkRelease(link); + } + CGDisplayModeRelease(moderef); + } + } + } + + if (flags & kCGDisplaySetMainFlag) { + if (display) { + for (int i = 0; i < _this->num_displays; i++) { + if (_this->displays[i] == display) { + if (i > 0) { + // move this display to the front of _this->displays so it's treated as primary. + SDL_memmove(&_this->displays[1], &_this->displays[0], sizeof (*_this->displays) * i); + _this->displays[0] = display; + } + flags |= kCGDisplayMovedFlag; // we don't have an SDL event atm for "this display became primary," so at least let everyone know it "moved". + break; + } + } + } + } + + if (flags & kCGDisplayMovedFlag) { + if (display) { + SDL_SendDisplayEvent(display, SDL_EVENT_DISPLAY_MOVED, 0, 0); + } + } + + if (flags & kCGDisplayDesktopShapeChangedFlag) { + SDL_UpdateDesktopBounds(); + } } void Cocoa_InitModes(SDL_VideoDevice *_this) { @autoreleasepool { CGDisplayErr result; - CGDirectDisplayID *displays; - CGDisplayCount numDisplays; - bool isstack; - int pass, i; + CGDisplayCount numDisplays = 0; result = CGGetOnlineDisplayList(0, NULL, &numDisplays); if (result != kCGErrorSuccess) { CG_SetError("CGGetOnlineDisplayList()", result); return; } - displays = SDL_small_alloc(CGDirectDisplayID, numDisplays, &isstack); + + bool isstack; + CGDirectDisplayID *displays = SDL_small_alloc(CGDirectDisplayID, numDisplays, &isstack); + result = CGGetOnlineDisplayList(numDisplays, displays, &numDisplays); if (result != kCGErrorSuccess) { CG_SetError("CGGetOnlineDisplayList()", result); @@ -331,15 +500,12 @@ void Cocoa_InitModes(SDL_VideoDevice *_this) return; } - // Pick up the primary display in the first pass, then get the rest - for (pass = 0; pass < 2; ++pass) { - for (i = 0; i < numDisplays; ++i) { - SDL_VideoDisplay display; - SDL_DisplayData *displaydata; - SDL_DisplayMode mode; - CGDisplayModeRef moderef = NULL; - CVDisplayLinkRef link = NULL; + // future updates to the display graph will come through this callback. + CGDisplayRegisterReconfigurationCallback(Cocoa_DisplayReconfigurationCallback, _this); + // Pick up the primary display in the first pass, then get the rest + for (int pass = 0; pass < 2; ++pass) { + for (int i = 0; i < numDisplays; ++i) { if (pass == 0) { if (!CGDisplayIsMain(displays[i])) { continue; @@ -354,41 +520,7 @@ void Cocoa_InitModes(SDL_VideoDevice *_this) continue; } - moderef = CGDisplayCopyDisplayMode(displays[i]); - - if (!moderef) { - continue; - } - - displaydata = (SDL_DisplayData *)SDL_malloc(sizeof(*displaydata)); - if (!displaydata) { - CGDisplayModeRelease(moderef); - continue; - } - displaydata->display = displays[i]; - - CVDisplayLinkCreateWithCGDisplay(displays[i], &link); - - SDL_zero(display); - // this returns a strdup'ed string - display.name = Cocoa_GetDisplayName(displays[i]); - if (!GetDisplayMode(_this, moderef, true, NULL, link, &mode)) { - CVDisplayLinkRelease(link); - CGDisplayModeRelease(moderef); - SDL_free(display.name); - SDL_free(displaydata); - continue; - } - - CVDisplayLinkRelease(link); - CGDisplayModeRelease(moderef); - - Cocoa_GetHDRProperties(displaydata->display, &display.HDR); - - display.desktop_mode = mode; - display.internal = displaydata; - SDL_AddVideoDisplay(&display, false); - SDL_free(display.name); + Cocoa_AddDisplay(displays[i], false); } } SDL_small_free(displays, isstack); @@ -486,7 +618,7 @@ bool Cocoa_GetDisplayModes(SDL_VideoDevice *_this, SDL_VideoDisplay *display) CGDisplayModeRef moderef = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i); SDL_DisplayMode mode; - if (GetDisplayMode(_this, moderef, false, modes, link, &mode)) { + if (GetDisplayMode(moderef, false, modes, link, &mode)) { if (!SDL_AddFullscreenDisplayMode(display, &mode)) { CFRelease(mode.internal->modes); SDL_free(mode.internal); @@ -559,6 +691,8 @@ void Cocoa_QuitModes(SDL_VideoDevice *_this) { int i, j; + CGDisplayRemoveReconfigurationCallback(Cocoa_DisplayReconfigurationCallback, _this); + for (i = 0; i < _this->num_displays; ++i) { SDL_VideoDisplay *display = _this->displays[i]; SDL_DisplayModeData *mode; diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoamouse.h b/libs/SDL3/src/video/cocoa/SDL_cocoamouse.h index 7dc257fd..70282be9 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoamouse.h +++ b/libs/SDL3/src/video/cocoa/SDL_cocoamouse.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -26,6 +26,7 @@ #include "SDL_cocoavideo.h" extern bool Cocoa_InitMouse(SDL_VideoDevice *_this); +extern NSWindow *Cocoa_GetMouseFocus(); extern void Cocoa_HandleMouseEvent(SDL_VideoDevice *_this, NSEvent *event); extern void Cocoa_HandleMouseWheel(SDL_Window *window, NSEvent *event); extern void Cocoa_HandleMouseWarp(CGFloat x, CGFloat y); diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoamouse.m b/libs/SDL3/src/video/cocoa/SDL_cocoamouse.m index 8f2cef58..77ebf109 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoamouse.m +++ b/libs/SDL3/src/video/cocoa/SDL_cocoamouse.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -27,7 +27,9 @@ #include "../../events/SDL_mouse_c.h" -// #define DEBUG_COCOAMOUSE +#if 0 +#define DEBUG_COCOAMOUSE +#endif #ifdef DEBUG_COCOAMOUSE #define DLog(fmt, ...) printf("%s: " fmt "\n", __func__, ##__VA_ARGS__) @@ -230,11 +232,11 @@ static bool Cocoa_ShowCursor(SDL_Cursor *cursor) SDL_VideoDevice *device = SDL_GetVideoDevice(); SDL_Window *window = (device ? device->windows : NULL); for (; window != NULL; window = window->next) { - SDL_CocoaWindowData *internal = (__bridge SDL_CocoaWindowData *)window->internal; - if (internal) { - [internal.nswindow performSelectorOnMainThread:@selector(invalidateCursorRectsForView:) - withObject:[internal.nswindow contentView] - waitUntilDone:NO]; + SDL_CocoaWindowData *data = (__bridge SDL_CocoaWindowData *)window->internal; + if (data) { + [data.nswindow performSelectorOnMainThread:@selector(invalidateCursorRectsForView:) + withObject:[data.nswindow contentView] + waitUntilDone:NO]; } } return true; @@ -428,6 +430,13 @@ static void Cocoa_HandleTitleButtonEvent(SDL_VideoDevice *_this, NSEvent *event) } } +static NSWindow *Cocoa_MouseFocus; + +NSWindow *Cocoa_GetMouseFocus() +{ + return Cocoa_MouseFocus; +} + void Cocoa_HandleMouseEvent(SDL_VideoDevice *_this, NSEvent *event) { SDL_MouseID mouseID = SDL_DEFAULT_MOUSE_ID; @@ -437,7 +446,14 @@ void Cocoa_HandleMouseEvent(SDL_VideoDevice *_this, NSEvent *event) CGFloat lastMoveX, lastMoveY; float deltaX, deltaY; bool seenWarp; + switch ([event type]) { + case NSEventTypeMouseEntered: + Cocoa_MouseFocus = [event window]; + return; + case NSEventTypeMouseExited: + Cocoa_MouseFocus = NULL; + return; case NSEventTypeMouseMoved: case NSEventTypeLeftMouseDragged: case NSEventTypeRightMouseDragged: diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoaopengl.h b/libs/SDL3/src/video/cocoa/SDL_cocoaopengl.h index 747a3f92..33d7b0eb 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoaopengl.h +++ b/libs/SDL3/src/video/cocoa/SDL_cocoaopengl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoaopengl.m b/libs/SDL3/src/video/cocoa/SDL_cocoaopengl.m index cacfbb87..34002ecd 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoaopengl.m +++ b/libs/SDL3/src/video/cocoa/SDL_cocoaopengl.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoaopengles.h b/libs/SDL3/src/video/cocoa/SDL_cocoaopengles.h index 98ff00c6..5cf97e3c 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoaopengles.h +++ b/libs/SDL3/src/video/cocoa/SDL_cocoaopengles.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoaopengles.m b/libs/SDL3/src/video/cocoa/SDL_cocoaopengles.m index 6fb5e9ed..053ddc91 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoaopengles.m +++ b/libs/SDL3/src/video/cocoa/SDL_cocoaopengles.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoapen.h b/libs/SDL3/src/video/cocoa/SDL_cocoapen.h index 140d0940..b659ba41 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoapen.h +++ b/libs/SDL3/src/video/cocoa/SDL_cocoapen.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoapen.m b/libs/SDL3/src/video/cocoa/SDL_cocoapen.m index 6a9ff9a1..35fe7926 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoapen.m +++ b/libs/SDL3/src/video/cocoa/SDL_cocoapen.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoashape.h b/libs/SDL3/src/video/cocoa/SDL_cocoashape.h index 82d42e67..9ca3c647 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoashape.h +++ b/libs/SDL3/src/video/cocoa/SDL_cocoashape.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoashape.m b/libs/SDL3/src/video/cocoa/SDL_cocoashape.m index ab98aa5c..26081bd6 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoashape.m +++ b/libs/SDL3/src/video/cocoa/SDL_cocoashape.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoavideo.h b/libs/SDL3/src/video/cocoa/SDL_cocoavideo.h index 29edadb3..353fb435 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoavideo.h +++ b/libs/SDL3/src/video/cocoa/SDL_cocoavideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -40,63 +40,18 @@ #include "SDL_cocoawindow.h" #include "SDL_cocoapen.h" -#ifndef MAC_OS_X_VERSION_10_12 -#define DECLARE_EVENT(name) static const NSEventType NSEventType##name = NS##name -DECLARE_EVENT(LeftMouseDown); -DECLARE_EVENT(LeftMouseUp); -DECLARE_EVENT(RightMouseDown); -DECLARE_EVENT(RightMouseUp); -DECLARE_EVENT(OtherMouseDown); -DECLARE_EVENT(OtherMouseUp); -DECLARE_EVENT(MouseMoved); -DECLARE_EVENT(LeftMouseDragged); -DECLARE_EVENT(RightMouseDragged); -DECLARE_EVENT(OtherMouseDragged); -DECLARE_EVENT(ScrollWheel); -DECLARE_EVENT(KeyDown); -DECLARE_EVENT(KeyUp); -DECLARE_EVENT(FlagsChanged); -#undef DECLARE_EVENT - -static const NSEventMask NSEventMaskAny = NSAnyEventMask; - -#define DECLARE_MODIFIER_FLAG(name) static const NSUInteger NSEventModifierFlag##name = NS##name##KeyMask -DECLARE_MODIFIER_FLAG(Shift); -DECLARE_MODIFIER_FLAG(Control); -DECLARE_MODIFIER_FLAG(Command); -DECLARE_MODIFIER_FLAG(NumericPad); -DECLARE_MODIFIER_FLAG(Help); -DECLARE_MODIFIER_FLAG(Function); -#undef DECLARE_MODIFIER_FLAG -static const NSUInteger NSEventModifierFlagCapsLock = NSAlphaShiftKeyMask; -static const NSUInteger NSEventModifierFlagOption = NSAlternateKeyMask; - -#define DECLARE_WINDOW_MASK(name) static const unsigned int NSWindowStyleMask##name = NS##name##WindowMask -DECLARE_WINDOW_MASK(Borderless); -DECLARE_WINDOW_MASK(Titled); -DECLARE_WINDOW_MASK(Closable); -DECLARE_WINDOW_MASK(Miniaturizable); -DECLARE_WINDOW_MASK(Resizable); -DECLARE_WINDOW_MASK(TexturedBackground); -DECLARE_WINDOW_MASK(UnifiedTitleAndToolbar); -DECLARE_WINDOW_MASK(FullScreen); -/*DECLARE_WINDOW_MASK(FullSizeContentView);*/ // Not used, fails compile on older SDKs -static const unsigned int NSWindowStyleMaskUtilityWindow = NSUtilityWindowMask; -static const unsigned int NSWindowStyleMaskDocModalWindow = NSDocModalWindowMask; -static const unsigned int NSWindowStyleMaskHUDWindow = NSHUDWindowMask; -#undef DECLARE_WINDOW_MASK - -#define DECLARE_ALERT_STYLE(name) static const NSUInteger NSAlertStyle##name = NS##name##AlertStyle -DECLARE_ALERT_STYLE(Warning); -DECLARE_ALERT_STYLE(Informational); -DECLARE_ALERT_STYLE(Critical); -#undef DECLARE_ALERT_STYLE -#endif - // Private display data @class SDL3TranslatorResponder; +typedef enum +{ + OptionAsAltNone, + OptionAsAltOnlyLeft, + OptionAsAltOnlyRight, + OptionAsAltBoth, +} OptionAsAlt; + @interface SDL_CocoaVideoData : NSObject @property(nonatomic) int allow_spaces; @property(nonatomic) int trackpad_is_touch_only; @@ -106,15 +61,11 @@ DECLARE_ALERT_STYLE(Critical); @property(nonatomic) NSInteger clipboard_count; @property(nonatomic) IOPMAssertionID screensaver_assertion; @property(nonatomic) SDL_Mutex *swaplock; +@property(nonatomic) OptionAsAlt option_as_alt; @end // Utility functions extern SDL_SystemTheme Cocoa_GetSystemTheme(void); extern NSImage *Cocoa_CreateImage(SDL_Surface *surface); -// Fix build with the 10.11 SDK -#if MAC_OS_X_VERSION_MAX_ALLOWED < 101200 -#define NSEventSubtypeMouseEvent NSMouseEventSubtype -#endif - #endif // SDL_cocoavideo_h_ diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoavideo.m b/libs/SDL3/src/video/cocoa/SDL_cocoavideo.m index c2c0bb3b..aae54eba 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoavideo.m +++ b/libs/SDL3/src/video/cocoa/SDL_cocoavideo.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -103,6 +103,7 @@ static SDL_VideoDevice *Cocoa_CreateDevice(void) device->SetWindowSize = Cocoa_SetWindowSize; device->SetWindowMinimumSize = Cocoa_SetWindowMinimumSize; device->SetWindowMaximumSize = Cocoa_SetWindowMaximumSize; + device->SetWindowAspectRatio = Cocoa_SetWindowAspectRatio; device->SetWindowOpacity = Cocoa_SetWindowOpacity; device->GetWindowSizeInPixels = Cocoa_GetWindowSizeInPixels; device->ShowWindow = Cocoa_ShowWindow; @@ -218,6 +219,7 @@ static bool Cocoa_VideoInit(SDL_VideoDevice *_this) data.allow_spaces = SDL_GetHintBoolean(SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES, true); data.trackpad_is_touch_only = SDL_GetHintBoolean(SDL_HINT_TRACKPAD_IS_TOUCH_ONLY, false); + SDL_AddHintCallback(SDL_HINT_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY, Cocoa_MenuVisibilityCallback, NULL); data.swaplock = SDL_CreateMutex(); if (!data.swaplock) { @@ -244,15 +246,13 @@ void Cocoa_VideoQuit(SDL_VideoDevice *_this) // This function assumes that it's called from within an autorelease pool SDL_SystemTheme Cocoa_GetSystemTheme(void) { -#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 // Added in the 10.14.0 SDK. - if ([[NSApplication sharedApplication] respondsToSelector:@selector(effectiveAppearance)]) { + if (@available(macOS 10.14, *)) { NSAppearance* appearance = [[NSApplication sharedApplication] effectiveAppearance]; if ([appearance.name containsString: @"Dark"]) { return SDL_SYSTEM_THEME_DARK; } } -#endif return SDL_SYSTEM_THEME_LIGHT; } diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoavulkan.h b/libs/SDL3/src/video/cocoa/SDL_cocoavulkan.h index 6b872bc4..86e634ed 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoavulkan.h +++ b/libs/SDL3/src/video/cocoa/SDL_cocoavulkan.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoavulkan.m b/libs/SDL3/src/video/cocoa/SDL_cocoavulkan.m index d3f857dc..a4406275 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoavulkan.m +++ b/libs/SDL3/src/video/cocoa/SDL_cocoavulkan.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoawindow.h b/libs/SDL3/src/video/cocoa/SDL_cocoawindow.h index 83d6fe85..6df69f44 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoawindow.h +++ b/libs/SDL3/src/video/cocoa/SDL_cocoawindow.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -142,6 +142,7 @@ typedef enum @property(nonatomic) NSView *sdlContentView; @property(nonatomic) NSMutableArray *nscontexts; @property(nonatomic) BOOL in_blocking_transition; +@property(nonatomic) BOOL fullscreen_space_requested; @property(nonatomic) BOOL was_zoomed; @property(nonatomic) NSInteger window_number; @property(nonatomic) NSInteger flash_request; @@ -167,6 +168,7 @@ extern bool Cocoa_SetWindowPosition(SDL_VideoDevice *_this, SDL_Window *window); extern void Cocoa_SetWindowSize(SDL_VideoDevice *_this, SDL_Window *window); extern void Cocoa_SetWindowMinimumSize(SDL_VideoDevice *_this, SDL_Window *window); extern void Cocoa_SetWindowMaximumSize(SDL_VideoDevice *_this, SDL_Window *window); +extern void Cocoa_SetWindowAspectRatio(SDL_VideoDevice *_this, SDL_Window *window); extern void Cocoa_GetWindowSizeInPixels(SDL_VideoDevice *_this, SDL_Window *window, int *w, int *h); extern bool Cocoa_SetWindowOpacity(SDL_VideoDevice *_this, SDL_Window *window, float opacity); extern void Cocoa_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window); @@ -192,4 +194,6 @@ extern bool Cocoa_SetWindowModal(SDL_VideoDevice *_this, SDL_Window *window, boo extern bool Cocoa_SetWindowParent(SDL_VideoDevice *_this, SDL_Window *window, SDL_Window *parent); extern bool Cocoa_SyncWindow(SDL_VideoDevice *_this, SDL_Window *window); +extern void Cocoa_MenuVisibilityCallback(void *userdata, const char *name, const char *oldValue, const char *newValue); + #endif // SDL_cocoawindow_h_ diff --git a/libs/SDL3/src/video/cocoa/SDL_cocoawindow.m b/libs/SDL3/src/video/cocoa/SDL_cocoawindow.m index c4512033..06ba56ad 100644 --- a/libs/SDL3/src/video/cocoa/SDL_cocoawindow.m +++ b/libs/SDL3/src/video/cocoa/SDL_cocoawindow.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -22,10 +22,6 @@ #ifdef SDL_VIDEO_DRIVER_COCOA -#if MAC_OS_X_VERSION_MAX_ALLOWED < 1090 -#error SDL for macOS must be built with a 10.9 SDK or above. -#endif // MAC_OS_X_VERSION_MAX_ALLOWED < 1090 - #include // For FLT_MAX #include "../../events/SDL_dropevents_c.h" @@ -40,7 +36,9 @@ #include "SDL_cocoaopengles.h" #include "SDL_cocoavideo.h" -// #define DEBUG_COCOAWINDOW +#if 0 +#define DEBUG_COCOAWINDOW +#endif #ifdef DEBUG_COCOAWINDOW #define DLog(fmt, ...) printf("%s: " fmt "\n", __func__, ##__VA_ARGS__) @@ -71,10 +69,6 @@ @end @interface NSWindow (SDL) -#if MAC_OS_X_VERSION_MAX_ALLOWED < 101000 // Added in the 10.10 SDK -@property(readonly) NSRect contentLayoutRect; -#endif - // This is available as of 10.13.2, but isn't in public headers @property(nonatomic) NSRect mouseConfinementRect; @end @@ -133,7 +127,7 @@ - (BOOL)canBecomeMainWindow { SDL_Window *window = [self findSDLWindow]; - if (window && !SDL_WINDOW_IS_POPUP(window)) { + if (window && !(window->flags & (SDL_WINDOW_TOOLTIP | SDL_WINDOW_NOT_FOCUSABLE)) && !SDL_WINDOW_IS_POPUP(window)) { return YES; } else { return NO; @@ -404,6 +398,61 @@ static NSScreen *ScreenForPoint(const NSPoint *point) return screen; } +bool Cocoa_IsWindowInFullscreenSpace(SDL_Window *window) +{ + @autoreleasepool { + SDL_CocoaWindowData *data = (__bridge SDL_CocoaWindowData *)window->internal; + + if ([data.listener isInFullscreenSpace]) { + return true; + } else { + return false; + } + } +} + +typedef enum CocoaMenuVisibility +{ + COCOA_MENU_VISIBILITY_AUTO = 0, + COCOA_MENU_VISIBILITY_NEVER, + COCOA_MENU_VISIBILITY_ALWAYS +} CocoaMenuVisibility; + +static CocoaMenuVisibility menu_visibility_hint = COCOA_MENU_VISIBILITY_AUTO; + +static void Cocoa_ToggleFullscreenSpaceMenuVisibility(SDL_Window *window) +{ + if (window && Cocoa_IsWindowInFullscreenSpace(window)) { + SDL_CocoaWindowData *data = (__bridge SDL_CocoaWindowData *)window->internal; + + // 'Auto' sets the menu to visible if fullscreen wasn't explicitly entered via SDL_SetWindowFullscreen(). + if ((menu_visibility_hint == COCOA_MENU_VISIBILITY_AUTO && !data.fullscreen_space_requested) || + menu_visibility_hint == COCOA_MENU_VISIBILITY_ALWAYS) { + [NSMenu setMenuBarVisible:YES]; + } else { + [NSMenu setMenuBarVisible:NO]; + } + } +} + +void Cocoa_MenuVisibilityCallback(void *userdata, const char *name, const char *oldValue, const char *newValue) +{ + if (newValue) { + if (*newValue == '0' || SDL_strcasecmp(newValue, "false") == 0) { + menu_visibility_hint = COCOA_MENU_VISIBILITY_NEVER; + } else if (*newValue == '1' || SDL_strcasecmp(newValue, "true") == 0) { + menu_visibility_hint = COCOA_MENU_VISIBILITY_ALWAYS; + } else { + menu_visibility_hint = COCOA_MENU_VISIBILITY_AUTO; + } + } else { + menu_visibility_hint = COCOA_MENU_VISIBILITY_AUTO; + } + + // Update the current menu visibility. + Cocoa_ToggleFullscreenSpaceMenuVisibility(SDL_GetKeyboardFocus()); +} + static NSScreen *ScreenForRect(const NSRect *rect) { NSPoint center = NSMakePoint(NSMidX(*rect), NSMidY(*rect)); @@ -622,26 +671,29 @@ static void Cocoa_UpdateClipCursor(SDL_Window *window) } } -static SDL_Window *GetTopmostWindow(SDL_Window *window) +static SDL_Window *GetParentToplevelWindow(SDL_Window *window) { - SDL_Window *topmost = window; + SDL_Window *toplevel = window; // Find the topmost parent - while (topmost->parent != NULL) { - topmost = topmost->parent; + while (SDL_WINDOW_IS_POPUP(toplevel)) { + toplevel = toplevel->parent; } - return topmost; + return toplevel; } -static void Cocoa_SetKeyboardFocus(SDL_Window *window) +static void Cocoa_SetKeyboardFocus(SDL_Window *window, bool set_active_focus) { - SDL_Window *topmost = GetTopmostWindow(window); - SDL_CocoaWindowData *topmost_data; + SDL_Window *toplevel = GetParentToplevelWindow(window); + SDL_CocoaWindowData *toplevel_data; - topmost_data = (__bridge SDL_CocoaWindowData *)topmost->internal; - topmost_data.keyboard_focus = window; - SDL_SetKeyboardFocus(window); + toplevel_data = (__bridge SDL_CocoaWindowData *)toplevel->internal; + toplevel_data.keyboard_focus = window; + + if (set_active_focus && !window->is_hiding && !window->is_destroying) { + SDL_SetKeyboardFocus(window); + } } static void Cocoa_SendExposedEventIfVisible(SDL_Window *window) @@ -1057,7 +1109,7 @@ static NSCursor *Cocoa_GetDesiredCursor(void) { SDL_Window *window = _data.window; - if (window->min_aspect > 0.0f || window->max_aspect > 0.0f) { + if (window->min_aspect != window->max_aspect) { NSWindow *nswindow = _data.nswindow; NSRect newContentRect = [nswindow contentRectForFrameRect:NSMakeRect(0, 0, frameSize.width, frameSize.height)]; NSSize newSize = newContentRect.size; @@ -1069,9 +1121,9 @@ static NSCursor *Cocoa_GetDesiredCursor(void) aspectRatio = newSize.width / newSize.height; if (maxAspectRatio > 0.0f && aspectRatio > maxAspectRatio) { - newSize.width = (int)SDL_roundf(newSize.height * maxAspectRatio); + newSize.width = SDL_roundf(newSize.height * maxAspectRatio); } else if (minAspectRatio > 0.0f && aspectRatio < minAspectRatio) { - newSize.height = (int)SDL_roundf(newSize.width / minAspectRatio); + newSize.height = SDL_roundf(newSize.width / minAspectRatio); } NSRect newFrameRect = [nswindow frameRectForContentRect:NSMakeRect(0, 0, newSize.width, newSize.height)]; @@ -1172,7 +1224,7 @@ static NSCursor *Cocoa_GetDesiredCursor(void) // We're going to get keyboard events, since we're key. // This needs to be done before restoring the relative mouse mode. - Cocoa_SetKeyboardFocus(_data.keyboard_focus ? _data.keyboard_focus : window); + Cocoa_SetKeyboardFocus(_data.keyboard_focus ? _data.keyboard_focus : window, true); // If we just gained focus we need the updated mouse position if (!(window->flags & SDL_WINDOW_MOUSE_RELATIVE_MODE)) { @@ -1192,7 +1244,7 @@ static NSCursor *Cocoa_GetDesiredCursor(void) Cocoa_CheckClipboardUpdate(_data.videodata); if (isFullscreenSpace && !window->fullscreen_exclusive) { - [NSMenu setMenuBarVisible:NO]; + Cocoa_ToggleFullscreenSpaceMenuVisibility(window); } { const unsigned int newflags = [NSEvent modifierFlags] & NSEventModifierFlagCapsLock; @@ -1304,9 +1356,7 @@ static NSCursor *Cocoa_GetDesiredCursor(void) if ([self windowOperationIsPending:PENDING_OPERATION_LEAVE_FULLSCREEN]) { [self setFullscreenSpace:NO]; } else { - if (window->fullscreen_exclusive) { - [NSMenu setMenuBarVisible:NO]; - } + Cocoa_ToggleFullscreenSpaceMenuVisibility(window); /* Don't recurse back into UpdateFullscreenMode() if this was hit in * a blocking transition, as the caller is already waiting in @@ -1327,6 +1377,8 @@ static NSCursor *Cocoa_GetDesiredCursor(void) window->h = 0; [self windowDidMove:aNotification]; [self windowDidResize:aNotification]; + + Cocoa_UpdateClipCursor(window); } } @@ -1377,6 +1429,7 @@ static NSCursor *Cocoa_GetDesiredCursor(void) NSWindow *nswindow = _data.nswindow; inFullscreenTransition = NO; + _data.fullscreen_space_requested = NO; /* As of macOS 10.15, the window decorations can go missing sometimes after certain fullscreen-desktop->exlusive-fullscreen->windowed mode flows @@ -1465,6 +1518,8 @@ static NSCursor *Cocoa_GetDesiredCursor(void) if (!(window->flags & SDL_WINDOW_HIDDEN)) { Cocoa_ShowWindow(SDL_GetVideoDevice(), window); } + + Cocoa_UpdateClipCursor(window); } } @@ -1617,11 +1672,6 @@ static void Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL } } - if ([self processHitTest:theEvent]) { - SDL_SendWindowEvent(_data.window, SDL_EVENT_WINDOW_HIT_TEST, 0, 0); - return; // dragging, drop event. - } - switch ([theEvent buttonNumber]) { case 0: if (([theEvent modifierFlags] & NSEventModifierFlagControl) && @@ -1644,6 +1694,11 @@ static void Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL break; } + if (button == SDL_BUTTON_LEFT && [self processHitTest:theEvent]) { + SDL_SendWindowEvent(_data.window, SDL_EVENT_WINDOW_HIT_TEST, 0, 0); + return; // dragging, drop event. + } + Cocoa_SendMouseButtonClicks(mouse, theEvent, _data.window, button, true); } @@ -1670,11 +1725,6 @@ static void Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL return; } - if ([self processHitTest:theEvent]) { - SDL_SendWindowEvent(_data.window, SDL_EVENT_WINDOW_HIT_TEST, 0, 0); - return; // stopped dragging, drop event. - } - switch ([theEvent buttonNumber]) { case 0: if (wasCtrlLeft) { @@ -1695,6 +1745,11 @@ static void Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL break; } + if (button == SDL_BUTTON_LEFT && [self processHitTest:theEvent]) { + SDL_SendWindowEvent(_data.window, SDL_EVENT_WINDOW_HIT_TEST, 0, 0); + return; // stopped dragging, drop event. + } + Cocoa_SendMouseButtonClicks(mouse, theEvent, _data.window, button, false); } @@ -1725,6 +1780,12 @@ static void Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL return; } + if (!Cocoa_GetMouseFocus()) { + // The mouse is no longer over any window in the application + SDL_SetMouseFocus(NULL); + return; + } + window = _data.window; contentView = _data.sdlContentView; point = [theEvent locationInWindow]; @@ -1844,7 +1905,7 @@ static void Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL * events from being generated from touch events. */ SDL_Window *window = NULL; - SDL_SendTouch(Cocoa_GetEventTimestamp([theEvent timestamp]), touchID, finger->id, window, false, 0, 0, 0); + SDL_SendTouch(Cocoa_GetEventTimestamp([theEvent timestamp]), touchID, finger->id, window, SDL_EVENT_FINGER_CANCELED, 0, 0, 0); } SDL_free(fingers); } @@ -1887,20 +1948,16 @@ static void Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL */ SDL_Window *window = NULL; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101202 // Added in the 10.12.2 SDK. - if ([touch respondsToSelector:@selector(type)]) { - /* TODO: Before implementing direct touch support here, we need to - * figure out whether the OS generates mouse events from them on its - * own. If it does, we should prevent SendTouch from generating - * synthetic mouse events for these touches itself (while also - * sending a window.) It will also need to use normalized window- - * relative coordinates via [touch locationInView:]. - */ - if ([touch type] == NSTouchTypeDirect) { - continue; - } + /* TODO: Before implementing direct touch support here, we need to + * figure out whether the OS generates mouse events from them on its + * own. If it does, we should prevent SendTouch from generating + * synthetic mouse events for these touches itself (while also + * sending a window.) It will also need to use normalized window- + * relative coordinates via [touch locationInView:]. + */ + if ([touch type] == NSTouchTypeDirect) { + continue; } -#endif if (SDL_AddTouch(touchId, devtype, "") < 0) { return; @@ -1914,11 +1971,13 @@ static void Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL switch (phase) { case NSTouchPhaseBegan: - SDL_SendTouch(Cocoa_GetEventTimestamp([theEvent timestamp]), touchId, fingerId, window, true, x, y, 1.0f); + SDL_SendTouch(Cocoa_GetEventTimestamp([theEvent timestamp]), touchId, fingerId, window, SDL_EVENT_FINGER_DOWN, x, y, 1.0f); break; case NSTouchPhaseEnded: + SDL_SendTouch(Cocoa_GetEventTimestamp([theEvent timestamp]), touchId, fingerId, window, SDL_EVENT_FINGER_UP, x, y, 1.0f); + break; case NSTouchPhaseCancelled: - SDL_SendTouch(Cocoa_GetEventTimestamp([theEvent timestamp]), touchId, fingerId, window, false, x, y, 1.0f); + SDL_SendTouch(Cocoa_GetEventTimestamp([theEvent timestamp]), touchId, fingerId, window, SDL_EVENT_FINGER_CANCELED, x, y, 1.0f); break; case NSTouchPhaseMoved: SDL_SendTouchMotion(Cocoa_GetEventTimestamp([theEvent timestamp]), touchId, fingerId, window, x, y, 1.0f); @@ -2126,15 +2185,13 @@ static bool SetupWindowData(SDL_VideoDevice *_this, SDL_Window *window, NSWindow if (!SDL_WINDOW_IS_POPUP(window)) { if ([nswindow isKeyWindow]) { window->flags |= SDL_WINDOW_INPUT_FOCUS; - Cocoa_SetKeyboardFocus(data.window); + Cocoa_SetKeyboardFocus(data.window, true); } } else { if (window->flags & SDL_WINDOW_TOOLTIP) { [nswindow setIgnoresMouseEvents:YES]; } else if (window->flags & SDL_WINDOW_POPUP_MENU) { - if (window->parent == SDL_GetKeyboardFocus()) { - Cocoa_SetKeyboardFocus(window); - } + Cocoa_SetKeyboardFocus(window, window->parent == SDL_GetKeyboardFocus()); } } @@ -2244,12 +2301,7 @@ bool Cocoa_CreateWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_Properti [nswindow setColorSpace:[NSColorSpace sRGBColorSpace]]; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101200 // Added in the 10.12.0 SDK. - // By default, don't allow users to make our window tabbed in 10.12 or later - if ([nswindow respondsToSelector:@selector(setTabbingMode:)]) { - [nswindow setTabbingMode:NSWindowTabbingModeDisallowed]; - } -#endif + [nswindow setTabbingMode:NSWindowTabbingModeDisallowed]; if (videodata.allow_spaces) { // we put fullscreen desktop windows in their own Space, without a toggle button or menubar, later @@ -2294,8 +2346,7 @@ bool Cocoa_CreateWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_Properti if ((window->flags & SDL_WINDOW_OPENGL) && _this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) { [nsview setWantsLayer:TRUE]; - if ((window->flags & SDL_WINDOW_HIGH_PIXEL_DENSITY) && - [nswindow.screen respondsToSelector:@selector(backingScaleFactor)]) { + if ((window->flags & SDL_WINDOW_HIGH_PIXEL_DENSITY)) { nsview.layer.contentsScale = nswindow.screen.backingScaleFactor; } else { nsview.layer.contentsScale = 1; @@ -2474,6 +2525,21 @@ void Cocoa_SetWindowMaximumSize(SDL_VideoDevice *_this, SDL_Window *window) } } +void Cocoa_SetWindowAspectRatio(SDL_VideoDevice *_this, SDL_Window *window) +{ + @autoreleasepool { + SDL_CocoaWindowData *windata = (__bridge SDL_CocoaWindowData *)window->internal; + + if (window->min_aspect > 0.0f && window->min_aspect == window->max_aspect) { + int numerator = 0, denominator = 1; + SDL_CalculateFraction(window->max_aspect, &numerator, &denominator); + [windata.nswindow setContentAspectRatio:NSMakeSize(numerator, denominator)]; + } else { + [windata.nswindow setContentAspectRatio:NSMakeSize(0, 0)]; + } + } +} + void Cocoa_GetWindowSizeInPixels(SDL_VideoDevice *_this, SDL_Window *window, int *w, int *h) { @autoreleasepool { @@ -2550,16 +2616,20 @@ void Cocoa_HideWindow(SDL_VideoDevice *_this, SDL_Window *window) // Transfer keyboard focus back to the parent when closing a popup menu if (window->flags & SDL_WINDOW_POPUP_MENU) { - if (window == SDL_GetKeyboardFocus()) { - SDL_Window *new_focus = window->parent; + SDL_Window *new_focus = window->parent; + bool set_focus = window == SDL_GetKeyboardFocus(); - // Find the highest level window that isn't being hidden or destroyed. - while (new_focus->parent != NULL && (new_focus->is_hiding || new_focus->is_destroying)) { - new_focus = new_focus->parent; + // Find the highest level window, up to the toplevel parent, that isn't being hidden or destroyed. + while (SDL_WINDOW_IS_POPUP(new_focus) && (new_focus->is_hiding || new_focus->is_destroying)) { + new_focus = new_focus->parent; + + // If some window in the chain currently had focus, set it to the new lowest-level window. + if (!set_focus) { + set_focus = new_focus == SDL_GetKeyboardFocus(); } - - Cocoa_SetKeyboardFocus(new_focus); } + + Cocoa_SetKeyboardFocus(new_focus, set_focus); } else if (window->parent && waskey) { /* Key status is not automatically set on the parent when a child is hidden. Check if the * child window was key, and set the first visible parent to be key if so. @@ -2869,6 +2939,8 @@ SDL_FullscreenResult Cocoa_SetWindowFullscreen(SDL_VideoDevice *_this, SDL_Windo } ScheduleContextUpdates(data); + Cocoa_SyncWindow(_this, window); + Cocoa_UpdateClipCursor(window); } return SDL_FULLSCREEN_SUCCEEDED; @@ -2927,17 +2999,11 @@ SDL_DisplayID Cocoa_GetDisplayForWindow(SDL_VideoDevice *_this, SDL_Window *wind screen = data.nswindow.screen; if (screen != nil) { - CGDirectDisplayID displayid; - int i; - // https://developer.apple.com/documentation/appkit/nsscreen/1388360-devicedescription?language=objc - displayid = [[screen.deviceDescription objectForKey:@"NSScreenNumber"] unsignedIntValue]; - - for (i = 0; i < _this->num_displays; i++) { - SDL_DisplayData *displaydata = _this->displays[i]->internal; - if (displaydata != NULL && displaydata->display == displayid) { - return _this->displays[i]->id; - } + CGDirectDisplayID displayid = [[screen.deviceDescription objectForKey:@"NSScreenNumber"] unsignedIntValue]; + SDL_VideoDisplay *display = Cocoa_FindSDLDisplayByCGDirectDisplayID(_this, displayid); + if (display) { + return display->id; } } @@ -2986,7 +3052,7 @@ void Cocoa_DestroyWindow(SDL_VideoDevice *_this, SDL_Window *window) NSArray *contexts; #endif // SDL_VIDEO_OPENGL - SDL_Window *topmost = GetTopmostWindow(window); + SDL_Window *topmost = GetParentToplevelWindow(window); SDL_CocoaWindowData *topmost_data = (__bridge SDL_CocoaWindowData *)topmost->internal; /* Reset the input focus of the root window if this window is still set as keyboard focus. @@ -2996,7 +3062,7 @@ void Cocoa_DestroyWindow(SDL_VideoDevice *_this, SDL_Window *window) */ if (topmost_data.keyboard_focus == window) { SDL_Window *new_focus = window; - while (new_focus->parent && (new_focus->is_hiding || new_focus->is_destroying)) { + while (SDL_WINDOW_IS_POPUP(new_focus) && (new_focus->is_hiding || new_focus->is_destroying)) { new_focus = new_focus->parent; } @@ -3029,25 +3095,15 @@ void Cocoa_DestroyWindow(SDL_VideoDevice *_this, SDL_Window *window) } } -bool Cocoa_IsWindowInFullscreenSpace(SDL_Window *window) -{ - @autoreleasepool { - SDL_CocoaWindowData *data = (__bridge SDL_CocoaWindowData *)window->internal; - - if ([data.listener isInFullscreenSpace]) { - return true; - } else { - return false; - } - } -} - bool Cocoa_SetWindowFullscreenSpace(SDL_Window *window, bool state, bool blocking) { @autoreleasepool { bool succeeded = false; SDL_CocoaWindowData *data = (__bridge SDL_CocoaWindowData *)window->internal; + if (state) { + data.fullscreen_space_requested = YES; + } data.in_blocking_transition = blocking; if ([data.listener setFullscreenSpace:(state ? YES : NO)]) { if (blocking) { diff --git a/libs/SDL3/src/video/directx/SDL_d3d12.h b/libs/SDL3/src/video/directx/SDL_d3d12.h index b81ad039..31735583 100644 --- a/libs/SDL3/src/video/directx/SDL_d3d12.h +++ b/libs/SDL3/src/video/directx/SDL_d3d12.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/directx/gen_xbox_cmacros.cs b/libs/SDL3/src/video/directx/gen_xbox_cmacros.cs index 74923986..5878f937 100644 --- a/libs/SDL3/src/video/directx/gen_xbox_cmacros.cs +++ b/libs/SDL3/src/video/directx/gen_xbox_cmacros.cs @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/dummy/SDL_nullevents.c b/libs/SDL3/src/video/dummy/SDL_nullevents.c index e2b2c1ff..2a7cdd40 100644 --- a/libs/SDL3/src/video/dummy/SDL_nullevents.c +++ b/libs/SDL3/src/video/dummy/SDL_nullevents.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/dummy/SDL_nullevents_c.h b/libs/SDL3/src/video/dummy/SDL_nullevents_c.h index 7672e2b2..8baed959 100644 --- a/libs/SDL3/src/video/dummy/SDL_nullevents_c.h +++ b/libs/SDL3/src/video/dummy/SDL_nullevents_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/dummy/SDL_nullframebuffer.c b/libs/SDL3/src/video/dummy/SDL_nullframebuffer.c index 6d1af9c5..f37510cd 100644 --- a/libs/SDL3/src/video/dummy/SDL_nullframebuffer.c +++ b/libs/SDL3/src/video/dummy/SDL_nullframebuffer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/dummy/SDL_nullframebuffer_c.h b/libs/SDL3/src/video/dummy/SDL_nullframebuffer_c.h index 3f25ee40..819b841d 100644 --- a/libs/SDL3/src/video/dummy/SDL_nullframebuffer_c.h +++ b/libs/SDL3/src/video/dummy/SDL_nullframebuffer_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/dummy/SDL_nullvideo.c b/libs/SDL3/src/video/dummy/SDL_nullvideo.c index 295176c6..e5525a63 100644 --- a/libs/SDL3/src/video/dummy/SDL_nullvideo.c +++ b/libs/SDL3/src/video/dummy/SDL_nullvideo.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/dummy/SDL_nullvideo.h b/libs/SDL3/src/video/dummy/SDL_nullvideo.h index 491ec76d..8a437940 100644 --- a/libs/SDL3/src/video/dummy/SDL_nullvideo.h +++ b/libs/SDL3/src/video/dummy/SDL_nullvideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/emscripten/SDL_emscriptenevents.c b/libs/SDL3/src/video/emscripten/SDL_emscriptenevents.c index aeffef64..de9ec57a 100644 --- a/libs/SDL3/src/video/emscripten/SDL_emscriptenevents.c +++ b/libs/SDL3/src/video/emscripten/SDL_emscriptenevents.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -314,8 +314,11 @@ static EM_BOOL Emscripten_HandleMouseButton(int eventType, const EmscriptenMouse return 0; } + const SDL_Mouse *mouse = SDL_GetMouse(); + SDL_assert(mouse != NULL); + if (eventType == EMSCRIPTEN_EVENT_MOUSEDOWN) { - if (SDL_GetMouse()->relative_mode && !window_data->has_pointer_lock) { + if (mouse->relative_mode && !window_data->has_pointer_lock) { emscripten_request_pointerlock(window_data->canvas_id, 0); // try to regrab lost pointer lock. } sdl_button_state = true; @@ -323,13 +326,30 @@ static EM_BOOL Emscripten_HandleMouseButton(int eventType, const EmscriptenMouse sdl_button_state = false; prevent_default = SDL_EventEnabled(SDL_EVENT_MOUSE_BUTTON_UP); } + SDL_SendMouseButton(0, window_data->window, SDL_DEFAULT_MOUSE_ID, sdl_button, sdl_button_state); - // Do not consume the event if the mouse is outside of the canvas. - emscripten_get_element_css_size(window_data->canvas_id, &css_w, &css_h); - if (mouseEvent->targetX < 0 || mouseEvent->targetX >= css_w || - mouseEvent->targetY < 0 || mouseEvent->targetY >= css_h) { - return 0; + // We have an imaginary mouse capture, because we need SDL to not drop our imaginary mouse focus when we leave the canvas. + if (mouse->auto_capture) { + if (SDL_GetMouseState(NULL, NULL) != 0) { + window_data->window->flags |= SDL_WINDOW_MOUSE_CAPTURE; + } else { + window_data->window->flags &= ~SDL_WINDOW_MOUSE_CAPTURE; + } + } + + if ((eventType == EMSCRIPTEN_EVENT_MOUSEUP) && window_data->mouse_focus_loss_pending) { + window_data->mouse_focus_loss_pending = (window_data->window->flags & SDL_WINDOW_MOUSE_CAPTURE) != 0; + if (!window_data->mouse_focus_loss_pending) { + SDL_SetMouseFocus(NULL); + } + } else { + // Do not consume the event if the mouse is outside of the canvas. + emscripten_get_element_css_size(window_data->canvas_id, &css_w, &css_h); + if (mouseEvent->targetX < 0 || mouseEvent->targetX >= css_w || + mouseEvent->targetY < 0 || mouseEvent->targetY >= css_h) { + return 0; + } } return prevent_default; @@ -352,8 +372,16 @@ static EM_BOOL Emscripten_HandleMouseFocus(int eventType, const EmscriptenMouseE SDL_SendMouseMotion(0, window_data->window, SDL_GLOBAL_MOUSE_ID, isPointerLocked, mx, my); } - SDL_SetMouseFocus(eventType == EMSCRIPTEN_EVENT_MOUSEENTER ? window_data->window : NULL); - return SDL_EventEnabled(SDL_EVENT_MOUSE_MOTION); + const bool isenter = (eventType == EMSCRIPTEN_EVENT_MOUSEENTER); + if (isenter && window_data->mouse_focus_loss_pending) { + window_data->mouse_focus_loss_pending = false; // just drop the state, but don't send the enter event. + } else if (!isenter && (window_data->window->flags & SDL_WINDOW_MOUSE_CAPTURE)) { + window_data->mouse_focus_loss_pending = true; // waiting on a mouse button to let go before we send the mouse focus update. + } else { + SDL_SetMouseFocus(isenter ? window_data->window : NULL); + } + + return SDL_EventEnabled(SDL_EVENT_MOUSE_MOTION); // !!! FIXME: should this be MOUSE_MOTION or something else? } static EM_BOOL Emscripten_HandleWheel(int eventType, const EmscriptenWheelEvent *wheelEvent, void *userData) @@ -433,7 +461,7 @@ static EM_BOOL Emscripten_HandleTouch(int eventType, const EmscriptenTouchEvent } if (eventType == EMSCRIPTEN_EVENT_TOUCHSTART) { - SDL_SendTouch(0, deviceId, id, window_data->window, true, x, y, 1.0f); + SDL_SendTouch(0, deviceId, id, window_data->window, SDL_EVENT_FINGER_DOWN, x, y, 1.0f); // disable browser scrolling/pinch-to-zoom if app handles touch events if (!preventDefault && SDL_EventEnabled(SDL_EVENT_FINGER_DOWN)) { @@ -441,17 +469,30 @@ static EM_BOOL Emscripten_HandleTouch(int eventType, const EmscriptenTouchEvent } } else if (eventType == EMSCRIPTEN_EVENT_TOUCHMOVE) { SDL_SendTouchMotion(0, deviceId, id, window_data->window, x, y, 1.0f); - } else { - SDL_SendTouch(0, deviceId, id, window_data->window, false, x, y, 1.0f); + } else if (eventType == EMSCRIPTEN_EVENT_TOUCHEND) { + SDL_SendTouch(0, deviceId, id, window_data->window, SDL_EVENT_FINGER_UP, x, y, 1.0f); // block browser's simulated mousedown/mouseup on touchscreen devices preventDefault = 1; + } else if (eventType == EMSCRIPTEN_EVENT_TOUCHCANCEL) { + SDL_SendTouch(0, deviceId, id, window_data->window, SDL_EVENT_FINGER_CANCELED, x, y, 1.0f); } } return preventDefault; } +static bool IsFunctionKey(SDL_Scancode scancode) +{ + if (scancode >= SDL_SCANCODE_F1 && scancode <= SDL_SCANCODE_F12) { + return true; + } + if (scancode >= SDL_SCANCODE_F13 && scancode <= SDL_SCANCODE_F24) { + return true; + } + return false; +} + /* This is a great tool to see web keyboard events live: * https://w3c.github.io/uievents/tools/key-event-viewer.html */ @@ -527,7 +568,7 @@ static EM_BOOL Emscripten_HandleKey(int eventType, const EmscriptenKeyboardEvent (scancode == SDL_SCANCODE_UP) || (scancode == SDL_SCANCODE_RIGHT) || (scancode == SDL_SCANCODE_DOWN) || - ((scancode >= SDL_SCANCODE_F1) && (scancode <= SDL_SCANCODE_F15)) || + IsFunctionKey(scancode) || keyEvent->ctrlKey) { is_nav_key = true; } @@ -643,6 +684,25 @@ static const char *Emscripten_HandleBeforeUnload(int eventType, const void *rese return ""; // don't trigger confirmation dialog } +static EM_BOOL Emscripten_HandleOrientationChange(int eventType, const EmscriptenOrientationChangeEvent *orientationChangeEvent, void *userData) +{ + SDL_DisplayOrientation orientation; + switch (orientationChangeEvent->orientationIndex) { + #define CHECK_ORIENTATION(emsdk, sdl) case EMSCRIPTEN_ORIENTATION_##emsdk: orientation = SDL_ORIENTATION_##sdl; break + CHECK_ORIENTATION(LANDSCAPE_PRIMARY, LANDSCAPE); + CHECK_ORIENTATION(LANDSCAPE_SECONDARY, LANDSCAPE_FLIPPED); + CHECK_ORIENTATION(PORTRAIT_PRIMARY, PORTRAIT); + CHECK_ORIENTATION(PORTRAIT_SECONDARY, PORTRAIT_FLIPPED); + #undef CHECK_ORIENTATION + default: orientation = SDL_ORIENTATION_UNKNOWN; break; + } + + SDL_WindowData *window_data = (SDL_WindowData *) userData; + SDL_SendDisplayEvent(SDL_GetVideoDisplayForWindow(window_data->window), SDL_EVENT_DISPLAY_ORIENTATION, orientation, 0); + + return 0; +} + // IF YOU CHANGE THIS STRUCTURE, YOU NEED TO UPDATE THE JAVASCRIPT THAT FILLS IT IN: makePointerEventCStruct, below. typedef struct Emscripten_PointerEvent { @@ -963,6 +1023,8 @@ void Emscripten_RegisterEventHandlers(SDL_WindowData *data) emscripten_set_focus_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, data, 0, Emscripten_HandleFocus); emscripten_set_blur_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, data, 0, Emscripten_HandleFocus); + emscripten_set_orientationchange_callback(data, 0, Emscripten_HandleOrientationChange); + emscripten_set_touchstart_callback(data->canvas_id, data, 0, Emscripten_HandleTouch); emscripten_set_touchend_callback(data->canvas_id, data, 0, Emscripten_HandleTouch); emscripten_set_touchmove_callback(data->canvas_id, data, 0, Emscripten_HandleTouch); @@ -972,13 +1034,15 @@ void Emscripten_RegisterEventHandlers(SDL_WindowData *data) // Keyboard events are awkward keyElement = SDL_GetHint(SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT); - if (!keyElement) { + if (!keyElement || !*keyElement) { keyElement = EMSCRIPTEN_EVENT_TARGET_WINDOW; } - emscripten_set_keydown_callback(keyElement, data, 0, Emscripten_HandleKey); - emscripten_set_keyup_callback(keyElement, data, 0, Emscripten_HandleKey); - emscripten_set_keypress_callback(keyElement, data, 0, Emscripten_HandleKeyPress); + if (SDL_strcmp(keyElement, "#none") != 0) { + emscripten_set_keydown_callback(keyElement, data, 0, Emscripten_HandleKey); + emscripten_set_keyup_callback(keyElement, data, 0, Emscripten_HandleKey); + emscripten_set_keypress_callback(keyElement, data, 0, Emscripten_HandleKeyPress); + } emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, data, 0, Emscripten_HandleFullscreenChange); @@ -1021,6 +1085,8 @@ void Emscripten_UnregisterEventHandlers(SDL_WindowData *data) emscripten_set_focus_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, 0, NULL); emscripten_set_blur_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, 0, NULL); + emscripten_set_orientationchange_callback(NULL, 0, NULL); + emscripten_set_touchstart_callback(data->canvas_id, NULL, 0, NULL); emscripten_set_touchend_callback(data->canvas_id, NULL, 0, NULL); emscripten_set_touchmove_callback(data->canvas_id, NULL, 0, NULL); @@ -1033,9 +1099,11 @@ void Emscripten_UnregisterEventHandlers(SDL_WindowData *data) target = EMSCRIPTEN_EVENT_TARGET_WINDOW; } - emscripten_set_keydown_callback(target, NULL, 0, NULL); - emscripten_set_keyup_callback(target, NULL, 0, NULL); - emscripten_set_keypress_callback(target, NULL, 0, NULL); + if (*target) { + emscripten_set_keydown_callback(target, NULL, 0, NULL); + emscripten_set_keyup_callback(target, NULL, 0, NULL); + emscripten_set_keypress_callback(target, NULL, 0, NULL); + } emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, NULL, 0, NULL); diff --git a/libs/SDL3/src/video/emscripten/SDL_emscriptenevents.h b/libs/SDL3/src/video/emscripten/SDL_emscriptenevents.h index ccf3ef07..fcfacec0 100644 --- a/libs/SDL3/src/video/emscripten/SDL_emscriptenevents.h +++ b/libs/SDL3/src/video/emscripten/SDL_emscriptenevents.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/emscripten/SDL_emscriptenframebuffer.c b/libs/SDL3/src/video/emscripten/SDL_emscriptenframebuffer.c index f300555e..503fac68 100644 --- a/libs/SDL3/src/video/emscripten/SDL_emscriptenframebuffer.c +++ b/libs/SDL3/src/video/emscripten/SDL_emscriptenframebuffer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/emscripten/SDL_emscriptenframebuffer.h b/libs/SDL3/src/video/emscripten/SDL_emscriptenframebuffer.h index 43447013..1be7079d 100644 --- a/libs/SDL3/src/video/emscripten/SDL_emscriptenframebuffer.h +++ b/libs/SDL3/src/video/emscripten/SDL_emscriptenframebuffer.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/emscripten/SDL_emscriptenmouse.c b/libs/SDL3/src/video/emscripten/SDL_emscriptenmouse.c index 64f49a5e..c959804d 100644 --- a/libs/SDL3/src/video/emscripten/SDL_emscriptenmouse.c +++ b/libs/SDL3/src/video/emscripten/SDL_emscriptenmouse.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/emscripten/SDL_emscriptenmouse.h b/libs/SDL3/src/video/emscripten/SDL_emscriptenmouse.h index fa50b243..5fcfeb56 100644 --- a/libs/SDL3/src/video/emscripten/SDL_emscriptenmouse.h +++ b/libs/SDL3/src/video/emscripten/SDL_emscriptenmouse.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/emscripten/SDL_emscriptenopengles.c b/libs/SDL3/src/video/emscripten/SDL_emscriptenopengles.c index a5140b8c..227cdc55 100644 --- a/libs/SDL3/src/video/emscripten/SDL_emscriptenopengles.c +++ b/libs/SDL3/src/video/emscripten/SDL_emscriptenopengles.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -47,10 +47,14 @@ bool Emscripten_GLES_SetSwapInterval(SDL_VideoDevice *_this, int interval) { if (interval < 0) { return SDL_SetError("Late swap tearing currently unsupported"); - } else if (interval == 0) { - emscripten_set_main_loop_timing(EM_TIMING_SETTIMEOUT, 0); - } else { - emscripten_set_main_loop_timing(EM_TIMING_RAF, interval); + } + + if (Emscripten_ShouldSetSwapInterval(interval)) { + if (interval == 0) { + emscripten_set_main_loop_timing(EM_TIMING_SETTIMEOUT, 0); + } else { + emscripten_set_main_loop_timing(EM_TIMING_RAF, interval); + } } return true; diff --git a/libs/SDL3/src/video/emscripten/SDL_emscriptenopengles.h b/libs/SDL3/src/video/emscripten/SDL_emscriptenopengles.h index bd70ea47..d0af111a 100644 --- a/libs/SDL3/src/video/emscripten/SDL_emscriptenopengles.h +++ b/libs/SDL3/src/video/emscripten/SDL_emscriptenopengles.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/emscripten/SDL_emscriptenvideo.c b/libs/SDL3/src/video/emscripten/SDL_emscriptenvideo.c index 45a6e9a1..413d96fc 100644 --- a/libs/SDL3/src/video/emscripten/SDL_emscriptenvideo.c +++ b/libs/SDL3/src/video/emscripten/SDL_emscriptenvideo.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -48,6 +48,10 @@ static SDL_FullscreenResult Emscripten_SetWindowFullscreen(SDL_VideoDevice *_thi static void Emscripten_PumpEvents(SDL_VideoDevice *_this); static void Emscripten_SetWindowTitle(SDL_VideoDevice *_this, SDL_Window *window); +static bool pumpevents_has_run = false; +static int pending_swap_interval = -1; + + // Emscripten driver bootstrap functions static void Emscripten_DeleteDevice(SDL_VideoDevice *device) @@ -228,6 +232,8 @@ static void Emscripten_VideoQuit(SDL_VideoDevice *_this) { Emscripten_QuitMouse(); Emscripten_UnlistenSystemTheme(); + pumpevents_has_run = false; + pending_swap_interval = -1; } static bool Emscripten_GetDisplayUsableBounds(SDL_VideoDevice *_this, SDL_VideoDisplay *display, SDL_Rect *rect) @@ -245,9 +251,31 @@ static bool Emscripten_GetDisplayUsableBounds(SDL_VideoDevice *_this, SDL_VideoD return true; } +bool Emscripten_ShouldSetSwapInterval(int interval) +{ + if (!pumpevents_has_run) { + pending_swap_interval = interval; + return false; + } + return true; +} + static void Emscripten_PumpEvents(SDL_VideoDevice *_this) { - // do nothing. + if (!pumpevents_has_run) { + // we assume you've set a mainloop by the time you've called pumpevents, so we delay initial SetInterval changes until then. + // otherwise you'll get a warning on the javascript console. + pumpevents_has_run = true; + if (pending_swap_interval >= 0) { + Emscripten_GLES_SetSwapInterval(_this, pending_swap_interval); + pending_swap_interval = -1; + } + } +} + +EMSCRIPTEN_KEEPALIVE void requestFullscreenThroughSDL(SDL_Window *window) +{ + SDL_SetWindowFullscreen(window, true); } static bool Emscripten_CreateWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_PropertiesID props) @@ -313,6 +341,13 @@ static bool Emscripten_CreateWindow(SDL_VideoDevice *_this, SDL_Window *window, Emscripten_RegisterEventHandlers(wdata); + // disable the emscripten "fullscreen" button. + MAIN_THREAD_EM_ASM({ + Module['requestFullscreen'] = function(lockPointer, resizeCanvas) { + _requestFullscreenThroughSDL($0); + }; + }, window); + // Window has been successfully created return true; } @@ -364,6 +399,9 @@ static void Emscripten_DestroyWindow(SDL_VideoDevice *_this, SDL_Window *window) SDL_free(window->internal); window->internal = NULL; } + + // just ignore clicks on the fullscreen button while there's no SDL window. + MAIN_THREAD_EM_ASM({ Module['requestFullscreen'] = function(lockPointer, resizeCanvas) {}; }); } static SDL_FullscreenResult Emscripten_SetWindowFullscreen(SDL_VideoDevice *_this, SDL_Window *window, SDL_VideoDisplay *display, SDL_FullscreenOp fullscreen) diff --git a/libs/SDL3/src/video/emscripten/SDL_emscriptenvideo.h b/libs/SDL3/src/video/emscripten/SDL_emscriptenvideo.h index 4dd63cb2..892d0744 100644 --- a/libs/SDL3/src/video/emscripten/SDL_emscriptenvideo.h +++ b/libs/SDL3/src/video/emscripten/SDL_emscriptenvideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -45,6 +45,10 @@ struct SDL_WindowData bool fullscreen_resize; bool has_pointer_lock; + + bool mouse_focus_loss_pending; }; +bool Emscripten_ShouldSetSwapInterval(int interval); + #endif // SDL_emscriptenvideo_h_ diff --git a/libs/SDL3/src/video/gdk/SDL_gdktextinput.cpp b/libs/SDL3/src/video/gdk/SDL_gdktextinput.cpp index c2b8294a..e787871c 100644 --- a/libs/SDL3/src/video/gdk/SDL_gdktextinput.cpp +++ b/libs/SDL3/src/video/gdk/SDL_gdktextinput.cpp @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/gdk/SDL_gdktextinput.h b/libs/SDL3/src/video/gdk/SDL_gdktextinput.h index 471dbe33..c3882ba1 100644 --- a/libs/SDL3/src/video/gdk/SDL_gdktextinput.h +++ b/libs/SDL3/src/video/gdk/SDL_gdktextinput.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_BWin.h b/libs/SDL3/src/video/haiku/SDL_BWin.h index 6c1da193..add3aaf5 100644 --- a/libs/SDL3/src/video/haiku/SDL_BWin.h +++ b/libs/SDL3/src/video/haiku/SDL_BWin.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bclipboard.cc b/libs/SDL3/src/video/haiku/SDL_bclipboard.cc index f0b84e08..ff2bc6b6 100644 --- a/libs/SDL3/src/video/haiku/SDL_bclipboard.cc +++ b/libs/SDL3/src/video/haiku/SDL_bclipboard.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bclipboard.h b/libs/SDL3/src/video/haiku/SDL_bclipboard.h index 0ecc59c0..72965bac 100644 --- a/libs/SDL3/src/video/haiku/SDL_bclipboard.h +++ b/libs/SDL3/src/video/haiku/SDL_bclipboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bevents.cc b/libs/SDL3/src/video/haiku/SDL_bevents.cc index e09ce0f3..ee23b202 100644 --- a/libs/SDL3/src/video/haiku/SDL_bevents.cc +++ b/libs/SDL3/src/video/haiku/SDL_bevents.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bevents.h b/libs/SDL3/src/video/haiku/SDL_bevents.h index 1edc7229..de2c9095 100644 --- a/libs/SDL3/src/video/haiku/SDL_bevents.h +++ b/libs/SDL3/src/video/haiku/SDL_bevents.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bframebuffer.cc b/libs/SDL3/src/video/haiku/SDL_bframebuffer.cc index 545433f2..d152255d 100644 --- a/libs/SDL3/src/video/haiku/SDL_bframebuffer.cc +++ b/libs/SDL3/src/video/haiku/SDL_bframebuffer.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bframebuffer.h b/libs/SDL3/src/video/haiku/SDL_bframebuffer.h index d6161951..c7820014 100644 --- a/libs/SDL3/src/video/haiku/SDL_bframebuffer.h +++ b/libs/SDL3/src/video/haiku/SDL_bframebuffer.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bkeyboard.cc b/libs/SDL3/src/video/haiku/SDL_bkeyboard.cc index 5a210371..c4f364e9 100644 --- a/libs/SDL3/src/video/haiku/SDL_bkeyboard.cc +++ b/libs/SDL3/src/video/haiku/SDL_bkeyboard.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bkeyboard.h b/libs/SDL3/src/video/haiku/SDL_bkeyboard.h index e1896858..57fd77af 100644 --- a/libs/SDL3/src/video/haiku/SDL_bkeyboard.h +++ b/libs/SDL3/src/video/haiku/SDL_bkeyboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bmessagebox.cc b/libs/SDL3/src/video/haiku/SDL_bmessagebox.cc index a7001fa9..75bef70e 100644 --- a/libs/SDL3/src/video/haiku/SDL_bmessagebox.cc +++ b/libs/SDL3/src/video/haiku/SDL_bmessagebox.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga Copyright (C) 2018-2019 EXL This software is provided 'as-is', without any express or implied diff --git a/libs/SDL3/src/video/haiku/SDL_bmessagebox.h b/libs/SDL3/src/video/haiku/SDL_bmessagebox.h index 07d989a2..e2800af0 100644 --- a/libs/SDL3/src/video/haiku/SDL_bmessagebox.h +++ b/libs/SDL3/src/video/haiku/SDL_bmessagebox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga Copyright (C) 2018-2019 EXL This software is provided 'as-is', without any express or implied diff --git a/libs/SDL3/src/video/haiku/SDL_bmodes.cc b/libs/SDL3/src/video/haiku/SDL_bmodes.cc index f479edd2..32c8b6d4 100644 --- a/libs/SDL3/src/video/haiku/SDL_bmodes.cc +++ b/libs/SDL3/src/video/haiku/SDL_bmodes.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bmodes.h b/libs/SDL3/src/video/haiku/SDL_bmodes.h index 2aab11d0..2fd0bc2c 100644 --- a/libs/SDL3/src/video/haiku/SDL_bmodes.h +++ b/libs/SDL3/src/video/haiku/SDL_bmodes.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bopengl.cc b/libs/SDL3/src/video/haiku/SDL_bopengl.cc index 11235982..469b7f6c 100644 --- a/libs/SDL3/src/video/haiku/SDL_bopengl.cc +++ b/libs/SDL3/src/video/haiku/SDL_bopengl.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bopengl.h b/libs/SDL3/src/video/haiku/SDL_bopengl.h index 3b40c9b5..e0522a8c 100644 --- a/libs/SDL3/src/video/haiku/SDL_bopengl.h +++ b/libs/SDL3/src/video/haiku/SDL_bopengl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bvideo.cc b/libs/SDL3/src/video/haiku/SDL_bvideo.cc index 854c1b39..9669dd47 100644 --- a/libs/SDL3/src/video/haiku/SDL_bvideo.cc +++ b/libs/SDL3/src/video/haiku/SDL_bvideo.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bvideo.h b/libs/SDL3/src/video/haiku/SDL_bvideo.h index 1f0ceccf..f107d80b 100644 --- a/libs/SDL3/src/video/haiku/SDL_bvideo.h +++ b/libs/SDL3/src/video/haiku/SDL_bvideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bwindow.cc b/libs/SDL3/src/video/haiku/SDL_bwindow.cc index 902676a5..47a28d38 100644 --- a/libs/SDL3/src/video/haiku/SDL_bwindow.cc +++ b/libs/SDL3/src/video/haiku/SDL_bwindow.cc @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/haiku/SDL_bwindow.h b/libs/SDL3/src/video/haiku/SDL_bwindow.h index 1bc711d1..0f0da858 100644 --- a/libs/SDL3/src/video/haiku/SDL_bwindow.h +++ b/libs/SDL3/src/video/haiku/SDL_bwindow.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmdyn.c b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmdyn.c index 1a680eac..467fb27f 100644 --- a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmdyn.c +++ b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmdyn.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmdyn.h b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmdyn.h index 704671d3..55c51992 100644 --- a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmdyn.h +++ b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmdyn.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmevents.c b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmevents.c index 9bdd5d28..78fb9f43 100644 --- a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmevents.c +++ b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmevents.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmevents.h b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmevents.h index 6b08dada..35473f8a 100644 --- a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmevents.h +++ b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmevents.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmmouse.c b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmmouse.c index a4a5c24e..bb50ae39 100644 --- a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmmouse.c +++ b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmmouse.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmmouse.h b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmmouse.h index d9512cad..53e33f4a 100644 --- a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmmouse.h +++ b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmmouse.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmopengles.c b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmopengles.c index 8f15de86..cc93cde9 100644 --- a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmopengles.c +++ b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmopengles.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmopengles.h b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmopengles.h index e1c11e89..6a4fa568 100644 --- a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmopengles.h +++ b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmopengles.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmsym.h b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmsym.h index 5f389d85..801942d0 100644 --- a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmsym.h +++ b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmsym.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvideo.c b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvideo.c index 6c2e7a69..1d25b8d0 100644 --- a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvideo.c +++ b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvideo.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvideo.h b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvideo.h index 2ef3ae52..5bd2e9cd 100644 --- a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvideo.h +++ b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvulkan.c b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvulkan.c index ef6b39ed..dd50d39e 100644 --- a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvulkan.c +++ b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvulkan.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvulkan.h b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvulkan.h index c2cb7ffe..aabfd92e 100644 --- a/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvulkan.h +++ b/libs/SDL3/src/video/kmsdrm/SDL_kmsdrmvulkan.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/n3ds/SDL_n3dsevents.c b/libs/SDL3/src/video/n3ds/SDL_n3dsevents.c index cda9b1c6..3d5e0e38 100644 --- a/libs/SDL3/src/video/n3ds/SDL_n3dsevents.c +++ b/libs/SDL3/src/video/n3ds/SDL_n3dsevents.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/n3ds/SDL_n3dsevents_c.h b/libs/SDL3/src/video/n3ds/SDL_n3dsevents_c.h index a3b459a9..898fbb28 100644 --- a/libs/SDL3/src/video/n3ds/SDL_n3dsevents_c.h +++ b/libs/SDL3/src/video/n3ds/SDL_n3dsevents_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/n3ds/SDL_n3dsframebuffer.c b/libs/SDL3/src/video/n3ds/SDL_n3dsframebuffer.c index f6a319dc..d632545f 100644 --- a/libs/SDL3/src/video/n3ds/SDL_n3dsframebuffer.c +++ b/libs/SDL3/src/video/n3ds/SDL_n3dsframebuffer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/n3ds/SDL_n3dsframebuffer_c.h b/libs/SDL3/src/video/n3ds/SDL_n3dsframebuffer_c.h index ed77b757..d442add2 100644 --- a/libs/SDL3/src/video/n3ds/SDL_n3dsframebuffer_c.h +++ b/libs/SDL3/src/video/n3ds/SDL_n3dsframebuffer_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/n3ds/SDL_n3dsswkb.c b/libs/SDL3/src/video/n3ds/SDL_n3dsswkb.c index 5aa01300..95f0466d 100644 --- a/libs/SDL3/src/video/n3ds/SDL_n3dsswkb.c +++ b/libs/SDL3/src/video/n3ds/SDL_n3dsswkb.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/n3ds/SDL_n3dsswkb.h b/libs/SDL3/src/video/n3ds/SDL_n3dsswkb.h index c4e03918..8857c009 100644 --- a/libs/SDL3/src/video/n3ds/SDL_n3dsswkb.h +++ b/libs/SDL3/src/video/n3ds/SDL_n3dsswkb.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/n3ds/SDL_n3dstouch.c b/libs/SDL3/src/video/n3ds/SDL_n3dstouch.c index 7379ea15..8116e4ad 100644 --- a/libs/SDL3/src/video/n3ds/SDL_n3dstouch.c +++ b/libs/SDL3/src/video/n3ds/SDL_n3dstouch.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -70,7 +70,7 @@ void N3DS_PollTouch(SDL_VideoDevice *_this) was_pressed = pressed; SDL_SendTouch(0, N3DS_TOUCH_ID, N3DS_TOUCH_FINGER, window, - pressed, + pressed ? SDL_EVENT_FINGER_DOWN : SDL_EVENT_FINGER_UP, touch.px * TOUCHSCREEN_SCALE_X, touch.py * TOUCHSCREEN_SCALE_Y, pressed ? 1.0f : 0.0f); diff --git a/libs/SDL3/src/video/n3ds/SDL_n3dstouch.h b/libs/SDL3/src/video/n3ds/SDL_n3dstouch.h index 204fbd56..7dac5a8f 100644 --- a/libs/SDL3/src/video/n3ds/SDL_n3dstouch.h +++ b/libs/SDL3/src/video/n3ds/SDL_n3dstouch.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/n3ds/SDL_n3dsvideo.c b/libs/SDL3/src/video/n3ds/SDL_n3dsvideo.c index bdf19367..21982797 100644 --- a/libs/SDL3/src/video/n3ds/SDL_n3dsvideo.c +++ b/libs/SDL3/src/video/n3ds/SDL_n3dsvideo.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/n3ds/SDL_n3dsvideo.h b/libs/SDL3/src/video/n3ds/SDL_n3dsvideo.h index adac2626..14b70e92 100644 --- a/libs/SDL3/src/video/n3ds/SDL_n3dsvideo.h +++ b/libs/SDL3/src/video/n3ds/SDL_n3dsvideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/offscreen/SDL_offscreenevents.c b/libs/SDL3/src/video/offscreen/SDL_offscreenevents.c index fc248113..256d1a25 100644 --- a/libs/SDL3/src/video/offscreen/SDL_offscreenevents.c +++ b/libs/SDL3/src/video/offscreen/SDL_offscreenevents.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/offscreen/SDL_offscreenevents_c.h b/libs/SDL3/src/video/offscreen/SDL_offscreenevents_c.h index f1d59359..c06213cc 100644 --- a/libs/SDL3/src/video/offscreen/SDL_offscreenevents_c.h +++ b/libs/SDL3/src/video/offscreen/SDL_offscreenevents_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/offscreen/SDL_offscreenframebuffer.c b/libs/SDL3/src/video/offscreen/SDL_offscreenframebuffer.c index 475f1dd4..e7f61033 100644 --- a/libs/SDL3/src/video/offscreen/SDL_offscreenframebuffer.c +++ b/libs/SDL3/src/video/offscreen/SDL_offscreenframebuffer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/offscreen/SDL_offscreenframebuffer_c.h b/libs/SDL3/src/video/offscreen/SDL_offscreenframebuffer_c.h index 2afe5b7a..ff39ad69 100644 --- a/libs/SDL3/src/video/offscreen/SDL_offscreenframebuffer_c.h +++ b/libs/SDL3/src/video/offscreen/SDL_offscreenframebuffer_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/offscreen/SDL_offscreenopengles.c b/libs/SDL3/src/video/offscreen/SDL_offscreenopengles.c index c06f0b14..87eed0eb 100644 --- a/libs/SDL3/src/video/offscreen/SDL_offscreenopengles.c +++ b/libs/SDL3/src/video/offscreen/SDL_offscreenopengles.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/offscreen/SDL_offscreenopengles.h b/libs/SDL3/src/video/offscreen/SDL_offscreenopengles.h index 05413596..d6dfc0a2 100644 --- a/libs/SDL3/src/video/offscreen/SDL_offscreenopengles.h +++ b/libs/SDL3/src/video/offscreen/SDL_offscreenopengles.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/offscreen/SDL_offscreenvideo.c b/libs/SDL3/src/video/offscreen/SDL_offscreenvideo.c index 7dddb262..bcd4ffe6 100644 --- a/libs/SDL3/src/video/offscreen/SDL_offscreenvideo.c +++ b/libs/SDL3/src/video/offscreen/SDL_offscreenvideo.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/offscreen/SDL_offscreenvideo.h b/libs/SDL3/src/video/offscreen/SDL_offscreenvideo.h index f7c7a7c0..f39d8e72 100644 --- a/libs/SDL3/src/video/offscreen/SDL_offscreenvideo.h +++ b/libs/SDL3/src/video/offscreen/SDL_offscreenvideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/offscreen/SDL_offscreenvulkan.c b/libs/SDL3/src/video/offscreen/SDL_offscreenvulkan.c index 901752cd..b3dca4ac 100644 --- a/libs/SDL3/src/video/offscreen/SDL_offscreenvulkan.c +++ b/libs/SDL3/src/video/offscreen/SDL_offscreenvulkan.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/offscreen/SDL_offscreenvulkan.h b/libs/SDL3/src/video/offscreen/SDL_offscreenvulkan.h index 45f9afed..b9d348e6 100644 --- a/libs/SDL3/src/video/offscreen/SDL_offscreenvulkan.h +++ b/libs/SDL3/src/video/offscreen/SDL_offscreenvulkan.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/offscreen/SDL_offscreenwindow.c b/libs/SDL3/src/video/offscreen/SDL_offscreenwindow.c index 9abc85cf..579353bb 100644 --- a/libs/SDL3/src/video/offscreen/SDL_offscreenwindow.c +++ b/libs/SDL3/src/video/offscreen/SDL_offscreenwindow.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/offscreen/SDL_offscreenwindow.h b/libs/SDL3/src/video/offscreen/SDL_offscreenwindow.h index eb87f9a3..0f723c7f 100644 --- a/libs/SDL3/src/video/offscreen/SDL_offscreenwindow.h +++ b/libs/SDL3/src/video/offscreen/SDL_offscreenwindow.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/ps2/SDL_ps2video.c b/libs/SDL3/src/video/ps2/SDL_ps2video.c index 027ba283..72b8a725 100644 --- a/libs/SDL3/src/video/ps2/SDL_ps2video.c +++ b/libs/SDL3/src/video/ps2/SDL_ps2video.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/ps2/SDL_ps2video.h b/libs/SDL3/src/video/ps2/SDL_ps2video.h index 72443a60..fb79781d 100644 --- a/libs/SDL3/src/video/ps2/SDL_ps2video.h +++ b/libs/SDL3/src/video/ps2/SDL_ps2video.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/psp/SDL_pspevents.c b/libs/SDL3/src/video/psp/SDL_pspevents.c index 336b7d6e..631f0aa7 100644 --- a/libs/SDL3/src/video/psp/SDL_pspevents.c +++ b/libs/SDL3/src/video/psp/SDL_pspevents.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/psp/SDL_pspevents_c.h b/libs/SDL3/src/video/psp/SDL_pspevents_c.h index e56b4cb3..295c21af 100644 --- a/libs/SDL3/src/video/psp/SDL_pspevents_c.h +++ b/libs/SDL3/src/video/psp/SDL_pspevents_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/psp/SDL_pspgl.c b/libs/SDL3/src/video/psp/SDL_pspgl.c index cba2e49d..0e58256b 100644 --- a/libs/SDL3/src/video/psp/SDL_pspgl.c +++ b/libs/SDL3/src/video/psp/SDL_pspgl.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/psp/SDL_pspgl_c.h b/libs/SDL3/src/video/psp/SDL_pspgl_c.h index 44b00b41..028860d4 100644 --- a/libs/SDL3/src/video/psp/SDL_pspgl_c.h +++ b/libs/SDL3/src/video/psp/SDL_pspgl_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/psp/SDL_pspmouse.c b/libs/SDL3/src/video/psp/SDL_pspmouse.c index 5f95730c..e63be96c 100644 --- a/libs/SDL3/src/video/psp/SDL_pspmouse.c +++ b/libs/SDL3/src/video/psp/SDL_pspmouse.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/psp/SDL_pspmouse_c.h b/libs/SDL3/src/video/psp/SDL_pspmouse_c.h index 23bc0ab7..95d1ff44 100644 --- a/libs/SDL3/src/video/psp/SDL_pspmouse_c.h +++ b/libs/SDL3/src/video/psp/SDL_pspmouse_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/psp/SDL_pspvideo.c b/libs/SDL3/src/video/psp/SDL_pspvideo.c index 9448da7b..08e1e8d9 100644 --- a/libs/SDL3/src/video/psp/SDL_pspvideo.c +++ b/libs/SDL3/src/video/psp/SDL_pspvideo.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/psp/SDL_pspvideo.h b/libs/SDL3/src/video/psp/SDL_pspvideo.h index 7328dd80..971f4429 100644 --- a/libs/SDL3/src/video/psp/SDL_pspvideo.h +++ b/libs/SDL3/src/video/psp/SDL_pspvideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/raspberry/SDL_rpievents.c b/libs/SDL3/src/video/raspberry/SDL_rpievents.c index 3b5c12b9..bb4f49d2 100644 --- a/libs/SDL3/src/video/raspberry/SDL_rpievents.c +++ b/libs/SDL3/src/video/raspberry/SDL_rpievents.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/raspberry/SDL_rpievents_c.h b/libs/SDL3/src/video/raspberry/SDL_rpievents_c.h index c9fcff43..6aceae6f 100644 --- a/libs/SDL3/src/video/raspberry/SDL_rpievents_c.h +++ b/libs/SDL3/src/video/raspberry/SDL_rpievents_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/raspberry/SDL_rpimouse.c b/libs/SDL3/src/video/raspberry/SDL_rpimouse.c index fba93bad..925b734b 100644 --- a/libs/SDL3/src/video/raspberry/SDL_rpimouse.c +++ b/libs/SDL3/src/video/raspberry/SDL_rpimouse.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/raspberry/SDL_rpimouse.h b/libs/SDL3/src/video/raspberry/SDL_rpimouse.h index 32d7393d..4b5b95cb 100644 --- a/libs/SDL3/src/video/raspberry/SDL_rpimouse.h +++ b/libs/SDL3/src/video/raspberry/SDL_rpimouse.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/raspberry/SDL_rpiopengles.c b/libs/SDL3/src/video/raspberry/SDL_rpiopengles.c index 969f9ced..0561d8b3 100644 --- a/libs/SDL3/src/video/raspberry/SDL_rpiopengles.c +++ b/libs/SDL3/src/video/raspberry/SDL_rpiopengles.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/raspberry/SDL_rpiopengles.h b/libs/SDL3/src/video/raspberry/SDL_rpiopengles.h index 5836111f..f6f03968 100644 --- a/libs/SDL3/src/video/raspberry/SDL_rpiopengles.h +++ b/libs/SDL3/src/video/raspberry/SDL_rpiopengles.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/raspberry/SDL_rpivideo.c b/libs/SDL3/src/video/raspberry/SDL_rpivideo.c index 73b29bcd..2d1e507a 100644 --- a/libs/SDL3/src/video/raspberry/SDL_rpivideo.c +++ b/libs/SDL3/src/video/raspberry/SDL_rpivideo.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/raspberry/SDL_rpivideo.h b/libs/SDL3/src/video/raspberry/SDL_rpivideo.h index e379fa2a..c1546551 100644 --- a/libs/SDL3/src/video/raspberry/SDL_rpivideo.h +++ b/libs/SDL3/src/video/raspberry/SDL_rpivideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/SDL_riscosdefs.h b/libs/SDL3/src/video/riscos/SDL_riscosdefs.h index c49ec866..85be9397 100644 --- a/libs/SDL3/src/video/riscos/SDL_riscosdefs.h +++ b/libs/SDL3/src/video/riscos/SDL_riscosdefs.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/SDL_riscosevents.c b/libs/SDL3/src/video/riscos/SDL_riscosevents.c index 3993c8e0..367ea470 100644 --- a/libs/SDL3/src/video/riscos/SDL_riscosevents.c +++ b/libs/SDL3/src/video/riscos/SDL_riscosevents.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/SDL_riscosevents_c.h b/libs/SDL3/src/video/riscos/SDL_riscosevents_c.h index b0f345d4..5db26fd6 100644 --- a/libs/SDL3/src/video/riscos/SDL_riscosevents_c.h +++ b/libs/SDL3/src/video/riscos/SDL_riscosevents_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/SDL_riscosframebuffer.c b/libs/SDL3/src/video/riscos/SDL_riscosframebuffer.c index 4e1192e1..a13cab86 100644 --- a/libs/SDL3/src/video/riscos/SDL_riscosframebuffer.c +++ b/libs/SDL3/src/video/riscos/SDL_riscosframebuffer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/SDL_riscosframebuffer_c.h b/libs/SDL3/src/video/riscos/SDL_riscosframebuffer_c.h index 944e9321..ee3c8471 100644 --- a/libs/SDL3/src/video/riscos/SDL_riscosframebuffer_c.h +++ b/libs/SDL3/src/video/riscos/SDL_riscosframebuffer_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/SDL_riscosmessagebox.c b/libs/SDL3/src/video/riscos/SDL_riscosmessagebox.c index bc2fddce..a4b358ce 100644 --- a/libs/SDL3/src/video/riscos/SDL_riscosmessagebox.c +++ b/libs/SDL3/src/video/riscos/SDL_riscosmessagebox.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/SDL_riscosmessagebox.h b/libs/SDL3/src/video/riscos/SDL_riscosmessagebox.h index e05e063b..21af02f6 100644 --- a/libs/SDL3/src/video/riscos/SDL_riscosmessagebox.h +++ b/libs/SDL3/src/video/riscos/SDL_riscosmessagebox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/SDL_riscosmodes.c b/libs/SDL3/src/video/riscos/SDL_riscosmodes.c index b36e7c35..d4e9a534 100644 --- a/libs/SDL3/src/video/riscos/SDL_riscosmodes.c +++ b/libs/SDL3/src/video/riscos/SDL_riscosmodes.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/SDL_riscosmodes.h b/libs/SDL3/src/video/riscos/SDL_riscosmodes.h index 2d17dbdb..fa5d65c6 100644 --- a/libs/SDL3/src/video/riscos/SDL_riscosmodes.h +++ b/libs/SDL3/src/video/riscos/SDL_riscosmodes.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/SDL_riscosmouse.c b/libs/SDL3/src/video/riscos/SDL_riscosmouse.c index 16b0a550..d67e7c8d 100644 --- a/libs/SDL3/src/video/riscos/SDL_riscosmouse.c +++ b/libs/SDL3/src/video/riscos/SDL_riscosmouse.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/SDL_riscosmouse.h b/libs/SDL3/src/video/riscos/SDL_riscosmouse.h index 9f09dd6e..e28d1dcb 100644 --- a/libs/SDL3/src/video/riscos/SDL_riscosmouse.h +++ b/libs/SDL3/src/video/riscos/SDL_riscosmouse.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/SDL_riscosvideo.c b/libs/SDL3/src/video/riscos/SDL_riscosvideo.c index 6fc6508b..1002a45c 100644 --- a/libs/SDL3/src/video/riscos/SDL_riscosvideo.c +++ b/libs/SDL3/src/video/riscos/SDL_riscosvideo.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/SDL_riscosvideo.h b/libs/SDL3/src/video/riscos/SDL_riscosvideo.h index 91ee5a58..f9e42eeb 100644 --- a/libs/SDL3/src/video/riscos/SDL_riscosvideo.h +++ b/libs/SDL3/src/video/riscos/SDL_riscosvideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/SDL_riscoswindow.c b/libs/SDL3/src/video/riscos/SDL_riscoswindow.c index 7eb1c25c..cc28123b 100644 --- a/libs/SDL3/src/video/riscos/SDL_riscoswindow.c +++ b/libs/SDL3/src/video/riscos/SDL_riscoswindow.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/SDL_riscoswindow.h b/libs/SDL3/src/video/riscos/SDL_riscoswindow.h index 35179110..eefec97e 100644 --- a/libs/SDL3/src/video/riscos/SDL_riscoswindow.h +++ b/libs/SDL3/src/video/riscos/SDL_riscoswindow.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/riscos/scancodes_riscos.h b/libs/SDL3/src/video/riscos/scancodes_riscos.h index a181b5b5..2b991356 100644 --- a/libs/SDL3/src/video/riscos/scancodes_riscos.h +++ b/libs/SDL3/src/video/riscos/scancodes_riscos.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/sdlgenblit.pl b/libs/SDL3/src/video/sdlgenblit.pl index 25ef5d76..47c90d5e 100644 --- a/libs/SDL3/src/video/sdlgenblit.pl +++ b/libs/SDL3/src/video/sdlgenblit.pl @@ -93,7 +93,7 @@ sub open_file { // DO NOT EDIT! This file is generated by sdlgenblit.pl /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitappdelegate.h b/libs/SDL3/src/video/uikit/SDL_uikitappdelegate.h index c52594dc..77ccbfdd 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitappdelegate.h +++ b/libs/SDL3/src/video/uikit/SDL_uikitappdelegate.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitappdelegate.m b/libs/SDL3/src/video/uikit/SDL_uikitappdelegate.m index 8599cd3b..6a37e511 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitappdelegate.m +++ b/libs/SDL3/src/video/uikit/SDL_uikitappdelegate.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -30,14 +30,6 @@ #include "../../events/SDL_events_c.h" -#ifndef SDL_PLATFORM_TVOS -#include - -#ifndef __IPHONE_13_0 -#define __IPHONE_13_0 130000 -#endif -#endif - #ifdef main #undef main #endif @@ -159,13 +151,11 @@ static UIImage *SDL_LoadLaunchImageNamed(NSString *name, int screenh) if ([statusBarStyle isEqualToString:@"UIStatusBarStyleLightContent"]) { return UIStatusBarStyleLightContent; } -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0 if (@available(iOS 13.0, *)) { if ([statusBarStyle isEqualToString:@"UIStatusBarStyleDarkContent"]) { return UIStatusBarStyleDarkContent; } } -#endif return UIStatusBarStyleDefault; } @@ -517,8 +507,6 @@ static UIImage *SDL_LoadLaunchImageNamed(NSString *name, int screenh) SDL_SendDropComplete(NULL); } -#if defined(SDL_PLATFORM_TVOS) || (defined(__IPHONE_9_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_9_0) - - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options { // TODO: Handle options @@ -526,16 +514,6 @@ static UIImage *SDL_LoadLaunchImageNamed(NSString *name, int screenh) return YES; } -#else - -- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation -{ - [self sendDropFileForURL:url fromSourceApplication:sourceApplication]; - return YES; -} - -#endif - @end #endif // SDL_VIDEO_DRIVER_UIKIT diff --git a/libs/SDL3/src/video/uikit/SDL_uikitclipboard.h b/libs/SDL3/src/video/uikit/SDL_uikitclipboard.h index ce126fd9..1c538c2b 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitclipboard.h +++ b/libs/SDL3/src/video/uikit/SDL_uikitclipboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitclipboard.m b/libs/SDL3/src/video/uikit/SDL_uikitclipboard.m index cf4564e6..8ed4eb04 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitclipboard.m +++ b/libs/SDL3/src/video/uikit/SDL_uikitclipboard.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitevents.h b/libs/SDL3/src/video/uikit/SDL_uikitevents.h index b0c152a9..c767fb1a 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitevents.h +++ b/libs/SDL3/src/video/uikit/SDL_uikitevents.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitevents.m b/libs/SDL3/src/video/uikit/SDL_uikitevents.m index 8e34129b..86224f79 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitevents.m +++ b/libs/SDL3/src/video/uikit/SDL_uikitevents.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -31,14 +31,8 @@ #include "SDL_uikitwindow.h" #import - -#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 140000) || (__APPLETV_OS_VERSION_MAX_ALLOWED >= 140000) || (__MAC_OS_VERSION_MAX_ALLOWED > 1500000) #import -#define ENABLE_GCKEYBOARD -#define ENABLE_GCMOUSE -#endif - static BOOL UIKit_EventPumpEnabled = YES; @interface SDL_LifecycleObserver : NSObject @@ -50,7 +44,16 @@ static BOOL UIKit_EventPumpEnabled = YES; - (void)update { NSNotificationCenter *notificationCenter = NSNotificationCenter.defaultCenter; - if ((UIKit_EventPumpEnabled || SDL_HasMainCallbacks()) && !self.isObservingNotifications) { + bool wants_observation = (UIKit_EventPumpEnabled || SDL_HasMainCallbacks()); + if (!wants_observation) { + // Make sure no windows have active animation callbacks + int num_windows = 0; + SDL_free(SDL_GetWindows(&num_windows)); + if (num_windows > 0) { + wants_observation = true; + } + } + if (wants_observation && !self.isObservingNotifications) { self.isObservingNotifications = YES; [notificationCenter addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil]; [notificationCenter addObserver:self selector:@selector(applicationWillResignActive) name:UIApplicationWillResignActiveNotification object:nil]; @@ -64,7 +67,7 @@ static BOOL UIKit_EventPumpEnabled = YES; name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; #endif - } else if (!UIKit_EventPumpEnabled && !SDL_HasMainCallbacks() && self.isObservingNotifications) { + } else if (!wants_observation && self.isObservingNotifications) { self.isObservingNotifications = NO; [notificationCenter removeObserver:self]; } @@ -175,8 +178,6 @@ void UIKit_PumpEvents(SDL_VideoDevice *_this) #endif } -#ifdef ENABLE_GCKEYBOARD - static id keyboard_connect_observer = nil; static id keyboard_disconnect_observer = nil; @@ -257,20 +258,6 @@ void SDL_QuitGCKeyboard(void) } } -#else - -void SDL_InitGCKeyboard(void) -{ -} - -void SDL_QuitGCKeyboard(void) -{ -} - -#endif // ENABLE_GCKEYBOARD - -#ifdef ENABLE_GCMOUSE - static id mouse_connect_observer = nil; static id mouse_disconnect_observer = nil; static bool mouse_relative_mode = false; @@ -471,21 +458,4 @@ void SDL_QuitGCMouse(void) } } -#else - -void SDL_InitGCMouse(void) -{ -} - -bool SDL_GCMouseRelativeMode(void) -{ - return false; -} - -void SDL_QuitGCMouse(void) -{ -} - -#endif // ENABLE_GCMOUSE - #endif // SDL_VIDEO_DRIVER_UIKIT diff --git a/libs/SDL3/src/video/uikit/SDL_uikitmessagebox.h b/libs/SDL3/src/video/uikit/SDL_uikitmessagebox.h index ca207052..5c21f7c7 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitmessagebox.h +++ b/libs/SDL3/src/video/uikit/SDL_uikitmessagebox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitmessagebox.m b/libs/SDL3/src/video/uikit/SDL_uikitmessagebox.m index 2f2094aa..a57b3f76 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitmessagebox.m +++ b/libs/SDL3/src/video/uikit/SDL_uikitmessagebox.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitmetalview.h b/libs/SDL3/src/video/uikit/SDL_uikitmetalview.h index fb996be7..20bcf7cb 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitmetalview.h +++ b/libs/SDL3/src/video/uikit/SDL_uikitmetalview.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitmetalview.m b/libs/SDL3/src/video/uikit/SDL_uikitmetalview.m index 402ef4c4..010dae4b 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitmetalview.m +++ b/libs/SDL3/src/video/uikit/SDL_uikitmetalview.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitmodes.h b/libs/SDL3/src/video/uikit/SDL_uikitmodes.h index ee3d48eb..1b25cfda 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitmodes.h +++ b/libs/SDL3/src/video/uikit/SDL_uikitmodes.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitmodes.m b/libs/SDL3/src/video/uikit/SDL_uikitmodes.m index 8688dac1..d3247dbd 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitmodes.m +++ b/libs/SDL3/src/video/uikit/SDL_uikitmodes.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -131,12 +131,7 @@ static void UIKit_FreeDisplayModeData(SDL_DisplayMode *mode) #ifndef SDL_PLATFORM_VISIONOS static float UIKit_GetDisplayModeRefreshRate(UIScreen *uiscreen) { -#ifdef __IPHONE_10_3 - if ([uiscreen respondsToSelector:@selector(maximumFramesPerSecond)]) { - return (float)uiscreen.maximumFramesPerSecond; - } -#endif - return 0.0f; + return (float)uiscreen.maximumFramesPerSecond; } static bool UIKit_AddSingleDisplayMode(SDL_VideoDisplay *display, int w, int h, @@ -501,9 +496,15 @@ void SDL_OnApplicationDidChangeStatusBarOrientation(void) * fullscreen desktop keeps the window dimensions in the * correct orientation. */ if (isLandscape != (mode->w > mode->h)) { - int height = mode->w; - mode->w = mode->h; - mode->h = height; + SDL_DisplayMode new_mode; + SDL_copyp(&new_mode, mode); + new_mode.w = mode->h; + new_mode.h = mode->w; + + // Make sure we don't free the current display mode data + mode->internal = NULL; + + SDL_SetDesktopDisplayMode(display, &new_mode); } // Same deal with the fullscreen modes diff --git a/libs/SDL3/src/video/uikit/SDL_uikitopengles.h b/libs/SDL3/src/video/uikit/SDL_uikitopengles.h index 686ab715..cc259f72 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitopengles.h +++ b/libs/SDL3/src/video/uikit/SDL_uikitopengles.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitopengles.m b/libs/SDL3/src/video/uikit/SDL_uikitopengles.m index 7385ef6c..a73588bf 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitopengles.m +++ b/libs/SDL3/src/video/uikit/SDL_uikitopengles.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitopenglview.h b/libs/SDL3/src/video/uikit/SDL_uikitopenglview.h index 2c9f966b..3286a16a 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitopenglview.h +++ b/libs/SDL3/src/video/uikit/SDL_uikitopenglview.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitopenglview.m b/libs/SDL3/src/video/uikit/SDL_uikitopenglview.m index 1859c8d3..71d167fc 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitopenglview.m +++ b/libs/SDL3/src/video/uikit/SDL_uikitopenglview.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitpen.h b/libs/SDL3/src/video/uikit/SDL_uikitpen.h new file mode 100644 index 00000000..1e755892 --- /dev/null +++ b/libs/SDL3/src/video/uikit/SDL_uikitpen.h @@ -0,0 +1,39 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_uikitpen_h_ +#define SDL_uikitpen_h_ + +#include "SDL_uikitvideo.h" +#include "SDL_uikitwindow.h" + +extern bool UIKit_InitPen(SDL_VideoDevice *_this); +extern void UIKit_HandlePenMotion(SDL_uikitview *view, UITouch *pencil); +extern void UIKit_HandlePenPress(SDL_uikitview *view, UITouch *pencil); +extern void UIKit_HandlePenRelease(SDL_uikitview *view, UITouch *pencil); + +#if !defined(SDL_PLATFORM_TVOS) +extern void UIKit_HandlePenHover(SDL_uikitview *view, UIHoverGestureRecognizer *recognizer) API_AVAILABLE(ios(13.0)); +#endif + +extern void UIKit_QuitPen(SDL_VideoDevice *_this); + +#endif // SDL_uikitpen_h_ diff --git a/libs/SDL3/src/video/uikit/SDL_uikitpen.m b/libs/SDL3/src/video/uikit/SDL_uikitpen.m new file mode 100644 index 00000000..622513c2 --- /dev/null +++ b/libs/SDL3/src/video/uikit/SDL_uikitpen.m @@ -0,0 +1,189 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "SDL_internal.h" + +#ifdef SDL_VIDEO_DRIVER_UIKIT + +#include "SDL_uikitevents.h" +#include "SDL_uikitpen.h" +#include "SDL_uikitwindow.h" + +#include "../../events/SDL_pen_c.h" + +static SDL_PenID apple_pencil_id = 0; + +bool UIKit_InitPen(SDL_VideoDevice *_this) +{ + return true; +} + +// we only have one Apple Pencil at a time, and it must be paired to the iOS device. +// We only know about its existence when it first sends an event, so add an single SDL pen +// device here if we haven't already. +static SDL_PenID UIKit_AddPenIfNecesary() +{ + if (!apple_pencil_id) { + SDL_PenInfo info; + SDL_zero(info); + info.capabilities = SDL_PEN_CAPABILITY_PRESSURE | SDL_PEN_CAPABILITY_XTILT | SDL_PEN_CAPABILITY_YTILT; + info.max_tilt = 90.0f; + info.num_buttons = 0; + info.subtype = SDL_PEN_TYPE_PENCIL; + + if (@available(iOS 17.5, *)) { // need rollAngle method. + info.capabilities |= SDL_PEN_CAPABILITY_ROTATION; + } + + if (@available(ios 16.1, *)) { // need zOffset method. + info.capabilities |= SDL_PEN_CAPABILITY_DISTANCE; + } + + // Apple Pencil and iOS can report when the pencil is being "squeezed" but it's a boolean thing, + // so we can't use it for tangential pressure. + + // There's only ever one Apple Pencil at most, so we just pass a non-zero value for the handle. + apple_pencil_id = SDL_AddPenDevice(0, "Apple Pencil", &info, (void *) (size_t) 0x1); + } + + return apple_pencil_id; +} + +static void UIKit_HandlePenAxes(SDL_Window *window, NSTimeInterval nstimestamp, float zOffset, const CGPoint *point, float force, + float maximumPossibleForce, float azimuthAngleInView, float altitudeAngle, float rollAngle) +{ + const SDL_PenID penId = UIKit_AddPenIfNecesary(); + if (penId) { + const Uint64 timestamp = UIKit_GetEventTimestamp(nstimestamp); + const float radians_to_degrees = 180.0f / SDL_PI_F; + + // Normalize force to 0.0f ... 1.0f range. + const float pressure = force / maximumPossibleForce; + + // azimuthAngleInView is in radians, with 0 being the pen's back end pointing due east on the screen when the + // tip is touching the screen, and negative when heading north from there, positive to the south. + // So convert to degrees, 0 being due east, etc. + const float azimuth_angle = azimuthAngleInView * radians_to_degrees; + + // altitudeAngle is in radians, with 0 being the pen laying flat on (parallel to) the device + // screen and PI/2 being it pointing straight up from (perpendicular to) the device screen. + // So convert to degrees, 0 being flat and 90 being straight up. + const float altitude_angle = altitudeAngle * radians_to_degrees; + + // the azimuth_angle goes from -180 to 180 (with abs(angle) moving from 180 to 0, left to right), but SDL wants + // it from -90 (back facing west) to 90 (back facing east). + const float xtilt = (180.0f - SDL_fabsf(azimuth_angle)) - 90.0f; + + // the altitude_angle goes from 0 to 90 regardless of which direction the pen is lifting off the device, but SDL wants + // it from -90 (flat facing north) to 90 (flat facing south). + const float ytilt = (azimuth_angle < 0.0f) ? -(90.0f - altitude_angle) : (90.0f - altitude_angle); + + // rotation is in radians, and only available on a later iOS. + const float rotation = rollAngle * radians_to_degrees; // !!! FIXME: this might need adjustment, I don't have a pencil that supports it. + + SDL_SendPenMotion(timestamp, penId, window, point->x, point->y); + SDL_SendPenAxis(timestamp, penId, window, SDL_PEN_AXIS_PRESSURE, pressure); + SDL_SendPenAxis(timestamp, penId, window, SDL_PEN_AXIS_XTILT, xtilt); + SDL_SendPenAxis(timestamp, penId, window, SDL_PEN_AXIS_YTILT, ytilt); + SDL_SendPenAxis(timestamp, penId, window, SDL_PEN_AXIS_ROTATION, rotation); + SDL_SendPenAxis(timestamp, penId, window, SDL_PEN_AXIS_DISTANCE, zOffset); + } +} + +#if !defined(SDL_PLATFORM_TVOS) +extern void UIKit_HandlePenHover(SDL_uikitview *view, UIHoverGestureRecognizer *recognizer) +{ + float zOffset = 0.0f; + if (@available(iOS 16.1, *)) { + zOffset = (float) [recognizer zOffset]; + } + + float azimuthAngleInView = 0.0f; + if (@available(iOS 16.4, *)) { + azimuthAngleInView = (float) [recognizer azimuthAngleInView:view]; + } + + float altitudeAngle = 0.0f; + if (@available(iOS 16.4, *)) { + altitudeAngle = (float) [recognizer altitudeAngle]; + } + + float rollAngle = 0.0f; + if (@available(iOS 17.5, *)) { + rollAngle = (float) [recognizer rollAngle]; + } + + SDL_Window *window = [view getSDLWindow]; + const CGPoint point = [recognizer locationInView:view]; + + // force is zero here; if you're here, you're not touching. + // !!! FIXME: no timestamp on these...? + UIKit_HandlePenAxes(window, 0, zOffset, &point, 0.0f, 1.0f, azimuthAngleInView, altitudeAngle, rollAngle); +} +#endif + +static void UIKit_HandlePenAxesFromUITouch(SDL_uikitview *view, UITouch *pencil) +{ + float rollAngle = 0.0f; + #if !defined(SDL_PLATFORM_TVOS) + if (@available(iOS 17.5, *)) { + rollAngle = (float) [pencil rollAngle]; + } + #endif + + SDL_Window *window = [view getSDLWindow]; + const CGPoint point = [pencil locationInView:view]; + + // zOffset is zero here; if you're here, you're touching. + UIKit_HandlePenAxes(window, [pencil timestamp], 0.0f, &point, [pencil force], [pencil maximumPossibleForce], [pencil azimuthAngleInView:view], [pencil altitudeAngle], rollAngle); +} + +void UIKit_HandlePenMotion(SDL_uikitview *view, UITouch *pencil) +{ + UIKit_HandlePenAxesFromUITouch(view, pencil); +} + +void UIKit_HandlePenPress(SDL_uikitview *view, UITouch *pencil) +{ + const SDL_PenID penId = UIKit_AddPenIfNecesary(); + if (penId) { + UIKit_HandlePenAxesFromUITouch(view, pencil); + SDL_SendPenTouch(UIKit_GetEventTimestamp([pencil timestamp]), penId, [view getSDLWindow], false, true); + } +} + +void UIKit_HandlePenRelease(SDL_uikitview *view, UITouch *pencil) +{ + const SDL_PenID penId = UIKit_AddPenIfNecesary(); + if (penId) { + SDL_SendPenTouch(UIKit_GetEventTimestamp([pencil timestamp]), penId, [view getSDLWindow], false, false); + UIKit_HandlePenAxesFromUITouch(view, pencil); + } +} + +void UIKit_QuitPen(SDL_VideoDevice *_this) +{ + if (apple_pencil_id) { + SDL_RemovePenDevice(0, apple_pencil_id); + apple_pencil_id = 0; + } +} + +#endif // SDL_VIDEO_DRIVER_UIKIT diff --git a/libs/SDL3/src/video/uikit/SDL_uikitvideo.h b/libs/SDL3/src/video/uikit/SDL_uikitvideo.h index 66c30c73..927e6468 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitvideo.h +++ b/libs/SDL3/src/video/uikit/SDL_uikitvideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitvideo.m b/libs/SDL3/src/video/uikit/SDL_uikitvideo.m index de134147..43f0b30d 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitvideo.m +++ b/libs/SDL3/src/video/uikit/SDL_uikitvideo.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -259,13 +259,8 @@ void UIKit_ForceUpdateHomeIndicator(void) if (focus) { SDL_UIKitWindowData *data = (__bridge SDL_UIKitWindowData *)focus->internal; if (data != nil) { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunguarded-availability-new" - if ([data.viewcontroller respondsToSelector:@selector(setNeedsUpdateOfHomeIndicatorAutoHidden)]) { - [data.viewcontroller performSelectorOnMainThread:@selector(setNeedsUpdateOfHomeIndicatorAutoHidden) withObject:nil waitUntilDone:NO]; - [data.viewcontroller performSelectorOnMainThread:@selector(setNeedsUpdateOfScreenEdgesDeferringSystemGestures) withObject:nil waitUntilDone:NO]; - } -#pragma clang diagnostic pop + [data.viewcontroller performSelectorOnMainThread:@selector(setNeedsUpdateOfHomeIndicatorAutoHidden) withObject:nil waitUntilDone:NO]; + [data.viewcontroller performSelectorOnMainThread:@selector(setNeedsUpdateOfScreenEdgesDeferringSystemGestures) withObject:nil waitUntilDone:NO]; } } #endif // !SDL_PLATFORM_TVOS diff --git a/libs/SDL3/src/video/uikit/SDL_uikitview.h b/libs/SDL3/src/video/uikit/SDL_uikitview.h index 6169ccfa..78c2beda 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitview.h +++ b/libs/SDL3/src/video/uikit/SDL_uikitview.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -23,7 +23,7 @@ #include "../SDL_sysvideo.h" -#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4) +#if !defined(SDL_PLATFORM_TVOS) @interface SDL_uikitview : UIView #else @interface SDL_uikitview : UIView @@ -34,9 +34,12 @@ - (void)setSDLWindow:(SDL_Window *)window; - (SDL_Window *)getSDLWindow; -#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4) +#if !defined(SDL_PLATFORM_TVOS) +- (void)pencilHovering:(UIHoverGestureRecognizer *)recognizer API_AVAILABLE(ios(13.0)); + - (UIPointerRegion *)pointerInteraction:(UIPointerInteraction *)interaction regionForRequest:(UIPointerRegionRequest *)request defaultRegion:(UIPointerRegion *)defaultRegion API_AVAILABLE(ios(13.4)); - (UIPointerStyle *)pointerInteraction:(UIPointerInteraction *)interaction styleForRegion:(UIPointerRegion *)region API_AVAILABLE(ios(13.4)); +- (void)indirectPointerHovering:(UIHoverGestureRecognizer *)recognizer API_AVAILABLE(ios(13.4)); #endif - (CGPoint)touchLocation:(UITouch *)touch shouldNormalize:(BOOL)normalize; diff --git a/libs/SDL3/src/video/uikit/SDL_uikitview.m b/libs/SDL3/src/video/uikit/SDL_uikitview.m index 215f8471..ba3b09bf 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitview.m +++ b/libs/SDL3/src/video/uikit/SDL_uikitview.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -31,6 +31,7 @@ #include "SDL_uikitappdelegate.h" #include "SDL_uikitevents.h" #include "SDL_uikitmodes.h" +#include "SDL_uikitpen.h" #include "SDL_uikitwindow.h" // The maximum number of mouse buttons we support @@ -47,6 +48,10 @@ extern int SDL_AppleTVRemoteOpenedAsJoystick; SDL_TouchID directTouchId; SDL_TouchID indirectTouchId; + +#if !defined(SDL_PLATFORM_TVOS) + UIPointerInteraction *indirectPointerInteraction API_AVAILABLE(ios(13.4)); +#endif } - (instancetype)initWithFrame:(CGRect)frame @@ -80,13 +85,22 @@ extern int SDL_AppleTVRemoteOpenedAsJoystick; #ifndef SDL_PLATFORM_TVOS self.multipleTouchEnabled = YES; SDL_AddTouch(directTouchId, SDL_TOUCH_DEVICE_DIRECT, ""); -#endif -#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4) - if (@available(iOS 13.4, *)) { - [self addInteraction:[[UIPointerInteraction alloc] initWithDelegate:self]]; + if (@available(iOS 13.0, *)) { + UIHoverGestureRecognizer *pencilRecognizer = [[UIHoverGestureRecognizer alloc] initWithTarget:self action:@selector(pencilHovering:)]; + pencilRecognizer.allowedTouchTypes = @[@(UITouchTypePencil)]; + [self addGestureRecognizer:pencilRecognizer]; } -#endif + + if (@available(iOS 13.4, *)) { + indirectPointerInteraction = [[UIPointerInteraction alloc] initWithDelegate:self]; + [self addInteraction:indirectPointerInteraction]; + + UIHoverGestureRecognizer *indirectPointerRecognizer = [[UIHoverGestureRecognizer alloc] initWithTarget:self action:@selector(indirectPointerHovering:)]; + indirectPointerRecognizer.allowedTouchTypes = @[@(UITouchTypeIndirectPointer)]; + [self addGestureRecognizer:indirectPointerRecognizer]; + } +#endif // !defined(SDL_PLATFORM_TVOS) } return self; @@ -153,18 +167,10 @@ extern int SDL_AppleTVRemoteOpenedAsJoystick; return sdlwindow; } -#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4) +#if !defined(SDL_PLATFORM_TVOS) + - (UIPointerRegion *)pointerInteraction:(UIPointerInteraction *)interaction regionForRequest:(UIPointerRegionRequest *)request defaultRegion:(UIPointerRegion *)defaultRegion API_AVAILABLE(ios(13.4)) { - if (request != nil && !SDL_GCMouseRelativeMode()) { - CGPoint origin = self.bounds.origin; - CGPoint point = request.location; - - point.x -= origin.x; - point.y -= origin.y; - - SDL_SendMouseMotion(0, sdlwindow, SDL_GLOBAL_MOUSE_ID, false, point.x, point.y); - } return [UIPointerRegion regionWithRect:self.bounds identifier:nil]; } @@ -176,18 +182,112 @@ extern int SDL_AppleTVRemoteOpenedAsJoystick; return [UIPointerStyle hiddenPointerStyle]; } } -#endif // !defined(SDL_PLATFORM_TVOS) && __IPHONE_13_4 + +- (void)indirectPointerHovering:(UIHoverGestureRecognizer *)recognizer API_AVAILABLE(ios(13.4)) +{ + switch (recognizer.state) { + case UIGestureRecognizerStateBegan: + case UIGestureRecognizerStateChanged: + { + CGPoint point = [recognizer locationInView:self]; + SDL_SendMouseMotion(0, sdlwindow, SDL_GLOBAL_MOUSE_ID, false, point.x, point.y); + break; + } + + default: + break; + } +} + +- (void)indirectPointerMoving:(UITouch *)touch API_AVAILABLE(ios(13.4)) +{ + CGPoint locationInView = [self touchLocation:touch shouldNormalize:NO]; + SDL_SendMouseMotion(0, sdlwindow, SDL_GLOBAL_MOUSE_ID, false, locationInView.x, locationInView.y); +} + +- (void)indirectPointerPressed:(UITouch *)touch fromEvent:(UIEvent *)event API_AVAILABLE(ios(13.4)) +{ + if (!SDL_HasMouse()) { + int i; + + for (i = 1; i <= MAX_MOUSE_BUTTONS; ++i) { + if (event.buttonMask & SDL_BUTTON_MASK(i)) { + Uint8 button; + + switch (i) { + case 1: + button = SDL_BUTTON_LEFT; + break; + case 2: + button = SDL_BUTTON_RIGHT; + break; + case 3: + button = SDL_BUTTON_MIDDLE; + break; + default: + button = (Uint8)i; + break; + } + SDL_SendMouseButton(UIKit_GetEventTimestamp([touch timestamp]), sdlwindow, SDL_GLOBAL_MOUSE_ID, button, true); + } + } + } +} + +- (void)indirectPointerReleased:(UITouch *)touch fromEvent:(UIEvent *)event API_AVAILABLE(ios(13.4)) +{ + if (!SDL_HasMouse()) { + int i; + SDL_MouseButtonFlags buttons = SDL_GetMouseState(NULL, NULL); + + for (i = 0; i < MAX_MOUSE_BUTTONS; ++i) { + if (buttons & SDL_BUTTON_MASK(i)) { + SDL_SendMouseButton(UIKit_GetEventTimestamp([touch timestamp]), sdlwindow, SDL_GLOBAL_MOUSE_ID, (Uint8)i, false); + } + } + } +} + +- (void)pencilHovering:(UIHoverGestureRecognizer *)recognizer API_AVAILABLE(ios(13.0)) +{ + switch (recognizer.state) { + case UIGestureRecognizerStateBegan: + case UIGestureRecognizerStateChanged: + UIKit_HandlePenHover(self, recognizer); + break; + + case UIGestureRecognizerStateEnded: + case UIGestureRecognizerStateCancelled: + // we track touches elsewhere, so if a hover "ends" we'll deal with that there. + break; + + default: + break; + } +} + +- (void)pencilMoving:(UITouch *)touch +{ + UIKit_HandlePenMotion(self, touch); +} + +- (void)pencilPressed:(UITouch *)touch +{ + UIKit_HandlePenPress(self, touch); +} + +- (void)pencilReleased:(UITouch *)touch +{ + UIKit_HandlePenRelease(self, touch); +} + +#endif // !defined(SDL_PLATFORM_TVOS) - (SDL_TouchDeviceType)touchTypeForTouch:(UITouch *)touch { -#ifdef __IPHONE_9_0 - if ([touch respondsToSelector:@selector((type))]) { - if (touch.type == UITouchTypeIndirect) { - return SDL_TOUCH_DEVICE_INDIRECT_RELATIVE; - } + if (touch.type == UITouchTypeIndirect) { + return SDL_TOUCH_DEVICE_INDIRECT_RELATIVE; } -#endif - return SDL_TOUCH_DEVICE_DIRECT; } @@ -217,169 +317,164 @@ extern int SDL_AppleTVRemoteOpenedAsJoystick; - (float)pressureForTouch:(UITouch *)touch { -#ifdef __IPHONE_9_0 - if ([touch respondsToSelector:@selector(force)]) { - return (float)touch.force; - } -#endif - - return 1.0f; + return (float)touch.force; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { for (UITouch *touch in touches) { - BOOL handled = NO; - -#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4) - if (@available(iOS 13.4, *)) { - if (touch.type == UITouchTypeIndirectPointer) { - if (!SDL_HasMouse()) { - int i; - - for (i = 1; i <= MAX_MOUSE_BUTTONS; ++i) { - if (event.buttonMask & SDL_BUTTON_MASK(i)) { - Uint8 button; - - switch (i) { - case 1: - button = SDL_BUTTON_LEFT; - break; - case 2: - button = SDL_BUTTON_RIGHT; - break; - case 3: - button = SDL_BUTTON_MIDDLE; - break; - default: - button = (Uint8)i; - break; - } - SDL_SendMouseButton(UIKit_GetEventTimestamp([event timestamp]), sdlwindow, SDL_GLOBAL_MOUSE_ID, button, true); - } - } - } - handled = YES; - } - } -#endif - if (!handled) { - SDL_TouchDeviceType touchType = [self touchTypeForTouch:touch]; - SDL_TouchID touchId = [self touchIdForType:touchType]; - float pressure = [self pressureForTouch:touch]; - - if (SDL_AddTouch(touchId, touchType, "") < 0) { +#if !defined(SDL_PLATFORM_TVOS) + if (@available(iOS 13.0, *)) { + if (touch.type == UITouchTypePencil) { + [self pencilPressed:touch]; continue; } - - // FIXME, need to send: int clicks = (int) touch.tapCount; ? - - CGPoint locationInView = [self touchLocation:touch shouldNormalize:YES]; - SDL_SendTouch(UIKit_GetEventTimestamp([event timestamp]), - touchId, (SDL_FingerID)(uintptr_t)touch, sdlwindow, - true, locationInView.x, locationInView.y, pressure); } + + if (@available(iOS 13.4, *)) { + if (touch.type == UITouchTypeIndirectPointer) { + [self indirectPointerPressed:touch fromEvent:event]; + continue; + } + } +#endif // !defined(SDL_PLATFORM_TVOS) + + SDL_TouchDeviceType touchType = [self touchTypeForTouch:touch]; + SDL_TouchID touchId = [self touchIdForType:touchType]; + float pressure = [self pressureForTouch:touch]; + + if (SDL_AddTouch(touchId, touchType, "") < 0) { + continue; + } + + // FIXME, need to send: int clicks = (int) touch.tapCount; ? + + CGPoint locationInView = [self touchLocation:touch shouldNormalize:YES]; + SDL_SendTouch(UIKit_GetEventTimestamp([event timestamp]), + touchId, (SDL_FingerID)(uintptr_t)touch, sdlwindow, + SDL_EVENT_FINGER_DOWN, locationInView.x, locationInView.y, pressure); } } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { for (UITouch *touch in touches) { - BOOL handled = NO; - -#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4) - if (@available(iOS 13.4, *)) { - if (touch.type == UITouchTypeIndirectPointer) { - if (!SDL_HasMouse()) { - int i; - SDL_MouseButtonFlags buttons = SDL_GetMouseState(NULL, NULL); - - for (i = 0; i < MAX_MOUSE_BUTTONS; ++i) { - if (buttons & SDL_BUTTON_MASK(i)) { - SDL_SendMouseButton(UIKit_GetEventTimestamp([event timestamp]), sdlwindow, SDL_GLOBAL_MOUSE_ID, (Uint8)i, false); - } - } - } - handled = YES; - } - } -#endif - if (!handled) { - SDL_TouchDeviceType touchType = [self touchTypeForTouch:touch]; - SDL_TouchID touchId = [self touchIdForType:touchType]; - float pressure = [self pressureForTouch:touch]; - - if (SDL_AddTouch(touchId, touchType, "") < 0) { +#if !defined(SDL_PLATFORM_TVOS) + if (@available(iOS 13.0, *)) { + if (touch.type == UITouchTypePencil) { + [self pencilReleased:touch]; continue; } - - // FIXME, need to send: int clicks = (int) touch.tapCount; ? - - CGPoint locationInView = [self touchLocation:touch shouldNormalize:YES]; - SDL_SendTouch(UIKit_GetEventTimestamp([event timestamp]), - touchId, (SDL_FingerID)(uintptr_t)touch, sdlwindow, - false, locationInView.x, locationInView.y, pressure); } + + if (@available(iOS 13.4, *)) { + if (touch.type == UITouchTypeIndirectPointer) { + [self indirectPointerReleased:touch fromEvent:event]; + continue; + } + } +#endif // !defined(SDL_PLATFORM_TVOS) + + SDL_TouchDeviceType touchType = [self touchTypeForTouch:touch]; + SDL_TouchID touchId = [self touchIdForType:touchType]; + float pressure = [self pressureForTouch:touch]; + + if (SDL_AddTouch(touchId, touchType, "") < 0) { + continue; + } + + // FIXME, need to send: int clicks = (int) touch.tapCount; ? + + CGPoint locationInView = [self touchLocation:touch shouldNormalize:YES]; + SDL_SendTouch(UIKit_GetEventTimestamp([event timestamp]), + touchId, (SDL_FingerID)(uintptr_t)touch, sdlwindow, + SDL_EVENT_FINGER_UP, locationInView.x, locationInView.y, pressure); } } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { - [self touchesEnded:touches withEvent:event]; + for (UITouch *touch in touches) { +#if !defined(SDL_PLATFORM_TVOS) + if (@available(iOS 13.0, *)) { + if (touch.type == UITouchTypePencil) { + [self pencilReleased:touch]; + continue; + } + } + + if (@available(iOS 13.4, *)) { + if (touch.type == UITouchTypeIndirectPointer) { + [self indirectPointerReleased:touch fromEvent:event]; + continue; + } + } +#endif // !defined(SDL_PLATFORM_TVOS) + + SDL_TouchDeviceType touchType = [self touchTypeForTouch:touch]; + SDL_TouchID touchId = [self touchIdForType:touchType]; + float pressure = [self pressureForTouch:touch]; + + if (SDL_AddTouch(touchId, touchType, "") < 0) { + continue; + } + + CGPoint locationInView = [self touchLocation:touch shouldNormalize:YES]; + SDL_SendTouch(UIKit_GetEventTimestamp([event timestamp]), + touchId, (SDL_FingerID)(uintptr_t)touch, sdlwindow, + SDL_EVENT_FINGER_CANCELED, locationInView.x, locationInView.y, pressure); + } } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { for (UITouch *touch in touches) { - BOOL handled = NO; - -#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4) - if (@available(iOS 13.4, *)) { - if (touch.type == UITouchTypeIndirectPointer) { - // Already handled in pointerInteraction callback - handled = YES; - } - } -#endif - if (!handled) { - SDL_TouchDeviceType touchType = [self touchTypeForTouch:touch]; - SDL_TouchID touchId = [self touchIdForType:touchType]; - float pressure = [self pressureForTouch:touch]; - - if (SDL_AddTouch(touchId, touchType, "") < 0) { +#if !defined(SDL_PLATFORM_TVOS) + if (@available(iOS 13.0, *)) { + if (touch.type == UITouchTypePencil) { + [self pencilMoving:touch]; continue; } - - CGPoint locationInView = [self touchLocation:touch shouldNormalize:YES]; - SDL_SendTouchMotion(UIKit_GetEventTimestamp([event timestamp]), - touchId, (SDL_FingerID)(uintptr_t)touch, sdlwindow, - locationInView.x, locationInView.y, pressure); } + + if (@available(iOS 13.4, *)) { + if (touch.type == UITouchTypeIndirectPointer) { + [self indirectPointerMoving:touch]; + continue; + } + } +#endif // !defined(SDL_PLATFORM_TVOS) + + SDL_TouchDeviceType touchType = [self touchTypeForTouch:touch]; + SDL_TouchID touchId = [self touchIdForType:touchType]; + float pressure = [self pressureForTouch:touch]; + + if (SDL_AddTouch(touchId, touchType, "") < 0) { + continue; + } + + CGPoint locationInView = [self touchLocation:touch shouldNormalize:YES]; + SDL_SendTouchMotion(UIKit_GetEventTimestamp([event timestamp]), + touchId, (SDL_FingerID)(uintptr_t)touch, sdlwindow, + locationInView.x, locationInView.y, pressure); } } - (void)safeAreaInsetsDidChange { // Update the safe area insets - if (@available(iOS 11.0, tvOS 11.0, *)) { - SDL_SetWindowSafeAreaInsets(sdlwindow, - (int)SDL_ceilf(self.safeAreaInsets.left), - (int)SDL_ceilf(self.safeAreaInsets.right), - (int)SDL_ceilf(self.safeAreaInsets.top), - (int)SDL_ceilf(self.safeAreaInsets.bottom)); - } + SDL_SetWindowSafeAreaInsets(sdlwindow, + (int)SDL_ceilf(self.safeAreaInsets.left), + (int)SDL_ceilf(self.safeAreaInsets.right), + (int)SDL_ceilf(self.safeAreaInsets.top), + (int)SDL_ceilf(self.safeAreaInsets.bottom)); } -#if defined(SDL_PLATFORM_TVOS) || defined(__IPHONE_9_1) - (SDL_Scancode)scancodeFromPress:(UIPress *)press { -#ifdef __IPHONE_13_4 - if ([press respondsToSelector:@selector((key))]) { - if (press.key != nil) { - return (SDL_Scancode)press.key.keyCode; - } + if (press.key != nil) { + return (SDL_Scancode)press.key.keyCode; } -#endif #ifndef SDL_JOYSTICK_DISABLED // Presses from Apple TV remote @@ -458,8 +553,6 @@ extern int SDL_AppleTVRemoteOpenedAsJoystick; } } -#endif // defined(SDL_PLATFORM_TVOS) || defined(__IPHONE_9_1) - #ifdef SDL_PLATFORM_TVOS - (void)swipeGesture:(UISwipeGestureRecognizer *)gesture { diff --git a/libs/SDL3/src/video/uikit/SDL_uikitviewcontroller.h b/libs/SDL3/src/video/uikit/SDL_uikitviewcontroller.h index 997dc977..d52e4780 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitviewcontroller.h +++ b/libs/SDL3/src/video/uikit/SDL_uikitviewcontroller.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitviewcontroller.m b/libs/SDL3/src/video/uikit/SDL_uikitviewcontroller.m index c4345578..45f2d64f 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitviewcontroller.m +++ b/libs/SDL3/src/video/uikit/SDL_uikitviewcontroller.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -49,13 +49,8 @@ static void SDLCALL SDL_HideHomeIndicatorHintChanged(void *userdata, const char @autoreleasepool { SDL_uikitviewcontroller *viewcontroller = (__bridge SDL_uikitviewcontroller *)userdata; viewcontroller.homeIndicatorHidden = (hint && *hint) ? SDL_atoi(hint) : -1; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunguarded-availability-new" - if ([viewcontroller respondsToSelector:@selector(setNeedsUpdateOfHomeIndicatorAutoHidden)]) { - [viewcontroller setNeedsUpdateOfHomeIndicatorAutoHidden]; - [viewcontroller setNeedsUpdateOfScreenEdgesDeferringSystemGestures]; - } -#pragma clang diagnostic pop + [viewcontroller setNeedsUpdateOfHomeIndicatorAutoHidden]; + [viewcontroller setNeedsUpdateOfScreenEdgesDeferringSystemGestures]; } } #endif @@ -176,18 +171,11 @@ static void SDLCALL SDL_HideHomeIndicatorHintChanged(void *userdata, const char #ifdef SDL_PLATFORM_VISIONOS displayLink.preferredFramesPerSecond = 90 / animationInterval; //TODO: Get frame max frame rate on visionOS -#elif defined(__IPHONE_10_3) +#else SDL_UIKitWindowData *data = (__bridge SDL_UIKitWindowData *)window->internal; - if ([displayLink respondsToSelector:@selector(preferredFramesPerSecond)] && data != nil && data.uiwindow != nil && [data.uiwindow.screen respondsToSelector:@selector(maximumFramesPerSecond)]) { - displayLink.preferredFramesPerSecond = data.uiwindow.screen.maximumFramesPerSecond / animationInterval; - } else + displayLink.preferredFramesPerSecond = data.uiwindow.screen.maximumFramesPerSecond / animationInterval; #endif - { -#if __IPHONE_OS_VERSION_MIN_REQUIRED < 100300 - [displayLink setFrameInterval:animationInterval]; -#endif - } [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; } @@ -411,31 +399,19 @@ static void SDLCALL SDL_HideHomeIndicatorHintChanged(void *userdata, const char break; case SDL_TEXTINPUT_TYPE_TEXT_USERNAME: textField.keyboardType = UIKeyboardTypeDefault; - if (@available(iOS 11.0, tvOS 11.0, *)) { - textField.textContentType = UITextContentTypeUsername; - } else { - textField.textContentType = nil; - } + textField.textContentType = UITextContentTypeUsername; break; case SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_HIDDEN: textField.keyboardType = UIKeyboardTypeDefault; - if (@available(iOS 11.0, tvOS 11.0, *)) { - textField.textContentType = UITextContentTypePassword; - } else { - textField.textContentType = nil; - } + textField.textContentType = UITextContentTypePassword; textField.secureTextEntry = YES; break; case SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_VISIBLE: textField.keyboardType = UIKeyboardTypeDefault; - if (@available(iOS 11.0, tvOS 11.0, *)) { - textField.textContentType = UITextContentTypePassword; - } else { - textField.textContentType = nil; - } + textField.textContentType = UITextContentTypePassword; break; case SDL_TEXTINPUT_TYPE_NUMBER: - textField.keyboardType = UIKeyboardTypeNumberPad; + textField.keyboardType = UIKeyboardTypeDecimalPad; textField.textContentType = nil; break; case SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_HIDDEN: @@ -528,6 +504,7 @@ static void SDLCALL SDL_HideHomeIndicatorHintChanged(void *userdata, const char return true; } + [self resetTextState]; return [textField resignFirstResponder]; } @@ -657,8 +634,7 @@ static void SDLCALL SDL_HideHomeIndicatorHintChanged(void *userdata, const char { if (textField.markedTextRange == nil) { if (textField.text.length < 16) { - textField.text = obligateForBackspace; - committedText = textField.text; + [self resetTextState]; } } return YES; @@ -675,6 +651,12 @@ static void SDLCALL SDL_HideHomeIndicatorHintChanged(void *userdata, const char return YES; } +- (void)resetTextState +{ + textField.text = obligateForBackspace; + committedText = textField.text; +} + #endif @end diff --git a/libs/SDL3/src/video/uikit/SDL_uikitvulkan.h b/libs/SDL3/src/video/uikit/SDL_uikitvulkan.h index 3162eb85..6957670b 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitvulkan.h +++ b/libs/SDL3/src/video/uikit/SDL_uikitvulkan.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitvulkan.m b/libs/SDL3/src/video/uikit/SDL_uikitvulkan.m index b010cb44..332593b7 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitvulkan.m +++ b/libs/SDL3/src/video/uikit/SDL_uikitvulkan.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitwindow.h b/libs/SDL3/src/video/uikit/SDL_uikitwindow.h index d11a702a..da1fb639 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitwindow.h +++ b/libs/SDL3/src/video/uikit/SDL_uikitwindow.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/uikit/SDL_uikitwindow.m b/libs/SDL3/src/video/uikit/SDL_uikitwindow.m index 85e0b920..2b258b19 100644 --- a/libs/SDL3/src/video/uikit/SDL_uikitwindow.m +++ b/libs/SDL3/src/video/uikit/SDL_uikitwindow.m @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -319,7 +319,6 @@ SDL_FullscreenResult UIKit_SetWindowFullscreen(SDL_VideoDevice *_this, SDL_Windo void UIKit_UpdatePointerLock(SDL_VideoDevice *_this, SDL_Window *window) { #ifndef SDL_PLATFORM_TVOS -#if defined(__IPHONE_14_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_14_0 @autoreleasepool { SDL_UIKitWindowData *data = (__bridge SDL_UIKitWindowData *)window->internal; SDL_uikitviewcontroller *viewcontroller = data.viewcontroller; @@ -327,7 +326,6 @@ void UIKit_UpdatePointerLock(SDL_VideoDevice *_this, SDL_Window *window) [viewcontroller setNeedsUpdateOfPrefersPointerLocked]; } } -#endif // defined(__IPHONE_14_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_14_0 #endif // !SDL_PLATFORM_TVOS } diff --git a/libs/SDL3/src/video/vita/SDL_vitaframebuffer.c b/libs/SDL3/src/video/vita/SDL_vitaframebuffer.c index 970f3802..b9bfb508 100644 --- a/libs/SDL3/src/video/vita/SDL_vitaframebuffer.c +++ b/libs/SDL3/src/video/vita/SDL_vitaframebuffer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitaframebuffer.h b/libs/SDL3/src/video/vita/SDL_vitaframebuffer.h index 0703b71e..b85e9c3e 100644 --- a/libs/SDL3/src/video/vita/SDL_vitaframebuffer.h +++ b/libs/SDL3/src/video/vita/SDL_vitaframebuffer.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitagl_pvr.c b/libs/SDL3/src/video/vita/SDL_vitagl_pvr.c index fbd675b6..1255e4e9 100644 --- a/libs/SDL3/src/video/vita/SDL_vitagl_pvr.c +++ b/libs/SDL3/src/video/vita/SDL_vitagl_pvr.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitagl_pvr_c.h b/libs/SDL3/src/video/vita/SDL_vitagl_pvr_c.h index 2149039b..118602d6 100644 --- a/libs/SDL3/src/video/vita/SDL_vitagl_pvr_c.h +++ b/libs/SDL3/src/video/vita/SDL_vitagl_pvr_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitagles.c b/libs/SDL3/src/video/vita/SDL_vitagles.c index d26ab677..2c744478 100644 --- a/libs/SDL3/src/video/vita/SDL_vitagles.c +++ b/libs/SDL3/src/video/vita/SDL_vitagles.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitagles_c.h b/libs/SDL3/src/video/vita/SDL_vitagles_c.h index c6c43dda..44cb14d6 100644 --- a/libs/SDL3/src/video/vita/SDL_vitagles_c.h +++ b/libs/SDL3/src/video/vita/SDL_vitagles_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitagles_pvr.c b/libs/SDL3/src/video/vita/SDL_vitagles_pvr.c index e178b21b..4ba0573d 100644 --- a/libs/SDL3/src/video/vita/SDL_vitagles_pvr.c +++ b/libs/SDL3/src/video/vita/SDL_vitagles_pvr.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitagles_pvr_c.h b/libs/SDL3/src/video/vita/SDL_vitagles_pvr_c.h index 93532870..ad87212b 100644 --- a/libs/SDL3/src/video/vita/SDL_vitagles_pvr_c.h +++ b/libs/SDL3/src/video/vita/SDL_vitagles_pvr_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitakeyboard.c b/libs/SDL3/src/video/vita/SDL_vitakeyboard.c index 5895d77e..99677566 100644 --- a/libs/SDL3/src/video/vita/SDL_vitakeyboard.c +++ b/libs/SDL3/src/video/vita/SDL_vitakeyboard.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitakeyboard.h b/libs/SDL3/src/video/vita/SDL_vitakeyboard.h index a47ac5ff..4b528643 100644 --- a/libs/SDL3/src/video/vita/SDL_vitakeyboard.h +++ b/libs/SDL3/src/video/vita/SDL_vitakeyboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitamessagebox.c b/libs/SDL3/src/video/vita/SDL_vitamessagebox.c index f12b7e19..a63e1560 100644 --- a/libs/SDL3/src/video/vita/SDL_vitamessagebox.c +++ b/libs/SDL3/src/video/vita/SDL_vitamessagebox.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitamessagebox.h b/libs/SDL3/src/video/vita/SDL_vitamessagebox.h index 99b190e2..7e4148d0 100644 --- a/libs/SDL3/src/video/vita/SDL_vitamessagebox.h +++ b/libs/SDL3/src/video/vita/SDL_vitamessagebox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitamouse.c b/libs/SDL3/src/video/vita/SDL_vitamouse.c index facda1b5..7181023d 100644 --- a/libs/SDL3/src/video/vita/SDL_vitamouse.c +++ b/libs/SDL3/src/video/vita/SDL_vitamouse.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitamouse_c.h b/libs/SDL3/src/video/vita/SDL_vitamouse_c.h index c05c7785..ef6a7c91 100644 --- a/libs/SDL3/src/video/vita/SDL_vitamouse_c.h +++ b/libs/SDL3/src/video/vita/SDL_vitamouse_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitatouch.c b/libs/SDL3/src/video/vita/SDL_vitatouch.c index 2f218335..ac6f7641 100644 --- a/libs/SDL3/src/video/vita/SDL_vitatouch.c +++ b/libs/SDL3/src/video/vita/SDL_vitatouch.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -125,7 +125,7 @@ void VITA_PollTouch(void) // Skip if finger was already previously down if (!finger_down) { // Send an initial touch - SDL_SendTouch(0, touch_id, finger_id, Vita_Window, true, x, y, force); + SDL_SendTouch(0, touch_id, finger_id, Vita_Window, SDL_EVENT_FINGER_DOWN, x, y, force); } // Always send the motion @@ -151,7 +151,7 @@ void VITA_PollTouch(void) VITA_ConvertTouchXYToSDLXY(&x, &y, touch_old[port].report[i].x, touch_old[port].report[i].y, port); finger_id = (SDL_FingerID)(touch_old[port].report[i].id + 1); // Finger released from screen - SDL_SendTouch(0, touch_id, finger_id, Vita_Window, false, x, y, force); + SDL_SendTouch(0, touch_id, finger_id, Vita_Window, SDL_EVENT_FINGER_UP, x, y, force); } } } diff --git a/libs/SDL3/src/video/vita/SDL_vitatouch.h b/libs/SDL3/src/video/vita/SDL_vitatouch.h index f33f5ff4..b94051aa 100644 --- a/libs/SDL3/src/video/vita/SDL_vitatouch.h +++ b/libs/SDL3/src/video/vita/SDL_vitatouch.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitavideo.c b/libs/SDL3/src/video/vita/SDL_vitavideo.c index 3e72f1d6..603b0939 100644 --- a/libs/SDL3/src/video/vita/SDL_vitavideo.c +++ b/libs/SDL3/src/video/vita/SDL_vitavideo.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vita/SDL_vitavideo.h b/libs/SDL3/src/video/vita/SDL_vitavideo.h index f52969da..268bed84 100644 --- a/libs/SDL3/src/video/vita/SDL_vitavideo.h +++ b/libs/SDL3/src/video/vita/SDL_vitavideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vivante/SDL_vivanteopengles.c b/libs/SDL3/src/video/vivante/SDL_vivanteopengles.c index fc4b9907..577711fb 100644 --- a/libs/SDL3/src/video/vivante/SDL_vivanteopengles.c +++ b/libs/SDL3/src/video/vivante/SDL_vivanteopengles.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vivante/SDL_vivanteopengles.h b/libs/SDL3/src/video/vivante/SDL_vivanteopengles.h index e47de3e3..47cdc16a 100644 --- a/libs/SDL3/src/video/vivante/SDL_vivanteopengles.h +++ b/libs/SDL3/src/video/vivante/SDL_vivanteopengles.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vivante/SDL_vivanteplatform.c b/libs/SDL3/src/video/vivante/SDL_vivanteplatform.c index b5ad4182..5d1e6d92 100644 --- a/libs/SDL3/src/video/vivante/SDL_vivanteplatform.c +++ b/libs/SDL3/src/video/vivante/SDL_vivanteplatform.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vivante/SDL_vivanteplatform.h b/libs/SDL3/src/video/vivante/SDL_vivanteplatform.h index 2d9b4855..87babc00 100644 --- a/libs/SDL3/src/video/vivante/SDL_vivanteplatform.h +++ b/libs/SDL3/src/video/vivante/SDL_vivanteplatform.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vivante/SDL_vivantevideo.c b/libs/SDL3/src/video/vivante/SDL_vivantevideo.c index 52aaafcf..269367bf 100644 --- a/libs/SDL3/src/video/vivante/SDL_vivantevideo.c +++ b/libs/SDL3/src/video/vivante/SDL_vivantevideo.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vivante/SDL_vivantevideo.h b/libs/SDL3/src/video/vivante/SDL_vivantevideo.h index b24d85ca..44399d95 100644 --- a/libs/SDL3/src/video/vivante/SDL_vivantevideo.h +++ b/libs/SDL3/src/video/vivante/SDL_vivantevideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vivante/SDL_vivantevulkan.c b/libs/SDL3/src/video/vivante/SDL_vivantevulkan.c index c1821539..a021a99e 100644 --- a/libs/SDL3/src/video/vivante/SDL_vivantevulkan.c +++ b/libs/SDL3/src/video/vivante/SDL_vivantevulkan.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/vivante/SDL_vivantevulkan.h b/libs/SDL3/src/video/vivante/SDL_vivantevulkan.h index cc698792..49f14d3a 100644 --- a/libs/SDL3/src/video/vivante/SDL_vivantevulkan.h +++ b/libs/SDL3/src/video/vivante/SDL_vivantevulkan.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandclipboard.c b/libs/SDL3/src/video/wayland/SDL_waylandclipboard.c index 9f0c2383..62187332 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandclipboard.c +++ b/libs/SDL3/src/video/wayland/SDL_waylandclipboard.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandclipboard.h b/libs/SDL3/src/video/wayland/SDL_waylandclipboard.h index ccc6252a..ed6546fe 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandclipboard.h +++ b/libs/SDL3/src/video/wayland/SDL_waylandclipboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylanddatamanager.c b/libs/SDL3/src/video/wayland/SDL_waylanddatamanager.c index 6ab25f5c..8c75e3d0 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylanddatamanager.c +++ b/libs/SDL3/src/video/wayland/SDL_waylanddatamanager.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylanddatamanager.h b/libs/SDL3/src/video/wayland/SDL_waylanddatamanager.h index 7aea8d56..adca17b2 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylanddatamanager.h +++ b/libs/SDL3/src/video/wayland/SDL_waylanddatamanager.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylanddyn.c b/libs/SDL3/src/video/wayland/SDL_waylanddyn.c index ea15da39..dd0f3fc1 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylanddyn.c +++ b/libs/SDL3/src/video/wayland/SDL_waylanddyn.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylanddyn.h b/libs/SDL3/src/video/wayland/SDL_waylanddyn.h index 41c8bf90..fd85a7c2 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylanddyn.h +++ b/libs/SDL3/src/video/wayland/SDL_waylanddyn.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandevents.c b/libs/SDL3/src/video/wayland/SDL_waylandevents.c index 14cc9f39..c6260b86 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandevents.c +++ b/libs/SDL3/src/video/wayland/SDL_waylandevents.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -26,6 +26,7 @@ #include "../../core/unix/SDL_poll.h" #include "../../events/SDL_events_c.h" #include "../../events/SDL_scancode_tables_c.h" +#include "../../events/SDL_keysym_to_keycode_c.h" #include "../../core/linux/SDL_system_theme.h" #include "../SDL_sysvideo.h" @@ -68,9 +69,12 @@ // Weston uses a ratio of 10 units per scroll tick #define WAYLAND_WHEEL_AXIS_UNIT 10 -// xkbcommon as of 1.4.1 doesn't have a name macro for the mode key -#ifndef XKB_MOD_NAME_MODE -#define XKB_MOD_NAME_MODE "Mod5" +#ifndef XKB_MOD_NAME_MOD3 +#define XKB_MOD_NAME_MOD3 "Mod3" +#endif + +#ifndef XKB_MOD_NAME_MOD5 +#define XKB_MOD_NAME_MOD5 "Mod5" #endif // Keyboard and mouse names to match XWayland @@ -593,6 +597,7 @@ static void pointer_handle_leave(void *data, struct wl_pointer *pointer, // Clear the capture flag and raise all buttons wind->sdlwindow->flags &= ~SDL_WINDOW_MOUSE_CAPTURE; + input->buttons_pressed = 0; SDL_SendMouseButton(Wayland_GetPointerTimestamp(input, 0), wind->sdlwindow, input->pointer_id, SDL_BUTTON_LEFT, false); SDL_SendMouseButton(Wayland_GetPointerTimestamp(input, 0), wind->sdlwindow, input->pointer_id, SDL_BUTTON_RIGHT, false); SDL_SendMouseButton(Wayland_GetPointerTimestamp(input, 0), wind->sdlwindow, input->pointer_id, SDL_BUTTON_MIDDLE, false); @@ -600,7 +605,6 @@ static void pointer_handle_leave(void *data, struct wl_pointer *pointer, SDL_SendMouseButton(Wayland_GetPointerTimestamp(input, 0), wind->sdlwindow, input->pointer_id, SDL_BUTTON_X2, false); } - /* A pointer leave event may be emitted if the compositor hides the pointer in response to receiving a touch event. * Don't relinquish focus if the surface has active touches, as the compositor is just transitioning from mouse to touch mode. */ @@ -724,6 +728,13 @@ static void pointer_handle_button_common(struct SDL_WaylandInput *input, uint32_ SDL_VideoData *viddata = window->waylandData; bool ignore_click = false; + if (state) { + Wayland_UpdateImplicitGrabSerial(input, serial); + input->buttons_pressed |= SDL_BUTTON_MASK(sdl_button); + } else { + input->buttons_pressed &= ~(SDL_BUTTON_MASK(sdl_button)); + } + if (sdl_button == SDL_BUTTON_LEFT && ProcessHitTest(input->pointer_focus, input->seat, input->sx_w, input->sy_w, serial)) { return; // don't pass this event on to app. @@ -743,14 +754,9 @@ static void pointer_handle_button_common(struct SDL_WaylandInput *input, uint32_ * the mouse outside the window if you drag outside of it, until you let go * of all buttons (even if you add or remove presses outside the window, as * long as any button is still down, the capture remains). + * + * The mouse is not captured in relative mode. */ - if (state) { // update our mask of currently-pressed buttons - input->buttons_pressed |= SDL_BUTTON_MASK(sdl_button); - } else { - input->buttons_pressed &= ~(SDL_BUTTON_MASK(sdl_button)); - } - - // Don't modify the capture flag in relative mode. if (!viddata->relative_mouse_mode) { if (input->buttons_pressed != 0) { window->sdlwindow->flags |= SDL_WINDOW_MOUSE_CAPTURE; @@ -759,10 +765,6 @@ static void pointer_handle_button_common(struct SDL_WaylandInput *input, uint32_ } } - if (state) { - Wayland_UpdateImplicitGrabSerial(input, serial); - } - if (!ignore_click) { SDL_SendMouseButton(timestamp, window->sdlwindow, input->pointer_id, sdl_button, down); } @@ -1148,7 +1150,7 @@ static void touch_handler_down(void *data, struct wl_touch *touch, uint32_t seri SDL_SetMouseFocus(window_data->sdlwindow); SDL_SendTouch(Wayland_GetTouchTimestamp(input, timestamp), (SDL_TouchID)(uintptr_t)touch, - (SDL_FingerID)(id + 1), window_data->sdlwindow, true, x, y, 1.0f); + (SDL_FingerID)(id + 1), window_data->sdlwindow, SDL_EVENT_FINGER_DOWN, x, y, 1.0f); } } @@ -1169,7 +1171,7 @@ static void touch_handler_up(void *data, struct wl_touch *touch, uint32_t serial const float y = (float)wl_fixed_to_double(fy) / window_data->current.logical_height; SDL_SendTouch(Wayland_GetTouchTimestamp(input, timestamp), (SDL_TouchID)(uintptr_t)touch, - (SDL_FingerID)(id + 1), window_data->sdlwindow, false, x, y, 0.0f); + (SDL_FingerID)(id + 1), window_data->sdlwindow, SDL_EVENT_FINGER_UP, x, y, 0.0f); /* If the seat lacks pointer focus, the seat's keyboard focus is another window or NULL, this window currently * has mouse focus, and the surface has no active touch events, consider mouse focus to be lost. @@ -1223,7 +1225,7 @@ static void touch_handler_cancel(void *data, struct wl_touch *touch) const float y = (float)(wl_fixed_to_double(tp->fy) / window_data->current.logical_height); SDL_SendTouch(0, (SDL_TouchID)(uintptr_t)touch, - (SDL_FingerID)(tp->id + 1), window_data->sdlwindow, false, x, y, 0.0f); + (SDL_FingerID)(tp->id + 1), window_data->sdlwindow, SDL_EVENT_FINGER_CANCELED, x, y, 0.0f); // Remove the touch from the list before checking for still-active touches on the surface. WAYLAND_wl_list_remove(&tp->link); @@ -1267,26 +1269,13 @@ static void Wayland_keymap_iter(struct xkb_keymap *keymap, xkb_keycode_t key, vo { Wayland_Keymap *sdlKeymap = (Wayland_Keymap *)data; const xkb_keysym_t *syms; - SDL_Scancode scancode; - - scancode = SDL_GetScancodeFromTable(SDL_SCANCODE_TABLE_XFREE86_2, (key - 8)); + const SDL_Scancode scancode = SDL_GetScancodeFromTable(SDL_SCANCODE_TABLE_XFREE86_2, (key - 8)); if (scancode == SDL_SCANCODE_UNKNOWN) { return; } if (WAYLAND_xkb_state_key_get_syms(sdlKeymap->state, key, &syms) > 0) { - uint32_t keycode = SDL_KeySymToUcs4(syms[0]); - - if (!keycode) { - const SDL_Scancode sc = SDL_GetScancodeFromKeySym(syms[0], key); - - // Note: The default SDL scancode table sets this to right alt instead of AltGr/Mode, so handle it separately. - if (syms[0] != XKB_KEY_ISO_Level3_Shift) { - keycode = SDL_GetKeymapKeycode(NULL, sc, sdlKeymap->modstate); - } else { - keycode = SDLK_MODE; - } - } + SDL_Keycode keycode = SDL_GetKeyCodeFromKeySym(syms[0], key, sdlKeymap->modstate); if (!keycode) { switch (scancode) { @@ -1299,9 +1288,6 @@ static void Wayland_keymap_iter(struct xkb_keymap *keymap, xkb_keycode_t key, vo case SDL_SCANCODE_BACKSPACE: keycode = SDLK_BACKSPACE; break; - case SDL_SCANCODE_TAB: - keycode = SDLK_TAB; - break; case SDL_SCANCODE_DELETE: keycode = SDLK_DELETE; break; @@ -1326,10 +1312,18 @@ static void Wayland_UpdateKeymap(struct SDL_WaylandInput *input) { SDL_KMOD_SHIFT, input->xkb.idx_shift }, { SDL_KMOD_CAPS, input->xkb.idx_caps }, { SDL_KMOD_SHIFT | SDL_KMOD_CAPS, input->xkb.idx_shift | input->xkb.idx_caps }, - { SDL_KMOD_MODE, input->xkb.idx_mode }, - { SDL_KMOD_MODE | SDL_KMOD_SHIFT, input->xkb.idx_mode | input->xkb.idx_shift }, - { SDL_KMOD_MODE | SDL_KMOD_CAPS, input->xkb.idx_mode | input->xkb.idx_caps }, - { SDL_KMOD_MODE | SDL_KMOD_SHIFT | SDL_KMOD_CAPS, input->xkb.idx_mode | input->xkb.idx_shift | input->xkb.idx_caps } + { SDL_KMOD_MODE, input->xkb.idx_mod5 }, + { SDL_KMOD_MODE | SDL_KMOD_SHIFT, input->xkb.idx_mod5 | input->xkb.idx_shift }, + { SDL_KMOD_MODE | SDL_KMOD_CAPS, input->xkb.idx_mod5 | input->xkb.idx_caps }, + { SDL_KMOD_MODE | SDL_KMOD_SHIFT | SDL_KMOD_CAPS, input->xkb.idx_mod5 | input->xkb.idx_shift | input->xkb.idx_caps }, + { SDL_KMOD_LEVEL5, input->xkb.idx_mod3 }, + { SDL_KMOD_LEVEL5 | SDL_KMOD_SHIFT, input->xkb.idx_mod3 | input->xkb.idx_shift }, + { SDL_KMOD_LEVEL5 | SDL_KMOD_CAPS, input->xkb.idx_mod3 | input->xkb.idx_caps }, + { SDL_KMOD_LEVEL5 | SDL_KMOD_SHIFT | SDL_KMOD_CAPS, input->xkb.idx_mod3 | input->xkb.idx_shift | input->xkb.idx_caps }, + { SDL_KMOD_LEVEL5 | SDL_KMOD_MODE, input->xkb.idx_mod3 | input->xkb.idx_mod5 }, + { SDL_KMOD_LEVEL5 | SDL_KMOD_MODE | SDL_KMOD_SHIFT, input->xkb.idx_mod3 | input->xkb.idx_mod5 | input->xkb.idx_shift }, + { SDL_KMOD_LEVEL5 | SDL_KMOD_MODE | SDL_KMOD_CAPS, input->xkb.idx_mod3 | input->xkb.idx_mod5 | input->xkb.idx_caps }, + { SDL_KMOD_LEVEL5 | SDL_KMOD_MODE | SDL_KMOD_SHIFT | SDL_KMOD_CAPS, input->xkb.idx_mod3 | input->xkb.idx_mod5 | input->xkb.idx_shift | input->xkb.idx_caps }, }; if (!input->keyboard_is_virtual) { @@ -1350,7 +1344,7 @@ static void Wayland_UpdateKeymap(struct SDL_WaylandInput *input) for (int i = 0; i < SDL_arraysize(keymod_masks); ++i) { keymap.modstate = keymod_masks[i].sdl_mask; WAYLAND_xkb_state_update_mask(keymap.state, - keymod_masks[i].xkb_mask & (input->xkb.idx_shift | input->xkb.idx_mode), 0, keymod_masks[i].xkb_mask & input->xkb.idx_caps, + keymod_masks[i].xkb_mask & (input->xkb.idx_shift | input->xkb.idx_mod5 | input->xkb.idx_mod3), 0, keymod_masks[i].xkb_mask & input->xkb.idx_caps, 0, 0, input->xkb.current_group); WAYLAND_xkb_keymap_key_for_each(input->xkb.keymap, Wayland_keymap_iter, @@ -1413,7 +1407,8 @@ static void keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard, input->xkb.idx_ctrl = 1 << GET_MOD_INDEX(CTRL); input->xkb.idx_alt = 1 << GET_MOD_INDEX(ALT); input->xkb.idx_gui = 1 << GET_MOD_INDEX(LOGO); - input->xkb.idx_mode = 1 << GET_MOD_INDEX(MODE); + input->xkb.idx_mod3 = 1 << GET_MOD_INDEX(MOD3); + input->xkb.idx_mod5 = 1 << GET_MOD_INDEX(MOD5); input->xkb.idx_num = 1 << GET_MOD_INDEX(NUM); input->xkb.idx_caps = 1 << GET_MOD_INDEX(CAPS); #undef GET_MOD_INDEX @@ -1488,15 +1483,15 @@ static void keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard, * Virtual keyboards can have arbitrary layouts, arbitrary scancodes/keycodes, etc... * Key presses from these devices must be looked up by their keysym value. */ -static SDL_Scancode Wayland_get_scancode_from_key(struct SDL_WaylandInput *input, uint32_t key) +static SDL_Scancode Wayland_GetScancodeForKey(struct SDL_WaylandInput *input, uint32_t key) { SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN; if (!input->keyboard_is_virtual) { - scancode = SDL_GetScancodeFromTable(SDL_SCANCODE_TABLE_XFREE86_2, key - 8); + scancode = SDL_GetScancodeFromTable(SDL_SCANCODE_TABLE_XFREE86_2, key); } else { const xkb_keysym_t *syms; - if (WAYLAND_xkb_keymap_key_get_syms_by_level(input->xkb.keymap, key, input->xkb.current_group, 0, &syms) > 0) { + if (WAYLAND_xkb_keymap_key_get_syms_by_level(input->xkb.keymap, key + 8, input->xkb.current_group, 0, &syms) > 0) { scancode = SDL_GetScancodeFromKeySym(syms[0], key); } } @@ -1504,43 +1499,67 @@ static SDL_Scancode Wayland_get_scancode_from_key(struct SDL_WaylandInput *input return scancode; } -static void Wayland_ReconcileModifiers(struct SDL_WaylandInput *input) +static void Wayland_ReconcileModifiers(struct SDL_WaylandInput *input, bool key_pressed) { - // Handle pressed modifiers for virtual keyboards that may not send keystrokes. - if (input->keyboard_is_virtual) { + /* Handle explicit pressed modifier state. This will correct the modifier state + * if common modifier keys were remapped and the modifiers presumed to be set + * during a key press event were incorrect, or if the modifier was set to the + * pressed state via means other than pressing the physical key. + */ + if (!key_pressed) { if (input->xkb.wl_pressed_modifiers & input->xkb.idx_shift) { - input->pressed_modifiers |= SDL_KMOD_SHIFT; + if (!(input->pressed_modifiers & SDL_KMOD_SHIFT)) { + input->pressed_modifiers |= SDL_KMOD_SHIFT; + } } else { input->pressed_modifiers &= ~SDL_KMOD_SHIFT; } if (input->xkb.wl_pressed_modifiers & input->xkb.idx_ctrl) { - input->pressed_modifiers |= SDL_KMOD_CTRL; + if (!(input->pressed_modifiers & SDL_KMOD_CTRL)) { + input->pressed_modifiers |= SDL_KMOD_CTRL; + } } else { input->pressed_modifiers &= ~SDL_KMOD_CTRL; } if (input->xkb.wl_pressed_modifiers & input->xkb.idx_alt) { - input->pressed_modifiers |= SDL_KMOD_ALT; + if (!(input->pressed_modifiers & SDL_KMOD_ALT)) { + input->pressed_modifiers |= SDL_KMOD_ALT; + } } else { input->pressed_modifiers &= ~SDL_KMOD_ALT; } if (input->xkb.wl_pressed_modifiers & input->xkb.idx_gui) { - input->pressed_modifiers |= SDL_KMOD_GUI; + if (!(input->pressed_modifiers & SDL_KMOD_GUI)) { + input->pressed_modifiers |= SDL_KMOD_GUI; + } } else { input->pressed_modifiers &= ~SDL_KMOD_GUI; } - if (input->xkb.wl_pressed_modifiers & input->xkb.idx_mode) { - input->pressed_modifiers |= SDL_KMOD_MODE; + /* Note: This is not backwards: in the default keymap, Mod5 is typically + * level 3 shift, and Mod3 is typically level 5 shift. + */ + if (input->xkb.wl_pressed_modifiers & input->xkb.idx_mod3) { + if (!(input->pressed_modifiers & SDL_KMOD_LEVEL5)) { + input->pressed_modifiers |= SDL_KMOD_LEVEL5; + } + } else { + input->pressed_modifiers &= ~SDL_KMOD_LEVEL5; + } + + if (input->xkb.wl_pressed_modifiers & input->xkb.idx_mod5) { + if (!(input->pressed_modifiers & SDL_KMOD_MODE)) { + input->pressed_modifiers |= SDL_KMOD_MODE; + } } else { input->pressed_modifiers &= ~SDL_KMOD_MODE; } } - /* - * If a latch or lock was activated by a keypress, the latch/lock will + /* If a latch or lock was activated by a keypress, the latch/lock will * be tied to the specific left/right key that initiated it. Otherwise, * the ambiguous left/right combo is used. * @@ -1591,7 +1610,14 @@ static void Wayland_ReconcileModifiers(struct SDL_WaylandInput *input) input->locked_modifiers &= ~SDL_KMOD_GUI; } - if (input->xkb.wl_locked_modifiers & input->xkb.idx_mode) { + // As above, this is correct: Mod3 is typically level 5 shift, and Mod5 is typically level 3 shift. + if (input->xkb.wl_locked_modifiers & input->xkb.idx_mod3) { + input->locked_modifiers |= SDL_KMOD_LEVEL5; + } else { + input->locked_modifiers &= ~SDL_KMOD_LEVEL5; + } + + if (input->xkb.wl_locked_modifiers & input->xkb.idx_mod5) { input->locked_modifiers |= SDL_KMOD_MODE; } else { input->locked_modifiers &= ~SDL_KMOD_MODE; @@ -1618,6 +1644,12 @@ static void Wayland_HandleModifierKeys(struct SDL_WaylandInput *input, SDL_Scanc const SDL_Keycode keycode = SDL_GetKeyFromScancode(scancode, SDL_KMOD_NONE, false); SDL_Keymod mod; + /* SDL clients expect modifier state to be activated at the same time as the + * source keypress, so we set pressed modifier state with the usual modifier + * keys here, as the explicit modifier event won't arrive until after the + * keypress event. If this is wrong, it will be corrected when the explicit + * modifier state is sent at a later time. + */ switch (keycode) { case SDLK_LSHIFT: mod = SDL_KMOD_LSHIFT; @@ -1646,6 +1678,9 @@ static void Wayland_HandleModifierKeys(struct SDL_WaylandInput *input, SDL_Scanc case SDLK_MODE: mod = SDL_KMOD_MODE; break; + case SDLK_LEVEL5_SHIFT: + mod = SDL_KMOD_LEVEL5; + break; default: return; } @@ -1656,7 +1691,7 @@ static void Wayland_HandleModifierKeys(struct SDL_WaylandInput *input, SDL_Scanc input->pressed_modifiers &= ~mod; } - Wayland_ReconcileModifiers(input); + Wayland_ReconcileModifiers(input, true); } static void keyboard_handle_enter(void *data, struct wl_keyboard *keyboard, @@ -1694,7 +1729,7 @@ static void keyboard_handle_enter(void *data, struct wl_keyboard *keyboard, window->last_focus_event_time_ns = timestamp; wl_array_for_each (key, keys) { - const SDL_Scancode scancode = Wayland_get_scancode_from_key(input, *key + 8); + const SDL_Scancode scancode = Wayland_GetScancodeForKey(input, *key); const SDL_Keycode keycode = SDL_GetKeyFromScancode(scancode, SDL_KMOD_NONE, false); switch (keycode) { @@ -1707,6 +1742,7 @@ static void keyboard_handle_enter(void *data, struct wl_keyboard *keyboard, case SDLK_LGUI: case SDLK_RGUI: case SDLK_MODE: + case SDLK_LEVEL5_SHIFT: Wayland_HandleModifierKeys(input, scancode, true); SDL_SendKeyboardKeyIgnoreModifiers(timestamp, input->keyboard_id, *key, scancode, true); break; @@ -1816,7 +1852,6 @@ static void keyboard_handle_key(void *data, struct wl_keyboard *keyboard, { struct SDL_WaylandInput *input = data; enum wl_keyboard_key_state state = state_w; - SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN; char text[8]; bool has_text = false; bool handled_by_ime = false; @@ -1842,10 +1877,11 @@ static void keyboard_handle_key(void *data, struct wl_keyboard *keyboard, keyboard_input_get_text(text, input, key, false, &handled_by_ime); } - scancode = Wayland_get_scancode_from_key(input, key + 8); + const SDL_Scancode scancode = Wayland_GetScancodeForKey(input, key); Wayland_HandleModifierKeys(input, scancode, state == WL_KEYBOARD_KEY_STATE_PRESSED); Uint64 timestamp = Wayland_GetKeyboardTimestamp(input, time); - SDL_SendKeyboardKeyIgnoreModifiers(timestamp, input->keyboard_id, key, scancode, (state == WL_KEYBOARD_KEY_STATE_PRESSED)); + + SDL_SendKeyboardKeyIgnoreModifiers(timestamp, input->keyboard_id, key, scancode, state == WL_KEYBOARD_KEY_STATE_PRESSED); if (state == WL_KEYBOARD_KEY_STATE_PRESSED) { if (has_text && !(SDL_GetModState() & SDL_KMOD_CTRL)) { @@ -1878,7 +1914,7 @@ static void keyboard_handle_modifiers(void *data, struct wl_keyboard *keyboard, input->xkb.wl_pressed_modifiers = mods_depressed; input->xkb.wl_locked_modifiers = mods_latched | mods_locked; - Wayland_ReconcileModifiers(input); + Wayland_ReconcileModifiers(input, false); // If a key is repeating, update the text to apply the modifier. if (keyboard_repeat_is_set(&input->keyboard_repeat)) { @@ -2429,7 +2465,8 @@ static void data_device_handle_drop(void *data, struct wl_data_device *wl_data_d data_device->drag_offer = NULL; } -static void notifyFromMimes(struct wl_list *mimes) { +static void notifyFromMimes(struct wl_list *mimes) +{ int nformats = 0; char **new_mime_types = NULL; if (mimes) { @@ -2668,7 +2705,7 @@ void Wayland_create_primary_selection_device(SDL_VideoData *d) } } -void Wayland_create_text_input(SDL_VideoData *d) +static void Wayland_create_text_input(SDL_VideoData *d) { SDL_WaylandTextInput *text_input = NULL; @@ -2695,6 +2732,23 @@ void Wayland_create_text_input(SDL_VideoData *d) } } +void Wayland_create_text_input_manager(SDL_VideoData *d, uint32_t id) +{ +#ifdef HAVE_FCITX + const char *im_module = SDL_getenv("SDL_IM_MODULE"); + if (im_module && SDL_strcmp(im_module, "fcitx") == 0) { + /* Override the Wayland text-input protocol when Fcitx is enabled, like how GTK_IM_MODULE does. + * + * The Fcitx wiki discourages enabling it under Wayland via SDL_IM_MODULE, so its presence must + * be intentional, and this workaround is needed for fixing key repeat detection. + */ + return; + } +#endif + + d->text_input_manager = wl_registry_bind(d->registry, id, &zwp_text_input_manager_v3_interface, 1); + Wayland_create_text_input(d); +} // Pen/Tablet support... @@ -2901,7 +2955,7 @@ static void tablet_tool_handle_frame(void *data, struct zwp_tablet_tool_v2 *tool const Uint64 timestamp = Wayland_GetEventTimestamp(SDL_MS_TO_NS(time)); const SDL_PenID instance_id = sdltool->instance_id; - const SDL_Window *window = sdltool->tool_focus; + SDL_Window *window = sdltool->tool_focus; // I don't know if this is necessary (or makes sense), but send motion before pen downs, but after pen ups, so you don't get unexpected lines drawn. if (sdltool->frame_motion_set && (sdltool->frame_pen_down != -1)) { diff --git a/libs/SDL3/src/video/wayland/SDL_waylandevents_c.h b/libs/SDL3/src/video/wayland/SDL_waylandevents_c.h index f101baa0..6158882a 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandevents_c.h +++ b/libs/SDL3/src/video/wayland/SDL_waylandevents_c.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -94,7 +94,7 @@ struct SDL_WaylandInput wl_fixed_t sx_w; wl_fixed_t sy_w; - uint32_t buttons_pressed; + SDL_MouseButtonFlags buttons_pressed; // The serial of the last implicit grab event for window activation and selection data. Uint32 last_implicit_grab_serial; @@ -114,7 +114,8 @@ struct SDL_WaylandInput uint32_t idx_ctrl; uint32_t idx_alt; uint32_t idx_gui; - uint32_t idx_mode; + uint32_t idx_mod3; + uint32_t idx_mod5; uint32_t idx_num; uint32_t idx_caps; @@ -157,7 +158,8 @@ extern int Wayland_WaitEventTimeout(SDL_VideoDevice *_this, Sint64 timeoutNS); extern void Wayland_create_data_device(SDL_VideoData *d); extern void Wayland_create_primary_selection_device(SDL_VideoData *d); -extern void Wayland_create_text_input(SDL_VideoData *d); + +extern void Wayland_create_text_input_manager(SDL_VideoData *d, uint32_t id); extern void Wayland_input_initialize_seat(SDL_VideoData *d); extern void Wayland_display_destroy_input(SDL_VideoData *d); diff --git a/libs/SDL3/src/video/wayland/SDL_waylandkeyboard.c b/libs/SDL3/src/video/wayland/SDL_waylandkeyboard.c index bb7be9b5..df1628cd 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandkeyboard.c +++ b/libs/SDL3/src/video/wayland/SDL_waylandkeyboard.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandkeyboard.h b/libs/SDL3/src/video/wayland/SDL_waylandkeyboard.h index d148cf1f..f570edb3 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandkeyboard.h +++ b/libs/SDL3/src/video/wayland/SDL_waylandkeyboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandmessagebox.c b/libs/SDL3/src/video/wayland/SDL_waylandmessagebox.c index ca855231..3d6f1f87 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandmessagebox.c +++ b/libs/SDL3/src/video/wayland/SDL_waylandmessagebox.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandmessagebox.h b/libs/SDL3/src/video/wayland/SDL_waylandmessagebox.h index 43992285..af3012fb 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandmessagebox.h +++ b/libs/SDL3/src/video/wayland/SDL_waylandmessagebox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandmouse.c b/libs/SDL3/src/video/wayland/SDL_waylandmouse.c index cdce66b1..968cb6f0 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandmouse.c +++ b/libs/SDL3/src/video/wayland/SDL_waylandmouse.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -892,9 +892,10 @@ static SDL_MouseButtonFlags SDLCALL Wayland_GetGlobalMouseState(float *x, float SDL_MouseButtonFlags result = 0; if (focus) { + SDL_VideoData *viddata = SDL_GetVideoDevice()->internal; int off_x, off_y; - result = SDL_GetMouseState(x, y); + result = viddata->input->buttons_pressed; SDL_RelativeToGlobalForWindow(focus, focus->x, focus->y, &off_x, &off_y); *x += off_x; *y += off_y; diff --git a/libs/SDL3/src/video/wayland/SDL_waylandmouse.h b/libs/SDL3/src/video/wayland/SDL_waylandmouse.h index fbc55224..58188c0e 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandmouse.h +++ b/libs/SDL3/src/video/wayland/SDL_waylandmouse.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandopengles.c b/libs/SDL3/src/video/wayland/SDL_waylandopengles.c index b2f320f5..ac2b06dd 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandopengles.c +++ b/libs/SDL3/src/video/wayland/SDL_waylandopengles.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandopengles.h b/libs/SDL3/src/video/wayland/SDL_waylandopengles.h index 364277f2..ed2e9272 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandopengles.h +++ b/libs/SDL3/src/video/wayland/SDL_waylandopengles.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandshmbuffer.c b/libs/SDL3/src/video/wayland/SDL_waylandshmbuffer.c index 40ff2bd9..8fc6d9e5 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandshmbuffer.c +++ b/libs/SDL3/src/video/wayland/SDL_waylandshmbuffer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandshmbuffer.h b/libs/SDL3/src/video/wayland/SDL_waylandshmbuffer.h index fcb6ebd3..f6f49a4e 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandshmbuffer.h +++ b/libs/SDL3/src/video/wayland/SDL_waylandshmbuffer.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandsym.h b/libs/SDL3/src/video/wayland/SDL_waylandsym.h index 341e8051..846c876a 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandsym.h +++ b/libs/SDL3/src/video/wayland/SDL_waylandsym.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandvideo.c b/libs/SDL3/src/video/wayland/SDL_waylandvideo.c index 14f16a7e..7ea5a582 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandvideo.c +++ b/libs/SDL3/src/video/wayland/SDL_waylandvideo.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -1234,8 +1234,7 @@ static void display_handle_global(void *data, struct wl_registry *registry, uint } else if (SDL_strcmp(interface, "xdg_activation_v1") == 0) { d->activation_manager = wl_registry_bind(d->registry, id, &xdg_activation_v1_interface, 1); } else if (SDL_strcmp(interface, "zwp_text_input_manager_v3") == 0) { - d->text_input_manager = wl_registry_bind(d->registry, id, &zwp_text_input_manager_v3_interface, 1); - Wayland_create_text_input(d); + Wayland_create_text_input_manager(d, id); } else if (SDL_strcmp(interface, "wl_data_device_manager") == 0) { d->data_device_manager = wl_registry_bind(d->registry, id, &wl_data_device_manager_interface, SDL_min(3, version)); Wayland_create_data_device(d); diff --git a/libs/SDL3/src/video/wayland/SDL_waylandvideo.h b/libs/SDL3/src/video/wayland/SDL_waylandvideo.h index 1f0b3230..44f5f359 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandvideo.h +++ b/libs/SDL3/src/video/wayland/SDL_waylandvideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandvulkan.c b/libs/SDL3/src/video/wayland/SDL_waylandvulkan.c index d927a4eb..956be463 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandvulkan.c +++ b/libs/SDL3/src/video/wayland/SDL_waylandvulkan.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandvulkan.h b/libs/SDL3/src/video/wayland/SDL_waylandvulkan.h index db58589c..58be0bca 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandvulkan.h +++ b/libs/SDL3/src/video/wayland/SDL_waylandvulkan.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/wayland/SDL_waylandwindow.c b/libs/SDL3/src/video/wayland/SDL_waylandwindow.c index 31aa805c..ebf79a26 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandwindow.c +++ b/libs/SDL3/src/video/wayland/SDL_waylandwindow.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -60,12 +60,12 @@ static int PointToPixel(SDL_Window *window, int point) * Wayland scale units are in units of 1/120, so the offset is required to correct for * rounding errors when using certain scale values. */ - return SDL_max((int)SDL_lround((double)point * GetWindowScale(window) + 1e-6), 1); + return point ? SDL_max((int)SDL_lround((double)point * GetWindowScale(window) + 1e-6), 1) : 0; } static int PixelToPoint(SDL_Window *window, int pixel) { - return SDL_max((int)SDL_lround((double)pixel / GetWindowScale(window)), 1); + return pixel ? SDL_max((int)SDL_lround((double)pixel / GetWindowScale(window)), 1) : 0; } /* According to the Wayland spec: @@ -833,6 +833,13 @@ static void handle_configure_xdg_toplevel(void *data, if (floating) { width = window->floating.w; height = window->floating.h; + + // Clamp the window to the toplevel bounds, if any are set. + if (wind->shell_surface_status == WAYLAND_SHELL_SURFACE_STATUS_WAITING_FOR_CONFIGURE && + wind->toplevel_bounds.width && wind->toplevel_bounds.height) { + width = SDL_min(wind->toplevel_bounds.width, width); + height = SDL_min(wind->toplevel_bounds.height, height); + } } else { width = window->windowed.w; height = window->windowed.h; @@ -972,7 +979,9 @@ static void handle_xdg_configure_toplevel_bounds(void *data, struct xdg_toplevel *xdg_toplevel, int32_t width, int32_t height) { - // NOP + SDL_WindowData *window = (SDL_WindowData *)data; + window->toplevel_bounds.width = width; + window->toplevel_bounds.height = height; } static void handle_xdg_toplevel_wm_capabilities(void *data, @@ -1026,18 +1035,37 @@ static void handle_configure_xdg_popup(void *data, x -= offset_x; y -= offset_y; - wind->requested.logical_width = width; - wind->requested.logical_height = height; + /* This happens when the compositor indicates that the size is + * up to the client, so use the cached window size here. + */ + if (width == 0 || height == 0) { + width = wind->sdlwindow->floating.w; + height = wind->sdlwindow->floating.h; + } + + /* Don't apply the supplied dimensions if they haven't changed from the last configuration + * event, or a newer size set programmatically can be overwritten by old data. + */ + if (width != wind->last_configure.width || height != wind->last_configure.height) { + wind->requested.logical_width = width; + wind->requested.logical_height = height; + + if (wind->scale_to_display) { + wind->requested.pixel_width = PointToPixel(wind->sdlwindow, width); + wind->requested.pixel_height = PointToPixel(wind->sdlwindow, height); + } + } if (wind->scale_to_display) { x = PointToPixel(wind->sdlwindow->parent, x); y = PointToPixel(wind->sdlwindow->parent, y); - wind->requested.pixel_width = PointToPixel(wind->sdlwindow, width); - wind->requested.pixel_height = PointToPixel(wind->sdlwindow, height); } SDL_SendWindowEvent(wind->sdlwindow, SDL_EVENT_WINDOW_MOVED, x, y); + wind->last_configure.width = width; + wind->last_configure.height = height; + if (wind->shell_surface_status == WAYLAND_SHELL_SURFACE_STATUS_WAITING_FOR_CONFIGURE) { wind->shell_surface_status = WAYLAND_SHELL_SURFACE_STATUS_WAITING_FOR_FRAME; } @@ -1407,10 +1435,16 @@ static void decoration_frame_commit(struct libdecor_frame *frame, void *user_dat } } +static void decoration_dismiss_popup(struct libdecor_frame *frame, const char *seat_name, void *user_data) +{ + // NOP +} + static struct libdecor_frame_interface libdecor_frame_interface = { decoration_frame_configure, decoration_frame_close, decoration_frame_commit, + decoration_dismiss_popup }; #endif @@ -1613,18 +1647,20 @@ static const struct frog_color_managed_surface_listener frog_surface_listener = frog_preferred_metadata_handler }; -static void SetKeyboardFocus(SDL_Window *window) +static void SetKeyboardFocus(SDL_Window *window, bool set_focus) { - SDL_Window *topmost = window; + SDL_Window *toplevel = window; - // Find the topmost parent - while (topmost->parent) { - topmost = topmost->parent; + // Find the toplevel parent + while (SDL_WINDOW_IS_POPUP(toplevel)) { + toplevel = toplevel->parent; } - topmost->internal->keyboard_focus = window; + toplevel->internal->keyboard_focus = window; - SDL_SetKeyboardFocus(window); + if (set_focus && !window->is_hiding && !window->is_destroying) { + SDL_SetKeyboardFocus(window); + } } bool Wayland_SetWindowHitTest(SDL_Window *window, bool enabled) @@ -1802,6 +1838,7 @@ void Wayland_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window) } else { libdecor_frame_set_app_id(data->shell_surface.libdecor.frame, data->app_id); libdecor_frame_map(data->shell_surface.libdecor.frame); + libdecor_frame_set_visibility(data->shell_surface.libdecor.frame, !(window->flags & SDL_WINDOW_BORDERLESS)); if (c->zxdg_exporter_v2) { data->exported = zxdg_exporter_v2_export_toplevel(c->zxdg_exporter_v2, data->surface); @@ -1852,8 +1889,8 @@ void Wayland_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window) xdg_positioner_set_size(data->shell_surface.xdg.popup.xdg_positioner, data->current.logical_width, data->current.logical_height); // Set the popup initial position - position_x = window->x; - position_y = window->y; + position_x = window->last_position_pending ? window->pending.x : window->x; + position_y = window->last_position_pending ? window->pending.y : window->y; EnsurePopupPositionIsValid(window, &position_x, &position_y); if (data->scale_to_display) { position_x = PixelToPoint(window->parent, position_x); @@ -1877,9 +1914,7 @@ void Wayland_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window) wl_surface_set_input_region(data->surface, region); wl_region_destroy(region); } else if (window->flags & SDL_WINDOW_POPUP_MENU) { - if (window->parent == SDL_GetKeyboardFocus()) { - SetKeyboardFocus(window); - } + SetKeyboardFocus(window, window->parent == SDL_GetKeyboardFocus()); } SDL_SetPointerProperty(props, SDL_PROP_WINDOW_WAYLAND_XDG_POPUP_POINTER, data->shell_surface.xdg.popup.xdg_popup); @@ -1889,6 +1924,14 @@ void Wayland_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window) xdg_toplevel_set_app_id(data->shell_surface.xdg.toplevel.xdg_toplevel, data->app_id); xdg_toplevel_add_listener(data->shell_surface.xdg.toplevel.xdg_toplevel, &toplevel_listener_xdg, data); + // Create the window decorations + if (c->decoration_manager) { + data->server_decoration = zxdg_decoration_manager_v1_get_toplevel_decoration(c->decoration_manager, data->shell_surface.xdg.toplevel.xdg_toplevel); + zxdg_toplevel_decoration_v1_add_listener(data->server_decoration, &decoration_listener, window); + const enum zxdg_toplevel_decoration_v1_mode mode = !(window->flags & SDL_WINDOW_BORDERLESS) ? ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE : ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE; + zxdg_toplevel_decoration_v1_set_mode(data->server_decoration, mode); + } + if (c->zxdg_exporter_v2) { data->exported = zxdg_exporter_v2_export_toplevel(c->zxdg_exporter_v2, data->surface); zxdg_exported_v2_add_listener(data->exported, &exported_v2_listener, data); @@ -1938,14 +1981,6 @@ void Wayland_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window) WAYLAND_wl_display_dispatch(c->display); } } - - // Create the window decorations - if (data->shell_surface_type != WAYLAND_SHELL_SURFACE_TYPE_XDG_POPUP && data->shell_surface.xdg.toplevel.xdg_toplevel && c->decoration_manager) { - data->server_decoration = zxdg_decoration_manager_v1_get_toplevel_decoration(c->decoration_manager, data->shell_surface.xdg.toplevel.xdg_toplevel); - zxdg_toplevel_decoration_v1_add_listener(data->server_decoration, - &decoration_listener, - window); - } } else { // Nothing to see here, just commit. wl_surface_commit(data->surface); @@ -1977,7 +2012,6 @@ void Wayland_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window) } #endif Wayland_SetWindowResizable(_this, window, !!(window->flags & SDL_WINDOW_RESIZABLE)); - Wayland_SetWindowBordered(_this, window, !(window->flags & SDL_WINDOW_BORDERLESS)); // We're finally done putting the window together, raise if possible if (c->activation_manager) { @@ -2024,16 +2058,20 @@ static void Wayland_ReleasePopup(SDL_VideoDevice *_this, SDL_Window *popup) } if (popup->flags & SDL_WINDOW_POPUP_MENU) { - if (popup == SDL_GetKeyboardFocus()) { - SDL_Window *new_focus = popup->parent; + SDL_Window *new_focus = popup->parent; + bool set_focus = popup == SDL_GetKeyboardFocus(); - // Find the highest level window that isn't being hidden or destroyed. - while (new_focus->parent && (new_focus->is_hiding || new_focus->is_destroying)) { - new_focus = new_focus->parent; + // Find the highest level window, up to the toplevel parent, that isn't being hidden or destroyed. + while (SDL_WINDOW_IS_POPUP(new_focus) && (new_focus->is_hiding || new_focus->is_destroying)) { + new_focus = new_focus->parent; + + // If some window in the chain currently had focus, set it to the new lowest-level window. + if (!set_focus) { + set_focus = new_focus == SDL_GetKeyboardFocus(); } - - SetKeyboardFocus(new_focus); } + + SetKeyboardFocus(new_focus, set_focus); } xdg_popup_destroy(popupdata->shell_surface.xdg.popup.xdg_popup); @@ -2813,7 +2851,7 @@ bool Wayland_SetWindowIcon(SDL_VideoDevice *_this, SDL_Window *window, SDL_Surfa // TODO: Add high-DPI icon support Wayland_ReleaseSHMBuffer(&wind->icon); - if (Wayland_AllocSHMBuffer(icon->w, icon->h, &wind->icon) != 0) { + if (!Wayland_AllocSHMBuffer(icon->w, icon->h, &wind->icon)) { return SDL_SetError("wayland: failed to allocate SHM buffer for the icon"); } diff --git a/libs/SDL3/src/video/wayland/SDL_waylandwindow.h b/libs/SDL3/src/video/wayland/SDL_waylandwindow.h index 0c43a791..906c5e44 100644 --- a/libs/SDL3/src/video/wayland/SDL_waylandwindow.h +++ b/libs/SDL3/src/video/wayland/SDL_waylandwindow.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -174,6 +174,12 @@ struct SDL_WindowData int min_height; } system_limits; + struct + { + int width; + int height; + } toplevel_bounds; + SDL_DisplayID last_displayID; int fullscreen_deadline_count; int maximized_restored_deadline_count; diff --git a/libs/SDL3/src/video/windows/SDL_msctf.h b/libs/SDL3/src/video/windows/SDL_msctf.h index 76e1f4aa..0c9ed013 100644 --- a/libs/SDL3/src/video/windows/SDL_msctf.h +++ b/libs/SDL3/src/video/windows/SDL_msctf.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_surface_utils.c b/libs/SDL3/src/video/windows/SDL_surface_utils.c index bdcac106..7f9245c1 100644 --- a/libs/SDL3/src/video/windows/SDL_surface_utils.c +++ b/libs/SDL3/src/video/windows/SDL_surface_utils.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -24,9 +24,10 @@ #include "../SDL_surface_c.h" +#if !(defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)) HICON CreateIconFromSurface(SDL_Surface *surface) { - SDL_Surface *s = SDL_ConvertSurface(surface, SDL_PIXELFORMAT_RGBA32); + SDL_Surface *s = SDL_ConvertSurface(surface, SDL_PIXELFORMAT_ARGB8888); if (!s) { return NULL; } @@ -36,7 +37,7 @@ HICON CreateIconFromSurface(SDL_Surface *surface) const int height = s->h; BITMAPINFO bmpInfo; - ZeroMemory(&bmpInfo, sizeof(BITMAPINFO)); + SDL_zero(bmpInfo); bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth = width; bmpInfo.bmiHeader.biHeight = -height; /* Top-down bitmap */ @@ -93,3 +94,4 @@ HICON CreateIconFromSurface(SDL_Surface *surface) return hIcon; } +#endif diff --git a/libs/SDL3/src/video/windows/SDL_surface_utils.h b/libs/SDL3/src/video/windows/SDL_surface_utils.h index 5c05a4c8..a793cdcf 100644 --- a/libs/SDL3/src/video/windows/SDL_surface_utils.h +++ b/libs/SDL3/src/video/windows/SDL_surface_utils.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -23,7 +23,7 @@ #ifndef SDL_surface_utils_h_ #define SDL_surface_utils_h_ -#include +#include "../../core/windows/SDL_windows.h" #ifdef __cplusplus extern "C" { diff --git a/libs/SDL3/src/video/windows/SDL_windowsclipboard.c b/libs/SDL3/src/video/windows/SDL_windowsclipboard.c index e62936bb..46e579a9 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsclipboard.c +++ b/libs/SDL3/src/video/windows/SDL_windowsclipboard.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -41,51 +41,6 @@ // Assume we can directly read and write BMP fields without byte swapping SDL_COMPILE_TIME_ASSERT(verify_byte_order, SDL_BYTEORDER == SDL_LIL_ENDIAN); -static int WIN_GetPixelDataOffset(BITMAPINFOHEADER bih) -{ - int offset = 0; - // biSize Specifies the number of bytes required by the structure - // We expect to always be 40 because it should be packed - if (40 == bih.biSize && 40 == sizeof(BITMAPINFOHEADER)) - { - // - // biBitCount Specifies the number of bits per pixel. - // Might exist some bit masks *after* the header and *before* the pixel offset - // we're looking, but only if we have more than - // 8 bits per pixel, so we need to ajust for that - // - if (bih.biBitCount > 8) - { - // If bih.biCompression is RBG we should NOT offset more - - if (bih.biCompression == BI_BITFIELDS) - { - offset += 3 * sizeof(RGBQUAD); - } else if (bih.biCompression == 6 /* BI_ALPHABITFIELDS */) { - // Not common, but still right - offset += 4 * sizeof(RGBQUAD); - } - } - } - - // - // biClrUsed Specifies the number of color indices in the color table that are actually used by the bitmap. - // If this value is zero, the bitmap uses the maximum number of colors - // corresponding to the value of the biBitCount member for the compression mode specified by biCompression. - // If biClrUsed is nonzero and the biBitCount member is less than 16 - // the biClrUsed member specifies the actual number of colors - // - if (bih.biClrUsed > 0) { - offset += bih.biClrUsed * sizeof(RGBQUAD); - } else { - if (bih.biBitCount < 16) { - offset = offset + (sizeof(RGBQUAD) << bih.biBitCount); - } - } - return bih.biSize + offset; -} - - static BOOL WIN_OpenClipboard(SDL_VideoDevice *_this) { // Retry to open the clipboard in case another application has it open @@ -157,9 +112,30 @@ static void *WIN_ConvertDIBtoBMP(HANDLE hMem, size_t *size) LPVOID dib = GlobalLock(hMem); if (dib) { BITMAPINFOHEADER *pbih = (BITMAPINFOHEADER *)dib; - size_t bih_size = pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD); + + // https://learn.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-bitmapinfoheader#color-tables + size_t color_table_size; + switch (pbih->biCompression) { + case BI_RGB: + if (pbih->biBitCount <= 8) { + color_table_size = sizeof(RGBQUAD) * (pbih->biClrUsed == 0 ? 1 << pbih->biBitCount : pbih->biClrUsed); + } else { + color_table_size = 0; + } + break; + case BI_BITFIELDS: + color_table_size = 3 * sizeof(DWORD); + break; + case 6 /* BI_ALPHABITFIELDS */: + // https://learn.microsoft.com/en-us/previous-versions/windows/embedded/aa452885(v=msdn.10) + color_table_size = 4 * sizeof(DWORD); + break; + default: // FOURCC + color_table_size = sizeof(RGBQUAD) * pbih->biClrUsed; + } + + size_t bih_size = pbih->biSize + color_table_size; size_t dib_size = bih_size + pbih->biSizeImage; - int pixel_offset = WIN_GetPixelDataOffset(*pbih); if (dib_size <= mem_size) { size_t bmp_size = sizeof(BITMAPFILEHEADER) + mem_size; bmp = SDL_malloc(bmp_size); @@ -169,7 +145,7 @@ static void *WIN_ConvertDIBtoBMP(HANDLE hMem, size_t *size) pbfh->bfSize = (DWORD)bmp_size; pbfh->bfReserved1 = 0; pbfh->bfReserved2 = 0; - pbfh->bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + pixel_offset); + pbfh->bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + color_table_size); SDL_memcpy((Uint8 *)bmp + sizeof(BITMAPFILEHEADER), dib, dib_size); *size = bmp_size; } @@ -376,73 +352,90 @@ bool WIN_HasClipboardData(SDL_VideoDevice *_this, const char *mime_type) return false; } +static int GetClipboardFormatMimeType(UINT format, char *name) +{ + static struct + { + UINT format; + const char *mime_type; + } mime_types[] = { + { TEXT_FORMAT, "text/plain;charset=utf-8" }, + { IMAGE_FORMAT, IMAGE_MIME_TYPE }, + }; + + for (int i = 0; i < SDL_arraysize(mime_types); ++i) { + if (format == mime_types[i].format) { + size_t len = SDL_strlen(mime_types[i].mime_type) + 1; + if (name) { + SDL_memcpy(name, mime_types[i].mime_type, len); + } + return (int)len; + } + } + return 0; +} + static char **GetMimeTypes(int *pnformats) { + char **new_mime_types = NULL; + *pnformats = 0; - int nformats = CountClipboardFormats(); - size_t allocSize = (nformats + 1) * sizeof(char*); + if (WIN_OpenClipboard(SDL_GetVideoDevice())) { + int nformats = 0; + UINT format = 0; + int formatsSz = 0; + for ( ; ; ) { + format = EnumClipboardFormats(format); + if (!format) { + break; + } - UINT format = 0; - int formatsSz = 0; - int i; - for (i = 0; i < nformats; i++) { - format = EnumClipboardFormats(format); - if (!format) { - nformats = i; - break; + int len = GetClipboardFormatMimeType(format, NULL); + if (len > 0) { + ++nformats; + formatsSz += len; + } } - char mimeType[200]; - int nchars = GetClipboardFormatNameA(format, mimeType, sizeof(mimeType)); - formatsSz += nchars + 1; - } + new_mime_types = SDL_AllocateTemporaryMemory((nformats + 1) * sizeof(char *) + formatsSz); + if (new_mime_types) { + format = 0; + char *strPtr = (char *)(new_mime_types + nformats + 1); + int i = 0; + for ( ; ; ) { + format = EnumClipboardFormats(format); + if (!format) { + break; + } - char **new_mime_types = SDL_AllocateTemporaryMemory(allocSize + formatsSz); - if (!new_mime_types) - return NULL; + int len = GetClipboardFormatMimeType(format, strPtr); + if (len > 0) { + new_mime_types[i++] = strPtr; + strPtr += len; + } + } - format = 0; - char *strPtr = (char *)(new_mime_types + nformats + 1); - int formatRemains = formatsSz; - for (i = 0; i < nformats; i++) { - format = EnumClipboardFormats(format); - if (!format) { - nformats = i; - break; + new_mime_types[nformats] = NULL; + *pnformats = nformats; } - - new_mime_types[i] = strPtr; - - int nchars = GetClipboardFormatNameA(format, strPtr, formatRemains-1); - strPtr += nchars; - *strPtr = '\0'; - strPtr++; - - formatRemains -= (nchars + 1); + WIN_CloseClipboard(); } - - new_mime_types[nformats] = NULL; - *pnformats = nformats; return new_mime_types; } void WIN_CheckClipboardUpdate(struct SDL_VideoData *data) { - const DWORD seq = GetClipboardSequenceNumber(); - if (seq != data->clipboard_count) { - if (data->clipboard_count) { + DWORD count = GetClipboardSequenceNumber(); + if (count != data->clipboard_count) { + if (count) { int nformats = 0; char **new_mime_types = GetMimeTypes(&nformats); if (new_mime_types) { SDL_SendClipboardUpdate(false, new_mime_types, nformats); - } else { - WIN_SetError("Couldn't get clipboard mime types"); } - } - - data->clipboard_count = seq; + data->clipboard_count = count; } } diff --git a/libs/SDL3/src/video/windows/SDL_windowsclipboard.h b/libs/SDL3/src/video/windows/SDL_windowsclipboard.h index 0547555e..4b14ffe6 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsclipboard.h +++ b/libs/SDL3/src/video/windows/SDL_windowsclipboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsevents.c b/libs/SDL3/src/video/windows/SDL_windowsevents.c index 4802303c..b65d81ac 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsevents.c +++ b/libs/SDL3/src/video/windows/SDL_windowsevents.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -82,6 +82,21 @@ #ifndef WM_POINTERUPDATE #define WM_POINTERUPDATE 0x0245 #endif +#ifndef WM_POINTERDOWN +#define WM_POINTERDOWN 0x0246 +#endif +#ifndef WM_POINTERUP +#define WM_POINTERUP 0x0247 +#endif +#ifndef WM_POINTERENTER +#define WM_POINTERENTER 0x0249 +#endif +#ifndef WM_POINTERLEAVE +#define WM_POINTERLEAVE 0x024A +#endif +#ifndef WM_POINTERCAPTURECHANGED +#define WM_POINTERCAPTURECHANGED 0x024C +#endif #ifndef WM_UNICHAR #define WM_UNICHAR 0x0109 #endif @@ -159,6 +174,16 @@ static Uint64 WIN_GetEventTimestamp(void) return timestamp; } +// A message hook called before TranslateMessage() +static SDL_WindowsMessageHook g_WindowsMessageHook = NULL; +static void *g_WindowsMessageHookData = NULL; + +void SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata) +{ + g_WindowsMessageHook = callback; + g_WindowsMessageHookData = userdata; +} + static SDL_Scancode WindowsScanCodeToSDLScanCode(LPARAM lParam, WPARAM wParam, Uint16 *rawcode, bool *virtual_key) { SDL_Scancode code; @@ -226,9 +251,7 @@ static void WIN_CheckWParamMouseButton(Uint64 timestamp, bool bwParamMousePresse data->focus_click_pending &= ~SDL_BUTTON_MASK(button); WIN_UpdateClipCursor(data->window); } - if (WIN_ShouldIgnoreFocusClick(data)) { - return; - } + return; } if (bwParamMousePressed && !(mouseFlags & SDL_BUTTON_MASK(button))) { @@ -308,7 +331,7 @@ static void WIN_UpdateFocus(SDL_Window *window, bool expect_focus) if (has_focus) { POINT cursorPos; - if (!(window->flags & SDL_WINDOW_MOUSE_CAPTURE)) { + if (WIN_ShouldIgnoreFocusClick(data) && !(window->flags & SDL_WINDOW_MOUSE_CAPTURE)) { bool swapButtons = GetSystemMetrics(SM_SWAPBUTTON) != 0; if (GetAsyncKeyState(VK_LBUTTON)) { data->focus_click_pending |= !swapButtons ? SDL_BUTTON_LMASK : SDL_BUTTON_RMASK; @@ -556,7 +579,7 @@ static void WIN_HandleRawMouseInput(Uint64 timestamp, SDL_VideoData *data, HANDL return; } - if (GetMouseMessageSource(rawmouse->ulExtraInformation) == SDL_MOUSE_EVENT_SOURCE_TOUCH) { + if (GetMouseMessageSource(rawmouse->ulExtraInformation) != SDL_MOUSE_EVENT_SOURCE_MOUSE) { return; } @@ -661,9 +684,7 @@ static void WIN_HandleRawMouseInput(Uint64 timestamp, SDL_VideoData *data, HANDL windowdata->focus_click_pending &= ~SDL_BUTTON_MASK(button); WIN_UpdateClipCursor(window); } - if (WIN_ShouldIgnoreFocusClick(windowdata)) { - continue; - } + continue; } SDL_SendMouseButton(timestamp, window, mouseID, button, down); @@ -1031,6 +1052,25 @@ static bool SkipAltGrLeftControl(WPARAM wParam, LPARAM lParam) return false; } +static bool DispatchModalLoopMessageHook(HWND *hwnd, UINT *msg, WPARAM *wParam, LPARAM *lParam) +{ + MSG dummy; + + SDL_zero(dummy); + dummy.hwnd = *hwnd; + dummy.message = *msg; + dummy.wParam = *wParam; + dummy.lParam = *lParam; + if (g_WindowsMessageHook(g_WindowsMessageHookData, &dummy)) { + // Can't modify the hwnd, but everything else is fair game + *msg = dummy.message; + *wParam = dummy.wParam; + *lParam = dummy.lParam; + return true; + } + return false; +} + LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { SDL_WindowData *data; @@ -1060,6 +1100,14 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara } #endif // WMMSG_DEBUG + + if (g_WindowsMessageHook && data->in_modal_loop) { + // Synthesize a message for window hooks so they can modify the message if desired + if (!DispatchModalLoopMessageHook(&hwnd, &msg, &wParam, &lParam)) { + return 0; + } + } + #if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) if (WIN_HandleIMEMessage(hwnd, msg, wParam, &lParam, data->videodata)) { return 0; @@ -1104,6 +1152,16 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara if (SDL_WINDOW_IS_POPUP(data->window)) { return MA_NOACTIVATE; } + + // Check parents to see if they are in relative mouse mode and focused + SDL_Window *parent = data->window->parent; + while (parent) { + if ((parent->flags & SDL_WINDOW_INPUT_FOCUS) && + (parent->flags & SDL_WINDOW_MOUSE_RELATIVE_MODE)) { + return MA_NOACTIVATE; + } + parent = parent->parent; + } } break; case WM_SETFOCUS: @@ -1119,11 +1177,121 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara WIN_UpdateFocus(data->window, false); } break; - case WM_POINTERUPDATE: + case WM_POINTERENTER: { - data->last_pointer_update = lParam; - break; + if (!data->videodata->GetPointerType) { + break; // Not on Windows8 or later? We shouldn't get this event, but just in case... + } + + const UINT32 pointerid = GET_POINTERID_WPARAM(wParam); + void *hpointer = (void *) (size_t) pointerid; + POINTER_INPUT_TYPE pointer_type = PT_POINTER; + if (!data->videodata->GetPointerType(pointerid, &pointer_type)) { + break; // oh well. + } else if (pointer_type != PT_PEN) { + break; // we only care about pens here. + } else if (SDL_FindPenByHandle(hpointer)) { + break; // we already have this one, don't readd it. + } + + // one can use GetPointerPenInfo() to get the current state of the pen, and check POINTER_PEN_INFO::penMask, + // but the docs aren't clear if these masks are _always_ set for pens with specific features, or if they + // could be unset at this moment because Windows is still deciding what capabilities the pen has, and/or + // doesn't yet have valid data for them. As such, just say everything that the interface supports is + // available...we don't expose this information through the public API at the moment anyhow. + SDL_PenInfo info; + SDL_zero(info); + info.capabilities = SDL_PEN_CAPABILITY_PRESSURE | SDL_PEN_CAPABILITY_XTILT | SDL_PEN_CAPABILITY_YTILT | SDL_PEN_CAPABILITY_DISTANCE | SDL_PEN_CAPABILITY_ROTATION | SDL_PEN_CAPABILITY_ERASER; + info.max_tilt = 90.0f; + info.num_buttons = 1; + info.subtype = SDL_PEN_TYPE_PENCIL; + SDL_AddPenDevice(0, NULL, &info, hpointer); + returnCode = 0; + } break; + + case WM_POINTERCAPTURECHANGED: + case WM_POINTERLEAVE: + { + const UINT32 pointerid = GET_POINTERID_WPARAM(wParam); + void *hpointer = (void *) (size_t) pointerid; + const SDL_PenID pen = SDL_FindPenByHandle(hpointer); + if (pen == 0) { + break; // not a pen, or not a pen we already knew about. + } + + // if this just left the _window_, we don't care. If this is no longer visible to the tablet, time to remove it! + if ((msg == WM_POINTERCAPTURECHANGED) || !IS_POINTER_INCONTACT_WPARAM(wParam)) { + SDL_RemovePenDevice(WIN_GetEventTimestamp(), pen); + } + returnCode = 0; + } break; + + case WM_POINTERUPDATE: { + POINTER_INPUT_TYPE pointer_type = PT_POINTER; + if (!data->videodata->GetPointerType || !data->videodata->GetPointerType(GET_POINTERID_WPARAM(wParam), &pointer_type)) { + break; // oh well. + } + + if (pointer_type == PT_MOUSE) { + data->last_pointer_update = lParam; + returnCode = 0; + break; + } } + SDL_FALLTHROUGH; + + case WM_POINTERDOWN: + case WM_POINTERUP: { + POINTER_PEN_INFO pen_info; + const UINT32 pointerid = GET_POINTERID_WPARAM(wParam); + void *hpointer = (void *) (size_t) pointerid; + const SDL_PenID pen = SDL_FindPenByHandle(hpointer); + if (pen == 0) { + break; // not a pen, or not a pen we already knew about. + } else if (!data->videodata->GetPointerPenInfo || !data->videodata->GetPointerPenInfo(pointerid, &pen_info)) { + break; // oh well. + } + + const Uint64 timestamp = WIN_GetEventTimestamp(); + SDL_Window *window = data->window; + + // if lifting off, do it first, so any motion changes don't cause app issues. + if (msg == WM_POINTERUP) { + SDL_SendPenTouch(timestamp, pen, window, (pen_info.penFlags & PEN_FLAG_INVERTED) != 0, false); + } + + POINT position; + position.x = (LONG) GET_X_LPARAM(lParam); + position.y = (LONG) GET_Y_LPARAM(lParam); + ScreenToClient(data->hwnd, &position); + + SDL_SendPenMotion(timestamp, pen, window, (float) position.x, (float) position.y); + SDL_SendPenButton(timestamp, pen, window, 1, (pen_info.penFlags & PEN_FLAG_BARREL) != 0); + SDL_SendPenButton(timestamp, pen, window, 2, (pen_info.penFlags & PEN_FLAG_ERASER) != 0); + + if (pen_info.penMask & PEN_MASK_PRESSURE) { + SDL_SendPenAxis(timestamp, pen, window, SDL_PEN_AXIS_PRESSURE, ((float) pen_info.pressure) / 1024.0f); // pen_info.pressure is in the range 0..1024. + } + + if (pen_info.penMask & PEN_MASK_ROTATION) { + SDL_SendPenAxis(timestamp, pen, window, SDL_PEN_AXIS_ROTATION, ((float) pen_info.rotation)); // it's already in the range of 0 to 359. + } + + if (pen_info.penMask & PEN_MASK_TILT_X) { + SDL_SendPenAxis(timestamp, pen, window, SDL_PEN_AXIS_XTILT, ((float) pen_info.tiltX)); // it's already in the range of -90 to 90.. + } + + if (pen_info.penMask & PEN_MASK_TILT_Y) { + SDL_SendPenAxis(timestamp, pen, window, SDL_PEN_AXIS_YTILT, ((float) pen_info.tiltY)); // it's already in the range of -90 to 90.. + } + + // if setting down, do it last, so the pen is positioned correctly from the first contact. + if (msg == WM_POINTERDOWN) { + SDL_SendPenTouch(timestamp, pen, window, (pen_info.penFlags & PEN_FLAG_INVERTED) != 0, true); + } + + returnCode = 0; + } break; case WM_MOUSEMOVE: { @@ -1154,7 +1322,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara if (!data->videodata->raw_mouse_enabled) { // Only generate mouse events for real mouse - if (GetMouseMessageSource((ULONG)GetMessageExtraInfo()) != SDL_MOUSE_EVENT_SOURCE_TOUCH && + if (GetMouseMessageSource((ULONG)GetMessageExtraInfo()) == SDL_MOUSE_EVENT_SOURCE_MOUSE && lParam != data->last_pointer_update) { SDL_SendMouseMotion(WIN_GetEventTimestamp(), window, SDL_GLOBAL_MOUSE_ID, false, (float)GET_X_LPARAM(lParam), (float)GET_Y_LPARAM(lParam)); } @@ -1176,7 +1344,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara { /* SDL_Mouse *mouse = SDL_GetMouse(); */ if (!data->videodata->raw_mouse_enabled) { - if (GetMouseMessageSource((ULONG)GetMessageExtraInfo()) != SDL_MOUSE_EVENT_SOURCE_TOUCH && + if (GetMouseMessageSource((ULONG)GetMessageExtraInfo()) == SDL_MOUSE_EVENT_SOURCE_MOUSE && lParam != data->last_pointer_update) { WIN_CheckWParamMouseButtons(WIN_GetEventTimestamp(), wParam, data, SDL_GLOBAL_MOUSE_ID); } @@ -1405,7 +1573,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara constrain_max_size = FALSE; } - if (!(SDL_GetWindowFlags(data->window) & SDL_WINDOW_BORDERLESS)) { + if (!(SDL_GetWindowFlags(data->window) & SDL_WINDOW_BORDERLESS) && !SDL_WINDOW_IS_POPUP(data->window)) { size.top = 0; size.left = 0; size.bottom = h; @@ -1450,6 +1618,13 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara break; #endif // WM_GETMINMAXINFO + case WM_WINDOWPOSCHANGING: + + if (data->expected_resize) { + returnCode = 0; + } + break; + case WM_WINDOWPOSCHANGED: { SDL_Window *win; @@ -1473,8 +1648,17 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_RESTORED, 0, 0); } SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_MAXIMIZED, 0, 0); + data->force_ws_maximizebox = true; } else if (data->window->flags & (SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED)) { SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_RESTORED, 0, 0); + + /* If resizable was forced on for the maximized window, clear the style flags now, + * but not if the window is fullscreen, as this needs to be preserved in that case. + */ + if (!(data->window->flags & SDL_WINDOW_FULLSCREEN)) { + data->force_ws_maximizebox = false; + WIN_SetWindowResizable(SDL_GetVideoDevice(), data->window, !!(data->window->flags & SDL_WINDOW_RESIZABLE)); + } } if (windowpos->flags & SWP_HIDEWINDOW) { @@ -1490,23 +1674,25 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara break; } - if (GetClientRect(hwnd, &rect) && !WIN_IsRectEmpty(&rect)) { - ClientToScreen(hwnd, (LPPOINT) &rect); - ClientToScreen(hwnd, (LPPOINT) &rect + 1); + if (!data->disable_move_size_events) { + if (GetClientRect(hwnd, &rect) && !WIN_IsRectEmpty(&rect)) { + ClientToScreen(hwnd, (LPPOINT) &rect); + ClientToScreen(hwnd, (LPPOINT) &rect + 1); - x = rect.left; - y = rect.top; + x = rect.left; + y = rect.top; - SDL_GlobalToRelativeForWindow(data->window, x, y, &x, &y); - SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_MOVED, x, y); - } + SDL_GlobalToRelativeForWindow(data->window, x, y, &x, &y); + SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_MOVED, x, y); + } - // Moving the window from one display to another can change the size of the window (in the handling of SDL_EVENT_WINDOW_MOVED), so we need to re-query the bounds - if (GetClientRect(hwnd, &rect) && !WIN_IsRectEmpty(&rect)) { - w = rect.right; - h = rect.bottom; + // Moving the window from one display to another can change the size of the window (in the handling of SDL_EVENT_WINDOW_MOVED), so we need to re-query the bounds + if (GetClientRect(hwnd, &rect) && !WIN_IsRectEmpty(&rect)) { + w = rect.right; + h = rect.bottom; - SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_RESIZED, w, h); + SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_RESIZED, w, h); + } } WIN_UpdateClipCursor(data->window); @@ -1521,8 +1707,8 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara // Update the position of any child windows for (win = data->window->first_child; win; win = win->next_sibling) { - // Don't update hidden child windows, their relative position doesn't change - if (!(win->flags & SDL_WINDOW_HIDDEN)) { + // Don't update hidden child popup windows, their relative position doesn't change + if (SDL_WINDOW_IS_POPUP(win) && !(win->flags & SDL_WINDOW_HIDDEN)) { WIN_SetWindowPositionInternal(win, SWP_NOCOPYBITS | SWP_NOACTIVATE, SDL_WINDOWRECT_CURRENT); } } @@ -1535,7 +1721,15 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara case WM_ENTERSIZEMOVE: case WM_ENTERMENULOOP: { - SetTimer(hwnd, (UINT_PTR)SDL_IterateMainCallbacks, USER_TIMER_MINIMUM, NULL); + ++data->in_modal_loop; + if (data->in_modal_loop == 1) { + data->initial_size_rect.left = data->window->x; + data->initial_size_rect.right = data->window->x + data->window->w; + data->initial_size_rect.top = data->window->y; + data->initial_size_rect.bottom = data->window->y + data->window->h; + + SetTimer(hwnd, (UINT_PTR)SDL_IterateMainCallbacks, USER_TIMER_MINIMUM, NULL); + } } break; case WM_TIMER: @@ -1549,7 +1743,10 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara case WM_EXITSIZEMOVE: case WM_EXITMENULOOP: { - KillTimer(hwnd, (UINT_PTR)SDL_IterateMainCallbacks); + --data->in_modal_loop; + if (data->in_modal_loop == 0) { + KillTimer(hwnd, (UINT_PTR)SDL_IterateMainCallbacks); + } } break; case WM_SIZING: @@ -1628,7 +1825,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara case WMSZ_LEFT: clientDragRect.left = clientDragRect.right - w; if (lock_aspect_ratio) { - clientDragRect.top = (clientDragRect.bottom + clientDragRect.top - h) / 2; + clientDragRect.top = (data->initial_size_rect.bottom + data->initial_size_rect.top - h) / 2; } clientDragRect.bottom = h + clientDragRect.top; break; @@ -1639,7 +1836,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara case WMSZ_RIGHT: clientDragRect.right = w + clientDragRect.left; if (lock_aspect_ratio) { - clientDragRect.top = (clientDragRect.bottom + clientDragRect.top - h) / 2; + clientDragRect.top = (data->initial_size_rect.bottom + data->initial_size_rect.top - h) / 2; } clientDragRect.bottom = h + clientDragRect.top; break; @@ -1649,7 +1846,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara break; case WMSZ_TOP: if (lock_aspect_ratio) { - clientDragRect.left = (clientDragRect.right + clientDragRect.left - w) / 2; + clientDragRect.left = (data->initial_size_rect.right + data->initial_size_rect.left - w) / 2; } clientDragRect.right = w + clientDragRect.left; clientDragRect.top = clientDragRect.bottom - h; @@ -1660,7 +1857,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara break; case WMSZ_BOTTOM: if (lock_aspect_ratio) { - clientDragRect.left = (clientDragRect.right + clientDragRect.left - w) / 2; + clientDragRect.left = (data->initial_size_rect.right + data->initial_size_rect.left - w) / 2; } clientDragRect.right = w + clientDragRect.left; clientDragRect.bottom = h + clientDragRect.top; @@ -1806,13 +2003,13 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara // FIXME: Should we use the input->dwTime field for the tick source of the timestamp? if (input->dwFlags & TOUCHEVENTF_DOWN) { - SDL_SendTouch(WIN_GetEventTimestamp(), touchId, fingerId, data->window, true, x, y, 1.0f); + SDL_SendTouch(WIN_GetEventTimestamp(), touchId, fingerId, data->window, SDL_EVENT_FINGER_DOWN, x, y, 1.0f); } if (input->dwFlags & TOUCHEVENTF_MOVE) { SDL_SendTouchMotion(WIN_GetEventTimestamp(), touchId, fingerId, data->window, x, y, 1.0f); } if (input->dwFlags & TOUCHEVENTF_UP) { - SDL_SendTouch(WIN_GetEventTimestamp(), touchId, fingerId, data->window, false, x, y, 1.0f); + SDL_SendTouch(WIN_GetEventTimestamp(), touchId, fingerId, data->window, SDL_EVENT_FINGER_UP, x, y, 1.0f); } } } @@ -1873,20 +2070,30 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara NCCALCSIZE_PARAMS *params = (NCCALCSIZE_PARAMS *)lParam; WINDOWPLACEMENT placement; if (GetWindowPlacement(hwnd, &placement) && placement.showCmd == SW_MAXIMIZE) { - // Maximized borderless windows should use the full monitor size + // Maximized borderless windows should use the monitor work area. HMONITOR hMonitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONULL); + if (!hMonitor) { + // The returned monitor can be null when restoring from minimized, so use the last coordinates. + const POINT pt = { data->window->windowed.x, data->window->windowed.y }; + hMonitor = MonitorFromPoint(pt, MONITOR_DEFAULTTONEAREST); + } if (hMonitor) { MONITORINFO info; SDL_zero(info); info.cbSize = sizeof(info); if (GetMonitorInfo(hMonitor, &info)) { - params->rgrc[0] = info.rcMonitor; + params->rgrc[0] = info.rcWork; } } - } else if (!(window_flags & SDL_WINDOW_RESIZABLE)) { + } else if (!(window_flags & SDL_WINDOW_RESIZABLE) && !data->force_ws_maximizebox) { int w, h; - w = data->window->floating.w; - h = data->window->floating.h; + if (data->window->last_size_pending) { + w = data->window->pending.w; + h = data->window->pending.h; + } else { + w = data->window->floating.w; + h = data->window->floating.h; + } params->rgrc[0].right = params->rgrc[0].left + w; params->rgrc[0].bottom = params->rgrc[0].top + h; } @@ -1919,7 +2126,19 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara return ret; \ } case SDL_HITTEST_DRAGGABLE: + { + /* If the mouse button state is something other than none or left button down, + * return HTCLIENT, or Windows will eat the button press. + */ + SDL_MouseButtonFlags buttonState = SDL_GetGlobalMouseState(NULL, NULL); + if (buttonState && !(buttonState & SDL_BUTTON_LMASK)) { + // Set focus in case it was lost while previously moving over a draggable area. + SDL_SetMouseFocus(window); + return HTCLIENT; + } + POST_HIT_TEST(HTCAPTION); + } case SDL_HITTEST_RESIZE_TOPLEFT: POST_HIT_TEST(HTTOPLEFT); case SDL_HITTEST_RESIZE_TOP: @@ -1979,7 +2198,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara { RECT rect = { 0 }; - if (!(data->window->flags & SDL_WINDOW_BORDERLESS)) { + if (!(data->window->flags & SDL_WINDOW_BORDERLESS) && !SDL_WINDOW_IS_POPUP(data->window)) { WIN_AdjustWindowRectForHWND(hwnd, &rect, prevDPI); } @@ -1996,7 +2215,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara rect.right = query_client_w_win; rect.bottom = query_client_h_win; - if (!(data->window->flags & SDL_WINDOW_BORDERLESS)) { + if (!(data->window->flags & SDL_WINDOW_BORDERLESS) && !SDL_WINDOW_IS_POPUP(data->window)) { WIN_AdjustWindowRectForHWND(hwnd, &rect, nextDPI); } @@ -2129,16 +2348,6 @@ static void WIN_UpdateMouseCapture(void) } #endif // !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) -// A message hook called before TranslateMessage() -static SDL_WindowsMessageHook g_WindowsMessageHook = NULL; -static void *g_WindowsMessageHookData = NULL; - -void SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata) -{ - g_WindowsMessageHook = callback; - g_WindowsMessageHookData = userdata; -} - int WIN_WaitEventTimeout(SDL_VideoDevice *_this, Sint64 timeoutNS) { if (g_WindowsEnableMessageLoop) { diff --git a/libs/SDL3/src/video/windows/SDL_windowsevents.h b/libs/SDL3/src/video/windows/SDL_windowsevents.h index 8d4e762a..5336013b 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsevents.h +++ b/libs/SDL3/src/video/windows/SDL_windowsevents.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsframebuffer.c b/libs/SDL3/src/video/windows/SDL_windowsframebuffer.c index d21f06c6..f2bbd590 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsframebuffer.c +++ b/libs/SDL3/src/video/windows/SDL_windowsframebuffer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsframebuffer.h b/libs/SDL3/src/video/windows/SDL_windowsframebuffer.h index 1acd0a81..bafcfe91 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsframebuffer.h +++ b/libs/SDL3/src/video/windows/SDL_windowsframebuffer.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsgameinput.c b/libs/SDL3/src/video/windows/SDL_windowsgameinput.c index df6829bb..6db142f1 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsgameinput.c +++ b/libs/SDL3/src/video/windows/SDL_windowsgameinput.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsgameinput.h b/libs/SDL3/src/video/windows/SDL_windowsgameinput.h index eb72103b..561de9c4 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsgameinput.h +++ b/libs/SDL3/src/video/windows/SDL_windowsgameinput.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowskeyboard.c b/libs/SDL3/src/video/windows/SDL_windowskeyboard.c index 74bb8c15..5f934e02 100644 --- a/libs/SDL3/src/video/windows/SDL_windowskeyboard.c +++ b/libs/SDL3/src/video/windows/SDL_windowskeyboard.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowskeyboard.h b/libs/SDL3/src/video/windows/SDL_windowskeyboard.h index 65f7942e..592da9d3 100644 --- a/libs/SDL3/src/video/windows/SDL_windowskeyboard.h +++ b/libs/SDL3/src/video/windows/SDL_windowskeyboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsmessagebox.c b/libs/SDL3/src/video/windows/SDL_windowsmessagebox.c index be96da9e..c174e3d6 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsmessagebox.c +++ b/libs/SDL3/src/video/windows/SDL_windowsmessagebox.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -670,6 +670,31 @@ static const char *EscapeAmpersands(char **dst, size_t *dstlen, const char *src) return *dst; } +static float WIN_GetContentScale(void) +{ + int dpi = 0; + +#if 0 // We don't know what monitor the dialog will be shown on + UINT hdpi_uint, vdpi_uint; + if (GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &hdpi_uint, &vdpi_uint) == S_OK) { + dpi = (int)hdpi_uint; + } +#endif + if (dpi == 0) { + // Window 8.0 and below: same DPI for all monitors + HDC hdc = GetDC(NULL); + if (hdc) { + dpi = GetDeviceCaps(hdc, LOGPIXELSX); + ReleaseDC(NULL, hdc); + } + } + if (dpi == 0) { + // Safe default + dpi = USER_DEFAULT_SCREEN_DPI; + } + return dpi / (float)USER_DEFAULT_SCREEN_DPI; +} + // This function is called if a Task Dialog is unsupported. static bool WIN_ShowOldMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID) { @@ -690,13 +715,14 @@ static bool WIN_ShowOldMessageBox(const SDL_MessageBoxData *messageboxdata, int HWND ParentWindow = NULL; - const int ButtonWidth = 88; - const int ButtonHeight = 26; - const int TextMargin = 16; - const int ButtonMargin = 12; + const float scale = WIN_GetContentScale(); + const int ButtonWidth = (int)SDL_roundf(88 * scale); + const int ButtonHeight = (int)SDL_roundf(26 * scale); + const int TextMargin = (int)SDL_roundf(16 * scale); + const int ButtonMargin = (int)SDL_roundf(12 * scale); const int IconWidth = GetSystemMetrics(SM_CXICON); const int IconHeight = GetSystemMetrics(SM_CYICON); - const int IconMargin = 20; + const int IconMargin = (int)SDL_roundf(20 * scale); if (messageboxdata->numbuttons > MAX_BUTTONS) { return SDL_SetError("Number of buttons exceeds limit of %d", MAX_BUTTONS); @@ -925,15 +951,25 @@ bool WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID) int nButton; int nCancelButton; int i; + bool result = false; if (SIZE_MAX / sizeof(TASKDIALOG_BUTTON) < messageboxdata->numbuttons) { return SDL_OutOfMemory(); } + HMODULE hUser32 = GetModuleHandle(TEXT("user32.dll")); + typedef DPI_AWARENESS_CONTEXT (WINAPI * SetThreadDpiAwarenessContext_t)(DPI_AWARENESS_CONTEXT); + SetThreadDpiAwarenessContext_t SetThreadDpiAwarenessContextFunc = (SetThreadDpiAwarenessContext_t)GetProcAddress(hUser32, "SetThreadDpiAwarenessContext"); + DPI_AWARENESS_CONTEXT previous_context = DPI_AWARENESS_CONTEXT_UNAWARE; + if (SetThreadDpiAwarenessContextFunc) { + previous_context = SetThreadDpiAwarenessContextFunc(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); + } + // If we cannot load comctl32.dll use the old messagebox! hComctl32 = LoadLibrary(TEXT("comctl32.dll")); if (!hComctl32) { - return WIN_ShowOldMessageBox(messageboxdata, buttonID); + result = WIN_ShowOldMessageBox(messageboxdata, buttonID); + goto done; } /* If TaskDialogIndirect doesn't exist use the old messagebox! @@ -941,12 +977,13 @@ bool WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID) The manifest file in the application may require targeting version 6 of comctl32.dll, even when we use LoadLibrary here! If you don't want to bother with manifests, put this #pragma in your app's source code somewhere: - pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") + #pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") */ pfnTaskDialogIndirect = (TASKDIALOGINDIRECTPROC)GetProcAddress(hComctl32, "TaskDialogIndirect"); if (!pfnTaskDialogIndirect) { FreeLibrary(hComctl32); - return WIN_ShowOldMessageBox(messageboxdata, buttonID); + result = WIN_ShowOldMessageBox(messageboxdata, buttonID); + goto done; } /* If we have a parent window, get the Instance and HWND for them @@ -1033,11 +1070,17 @@ bool WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID) } else { *buttonID = -1; } - return true; + result = true; + } else { + // We failed showing the Task Dialog, use the old message box! + result = WIN_ShowOldMessageBox(messageboxdata, buttonID); } - // We failed showing the Task Dialog, use the old message box! - return WIN_ShowOldMessageBox(messageboxdata, buttonID); +done: + if (SetThreadDpiAwarenessContextFunc) { + SetThreadDpiAwarenessContextFunc(previous_context); + } + return result; } #endif // SDL_VIDEO_DRIVER_WINDOWS diff --git a/libs/SDL3/src/video/windows/SDL_windowsmessagebox.h b/libs/SDL3/src/video/windows/SDL_windowsmessagebox.h index 3b475530..28ed20c4 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsmessagebox.h +++ b/libs/SDL3/src/video/windows/SDL_windowsmessagebox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsmodes.c b/libs/SDL3/src/video/windows/SDL_windowsmodes.c index afa46830..bfb0baff 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsmodes.c +++ b/libs/SDL3/src/video/windows/SDL_windowsmodes.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsmodes.h b/libs/SDL3/src/video/windows/SDL_windowsmodes.h index 4b7742ac..3d294c31 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsmodes.h +++ b/libs/SDL3/src/video/windows/SDL_windowsmodes.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsmouse.c b/libs/SDL3/src/video/windows/SDL_windowsmouse.c index d53a1f20..3a1c7cac 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsmouse.c +++ b/libs/SDL3/src/video/windows/SDL_windowsmouse.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -390,7 +390,7 @@ static HCURSOR GetCachedCursor(SDL_Cursor *cursor) } int hot_x = (int)SDL_round(data->hot_x * scale); - int hot_y = (int)SDL_round(data->hot_x * scale); + int hot_y = (int)SDL_round(data->hot_y * scale); hcursor = WIN_CreateHCursor(surface, hot_x, hot_y); if (!hcursor) { goto error; diff --git a/libs/SDL3/src/video/windows/SDL_windowsmouse.h b/libs/SDL3/src/video/windows/SDL_windowsmouse.h index 4646a2ec..8fa6d7e5 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsmouse.h +++ b/libs/SDL3/src/video/windows/SDL_windowsmouse.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsopengl.c b/libs/SDL3/src/video/windows/SDL_windowsopengl.c index 37d8abaa..c4587960 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsopengl.c +++ b/libs/SDL3/src/video/windows/SDL_windowsopengl.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsopengl.h b/libs/SDL3/src/video/windows/SDL_windowsopengl.h index aefa5d73..23e2f3a5 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsopengl.h +++ b/libs/SDL3/src/video/windows/SDL_windowsopengl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsopengles.c b/libs/SDL3/src/video/windows/SDL_windowsopengles.c index 29a4c5fc..46f8ea3d 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsopengles.c +++ b/libs/SDL3/src/video/windows/SDL_windowsopengles.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsopengles.h b/libs/SDL3/src/video/windows/SDL_windowsopengles.h index 92ae899c..07cc8d4d 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsopengles.h +++ b/libs/SDL3/src/video/windows/SDL_windowsopengles.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsrawinput.c b/libs/SDL3/src/video/windows/SDL_windowsrawinput.c index 5a0b13a0..fa249914 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsrawinput.c +++ b/libs/SDL3/src/video/windows/SDL_windowsrawinput.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsrawinput.h b/libs/SDL3/src/video/windows/SDL_windowsrawinput.h index df03ccff..25ae7054 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsrawinput.h +++ b/libs/SDL3/src/video/windows/SDL_windowsrawinput.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsshape.c b/libs/SDL3/src/video/windows/SDL_windowsshape.c index cbeb3bb2..ae6b9510 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsshape.c +++ b/libs/SDL3/src/video/windows/SDL_windowsshape.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsshape.h b/libs/SDL3/src/video/windows/SDL_windowsshape.h index cc9955f3..fae61d56 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsshape.h +++ b/libs/SDL3/src/video/windows/SDL_windowsshape.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsvideo.c b/libs/SDL3/src/video/windows/SDL_windowsvideo.c index 982c2a77..819cdee4 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsvideo.c +++ b/libs/SDL3/src/video/windows/SDL_windowsvideo.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -163,6 +163,8 @@ static SDL_VideoDevice *WIN_CreateDevice(void) data->GetDisplayConfigBufferSizes = (LONG (WINAPI *)(UINT32,UINT32*,UINT32* ))SDL_LoadFunction(data->userDLL, "GetDisplayConfigBufferSizes"); data->QueryDisplayConfig = (LONG (WINAPI *)(UINT32,UINT32*,DISPLAYCONFIG_PATH_INFO*,UINT32*,DISPLAYCONFIG_MODE_INFO*,DISPLAYCONFIG_TOPOLOGY_ID*))SDL_LoadFunction(data->userDLL, "QueryDisplayConfig"); data->DisplayConfigGetDeviceInfo = (LONG (WINAPI *)(DISPLAYCONFIG_DEVICE_INFO_HEADER*))SDL_LoadFunction(data->userDLL, "DisplayConfigGetDeviceInfo"); + data->GetPointerType = (BOOL (WINAPI *)(UINT32, POINTER_INPUT_TYPE *))SDL_LoadFunction(data->userDLL, "GetPointerType"); + data->GetPointerPenInfo = (BOOL (WINAPI *)(UINT32, POINTER_PEN_INFO *))SDL_LoadFunction(data->userDLL, "GetPointerPenInfo"); /* *INDENT-ON* */ // clang-format on } else { SDL_ClearError(); diff --git a/libs/SDL3/src/video/windows/SDL_windowsvideo.h b/libs/SDL3/src/video/windows/SDL_windowsvideo.h index 87eaaaf4..53cfbadd 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsvideo.h +++ b/libs/SDL3/src/video/windows/SDL_windowsvideo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -417,6 +417,9 @@ struct SDL_VideoData UINT *dpiX, UINT *dpiY ); HRESULT (WINAPI *SetProcessDpiAwareness)(PROCESS_DPI_AWARENESS dpiAwareness); + BOOL (WINAPI *GetPointerType)(UINT32 pointerId, POINTER_INPUT_TYPE *pointerType); + BOOL (WINAPI *GetPointerPenInfo)(UINT32 pointerId, POINTER_PEN_INFO *penInfo); + /* *INDENT-ON* */ // clang-format on #endif // !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) diff --git a/libs/SDL3/src/video/windows/SDL_windowsvulkan.c b/libs/SDL3/src/video/windows/SDL_windowsvulkan.c index ad2a1476..0b16d550 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsvulkan.c +++ b/libs/SDL3/src/video/windows/SDL_windowsvulkan.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowsvulkan.h b/libs/SDL3/src/video/windows/SDL_windowsvulkan.h index 4b90b8da..34f3a66a 100644 --- a/libs/SDL3/src/video/windows/SDL_windowsvulkan.h +++ b/libs/SDL3/src/video/windows/SDL_windowsvulkan.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/windows/SDL_windowswindow.c b/libs/SDL3/src/video/windows/SDL_windowswindow.c index bceccc7a..1711fc0a 100644 --- a/libs/SDL3/src/video/windows/SDL_windowswindow.c +++ b/libs/SDL3/src/video/windows/SDL_windowswindow.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -147,6 +147,8 @@ static ATOM SDL_HelperWindowClass = 0; - WS_CAPTION: this seems to enable the Windows minimize animation - WS_SYSMENU: enables system context menu on task bar This will also cause the task bar to overlap the window and other windowed behaviors, so only use this for windows that shouldn't appear to be fullscreen + - WS_THICKFRAME: allows hit-testing to resize window (doesn't actually add a frame to a borderless window). + - WS_MAXIMIZEBOX: window will respond to Windows maximize commands sent to all windows, and the window will fill the usable desktop area rather than the whole screen */ #define STYLE_BASIC (WS_CLIPSIBLINGS | WS_CLIPCHILDREN) @@ -180,16 +182,27 @@ static DWORD GetWindowStyle(SDL_Window *window) style |= STYLE_NORMAL; } + /* The WS_MAXIMIZEBOX style flag needs to be retained for as long as the window is maximized, + * or restoration from minimized can fail, and leaving maximized can result in an odd size. + */ if (window->flags & SDL_WINDOW_RESIZABLE) { /* You can have a borderless resizable window, but Windows doesn't always draw it correctly, see https://bugzilla.libsdl.org/show_bug.cgi?id=4466 */ if (!(window->flags & SDL_WINDOW_BORDERLESS) || - SDL_GetHintBoolean("SDL_BORDERLESS_RESIZABLE_STYLE", false)) { + SDL_GetHintBoolean("SDL_BORDERLESS_RESIZABLE_STYLE", true)) { style |= STYLE_RESIZABLE; } } + if (window->internal && window->internal->force_ws_maximizebox) { + /* Even if the resizable flag is cleared, WS_MAXIMIZEBOX is still needed as long + * as the window is maximized, or de-maximizing or minimizing and restoring the + * maximized window can result in the window disappearing or being the wrong size. + */ + style |= WS_MAXIMIZEBOX; + } + // Need to set initialize minimize style, or when we call ShowWindow with WS_MINIMIZE it will activate a random window if (window->flags & SDL_WINDOW_MINIMIZED) { style |= WS_MINIMIZE; @@ -260,7 +273,7 @@ static bool WIN_AdjustWindowRectWithStyle(SDL_Window *window, DWORD style, DWORD /* borderless windows will have WM_NCCALCSIZE return 0 for the non-client area. When this happens, it looks like windows will send a resize message expanding the window client area to the previous window + chrome size, so shouldn't need to adjust the window size for the set styles. */ - if (!(window->flags & SDL_WINDOW_BORDERLESS)) { + if (!(window->flags & SDL_WINDOW_BORDERLESS) && !SDL_WINDOW_IS_POPUP(window)) { #if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES) AdjustWindowRectEx(&rect, style, menu, 0); #else @@ -664,19 +677,21 @@ static void CleanupWindowData(SDL_VideoDevice *_this, SDL_Window *window) window->internal = NULL; } -static void WIN_ConstrainPopup(SDL_Window *window) +static void WIN_ConstrainPopup(SDL_Window *window, bool output_to_pending) { // Clamp popup windows to the output borders if (SDL_WINDOW_IS_POPUP(window)) { SDL_Window *w; SDL_DisplayID displayID; SDL_Rect rect; - int abs_x = window->floating.x; - int abs_y = window->floating.y; + int abs_x = window->last_position_pending ? window->pending.x : window->floating.x; + int abs_y = window->last_position_pending ? window->pending.y : window->floating.y; + const int width = window->last_size_pending ? window->pending.w : window->floating.w; + const int height = window->last_size_pending ? window->pending.h : window->floating.h; int offset_x = 0, offset_y = 0; // Calculate the total offset from the parents - for (w = window->parent; w->parent; w = w->parent) { + for (w = window->parent; SDL_WINDOW_IS_POPUP(w); w = w->parent) { offset_x += w->x; offset_y += w->y; } @@ -689,31 +704,43 @@ static void WIN_ConstrainPopup(SDL_Window *window) // Constrain the popup window to the display of the toplevel parent displayID = SDL_GetDisplayForWindow(w); SDL_GetDisplayBounds(displayID, &rect); - if (abs_x + window->floating.w > rect.x + rect.w) { - abs_x -= (abs_x + window->floating.w) - (rect.x + rect.w); + if (abs_x + width > rect.x + rect.w) { + abs_x -= (abs_x + width) - (rect.x + rect.w); } - if (abs_y + window->floating.h > rect.y + rect.h) { - abs_y -= (abs_y + window->floating.h) - (rect.y + rect.h); + if (abs_y + height > rect.y + rect.h) { + abs_y -= (abs_y + height) - (rect.y + rect.h); } abs_x = SDL_max(abs_x, rect.x); abs_y = SDL_max(abs_y, rect.y); - window->floating.x = abs_x - offset_x; - window->floating.y = abs_y - offset_y; + if (output_to_pending) { + window->pending.x = abs_x - offset_x; + window->pending.y = abs_y - offset_y; + window->pending.w = width; + window->pending.h = height; + } else { + window->floating.x = abs_x - offset_x; + window->floating.y = abs_y - offset_y; + window->floating.w = width; + window->floating.h = height; + } } } -static void WIN_SetKeyboardFocus(SDL_Window *window) +static void WIN_SetKeyboardFocus(SDL_Window *window, bool set_active_focus) { - SDL_Window *topmost = window; + SDL_Window *toplevel = window; // Find the topmost parent - while (topmost->parent) { - topmost = topmost->parent; + while (SDL_WINDOW_IS_POPUP(toplevel)) { + toplevel = toplevel->parent; } - topmost->internal->keyboard_focus = window; - SDL_SetKeyboardFocus(window); + toplevel->internal->keyboard_focus = window; + + if (set_active_focus && !window->is_hiding && !window->is_destroying) { + SDL_SetKeyboardFocus(window); + } } bool WIN_CreateWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_PropertiesID create_props) @@ -742,7 +769,7 @@ bool WIN_CreateWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_Properties styleEx |= GetWindowStyleEx(window); // Figure out what the window area will be - WIN_ConstrainPopup(window); + WIN_ConstrainPopup(window, false); WIN_AdjustWindowRectWithStyle(window, style, styleEx, FALSE, &x, &y, &w, &h, SDL_WINDOWRECT_FLOATING); hwnd = CreateWindowEx(styleEx, SDL_Appname, TEXT(""), style, @@ -938,7 +965,7 @@ bool WIN_SetWindowPosition(SDL_VideoDevice *_this, SDL_Window *window) */ if (!(window->flags & SDL_WINDOW_FULLSCREEN)) { if (!(window->flags & (SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED))) { - WIN_ConstrainPopup(window); + WIN_ConstrainPopup(window, true); return WIN_SetWindowPositionInternal(window, window->internal->copybits_flag | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOACTIVATE, SDL_WINDOWRECT_PENDING); @@ -1053,7 +1080,7 @@ void WIN_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window) bool bActivate = SDL_GetHintBoolean(SDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN, true); - if (window->parent) { + if (SDL_WINDOW_IS_POPUP(window)) { // Update our position in case our parent moved while we were hidden WIN_SetWindowPosition(_this, window); } @@ -1071,9 +1098,7 @@ void WIN_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window) } if (window->flags & SDL_WINDOW_POPUP_MENU && bActivate) { - if (window->parent == SDL_GetKeyboardFocus()) { - WIN_SetKeyboardFocus(window); - } + WIN_SetKeyboardFocus(window, window->parent == SDL_GetKeyboardFocus()); } if (window->flags & SDL_WINDOW_MODAL) { WIN_SetWindowModal(_this, window, true); @@ -1092,16 +1117,20 @@ void WIN_HideWindow(SDL_VideoDevice *_this, SDL_Window *window) // Transfer keyboard focus back to the parent if (window->flags & SDL_WINDOW_POPUP_MENU) { - if (window == SDL_GetKeyboardFocus()) { - SDL_Window *new_focus = window->parent; + SDL_Window *new_focus = window->parent; + bool set_focus = window == SDL_GetKeyboardFocus(); - // Find the highest level window that isn't being hidden or destroyed. - while (new_focus->parent && (new_focus->is_hiding || new_focus->is_destroying)) { - new_focus = new_focus->parent; + // Find the highest level window, up to the toplevel parent, that isn't being hidden or destroyed. + while (SDL_WINDOW_IS_POPUP(new_focus) && (new_focus->is_hiding || new_focus->is_destroying)) { + new_focus = new_focus->parent; + + // If some window in the chain currently had keyboard focus, set it to the new lowest-level window. + if (!set_focus) { + set_focus = new_focus == SDL_GetKeyboardFocus(); } - - WIN_SetKeyboardFocus(new_focus); } + + WIN_SetKeyboardFocus(new_focus, set_focus); } } @@ -1139,9 +1168,7 @@ void WIN_RaiseWindow(SDL_VideoDevice *_this, SDL_Window *window) if (bActivate) { SetForegroundWindow(hwnd); if (window->flags & SDL_WINDOW_POPUP_MENU) { - if (window->parent == SDL_GetKeyboardFocus()) { - WIN_SetKeyboardFocus(window); - } + WIN_SetKeyboardFocus(window, window->parent == SDL_GetKeyboardFocus()); } } else { SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, data->copybits_flag | SWP_NOMOVE | SWP_NOSIZE | SWP_NOOWNERZORDER | SWP_NOACTIVATE); @@ -1352,28 +1379,31 @@ SDL_FullscreenResult WIN_SetWindowFullscreen(SDL_VideoDevice *_this, SDL_Window https://bugzilla.libsdl.org/show_bug.cgi?id=3215 can reproduce! */ if (data->windowed_mode_was_maximized && !data->in_window_deactivation) { - style |= WS_MAXIMIZE; enterMaximized = true; + data->disable_move_size_events = true; } menu = (style & WS_CHILDWINDOW) ? FALSE : (GetMenu(hwnd) != NULL); WIN_AdjustWindowRectWithStyle(window, style, styleEx, menu, &x, &y, &w, &h, - data->windowed_mode_was_maximized ? SDL_WINDOWRECT_WINDOWED : SDL_WINDOWRECT_FLOATING); + SDL_WINDOWRECT_FLOATING); data->windowed_mode_was_maximized = false; } + + /* Always reset the window to the base floating size before possibly re-applying the maximized state, + * otherwise, the base floating size can seemingly be lost in some cases. + */ SetWindowLong(hwnd, GWL_STYLE, style); data->expected_resize = true; + SetWindowPos(hwnd, top, x, y, w, h, data->copybits_flag | SWP_NOACTIVATE); + data->expected_resize = false; + data->disable_move_size_events = false; - if (!enterMaximized) { - SetWindowPos(hwnd, top, x, y, w, h, data->copybits_flag | SWP_NOACTIVATE); - } else { + if (enterMaximized) { WIN_MaximizeWindow(_this, window); } - data->expected_resize = false; - #ifdef HIGHDPI_DEBUG SDL_Log("WIN_SetWindowFullscreen: %d finished. Set window to %d,%d, %dx%d", (int)fullscreen, x, y, w, h); #endif @@ -1663,7 +1693,7 @@ void WIN_UpdateClipCursor(SDL_Window *window) if (!GetClientScreenRect(data->hwnd, &client)) { return; } - + RECT target = client; if (lock_to_ctr) { LONG cx = (client.left + client.right ) / 2; @@ -1687,7 +1717,7 @@ void WIN_UpdateClipCursor(SDL_Window *window) } } - if (GetClipCursor(&client) && + if (GetClipCursor(&client) && 0 != SDL_memcmp(&target, &client, sizeof(client)) && ClipCursor(&target)) { data->cursor_clipped_rect = target; // ClipCursor may fail if rect beyond screen diff --git a/libs/SDL3/src/video/windows/SDL_windowswindow.h b/libs/SDL3/src/video/windows/SDL_windowswindow.h index ddc3ddd6..a2c9a211 100644 --- a/libs/SDL3/src/video/windows/SDL_windowswindow.h +++ b/libs/SDL3/src/video/windows/SDL_windowswindow.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -81,6 +81,10 @@ struct SDL_WindowData bool skip_update_clipcursor; bool windowed_mode_was_maximized; bool in_window_deactivation; + bool force_ws_maximizebox; + bool disable_move_size_events; + int in_modal_loop; + RECT initial_size_rect; RECT cursor_clipped_rect; // last successfully committed clipping rect for this window RECT cursor_ctrlock_rect; // this is Windows-specific, but probably does not need to be per-window UINT windowed_mode_corner_rounding; diff --git a/libs/SDL3/src/video/windows/wmmsg.h b/libs/SDL3/src/video/windows/wmmsg.h index 2e1571dc..2f18aaaf 100644 --- a/libs/SDL3/src/video/windows/wmmsg.h +++ b/libs/SDL3/src/video/windows/wmmsg.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11clipboard.c b/libs/SDL3/src/video/x11/SDL_x11clipboard.c index 0a72faf8..5e33555f 100644 --- a/libs/SDL3/src/video/x11/SDL_x11clipboard.c +++ b/libs/SDL3/src/video/x11/SDL_x11clipboard.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11clipboard.h b/libs/SDL3/src/video/x11/SDL_x11clipboard.h index dc22d69c..da5990a9 100644 --- a/libs/SDL3/src/video/x11/SDL_x11clipboard.h +++ b/libs/SDL3/src/video/x11/SDL_x11clipboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11dyn.c b/libs/SDL3/src/video/x11/SDL_x11dyn.c index 0c73360d..7c48ed5c 100644 --- a/libs/SDL3/src/video/x11/SDL_x11dyn.c +++ b/libs/SDL3/src/video/x11/SDL_x11dyn.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -104,6 +104,8 @@ static void *X11_GetSym(const char *fnname, int *pHasModule) #ifdef X_HAVE_UTF8_STRING SDL_DYNX11FN_XCreateIC X11_XCreateIC = NULL; SDL_DYNX11FN_XGetICValues X11_XGetICValues = NULL; +SDL_DYNX11FN_XSetICValues X11_XSetICValues = NULL; +SDL_DYNX11FN_XVaCreateNestedList X11_XVaCreateNestedList = NULL; #endif /* These SDL_X11_HAVE_* flags are here whether you have dynamic X11 or not. */ @@ -129,6 +131,8 @@ void SDL_X11_UnloadSymbols(void) #ifdef X_HAVE_UTF8_STRING X11_XCreateIC = NULL; X11_XGetICValues = NULL; + X11_XSetICValues = NULL; + X11_XVaCreateNestedList = NULL; #endif #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC @@ -171,6 +175,10 @@ bool SDL_X11_LoadSymbols(void) X11_GetSym("XCreateIC", &SDL_X11_HAVE_UTF8); X11_XGetICValues = (SDL_DYNX11FN_XGetICValues) X11_GetSym("XGetICValues", &SDL_X11_HAVE_UTF8); + X11_XSetICValues = (SDL_DYNX11FN_XSetICValues) + X11_GetSym("XSetICValues", &SDL_X11_HAVE_UTF8); + X11_XVaCreateNestedList = (SDL_DYNX11FN_XVaCreateNestedList) + X11_GetSym("XVaCreateNestedList", &SDL_X11_HAVE_UTF8); #endif if (SDL_X11_HAVE_BASEXLIB) { @@ -191,6 +199,8 @@ bool SDL_X11_LoadSymbols(void) #ifdef X_HAVE_UTF8_STRING X11_XCreateIC = XCreateIC; X11_XGetICValues = XGetICValues; + X11_XSetICValues = XSetICValues; + X11_XVaCreateNestedList = XVaCreateNestedList; #endif #endif } diff --git a/libs/SDL3/src/video/x11/SDL_x11dyn.h b/libs/SDL3/src/video/x11/SDL_x11dyn.h index 9897b4f7..e9831fcd 100644 --- a/libs/SDL3/src/video/x11/SDL_x11dyn.h +++ b/libs/SDL3/src/video/x11/SDL_x11dyn.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -94,8 +94,12 @@ extern void SDL_X11_UnloadSymbols(void); #ifdef X_HAVE_UTF8_STRING typedef XIC (*SDL_DYNX11FN_XCreateIC)(XIM, ...); typedef char *(*SDL_DYNX11FN_XGetICValues)(XIC, ...); +typedef char *(*SDL_DYNX11FN_XSetICValues)(XIC, ...); +typedef XVaNestedList (*SDL_DYNX11FN_XVaCreateNestedList)(int, ...); extern SDL_DYNX11FN_XCreateIC X11_XCreateIC; extern SDL_DYNX11FN_XGetICValues X11_XGetICValues; +extern SDL_DYNX11FN_XSetICValues X11_XSetICValues; +extern SDL_DYNX11FN_XVaCreateNestedList X11_XVaCreateNestedList; #endif /* These SDL_X11_HAVE_* flags are here whether you have dynamic X11 or not. */ diff --git a/libs/SDL3/src/video/x11/SDL_x11events.c b/libs/SDL3/src/video/x11/SDL_x11events.c index 41a05f04..90ce95c5 100644 --- a/libs/SDL3/src/video/x11/SDL_x11events.c +++ b/libs/SDL3/src/video/x11/SDL_x11events.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -246,54 +246,140 @@ static void X11_HandleGenericEvent(SDL_VideoDevice *_this, XEvent *xev) } #endif // SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS -static unsigned X11_GetNumLockModifierMask(SDL_VideoDevice *_this) +static void X11_UpdateSystemKeyModifiers(SDL_VideoData *viddata) { - SDL_VideoData *videodata = _this->internal; - Display *display = videodata->display; - unsigned num_mask = 0; - int i, j; - XModifierKeymap *xmods; - unsigned n; + Window junk_window; + int x, y; - xmods = X11_XGetModifierMapping(display); - n = xmods->max_keypermod; - for (i = 3; i < 8; i++) { - for (j = 0; j < n; j++) { - KeyCode kc = xmods->modifiermap[i * n + j]; - if (videodata->key_layout[kc] == SDL_SCANCODE_NUMLOCKCLEAR) { - num_mask = 1 << i; - break; - } - } - } - X11_XFreeModifiermap(xmods); - - return num_mask; + X11_XQueryPointer(viddata->display, DefaultRootWindow(viddata->display), &junk_window, &junk_window, &x, &y, &x, &y, &viddata->xkb.xkb_modifiers); } -static unsigned X11_GetScrollLockModifierMask(SDL_VideoDevice *_this) +static void X11_ReconcileModifiers(SDL_VideoData *viddata) { - SDL_VideoData *videodata = _this->internal; - Display *display = videodata->display; - unsigned num_mask = 0; - int i, j; - XModifierKeymap *xmods; - unsigned n; + const Uint32 xk_modifiers = viddata->xkb.xkb_modifiers; - xmods = X11_XGetModifierMapping(display); - n = xmods->max_keypermod; - for (i = 3; i < 8; i++) { - for (j = 0; j < n; j++) { - KeyCode kc = xmods->modifiermap[i * n + j]; - if (videodata->key_layout[kc] == SDL_SCANCODE_SCROLLLOCK) { - num_mask = 1 << i; - break; - } + /* If a modifier was activated by a keypress, it will be tied to the + * specific left/right key that initiated it. Otherwise, the ambiguous + * left/right combo is used. + */ + if (xk_modifiers & ShiftMask) { + if (!(viddata->xkb.sdl_modifiers & SDL_KMOD_SHIFT)) { + viddata->xkb.sdl_modifiers |= SDL_KMOD_SHIFT; } + } else { + viddata->xkb.sdl_modifiers &= ~SDL_KMOD_SHIFT; } - X11_XFreeModifiermap(xmods); - return num_mask; + if (xk_modifiers & ControlMask) { + if (!(viddata->xkb.sdl_modifiers & SDL_KMOD_CTRL)) { + viddata->xkb.sdl_modifiers |= SDL_KMOD_CTRL; + } + } else { + viddata->xkb.sdl_modifiers &= ~SDL_KMOD_CTRL; + } + + // Mod1 is used for the Alt keys + if (xk_modifiers & Mod1Mask) { + if (!(viddata->xkb.sdl_modifiers & SDL_KMOD_ALT)) { + viddata->xkb.sdl_modifiers |= SDL_KMOD_ALT; + } + } else { + viddata->xkb.sdl_modifiers &= ~SDL_KMOD_ALT; + } + + // Mod4 is used for the Super (aka GUI/Logo) keys. + if (xk_modifiers & Mod4Mask) { + if (!(viddata->xkb.sdl_modifiers & SDL_KMOD_GUI)) { + viddata->xkb.sdl_modifiers |= SDL_KMOD_GUI; + } + } else { + viddata->xkb.sdl_modifiers &= ~SDL_KMOD_GUI; + } + + // Mod3 is typically Level 5 shift. + if (xk_modifiers & Mod3Mask) { + viddata->xkb.sdl_modifiers |= SDL_KMOD_LEVEL5; + } else { + viddata->xkb.sdl_modifiers &= ~SDL_KMOD_LEVEL5; + } + + // Mod5 is typically Level 3 shift (aka AltGr). + if (xk_modifiers & Mod5Mask) { + viddata->xkb.sdl_modifiers |= SDL_KMOD_MODE; + } else { + viddata->xkb.sdl_modifiers &= ~SDL_KMOD_MODE; + } + + if (xk_modifiers & viddata->xkb.numlock_mask) { + viddata->xkb.sdl_modifiers |= SDL_KMOD_NUM; + } else { + viddata->xkb.sdl_modifiers &= ~SDL_KMOD_NUM; + } + + if (xk_modifiers & viddata->xkb.scrolllock_mask) { + viddata->xkb.sdl_modifiers |= SDL_KMOD_SCROLL; + } else { + viddata->xkb.sdl_modifiers &= ~SDL_KMOD_SCROLL; + } + + SDL_SetModState(viddata->xkb.sdl_modifiers); +} + +static void X11_HandleModifierKeys(SDL_VideoData *viddata, SDL_Scancode scancode, bool pressed, bool reconcile) +{ + const SDL_Keycode keycode = SDL_GetKeyFromScancode(scancode, SDL_KMOD_NONE, false); + SDL_Keymod mod = SDL_KMOD_NONE; + + /* SDL clients expect modifier state to be activated at the same time as the + * source keypress, so we set pressed modifier state with the usual modifier + * keys here, as the explicit modifier event won't arrive until after the + * keypress event. If this is wrong, it will be corrected when the explicit + * modifier state is checked. + */ + switch (keycode) { + case SDLK_LSHIFT: + mod = SDL_KMOD_LSHIFT; + break; + case SDLK_RSHIFT: + mod = SDL_KMOD_RSHIFT; + break; + case SDLK_LCTRL: + mod = SDL_KMOD_LCTRL; + break; + case SDLK_RCTRL: + mod = SDL_KMOD_RCTRL; + break; + case SDLK_LALT: + mod = SDL_KMOD_LALT; + break; + case SDLK_RALT: + mod = SDL_KMOD_RALT; + break; + case SDLK_LGUI: + mod = SDL_KMOD_LGUI; + break; + case SDLK_RGUI: + mod = SDL_KMOD_RGUI; + break; + case SDLK_MODE: + mod = SDL_KMOD_MODE; + break; + case SDLK_LEVEL5_SHIFT: + mod = SDL_KMOD_LEVEL5; + break; + default: + break; + } + + if (pressed) { + viddata->xkb.sdl_modifiers |= mod; + } else { + viddata->xkb.sdl_modifiers &= ~mod; + } + + if (reconcile) { + X11_ReconcileModifiers(viddata); + } } void X11_ReconcileKeyboardState(SDL_VideoDevice *_this) @@ -302,20 +388,10 @@ void X11_ReconcileKeyboardState(SDL_VideoDevice *_this) Display *display = videodata->display; char keys[32]; int keycode; - Window junk_window; - int x, y; - unsigned int mask; const bool *keyboardState; X11_XQueryKeymap(display, keys); - // Sync up the keyboard modifier state - if (X11_XQueryPointer(display, DefaultRootWindow(display), &junk_window, &junk_window, &x, &y, &x, &y, &mask)) { - SDL_ToggleModState(SDL_KMOD_CAPS, (mask & LockMask) ? true : false); - SDL_ToggleModState(SDL_KMOD_NUM, (mask & X11_GetNumLockModifierMask(_this)) ? true : false); - SDL_ToggleModState(SDL_KMOD_SCROLL, (mask & X11_GetScrollLockModifierMask(_this)) ? true : false); - } - keyboardState = SDL_GetKeyboardState(0); for (keycode = 0; keycode < SDL_arraysize(videodata->key_layout); ++keycode) { SDL_Scancode scancode = videodata->key_layout[keycode]; @@ -334,15 +410,21 @@ void X11_ReconcileKeyboardState(SDL_VideoDevice *_this) case SDLK_LGUI: case SDLK_RGUI: case SDLK_MODE: - SDL_SendKeyboardKey(0, SDL_GLOBAL_KEYBOARD_ID, keycode, scancode, true); + case SDLK_LEVEL5_SHIFT: + X11_HandleModifierKeys(videodata, scancode, true, false); + SDL_SendKeyboardKeyIgnoreModifiers(0, SDL_GLOBAL_KEYBOARD_ID, keycode, scancode, true); break; default: break; } } else if (!x11KeyPressed && sdlKeyPressed) { - SDL_SendKeyboardKey(0, SDL_GLOBAL_KEYBOARD_ID, keycode, scancode, false); + X11_HandleModifierKeys(videodata, scancode, false, false); + SDL_SendKeyboardKeyIgnoreModifiers(0, SDL_GLOBAL_KEYBOARD_ID, keycode, scancode, false); } } + + X11_UpdateSystemKeyModifiers(videodata); + X11_ReconcileModifiers(videodata); } static void X11_DispatchFocusIn(SDL_VideoDevice *_this, SDL_WindowData *data) @@ -356,9 +438,6 @@ static void X11_DispatchFocusIn(SDL_VideoDevice *_this, SDL_WindowData *data) if (data->ic) { X11_XSetICFocus(data->ic); } -#endif -#ifdef SDL_USE_IME - SDL_IME_SetFocus(true); #endif if (data->flashing_window) { X11_FlashWindow(_this, data->window, SDL_FLASH_CANCEL); @@ -382,9 +461,6 @@ static void X11_DispatchFocusOut(SDL_VideoDevice *_this, SDL_WindowData *data) X11_XUnsetICFocus(data->ic); } #endif -#ifdef SDL_USE_IME - SDL_IME_SetFocus(false); -#endif } static void X11_DispatchMapNotify(SDL_WindowData *data) @@ -811,13 +887,15 @@ void X11_HandleKeyEvent(SDL_VideoDevice *_this, SDL_WindowData *windowdata, SDL_ char text[64]; Status status = 0; bool handled_by_ime = false; + bool pressed = (xevent->type == KeyPress); + SDL_Scancode scancode = videodata->key_layout[keycode]; Uint64 timestamp = X11_GetEventTimestamp(xevent->xkey.time); #ifdef DEBUG_XEVENTS SDL_Log("window 0x%lx %s (X11 keycode = 0x%X)\n", xevent->xany.window, (xevent->type == KeyPress ? "KeyPress" : "KeyRelease"), xevent->xkey.keycode); #endif #ifdef DEBUG_SCANCODES - if (videodata->key_layout[keycode] == SDL_SCANCODE_UNKNOWN && keycode) { + if (scancode == SDL_SCANCODE_UNKNOWN && keycode) { int min_keycode, max_keycode; X11_XDisplayKeycodes(display, &min_keycode, &max_keycode); keysym = X11_KeyCodeToSym(_this, keycode, xevent->xkey.state >> 13); @@ -828,63 +906,40 @@ void X11_HandleKeyEvent(SDL_VideoDevice *_this, SDL_WindowData *windowdata, SDL_ #endif // DEBUG SCANCODES text[0] = '\0'; + X11_UpdateSystemKeyModifiers(videodata); if (SDL_TextInputActive(windowdata->window)) { -#if defined(HAVE_IBUS_IBUS_H) || defined(HAVE_FCITX) - /* Save the original keycode for dead keys, which are filtered out by - the XFilterEvent() call below. - */ - int orig_event_type = xevent->type; - KeyCode orig_keycode = xevent->xkey.keycode; -#endif - // filter events catches XIM events and sends them to the correct handler if (X11_XFilterEvent(xevent, None)) { #ifdef DEBUG_XEVENTS SDL_Log("Filtered event type = %d display = %p window = 0x%lx\n", xevent->type, xevent->xany.display, xevent->xany.window); #endif - // Make sure dead key press/release events are sent - /* But only if we're using one of the DBus IMEs, otherwise - some XIM IMEs will generate duplicate events */ -#if defined(HAVE_IBUS_IBUS_H) || defined(HAVE_FCITX) - SDL_Scancode scancode = videodata->key_layout[orig_keycode]; - videodata->filter_code = orig_keycode; - videodata->filter_time = xevent->xkey.time; - - if (orig_event_type == KeyPress) { - SDL_SendKeyboardKey(timestamp, keyboardID, orig_keycode, scancode, true); - } else { - SDL_SendKeyboardKey(timestamp, keyboardID, orig_keycode, scancode, false); - } -#endif - return; + handled_by_ime = true; } + if (!handled_by_ime) { #ifdef X_HAVE_UTF8_STRING - if (windowdata->ic && xevent->type == KeyPress) { - text_length = X11_Xutf8LookupString(windowdata->ic, &xevent->xkey, text, sizeof(text) - 1, - &keysym, &status); - } else { - text_length = XLookupStringAsUTF8(&xevent->xkey, text, sizeof(text) - 1, &keysym, NULL); - } + if (windowdata->ic && xevent->type == KeyPress) { + text_length = X11_Xutf8LookupString(windowdata->ic, &xevent->xkey, text, sizeof(text) - 1, + &keysym, &status); + } else { + text_length = XLookupStringAsUTF8(&xevent->xkey, text, sizeof(text) - 1, &keysym, NULL); + } #else - text_length = XLookupStringAsUTF8(&xevent->xkey, text, sizeof(text) - 1, &keysym, NULL); -#endif - -#ifdef SDL_USE_IME - handled_by_ime = SDL_IME_ProcessKeyEvent(keysym, keycode, (xevent->type == KeyPress)); + text_length = XLookupStringAsUTF8(&xevent->xkey, text, sizeof(text) - 1, &keysym, NULL); #endif + } } if (!handled_by_ime) { - if (xevent->type == KeyPress) { - // Don't send the key if it looks like a duplicate of a filtered key sent by an IME - if (xevent->xkey.keycode != videodata->filter_code || xevent->xkey.time != videodata->filter_time) { - SDL_SendKeyboardKey(timestamp, keyboardID, keycode, videodata->key_layout[keycode], true); - } + if (pressed) { + X11_HandleModifierKeys(videodata, scancode, true, true); + SDL_SendKeyboardKeyIgnoreModifiers(timestamp, keyboardID, keycode, scancode, true); + if (*text) { text[text_length] = '\0'; + X11_ClearComposition(windowdata); SDL_SendKeyboardText(text); } } else { @@ -892,11 +947,13 @@ void X11_HandleKeyEvent(SDL_VideoDevice *_this, SDL_WindowData *windowdata, SDL_ // We're about to get a repeated key down, ignore the key up return; } - SDL_SendKeyboardKey(timestamp, keyboardID, keycode, videodata->key_layout[keycode], false); + + X11_HandleModifierKeys(videodata, scancode, false, true); + SDL_SendKeyboardKeyIgnoreModifiers(timestamp, keyboardID, keycode, scancode, false); } } - if (xevent->type == KeyPress) { + if (pressed) { X11_UpdateUserTime(windowdata, xevent->xkey.time); } } @@ -1101,11 +1158,12 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent) #endif if (SDL_GetKeyboardFocus() != NULL) { #ifdef SDL_VIDEO_DRIVER_X11_HAS_XKBLOOKUPKEYSYM - if (videodata->xkb) { + if (videodata->xkb.desc_ptr) { XkbStateRec state; if (X11_XkbGetState(videodata->display, XkbUseCoreKbd, &state) == Success) { - if (state.group != videodata->xkb_group) { + if (state.group != videodata->xkb.current_group) { // Only rebuild the keymap if the layout has changed. + videodata->xkb.current_group = state.group; X11_UpdateKeymap(_this, true); } } @@ -1375,15 +1433,9 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent) SDL_GlobalToRelativeForWindow(data->window, x, y, &x, &y); SDL_SendWindowEvent(data->window, SDL_EVENT_WINDOW_MOVED, x, y); -#ifdef SDL_USE_IME - if (SDL_TextInputActive(data->window)) { - // Update IME candidate list position - SDL_IME_UpdateTextInputArea(NULL); - } -#endif for (w = data->window->first_child; w; w = w->next_sibling) { - // Don't update hidden child windows, their relative position doesn't change - if (!(w->flags & SDL_WINDOW_HIDDEN)) { + // Don't update hidden child popup windows, their relative position doesn't change + if (SDL_WINDOW_IS_POPUP(w) && !(w->flags & SDL_WINDOW_HIDDEN)) { X11_UpdateWindowPosition(w, true); } } @@ -2022,13 +2074,6 @@ int X11_WaitEventTimeout(SDL_VideoDevice *_this, Sint64 timeoutNS) X11_DispatchEvent(_this, &xevent); -#ifdef SDL_USE_IME - SDL_Window *keyboard_focus = SDL_GetKeyboardFocus(); - if (keyboard_focus && SDL_TextInputActive(keyboard_focus)) { - SDL_IME_PumpEvents(); - } -#endif - #ifdef SDL_USE_LIBDBUS SDL_DBus_PumpEvents(); #endif @@ -2083,13 +2128,6 @@ void X11_PumpEvents(SDL_VideoDevice *_this) X11_DispatchEvent(_this, &xevent); } -#ifdef SDL_USE_IME - SDL_Window *keyboard_focus = SDL_GetKeyboardFocus(); - if (keyboard_focus && SDL_TextInputActive(keyboard_focus)) { - SDL_IME_PumpEvents(); - } -#endif - #ifdef SDL_USE_LIBDBUS SDL_DBus_PumpEvents(); #endif diff --git a/libs/SDL3/src/video/x11/SDL_x11events.h b/libs/SDL3/src/video/x11/SDL_x11events.h index 4e00f04e..bb76f836 100644 --- a/libs/SDL3/src/video/x11/SDL_x11events.h +++ b/libs/SDL3/src/video/x11/SDL_x11events.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11framebuffer.c b/libs/SDL3/src/video/x11/SDL_x11framebuffer.c index a586ba4a..12642ccb 100644 --- a/libs/SDL3/src/video/x11/SDL_x11framebuffer.c +++ b/libs/SDL3/src/video/x11/SDL_x11framebuffer.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11framebuffer.h b/libs/SDL3/src/video/x11/SDL_x11framebuffer.h index ea4bf349..08feda4e 100644 --- a/libs/SDL3/src/video/x11/SDL_x11framebuffer.h +++ b/libs/SDL3/src/video/x11/SDL_x11framebuffer.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11keyboard.c b/libs/SDL3/src/video/x11/SDL_x11keyboard.c index 1ec1df1d..336f906e 100644 --- a/libs/SDL3/src/video/x11/SDL_x11keyboard.c +++ b/libs/SDL3/src/video/x11/SDL_x11keyboard.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -32,6 +32,7 @@ #include "../../events/imKStoUCS.h" #include "../../events/SDL_keysym_to_scancode_c.h" +#include "../../events/SDL_keysym_to_keycode_c.h" #ifdef X_HAVE_UTF8_STRING #include @@ -90,9 +91,9 @@ KeySym X11_KeyCodeToSym(SDL_VideoDevice *_this, KeyCode keycode, unsigned char g SDL_zero(mods_ret); #ifdef SDL_VIDEO_DRIVER_X11_HAS_XKBLOOKUPKEYSYM - if (data->xkb) { - int num_groups = XkbKeyNumGroups(data->xkb, keycode); - unsigned char info = XkbKeyGroupInfo(data->xkb, keycode); + if (data->xkb.desc_ptr) { + int num_groups = XkbKeyNumGroups(data->xkb.desc_ptr, keycode); + unsigned char info = XkbKeyGroupInfo(data->xkb.desc_ptr, keycode); if (num_groups && group >= num_groups) { @@ -152,8 +153,8 @@ bool X11_InitKeyboard(SDL_VideoDevice *_this) int xkb_major = XkbMajorVersion; int xkb_minor = XkbMinorVersion; - if (X11_XkbQueryExtension(data->display, NULL, &data->xkb_event, NULL, &xkb_major, &xkb_minor)) { - data->xkb = X11_XkbGetMap(data->display, XkbAllClientInfoMask, XkbUseCoreKbd); + if (X11_XkbQueryExtension(data->display, NULL, &data->xkb.event, NULL, &xkb_major, &xkb_minor)) { + data->xkb.desc_ptr = X11_XkbGetMap(data->display, XkbAllClientInfoMask, XkbUseCoreKbd); } // This will remove KeyRelease events for held keys @@ -168,9 +169,6 @@ bool X11_InitKeyboard(SDL_VideoDevice *_this) Compose keys will work correctly. */ char *prev_locale = setlocale(LC_ALL, NULL); char *prev_xmods = X11_XSetLocaleModifiers(NULL); - const char *new_xmods = ""; - const char *env_xmods = SDL_getenv("XMODIFIERS"); - bool has_dbus_ime_support = false; if (prev_locale) { prev_locale = SDL_strdup(prev_locale); @@ -180,22 +178,8 @@ bool X11_InitKeyboard(SDL_VideoDevice *_this) prev_xmods = SDL_strdup(prev_xmods); } - /* IBus resends some key events that were filtered by XFilterEvents - when it is used via XIM which causes issues. Prevent this by forcing - @im=none if XMODIFIERS contains @im=ibus. IBus can still be used via - the DBus implementation, which also has support for pre-editing. */ - if (env_xmods && SDL_strstr(env_xmods, "@im=ibus") != NULL) { - has_dbus_ime_support = true; - } - if (env_xmods && SDL_strstr(env_xmods, "@im=fcitx") != NULL) { - has_dbus_ime_support = true; - } - if (has_dbus_ime_support || !xkb_repeat) { - new_xmods = "@im=none"; - } - (void)setlocale(LC_ALL, ""); - X11_XSetLocaleModifiers(new_xmods); + X11_XSetLocaleModifiers(""); data->im = X11_XOpenIM(data->display, NULL, NULL, NULL); @@ -280,7 +264,7 @@ bool X11_InitKeyboard(SDL_VideoDevice *_this) if (scancode == data->key_layout[i]) { continue; } - if ((SDL_GetKeymapKeycode(NULL, scancode, SDL_KMOD_NONE) & SDLK_SCANCODE_MASK) && X11_ScancodeIsRemappable(scancode)) { + if ((SDL_GetKeymapKeycode(NULL, scancode, SDL_KMOD_NONE) & (SDLK_SCANCODE_MASK | SDLK_EXTENDED_MASK)) && X11_ScancodeIsRemappable(scancode)) { // Not a character key and the scancode is safe to remap #ifdef DEBUG_KEYBOARD SDL_Log("Changing scancode, was %d (%s), now %d (%s)\n", data->key_layout[i], SDL_GetScancodeName(data->key_layout[i]), scancode, SDL_GetScancodeName(scancode)); @@ -317,15 +301,61 @@ bool X11_InitKeyboard(SDL_VideoDevice *_this) SDL_SetScancodeName(SDL_SCANCODE_APPLICATION, "Menu"); -#ifdef SDL_USE_IME - SDL_IME_Init(); -#endif - X11_ReconcileKeyboardState(_this); return true; } +static unsigned X11_GetNumLockModifierMask(SDL_VideoDevice *_this) +{ + SDL_VideoData *videodata = _this->internal; + Display *display = videodata->display; + unsigned num_mask = 0; + int i, j; + XModifierKeymap *xmods; + unsigned n; + + xmods = X11_XGetModifierMapping(display); + n = xmods->max_keypermod; + for (i = 3; i < 8; i++) { + for (j = 0; j < n; j++) { + KeyCode kc = xmods->modifiermap[i * n + j]; + if (videodata->key_layout[kc] == SDL_SCANCODE_NUMLOCKCLEAR) { + num_mask = 1 << i; + break; + } + } + } + X11_XFreeModifiermap(xmods); + + return num_mask; +} + +static unsigned X11_GetScrollLockModifierMask(SDL_VideoDevice *_this) +{ + SDL_VideoData *videodata = _this->internal; + Display *display = videodata->display; + unsigned num_mask = 0; + int i, j; + XModifierKeymap *xmods; + unsigned n; + + xmods = X11_XGetModifierMapping(display); + n = xmods->max_keypermod; + for (i = 3; i < 8; i++) { + for (j = 0; j < n; j++) { + KeyCode kc = xmods->modifiermap[i * n + j]; + if (videodata->key_layout[kc] == SDL_SCANCODE_SCROLLLOCK) { + num_mask = 1 << i; + break; + } + } + } + X11_XFreeModifiermap(xmods); + + return num_mask; +} + void X11_UpdateKeymap(SDL_VideoDevice *_this, bool send_event) { struct Keymod_masks @@ -340,53 +370,72 @@ void X11_UpdateKeymap(SDL_VideoDevice *_this, bool send_event) { SDL_KMOD_MODE, Mod5Mask }, { SDL_KMOD_MODE | SDL_KMOD_SHIFT, Mod5Mask | ShiftMask }, { SDL_KMOD_MODE | SDL_KMOD_CAPS, Mod5Mask | LockMask }, - { SDL_KMOD_MODE | SDL_KMOD_SHIFT | SDL_KMOD_CAPS, Mod5Mask | ShiftMask | LockMask } + { SDL_KMOD_MODE | SDL_KMOD_SHIFT | SDL_KMOD_CAPS, Mod5Mask | ShiftMask | LockMask }, + { SDL_KMOD_LEVEL5, Mod3Mask }, + { SDL_KMOD_LEVEL5 | SDL_KMOD_SHIFT, Mod3Mask | ShiftMask }, + { SDL_KMOD_LEVEL5 | SDL_KMOD_CAPS, Mod3Mask | LockMask }, + { SDL_KMOD_LEVEL5 | SDL_KMOD_SHIFT | SDL_KMOD_CAPS, Mod3Mask | ShiftMask | LockMask }, + { SDL_KMOD_LEVEL5 | SDL_KMOD_MODE, Mod5Mask | Mod3Mask }, + { SDL_KMOD_LEVEL5 | SDL_KMOD_MODE | SDL_KMOD_SHIFT, Mod3Mask | Mod5Mask | ShiftMask }, + { SDL_KMOD_LEVEL5 | SDL_KMOD_MODE | SDL_KMOD_CAPS, Mod3Mask | Mod5Mask | LockMask }, + { SDL_KMOD_LEVEL5 | SDL_KMOD_MODE | SDL_KMOD_SHIFT | SDL_KMOD_CAPS, Mod3Mask | Mod5Mask | ShiftMask | LockMask } }; SDL_VideoData *data = _this->internal; - int i; SDL_Scancode scancode; - SDL_Keymap *keymap; - - keymap = SDL_CreateKeymap(); + SDL_Keymap *keymap = SDL_CreateKeymap(); #ifdef SDL_VIDEO_DRIVER_X11_HAS_XKBLOOKUPKEYSYM - if (data->xkb) { + if (data->xkb.desc_ptr) { XkbStateRec state; - X11_XkbGetUpdatedMap(data->display, XkbAllClientInfoMask, data->xkb); + X11_XkbGetUpdatedMap(data->display, XkbAllClientInfoMask, data->xkb.desc_ptr); if (X11_XkbGetState(data->display, XkbUseCoreKbd, &state) == Success) { - data->xkb_group = state.group; + data->xkb.current_group = state.group; } } #endif for (int m = 0; m < SDL_arraysize(keymod_masks); ++m) { - for (i = 0; i < SDL_arraysize(data->key_layout); i++) { - SDL_Keycode keycode; - + for (int i = 0; i < SDL_arraysize(data->key_layout); ++i) { // Make sure this is a valid scancode scancode = data->key_layout[i]; if (scancode == SDL_SCANCODE_UNKNOWN) { continue; } - KeySym keysym = X11_KeyCodeToSym(_this, i, data->xkb_group, keymod_masks[m].xkb_mask); + const KeySym keysym = X11_KeyCodeToSym(_this, i, data->xkb.current_group, keymod_masks[m].xkb_mask); - // Note: The default SDL scancode table sets this to right alt instead of AltGr/Mode, so handle it separately. - if (keysym != XK_ISO_Level3_Shift) { - keycode = SDL_KeySymToUcs4(keysym); - } else { - keycode = SDLK_MODE; - } + if (keysym != NoSymbol) { + SDL_Keycode keycode = SDL_GetKeyCodeFromKeySym(keysym, i, keymod_masks[m].sdl_mask); - if (!keycode) { - SDL_Scancode keyScancode = SDL_GetScancodeFromKeySym(keysym, (KeyCode)i); - keycode = SDL_GetKeymapKeycode(NULL, keyScancode, keymod_masks[m].sdl_mask); + if (!keycode) { + switch (scancode) { + case SDL_SCANCODE_RETURN: + keycode = SDLK_RETURN; + break; + case SDL_SCANCODE_ESCAPE: + keycode = SDLK_ESCAPE; + break; + case SDL_SCANCODE_BACKSPACE: + keycode = SDLK_BACKSPACE; + break; + case SDL_SCANCODE_DELETE: + keycode = SDLK_DELETE; + break; + default: + keycode = SDL_SCANCODE_TO_KEYCODE(scancode); + break; + } + } + + SDL_SetKeymapEntry(keymap, scancode, keymod_masks[m].sdl_mask, keycode); } - SDL_SetKeymapEntry(keymap, scancode, keymod_masks[m].sdl_mask, keycode); } } + + data->xkb.numlock_mask = X11_GetNumLockModifierMask(_this); + data->xkb.scrolllock_mask = X11_GetScrollLockModifierMask(_this); SDL_SetKeymap(keymap, send_event); } @@ -395,15 +444,232 @@ void X11_QuitKeyboard(SDL_VideoDevice *_this) SDL_VideoData *data = _this->internal; #ifdef SDL_VIDEO_DRIVER_X11_HAS_XKBLOOKUPKEYSYM - if (data->xkb) { - X11_XkbFreeKeyboard(data->xkb, 0, True); - data->xkb = NULL; + if (data->xkb.desc_ptr) { + X11_XkbFreeKeyboard(data->xkb.desc_ptr, 0, True); + data->xkb.desc_ptr = NULL; } #endif +} -#ifdef SDL_USE_IME - SDL_IME_Quit(); +void X11_ClearComposition(SDL_WindowData *data) +{ + if (data->preedit_length > 0) { + data->preedit_text[0] = '\0'; + data->preedit_length = 0; + } + + if (data->ime_needs_clear_composition) { + SDL_SendEditingText("", 0, 0); + data->ime_needs_clear_composition = false; + } +} + +static void X11_SendEditingEvent(SDL_WindowData *data) +{ + if (data->preedit_length == 0) { + X11_ClearComposition(data); + return; + } + + bool in_highlight = false; + int start = -1, length = 0, i; + for (i = 0; i < data->preedit_length; ++i) { + if (data->preedit_feedback[i] & (XIMReverse | XIMHighlight)) { + if (start < 0) { + start = i; + in_highlight = true; + } + } else if (in_highlight) { + // Found the end of the highlight + break; + } + } + if (in_highlight) { + length = (i - start); + } else { + start = SDL_clamp(data->preedit_cursor, 0, data->preedit_length); + } + SDL_SendEditingText(data->preedit_text, start, length); + + data->ime_needs_clear_composition = true; +} + +static int preedit_start_callback(XIC xic, XPointer client_data, XPointer call_data) +{ + // No limit on preedit text length + return -1; +} + +static void preedit_done_callback(XIC xic, XPointer client_data, XPointer call_data) +{ +} + +static void preedit_draw_callback(XIC xic, XPointer client_data, XIMPreeditDrawCallbackStruct *call_data) +{ + SDL_WindowData *data = (SDL_WindowData *)client_data; + int chg_first = SDL_clamp(call_data->chg_first, 0, data->preedit_length); + int chg_length = SDL_clamp(call_data->chg_length, 0, data->preedit_length - chg_first); + + const char *start = data->preedit_text; + if (chg_length > 0) { + // Delete text in range + for (int i = 0; start && *start && i < chg_first; ++i) { + SDL_StepUTF8(&start, NULL); + } + + const char *end = start; + for (int i = 0; end && *end && i < chg_length; ++i) { + SDL_StepUTF8(&end, NULL); + } + + if (end > start) { + SDL_memmove((char *)start, end, SDL_strlen(end) + 1); + if ((chg_first + chg_length) > data->preedit_length) { + SDL_memmove(&data->preedit_feedback[chg_first], &data->preedit_feedback[chg_first + chg_length], (data->preedit_length - chg_first - chg_length) * sizeof(*data->preedit_feedback)); + } + } + data->preedit_length -= chg_length; + } + + XIMText *text = call_data->text; + if (text) { + // Insert text in range + SDL_assert(!text->encoding_is_wchar); + + // The text length isn't calculated as directed by the spec, recalculate it now + if (text->string.multi_byte) { + text->length = SDL_utf8strlen(text->string.multi_byte); + } + + size_t string_size = SDL_strlen(text->string.multi_byte); + size_t size = string_size + 1; + if (data->preedit_text) { + size += SDL_strlen(data->preedit_text); + } + char *preedit_text = (char *)SDL_malloc(size * sizeof(*preedit_text)); + if (preedit_text) { + size_t pre_size = (start - data->preedit_text); + size_t post_size = start ? SDL_strlen(start) : 0; + if (pre_size > 0) { + SDL_memcpy(&preedit_text[0], data->preedit_text, pre_size); + } + SDL_memcpy(&preedit_text[pre_size], text->string.multi_byte, string_size); + if (post_size > 0) { + SDL_memcpy(&preedit_text[pre_size + string_size], start, post_size); + } + preedit_text[size - 1] = '\0'; + } + + size_t feedback_size = data->preedit_length + text->length; + XIMFeedback *feedback = (XIMFeedback *)SDL_malloc(feedback_size * sizeof(*feedback)); + if (feedback) { + size_t pre_size = (size_t)chg_first; + size_t post_size = (size_t)data->preedit_length - pre_size; + if (pre_size > 0) { + SDL_memcpy(&feedback[0], data->preedit_feedback, pre_size * sizeof(*feedback)); + } + SDL_memcpy(&feedback[pre_size], text->feedback, text->length * sizeof(*feedback)); + if (post_size > 0) { + SDL_memcpy(&feedback[pre_size + text->length], &data->preedit_feedback[pre_size], post_size * sizeof(*feedback)); + } + } + + if (preedit_text && feedback) { + SDL_free(data->preedit_text); + data->preedit_text = preedit_text; + + SDL_free(data->preedit_feedback); + data->preedit_feedback = feedback; + + data->preedit_length += text->length; + } else { + SDL_free(preedit_text); + SDL_free(feedback); + } + } + + data->preedit_cursor = call_data->caret; + +#ifdef DEBUG_XIM + if (call_data->chg_length > 0) { + SDL_Log("Draw callback deleted %d characters at %d\n", call_data->chg_length, call_data->chg_first); + } + if (text) { + SDL_Log("Draw callback inserted %s at %d, caret: %d\n", text->string.multi_byte, call_data->chg_first, call_data->caret); + } + SDL_Log("Pre-edit text: %s\n", data->preedit_text); #endif + + X11_SendEditingEvent(data); +} + +static void preedit_caret_callback(XIC xic, XPointer client_data, XIMPreeditCaretCallbackStruct *call_data) +{ + SDL_WindowData *data = (SDL_WindowData *)client_data; + + switch (call_data->direction) { + case XIMAbsolutePosition: + if (call_data->position != data->preedit_cursor) { + data->preedit_cursor = call_data->position; + X11_SendEditingEvent(data); + } + break; + case XIMDontChange: + break; + default: + // Not currently supported + break; + } +} + +void X11_CreateInputContext(SDL_WindowData *data) +{ +#ifdef X_HAVE_UTF8_STRING + SDL_VideoData *videodata = data->videodata; + + if (SDL_X11_HAVE_UTF8 && videodata->im) { + const char *hint = SDL_GetHint(SDL_HINT_IME_IMPLEMENTED_UI); + if (hint && SDL_strstr(hint, "composition")) { + XIMCallback draw_callback; + draw_callback.client_data = (XPointer)data; + draw_callback.callback = (XIMProc)preedit_draw_callback; + + XIMCallback start_callback; + start_callback.client_data = (XPointer)data; + start_callback.callback = (XIMProc)preedit_start_callback; + + XIMCallback done_callback; + done_callback.client_data = (XPointer)data; + done_callback.callback = (XIMProc)preedit_done_callback; + + XIMCallback caret_callback; + caret_callback.client_data = (XPointer)data; + caret_callback.callback = (XIMProc)preedit_caret_callback; + + XVaNestedList attr = X11_XVaCreateNestedList(0, + XNPreeditStartCallback, &start_callback, + XNPreeditDoneCallback, &done_callback, + XNPreeditDrawCallback, &draw_callback, + XNPreeditCaretCallback, &caret_callback, + NULL); + if (attr) { + data->ic = X11_XCreateIC(videodata->im, + XNInputStyle, XIMPreeditCallbacks | XIMStatusCallbacks, + XNPreeditAttributes, attr, + XNClientWindow, data->xwindow, + NULL); + X11_XFree(attr); + } + } else { + data->ic = X11_XCreateIC(videodata->im, + XNInputStyle, XIMPreeditNothing | XIMStatusNothing, + XNClientWindow, data->xwindow, + NULL); + } + data->xim_spot.x = -1; + data->xim_spot.y = -1; + } +#endif // X_HAVE_UTF8_STRING } static void X11_ResetXIM(SDL_VideoDevice *_this, SDL_Window *window) @@ -418,7 +684,7 @@ static void X11_ResetXIM(SDL_VideoDevice *_this, SDL_Window *window) X11_XFree(contents); } } -#endif +#endif // X_HAVE_UTF8_STRING } bool X11_StartTextInput(SDL_VideoDevice *_this, SDL_Window *window, SDL_PropertiesID props) @@ -431,16 +697,27 @@ bool X11_StartTextInput(SDL_VideoDevice *_this, SDL_Window *window, SDL_Properti bool X11_StopTextInput(SDL_VideoDevice *_this, SDL_Window *window) { X11_ResetXIM(_this, window); -#ifdef SDL_USE_IME - SDL_IME_Reset(); -#endif return true; } bool X11_UpdateTextInputArea(SDL_VideoDevice *_this, SDL_Window *window) { -#ifdef SDL_USE_IME - SDL_IME_UpdateTextInputArea(window); +#ifdef X_HAVE_UTF8_STRING + SDL_WindowData *data = window->internal; + + if (data && data->ic) { + XPoint spot; + spot.x = window->text_input_rect.x + window->text_input_cursor; + spot.y = window->text_input_rect.y + window->text_input_rect.h; + if (spot.x != data->xim_spot.x || spot.y != data->xim_spot.y) { + XVaNestedList attr = X11_XVaCreateNestedList(0, XNSpotLocation, &spot, NULL); + if (attr) { + X11_XSetICValues(data->ic, XNPreeditAttributes, attr, NULL); + X11_XFree(attr); + } + SDL_copyp(&data->xim_spot, &spot); + } + } #endif return true; } diff --git a/libs/SDL3/src/video/x11/SDL_x11keyboard.h b/libs/SDL3/src/video/x11/SDL_x11keyboard.h index 8c57b6d0..a6cd2f7e 100644 --- a/libs/SDL3/src/video/x11/SDL_x11keyboard.h +++ b/libs/SDL3/src/video/x11/SDL_x11keyboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -26,6 +26,8 @@ extern bool X11_InitKeyboard(SDL_VideoDevice *_this); extern void X11_UpdateKeymap(SDL_VideoDevice *_this, bool send_event); extern void X11_QuitKeyboard(SDL_VideoDevice *_this); +extern void X11_CreateInputContext(SDL_WindowData *data); +extern void X11_ClearComposition(SDL_WindowData *data); extern bool X11_StartTextInput(SDL_VideoDevice *_this, SDL_Window *window, SDL_PropertiesID props); extern bool X11_StopTextInput(SDL_VideoDevice *_this, SDL_Window *window); extern bool X11_UpdateTextInputArea(SDL_VideoDevice *_this, SDL_Window *window); diff --git a/libs/SDL3/src/video/x11/SDL_x11messagebox.c b/libs/SDL3/src/video/x11/SDL_x11messagebox.c index 2ecaa346..a2fdba48 100644 --- a/libs/SDL3/src/video/x11/SDL_x11messagebox.c +++ b/libs/SDL3/src/video/x11/SDL_x11messagebox.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -45,8 +45,16 @@ #define MIN_DIALOG_WIDTH 200 // Minimum dialog width #define MIN_DIALOG_HEIGHT 100 // Minimum dialog height -static const char g_MessageBoxFontLatin1[] = "-*-*-medium-r-normal--0-120-*-*-p-0-iso8859-1"; -static const char g_MessageBoxFont[] = "-*-*-medium-r-normal--*-120-*-*-*-*-*-*"; +static const char g_MessageBoxFontLatin1[] = + "-*-*-medium-r-normal--0-120-*-*-p-0-iso8859-1"; + +static const char g_MessageBoxFont[] = + "-*-*-medium-r-normal--*-120-*-*-*-*-iso10646-1," // explicitly unicode (iso10646-1) + "-*-*-medium-r-*--*-120-*-*-*-*-iso10646-1," // explicitly unicode (iso10646-1) + "-*-*-*-*-*--*-*-*-*-*-*-iso10646-1," // just give me anything Unicode. + "-*-*-medium-r-normal--*-120-*-*-*-*-iso8859-1," // explicitly latin1, in case low-ASCII works out. + "-*-*-medium-r-*--*-120-*-*-*-*-iso8859-1," // explicitly latin1, in case low-ASCII works out. + "-*-*-*-*-*--*-*-*-*-*-*-iso8859-1"; // just give me anything latin1. static const SDL_MessageBoxColor g_default_colors[SDL_MESSAGEBOX_COLOR_COUNT] = { { 56, 54, 53 }, // SDL_MESSAGEBOX_COLOR_BACKGROUND, diff --git a/libs/SDL3/src/video/x11/SDL_x11messagebox.h b/libs/SDL3/src/video/x11/SDL_x11messagebox.h index 31686253..9baa875e 100644 --- a/libs/SDL3/src/video/x11/SDL_x11messagebox.h +++ b/libs/SDL3/src/video/x11/SDL_x11messagebox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11modes.c b/libs/SDL3/src/video/x11/SDL_x11modes.c index 53d30768..e17a2d10 100644 --- a/libs/SDL3/src/video/x11/SDL_x11modes.c +++ b/libs/SDL3/src/video/x11/SDL_x11modes.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -541,6 +541,38 @@ static bool X11_UpdateXRandRDisplay(SDL_VideoDevice *_this, Display *dpy, int sc return true; } +static XRRScreenResources *X11_GetScreenResources(Display *dpy, int screen) +{ + XRRScreenResources *res = X11_XRRGetScreenResourcesCurrent(dpy, RootWindow(dpy, screen)); + if (!res || res->noutput == 0) { + if (res) { + X11_XRRFreeScreenResources(res); + } + res = X11_XRRGetScreenResources(dpy, RootWindow(dpy, screen)); + } + return res; +} + +static void X11_CheckDisplaysMoved(SDL_VideoDevice *_this, Display *dpy) +{ + const int screen = DefaultScreen(dpy); + XRRScreenResources *res = X11_GetScreenResources(dpy, screen); + if (!res) { + return; + } + + SDL_DisplayID *displays = SDL_GetDisplays(NULL); + if (displays) { + for (int i = 0; displays[i]; ++i) { + SDL_VideoDisplay *display = SDL_GetVideoDisplay(displays[i]); + const SDL_DisplayData *displaydata = display->internal; + X11_UpdateXRandRDisplay(_this, dpy, screen, displaydata->xrandr_output, res, display); + } + SDL_free(displays); + } + X11_XRRFreeScreenResources(res); +} + static void X11_HandleXRandROutputChange(SDL_VideoDevice *_this, const XRROutputChangeNotifyEvent *ev) { SDL_DisplayID *displays; @@ -568,29 +600,19 @@ static void X11_HandleXRandROutputChange(SDL_VideoDevice *_this, const XRROutput if (display) { SDL_DelVideoDisplay(display->id, true); } + X11_CheckDisplaysMoved(_this, ev->display); + } else if (ev->connection == RR_Connected) { // output is coming online - Display *dpy = ev->display; - const int screen = DefaultScreen(dpy); - XVisualInfo vinfo; - if (get_visualinfo(dpy, screen, &vinfo)) { - XRRScreenResources *res = X11_XRRGetScreenResourcesCurrent(dpy, RootWindow(dpy, screen)); - if (!res || res->noutput == 0) { - if (res) { - X11_XRRFreeScreenResources(res); - } - res = X11_XRRGetScreenResources(dpy, RootWindow(dpy, screen)); - } - + if (!display) { + Display *dpy = ev->display; + const int screen = DefaultScreen(dpy); + XRRScreenResources *res = X11_GetScreenResources(dpy, screen); if (res) { - if (display) { - X11_UpdateXRandRDisplay(_this, dpy, screen, ev->output, res, display); - } else { - X11_AddXRandRDisplay(_this, dpy, screen, ev->output, res, true); - } - + X11_AddXRandRDisplay(_this, dpy, screen, ev->output, res, true); X11_XRRFreeScreenResources(res); } } + X11_CheckDisplaysMoved(_this, ev->display); } } @@ -661,7 +683,6 @@ static bool X11_InitModes_XRandR(SDL_VideoDevice *_this) const int screencount = ScreenCount(dpy); const int default_screen = DefaultScreen(dpy); RROutput primary = X11_XRRGetOutputPrimary(dpy, RootWindow(dpy, default_screen)); - XRRScreenResources *res = NULL; int xrandr_error_base = 0; int looking_for_primary; int output; @@ -679,16 +700,9 @@ static bool X11_InitModes_XRandR(SDL_VideoDevice *_this) continue; } - res = X11_XRRGetScreenResourcesCurrent(dpy, RootWindow(dpy, screen)); - if (!res || res->noutput == 0) { - if (res) { - X11_XRRFreeScreenResources(res); - } - - res = X11_XRRGetScreenResources(dpy, RootWindow(dpy, screen)); - if (!res) { - continue; - } + XRRScreenResources *res = X11_GetScreenResources(dpy, screen); + if (!res) { + continue; } for (output = 0; output < res->noutput; output++) { diff --git a/libs/SDL3/src/video/x11/SDL_x11modes.h b/libs/SDL3/src/video/x11/SDL_x11modes.h index d8a92032..35fd8662 100644 --- a/libs/SDL3/src/video/x11/SDL_x11modes.h +++ b/libs/SDL3/src/video/x11/SDL_x11modes.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11mouse.c b/libs/SDL3/src/video/x11/SDL_x11mouse.c index 5015d957..5c72dbfa 100644 --- a/libs/SDL3/src/video/x11/SDL_x11mouse.c +++ b/libs/SDL3/src/video/x11/SDL_x11mouse.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11mouse.h b/libs/SDL3/src/video/x11/SDL_x11mouse.h index 0d150630..2a2973c3 100644 --- a/libs/SDL3/src/video/x11/SDL_x11mouse.h +++ b/libs/SDL3/src/video/x11/SDL_x11mouse.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11opengl.c b/libs/SDL3/src/video/x11/SDL_x11opengl.c index e64d2f34..d46409f4 100644 --- a/libs/SDL3/src/video/x11/SDL_x11opengl.c +++ b/libs/SDL3/src/video/x11/SDL_x11opengl.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga Copyright (C) 2021 NVIDIA Corporation This software is provided 'as-is', without any express or implied diff --git a/libs/SDL3/src/video/x11/SDL_x11opengl.h b/libs/SDL3/src/video/x11/SDL_x11opengl.h index 7f13defd..24db485b 100644 --- a/libs/SDL3/src/video/x11/SDL_x11opengl.h +++ b/libs/SDL3/src/video/x11/SDL_x11opengl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11opengles.c b/libs/SDL3/src/video/x11/SDL_x11opengles.c index 56afa615..9c1910f7 100644 --- a/libs/SDL3/src/video/x11/SDL_x11opengles.c +++ b/libs/SDL3/src/video/x11/SDL_x11opengles.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11opengles.h b/libs/SDL3/src/video/x11/SDL_x11opengles.h index 7c8e0df1..f8e8d3b2 100644 --- a/libs/SDL3/src/video/x11/SDL_x11opengles.h +++ b/libs/SDL3/src/video/x11/SDL_x11opengles.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11pen.c b/libs/SDL3/src/video/x11/SDL_x11pen.c index 2a78ee99..38a331f8 100644 --- a/libs/SDL3/src/video/x11/SDL_x11pen.c +++ b/libs/SDL3/src/video/x11/SDL_x11pen.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11pen.h b/libs/SDL3/src/video/x11/SDL_x11pen.h index 365940ee..de751815 100644 --- a/libs/SDL3/src/video/x11/SDL_x11pen.h +++ b/libs/SDL3/src/video/x11/SDL_x11pen.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11shape.c b/libs/SDL3/src/video/x11/SDL_x11shape.c index b7d31a7a..710eb329 100644 --- a/libs/SDL3/src/video/x11/SDL_x11shape.c +++ b/libs/SDL3/src/video/x11/SDL_x11shape.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11shape.h b/libs/SDL3/src/video/x11/SDL_x11shape.h index 69d92ca5..d47d1030 100644 --- a/libs/SDL3/src/video/x11/SDL_x11shape.h +++ b/libs/SDL3/src/video/x11/SDL_x11shape.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11sym.h b/libs/SDL3/src/video/x11/SDL_x11sym.h index a84773db..68d70cd2 100644 --- a/libs/SDL3/src/video/x11/SDL_x11sym.h +++ b/libs/SDL3/src/video/x11/SDL_x11sym.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -223,6 +223,8 @@ SDL_X11_SYM(int,Xutf8LookupString,(XIC a,XKeyPressedEvent* b,char* c,int d,KeySy // SDL_X11_SYM(XIC,XCreateIC,(XIM, ...),return) !!! ARGH! SDL_X11_SYM(void,XDestroyIC,(XIC a),(a),) /* SDL_X11_SYM(char*,XGetICValues,(XIC, ...),return) !!! ARGH! */ +/* SDL_X11_SYM(char*,XSetICValues,(XIC, ...),return) !!! ARGH! */ +/* SDL_X11_SYM(XVaNestedList,XVaCreateNestedList,(int, ...),return) !!! ARGH! */ SDL_X11_SYM(void,XSetICFocus,(XIC a),(a),) SDL_X11_SYM(void,XUnsetICFocus,(XIC a),(a),) SDL_X11_SYM(XIM,XOpenIM,(Display* a,struct _XrmHashBucketRec* b,char* c,char* d),(a,b,c,d),return) diff --git a/libs/SDL3/src/video/x11/SDL_x11touch.c b/libs/SDL3/src/video/x11/SDL_x11touch.c index cbd9c9ba..5b42c97d 100644 --- a/libs/SDL3/src/video/x11/SDL_x11touch.c +++ b/libs/SDL3/src/video/x11/SDL_x11touch.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11touch.h b/libs/SDL3/src/video/x11/SDL_x11touch.h index 35abf5aa..548bf07a 100644 --- a/libs/SDL3/src/video/x11/SDL_x11touch.h +++ b/libs/SDL3/src/video/x11/SDL_x11touch.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11video.c b/libs/SDL3/src/video/x11/SDL_x11video.c index 275bd4db..d87dcc0f 100644 --- a/libs/SDL3/src/video/x11/SDL_x11video.c +++ b/libs/SDL3/src/video/x11/SDL_x11video.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11video.h b/libs/SDL3/src/video/x11/SDL_x11video.h index f801981e..a336a800 100644 --- a/libs/SDL3/src/video/x11/SDL_x11video.h +++ b/libs/SDL3/src/video/x11/SDL_x11video.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -141,12 +141,20 @@ struct SDL_VideoData bool xinput_hierarchy_changed; int xrandr_event_base; - + struct + { #ifdef SDL_VIDEO_DRIVER_X11_HAS_XKBLOOKUPKEYSYM - XkbDescPtr xkb; + XkbDescPtr desc_ptr; #endif - int xkb_event; - unsigned int xkb_group; + int event; + unsigned int current_group; + unsigned int xkb_modifiers; + + SDL_Keymod sdl_modifiers; + + Uint32 numlock_mask; + Uint32 scrolllock_mask; + } xkb; KeyCode filter_code; Time filter_time; diff --git a/libs/SDL3/src/video/x11/SDL_x11vulkan.c b/libs/SDL3/src/video/x11/SDL_x11vulkan.c index 92fc844b..065549b8 100644 --- a/libs/SDL3/src/video/x11/SDL_x11vulkan.c +++ b/libs/SDL3/src/video/x11/SDL_x11vulkan.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11vulkan.h b/libs/SDL3/src/video/x11/SDL_x11vulkan.h index d5f4ca63..2a625967 100644 --- a/libs/SDL3/src/video/x11/SDL_x11vulkan.h +++ b/libs/SDL3/src/video/x11/SDL_x11vulkan.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11window.c b/libs/SDL3/src/video/x11/SDL_x11window.c index 6d64bfcd..0ecabec6 100644 --- a/libs/SDL3/src/video/x11/SDL_x11window.c +++ b/libs/SDL3/src/video/x11/SDL_x11window.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -196,19 +196,19 @@ void X11_SetNetWMState(SDL_VideoDevice *_this, Window xwindow, SDL_WindowFlags f } } -static void X11_ConstrainPopup(SDL_Window *window, bool use_current_position) +static void X11_ConstrainPopup(SDL_Window *window, bool output_to_pending) { // Clamp popup windows to the output borders if (SDL_WINDOW_IS_POPUP(window)) { SDL_Window *w; SDL_DisplayID displayID; SDL_Rect rect; - int abs_x = use_current_position ? window->floating.x : window->pending.x; - int abs_y = use_current_position ? window->floating.y : window->pending.y; + int abs_x = window->last_position_pending ? window->pending.x : window->floating.x; + int abs_y = window->last_position_pending ? window->pending.y : window->floating.y; int offset_x = 0, offset_y = 0; // Calculate the total offset from the parents - for (w = window->parent; w->parent; w = w->parent) { + for (w = window->parent; SDL_WINDOW_IS_POPUP(w); w = w->parent) { offset_x += w->x; offset_y += w->y; } @@ -230,22 +230,30 @@ static void X11_ConstrainPopup(SDL_Window *window, bool use_current_position) abs_x = SDL_max(abs_x, rect.x); abs_y = SDL_max(abs_y, rect.y); - window->floating.x = window->windowed.x = abs_x - offset_x; - window->floating.y = window->windowed.y = abs_y - offset_y; + if (output_to_pending) { + window->pending.x = abs_x - offset_x; + window->pending.y = abs_y - offset_y; + } else { + window->floating.x = window->windowed.x = abs_x - offset_x; + window->floating.y = window->windowed.y = abs_y - offset_y; + } } } -static void X11_SetKeyboardFocus(SDL_Window *window) +static void X11_SetKeyboardFocus(SDL_Window *window, bool set_active_focus) { - SDL_Window *topmost = window; + SDL_Window *toplevel = window; - // Find the topmost parent - while (topmost->parent) { - topmost = topmost->parent; + // Find the toplevel parent + while (SDL_WINDOW_IS_POPUP(toplevel)) { + toplevel = toplevel->parent; } - topmost->internal->keyboard_focus = window; - SDL_SetKeyboardFocus(window); + toplevel->internal->keyboard_focus = window; + + if (set_active_focus && !window->is_hiding && !window->is_destroying) { + SDL_SetKeyboardFocus(window); + } } Uint32 X11_GetNetWMState(SDL_VideoDevice *_this, SDL_Window *window, Window xwindow) @@ -348,19 +356,12 @@ static bool SetupWindowData(SDL_VideoDevice *_this, SDL_Window *window, Window w if (!data) { return false; } + data->videodata = videodata; data->window = window; data->xwindow = w; data->hit_test_result = SDL_HITTEST_NORMAL; -#ifdef X_HAVE_UTF8_STRING - if (SDL_X11_HAVE_UTF8 && videodata->im) { - data->ic = - X11_XCreateIC(videodata->im, XNClientWindow, w, XNFocusWindow, w, - XNInputStyle, XIMPreeditNothing | XIMStatusNothing, - NULL); - } -#endif - data->videodata = videodata; + X11_CreateInputContext(data); // Associate the data with the window @@ -685,7 +686,7 @@ bool X11_CreateWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_Properties } if (SDL_WINDOW_IS_POPUP(window)) { - X11_ConstrainPopup(window, true); + X11_ConstrainPopup(window, false); } SDL_RelativeToGlobalForWindow(window, window->floating.x, window->floating.y, @@ -1085,7 +1086,7 @@ bool X11_SetWindowPosition(SDL_VideoDevice *_this, SDL_Window *window) if (!(window->flags & SDL_WINDOW_FULLSCREEN)) { if (SDL_WINDOW_IS_POPUP(window)) { - X11_ConstrainPopup(window, false); + X11_ConstrainPopup(window, true); } X11_UpdateWindowPosition(window, false); } else { @@ -1119,9 +1120,11 @@ static void X11_SetWMNormalHints(SDL_VideoDevice *_this, SDL_Window *window, XSi and transitioning from windowed to fullscreen in Unity. */ X11_XResizeWindow(display, data->xwindow, window->pending.w, window->pending.h); + const int x = window->last_position_pending ? window->pending.x : window->floating.x; + const int y = window->last_position_pending ? window->pending.y : window->floating.y; SDL_RelativeToGlobalForWindow(window, - window->pending.x - data->border_left, - window->pending.y - data->border_top, + x - data->border_left, + y - data->border_top, &dest_x, &dest_y); X11_XMoveWindow(display, data->xwindow, dest_x, dest_y); X11_XRaiseWindow(display, data->xwindow); @@ -1431,11 +1434,15 @@ void X11_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window) bool bActivate = SDL_GetHintBoolean(SDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN, true); XEvent event; - if (window->parent) { - // Update our position in case our parent moved while we were hidden - X11_UpdateWindowPosition(window, true); + if (SDL_WINDOW_IS_POPUP(window)) { + // Update the position in case the parent moved while we were hidden + X11_ConstrainPopup(window, true); + X11_UpdateWindowPosition(window, false); } + const int target_x = window->last_position_pending ? window->pending.x : window->x; + const int target_y = window->last_position_pending ? window->pending.y : window->y; + /* Whether XMapRaised focuses the window is based on the window type and it is * wm specific. There isn't much we can do here */ (void)bActivate; @@ -1460,9 +1467,7 @@ void X11_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window) // Popup menus grab the keyboard if (window->flags & SDL_WINDOW_POPUP_MENU) { - if (window->parent == SDL_GetKeyboardFocus()) { - X11_SetKeyboardFocus(window); - } + X11_SetKeyboardFocus(window, window->parent == SDL_GetKeyboardFocus()); } // Get some valid border values, if we haven't received them yet @@ -1487,9 +1492,9 @@ void X11_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window) SDL_GlobalToRelativeForWindow(data->window, x, y, &x, &y); // If the borders appeared, this happened automatically in the event system, otherwise, set the position now. - if (data->disable_size_position_events && (window->x != x || window->y != y)) { + if (data->disable_size_position_events && (target_x != x || target_y != y)) { data->pending_operation = X11_PENDING_OP_MOVE; - X11_XMoveWindow(display, data->xwindow, window->x, window->y); + X11_XMoveWindow(display, data->xwindow, target_x, target_y); } SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_RESIZED, data->last_xconfigure.width, data->last_xconfigure.height); @@ -1518,16 +1523,20 @@ void X11_HideWindow(SDL_VideoDevice *_this, SDL_Window *window) // Transfer keyboard focus back to the parent if (window->flags & SDL_WINDOW_POPUP_MENU) { - if (window == SDL_GetKeyboardFocus()) { - SDL_Window *new_focus = window->parent; + SDL_Window *new_focus = window->parent; + bool set_focus = window == SDL_GetKeyboardFocus(); - // Find the highest level window that isn't being hidden or destroyed. - while (new_focus->parent && (new_focus->is_hiding || new_focus->is_destroying)) { - new_focus = new_focus->parent; + // Find the highest level window, up to the toplevel parent, that isn't being hidden or destroyed. + while (SDL_WINDOW_IS_POPUP(new_focus) && (new_focus->is_hiding || new_focus->is_destroying)) { + new_focus = new_focus->parent; + + // If some window in the chain currently had focus, set it to the new lowest-level window. + if (!set_focus) { + set_focus = new_focus == SDL_GetKeyboardFocus(); } - - X11_SetKeyboardFocus(new_focus); } + + X11_SetKeyboardFocus(new_focus, set_focus); } X11_XSync(display, False); @@ -2028,6 +2037,8 @@ void X11_DestroyWindow(SDL_VideoDevice *_this, SDL_Window *window) #ifdef X_HAVE_UTF8_STRING if (data->ic) { X11_XDestroyIC(data->ic); + SDL_free(data->preedit_text); + SDL_free(data->preedit_feedback); } #endif diff --git a/libs/SDL3/src/video/x11/SDL_x11window.h b/libs/SDL3/src/video/x11/SDL_x11window.h index 8a9e8b29..16936033 100644 --- a/libs/SDL3/src/video/x11/SDL_x11window.h +++ b/libs/SDL3/src/video/x11/SDL_x11window.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -111,6 +111,13 @@ struct SDL_WindowData bool toggle_borders; bool fullscreen_borders_forced_on; SDL_HitTestResult hit_test_result; + + XPoint xim_spot; + char *preedit_text; + XIMFeedback *preedit_feedback; + int preedit_length; + int preedit_cursor; + bool ime_needs_clear_composition; }; extern void X11_SetNetWMState(SDL_VideoDevice *_this, Window xwindow, SDL_WindowFlags flags); diff --git a/libs/SDL3/src/video/x11/SDL_x11xfixes.c b/libs/SDL3/src/video/x11/SDL_x11xfixes.c index 1e4432a1..517ebc86 100644 --- a/libs/SDL3/src/video/x11/SDL_x11xfixes.c +++ b/libs/SDL3/src/video/x11/SDL_x11xfixes.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11xfixes.h b/libs/SDL3/src/video/x11/SDL_x11xfixes.h index 3a0eb510..bd8e437d 100644 --- a/libs/SDL3/src/video/x11/SDL_x11xfixes.h +++ b/libs/SDL3/src/video/x11/SDL_x11xfixes.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11xinput2.c b/libs/SDL3/src/video/x11/SDL_x11xinput2.c index 214a5c01..32a62dd1 100644 --- a/libs/SDL3/src/video/x11/SDL_x11xinput2.c +++ b/libs/SDL3/src/video/x11/SDL_x11xinput2.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -482,7 +482,7 @@ void X11_HandleXinput2Event(SDL_VideoDevice *_this, XGenericEventCookie *cookie) float x, y; SDL_Window *window = xinput2_get_sdlwindow(videodata, xev->event); xinput2_normalize_touch_coordinates(window, xev->event_x, xev->event_y, &x, &y); - SDL_SendTouch(0, xev->sourceid, xev->detail, window, true, x, y, 1.0); + SDL_SendTouch(0, xev->sourceid, xev->detail, window, SDL_EVENT_FINGER_DOWN, x, y, 1.0); } break; case XI_TouchEnd: @@ -491,7 +491,7 @@ void X11_HandleXinput2Event(SDL_VideoDevice *_this, XGenericEventCookie *cookie) float x, y; SDL_Window *window = xinput2_get_sdlwindow(videodata, xev->event); xinput2_normalize_touch_coordinates(window, xev->event_x, xev->event_y, &x, &y); - SDL_SendTouch(0, xev->sourceid, xev->detail, window, false, x, y, 1.0); + SDL_SendTouch(0, xev->sourceid, xev->detail, window, SDL_EVENT_FINGER_UP, x, y, 1.0); } break; case XI_TouchUpdate: diff --git a/libs/SDL3/src/video/x11/SDL_x11xinput2.h b/libs/SDL3/src/video/x11/SDL_x11xinput2.h index 43172267..c96c020b 100644 --- a/libs/SDL3/src/video/x11/SDL_x11xinput2.h +++ b/libs/SDL3/src/video/x11/SDL_x11xinput2.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11xsync.c b/libs/SDL3/src/video/x11/SDL_x11xsync.c index ada1ce39..5981f6f1 100644 --- a/libs/SDL3/src/video/x11/SDL_x11xsync.c +++ b/libs/SDL3/src/video/x11/SDL_x11xsync.c @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2023 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/src/video/x11/SDL_x11xsync.h b/libs/SDL3/src/video/x11/SDL_x11xsync.h index 610e892e..bc747c15 100644 --- a/libs/SDL3/src/video/x11/SDL_x11xsync.h +++ b/libs/SDL3/src/video/x11/SDL_x11xsync.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2023 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/CMakeLists.txt b/libs/SDL3/test/CMakeLists.txt index 1a799482..5ac19672 100644 --- a/libs/SDL3/test/CMakeLists.txt +++ b/libs/SDL3/test/CMakeLists.txt @@ -102,7 +102,7 @@ define_property(TARGET PROPERTY SDL_NONINTERACTIVE_ARGUMENTS BRIEF_DOCS "Argumen define_property(TARGET PROPERTY SDL_NONINTERACTIVE_TIMEOUT BRIEF_DOCS "Timeout for noninteractive executable." FULL_DOCS "Timeout for noninteractive executable.") macro(add_sdl_test_executable TARGET) - cmake_parse_arguments(AST "BUILD_DEPENDENT;NONINTERACTIVE;NEEDS_RESOURCES;TESTUTILS;THREADS;NO_C90;MAIN_CALLBACKS;NOTRACKMEM" "" "DISABLE_THREADS_ARGS;NONINTERACTIVE_TIMEOUT;NONINTERACTIVE_ARGS;INSTALLED_ARGS;SOURCES" ${ARGN}) + cmake_parse_arguments(AST "BUILD_DEPENDENT;NONINTERACTIVE;NEEDS_RESOURCES;TESTUTILS;THREADS;NO_C90;MAIN_CALLBACKS;NOTRACKMEM" "" "DEPENDS;DISABLE_THREADS_ARGS;NONINTERACTIVE_TIMEOUT;NONINTERACTIVE_ARGS;INSTALLED_ARGS;SOURCES" ${ARGN}) if(AST_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unknown argument(s): ${AST_UNPARSED_ARGUMENTS}") endif() @@ -121,6 +121,7 @@ macro(add_sdl_test_executable TARGET) else() add_executable(${TARGET} ${AST_SOURCES} ${EXTRA_SOURCES}) endif() + target_compile_definitions(${TARGET} PRIVATE HAVE_BUILD_CONFIG) SDL_AddCommonCompilerFlags(${TARGET}) target_include_directories(${TARGET} PRIVATE "${SDL3_SOURCE_DIR}/src/video/khronos") target_link_libraries(${TARGET} PRIVATE SDL3::SDL3_test SDL3::${sdl_name_component}) @@ -128,6 +129,9 @@ macro(add_sdl_test_executable TARGET) set_property(TARGET ${TARGET} PROPERTY C_STANDARD 90) set_property(TARGET ${TARGET} PROPERTY C_EXTENSIONS FALSE) endif() + if(AST_DEPENDS) + add_dependencies(${TARGET} ${AST_DEPENDS}) + endif() list(APPEND SDL_TEST_EXECUTABLES ${TARGET}) set_property(TARGET ${TARGET} PROPERTY SDL_NOTRACKMEM ${AST_NOTRACKMEM}) @@ -208,6 +212,50 @@ if(HAVE_LIBUDEV_H) add_definitions(-DHAVE_LIBUDEV_H) endif() +function(files2headers OUTPUT) + set(xxd "${SDL3_SOURCE_DIR}/cmake/xxd.py") + set(inputs ${ARGN}) + set(outputs ) + foreach(input IN LISTS inputs) + get_filename_component(file_we "${input}" NAME_WE) + set(intermediate "${CMAKE_CURRENT_BINARY_DIR}/${file_we}.h") + set(output "${CMAKE_CURRENT_SOURCE_DIR}/${file_we}.h") + list(APPEND outputs "${output}") + if(TARGET Python3::Interpreter AND NOT CMAKE_CROSSCOMPILING) + list(APPEND outputs "${intermediate}") + # Don't add the 'output' header to the output, to avoid marking them as GENERATED + # (generated files are removed when running the CLEAN target) + add_custom_command(OUTPUT "${intermediate}" + COMMAND Python3::Interpreter "${xxd}" -i "${CMAKE_CURRENT_SOURCE_DIR}/${input}" "-o" "${intermediate}" + COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${intermediate}" "${output}" + DEPENDS "${xxd}" "${bmp}" + ) + endif() + endforeach() + set(${OUTPUT} "${outputs}" PARENT_SCOPE) + add_custom_target(generate-${OUTPUT} DEPENDS ${outputs}) +endfunction() + +files2headers(gamepad_image_headers + gamepad_axis_arrow.bmp + gamepad_axis.bmp + gamepad_back.bmp + gamepad_battery.bmp + gamepad_battery_wired.bmp + gamepad_button_background.bmp + gamepad_button.bmp + gamepad_button_small.bmp + gamepad_face_abxy.bmp + gamepad_face_bayx.bmp + gamepad_face_sony.bmp + gamepad_front.bmp + gamepad_touchpad.bmp + gamepad_wired.bmp + gamepad_wireless.bmp +) +files2headers(icon_bmp_header icon.bmp) +files2headers(glass_bmp_header glass.bmp) + set(FFmpeg_FIND_COMPONENTS AVCODEC AVFORMAT AVUTIL SWSCALE) include("${CMAKE_CURRENT_LIST_DIR}/../cmake/FindFFmpeg.cmake") if(FFmpeg_FOUND) @@ -219,7 +267,7 @@ if(FFmpeg_FOUND) cmake_pop_check_state() endif() if(FFmpeg_FOUND AND LIBAVUTIL_AVFRAME_HAS_CH_LAYOUT) - add_sdl_test_executable(testffmpeg NO_C90 SOURCES testffmpeg.c testffmpeg_vulkan.c ${icon_bmp_header}) + add_sdl_test_executable(testffmpeg NO_C90 SOURCES testffmpeg.c testffmpeg_vulkan.c ${icon_bmp_header} DEPENDS generate-icon_bmp_header) if(LIBAVUTIL_AVFULKANFRAMESCONTEXT_HAS_FORMAT) target_compile_definitions(testffmpeg PRIVATE FFMPEG_VULKAN_SUPPORT) endif() @@ -290,52 +338,11 @@ elseif(HAVE_X11 OR HAVE_WAYLAND) endif () endif() -function(files2headers OUTPUT) - set(xxd "${SDL3_SOURCE_DIR}/cmake/xxd.py") - set(inputs ${ARGN}) - set(outputs ) - foreach(input IN LISTS inputs) - get_filename_component(file_we "${input}" NAME_WE) - set(intermediate "${CMAKE_CURRENT_BINARY_DIR}/${file_we}.h") - set(output "${CMAKE_CURRENT_SOURCE_DIR}/${file_we}.h") - list(APPEND outputs "${output}") - if(TARGET Python3::Interpreter AND NOT CMAKE_CROSSCOMPILING) - list(APPEND outputs "${intermediate}") - # Don't add the 'output' header to the output, to avoid marking them as GENERATED - # (generated files are removed when running the CLEAN target) - add_custom_command(OUTPUT "${intermediate}" - COMMAND Python3::Interpreter "${xxd}" -i "${CMAKE_CURRENT_SOURCE_DIR}/${input}" "-o" "${intermediate}" - COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${intermediate}" "${output}" - DEPENDS "${xxd}" "${bmp}" - ) - endif() - endforeach() - set(${OUTPUT} "${outputs}" PARENT_SCOPE) -endfunction() - -files2headers(gamepad_image_headers - gamepad_axis_arrow.bmp - gamepad_axis.bmp - gamepad_back.bmp - gamepad_battery.bmp - gamepad_battery_wired.bmp - gamepad_button_background.bmp - gamepad_button.bmp - gamepad_button_small.bmp - gamepad_face_abxy.bmp - gamepad_face_bayx.bmp - gamepad_face_sony.bmp - gamepad_front.bmp - gamepad_touchpad.bmp -) -files2headers(icon_bmp_header icon.bmp) -files2headers(glass_bmp_header glass.bmp) - add_sdl_test_executable(testasyncio MAIN_CALLBACKS NEEDS_RESOURCES TESTUTILS SOURCES testasyncio.c) add_sdl_test_executable(testaudio MAIN_CALLBACKS NEEDS_RESOURCES TESTUTILS SOURCES testaudio.c) add_sdl_test_executable(testcolorspace SOURCES testcolorspace.c) add_sdl_test_executable(testfile NONINTERACTIVE SOURCES testfile.c) -add_sdl_test_executable(testcontroller TESTUTILS SOURCES testcontroller.c gamepadutils.c ${gamepad_image_headers}) +add_sdl_test_executable(testcontroller TESTUTILS SOURCES testcontroller.c gamepadutils.c ${gamepad_image_headers} DEPENDS generate-gamepad_image_headers) add_sdl_test_executable(testgeometry TESTUTILS SOURCES testgeometry.c) add_sdl_test_executable(testgl SOURCES testgl.c) add_sdl_test_executable(testgles SOURCES testgles.c) @@ -381,15 +388,16 @@ add_sdl_test_executable(testshader NEEDS_RESOURCES TESTUTILS SOURCES testshader. if(EMSCRIPTEN) target_link_options(testshader PRIVATE "-sLEGACY_GL_EMULATION") endif() -add_sdl_test_executable(testshape NEEDS_RESOURCES SOURCES testshape.c ${glass_bmp_header}) +add_sdl_test_executable(testshape NEEDS_RESOURCES SOURCES testshape.c ${glass_bmp_header} DEPENDS generate-glass_bmp_header) add_sdl_test_executable(testsprite MAIN_CALLBACKS NEEDS_RESOURCES TESTUTILS SOURCES testsprite.c) -add_sdl_test_executable(testspriteminimal SOURCES testspriteminimal.c ${icon_bmp_header}) -add_sdl_test_executable(testspritesurface SOURCES testspritesurface.c ${icon_bmp_header}) +add_sdl_test_executable(testspriteminimal SOURCES testspriteminimal.c ${icon_bmp_header} DEPENDS generate-icon_bmp_header) +add_sdl_test_executable(testspritesurface SOURCES testspritesurface.c ${icon_bmp_header} DEPENDS generate-icon_bmp_header) add_sdl_test_executable(teststreaming NEEDS_RESOURCES TESTUTILS SOURCES teststreaming.c) add_sdl_test_executable(testtimer NONINTERACTIVE NONINTERACTIVE_ARGS --no-interactive NONINTERACTIVE_TIMEOUT 60 SOURCES testtimer.c) add_sdl_test_executable(testurl SOURCES testurl.c) add_sdl_test_executable(testver NONINTERACTIVE NOTRACKMEM SOURCES testver.c) add_sdl_test_executable(testcamera MAIN_CALLBACKS SOURCES testcamera.c) +add_sdl_test_executable(testclipboard MAIN_CALLBACKS SOURCES testclipboard.c ${icon_bmp_header} DEPENDS generate-icon_bmp_header) add_sdl_test_executable(testviewport NEEDS_RESOURCES TESTUTILS SOURCES testviewport.c) add_sdl_test_executable(testwm SOURCES testwm.c) add_sdl_test_executable(testyuv NONINTERACTIVE NONINTERACTIVE_ARGS "--automated" NEEDS_RESOURCES TESTUTILS SOURCES testyuv.c testyuv_cvt.c) diff --git a/libs/SDL3/test/LICENSE.txt b/libs/SDL3/test/LICENSE.txt index 472c6ad1..ff8b85ff 100644 --- a/libs/SDL3/test/LICENSE.txt +++ b/libs/SDL3/test/LICENSE.txt @@ -3,7 +3,7 @@ following license, which is different (more permissive) than SDL's usual license. /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/checkkeys.c b/libs/SDL3/test/checkkeys.c index c81f9aa8..67954923 100644 --- a/libs/SDL3/test/checkkeys.c +++ b/libs/SDL3/test/checkkeys.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -167,6 +167,9 @@ static void print_modifiers(char **text, size_t *maxlen, SDL_Keymod mod) if (mod & SDL_KMOD_MODE) { print_string(text, maxlen, " MODE"); } + if (mod & SDL_KMOD_LEVEL5) { + print_string(text, maxlen, " LEVEL5"); + } if (mod & SDL_KMOD_SCROLL) { print_string(text, maxlen, " SCROLL"); } diff --git a/libs/SDL3/test/gamepad_wired.bmp b/libs/SDL3/test/gamepad_wired.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7186025fd5b9efe4fab2a4bea71329f95ebbd10e GIT binary patch literal 1226 zcmbu8Pb)-G7>Cao?3AG_lxZT_*jmVDn$4^v$|TC#f+DhEX{9VF}l*O>01l5Kc^2{~RxM*TZ;-f!1KXX6Oo;2Lg0YqQ_+3qSPH kKm3~tBs6ak^dDR4%;Z3O+wQE{dDhn1)fwIgt-EXe085KdTL1t6 literal 0 HcmV?d00001 diff --git a/libs/SDL3/test/gamepad_wired.h b/libs/SDL3/test/gamepad_wired.h new file mode 100644 index 00000000..3da64cc9 --- /dev/null +++ b/libs/SDL3/test/gamepad_wired.h @@ -0,0 +1,106 @@ +unsigned char gamepad_wired_bmp[] = { + 0x42, 0x4d, 0xca, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, + 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x04, + 0x00, 0x00, 0xd7, 0x0d, 0x00, 0x00, 0xd7, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x42, 0x47, + 0x52, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, + 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x5e, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, + 0x00, 0xa9, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, + 0x00, 0xc5, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x13, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, + 0x00, 0xf3, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x71, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, + 0x00, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, + 0x00, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe1, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1d, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x25, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, + 0x00, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, + 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x56, 0x00, 0x00, 0x00, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, + 0x00, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, + 0x00, 0xed, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1a, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0xed, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x8d, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0xdf, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xf3, 0x00, 0x00, + 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, + 0x00, 0xf2, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, + 0x00, 0xed, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x5a, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, + 0x00, 0x55, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00 +}; +unsigned int gamepad_wired_bmp_len = 1226; diff --git a/libs/SDL3/test/gamepad_wireless.bmp b/libs/SDL3/test/gamepad_wireless.bmp new file mode 100644 index 0000000000000000000000000000000000000000..17c9fad662e9bb13c40a6ee8d40b979dd642c818 GIT binary patch literal 1162 zcmcJOJxjw-6ozlDi&ezIMQA}NNL zV@*};6I5*dlNl!Y2)g$Vc!~H6_`S45V$YI;*du5g7uX_5+o0LTbwEI8-oRu$$+`g7 zpqf+gTEQ8$#WB`DvwQq=<1P|cYyi}w-Z$vL1W0pm1)7)N>lI&T`|DP12h^*XYEEJw zhQLd&d+<3~KsnX;`l`iC*ay&g@1V1qP&XPDQ%*H)n1Z<02xxwv;IG}=FJiZ_3BO72 O%`7Y$^Vom+biV<-U`j~< literal 0 HcmV?d00001 diff --git a/libs/SDL3/test/gamepad_wireless.h b/libs/SDL3/test/gamepad_wireless.h new file mode 100644 index 00000000..ee87dad0 --- /dev/null +++ b/libs/SDL3/test/gamepad_wireless.h @@ -0,0 +1,100 @@ +unsigned char gamepad_wireless_bmp[] = { + 0x42, 0x4d, 0x8a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, + 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x23, 0x2e, 0x00, 0x00, 0x23, 0x2e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x42, 0x47, + 0x52, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0a, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, + 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0xea, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, + 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0xf5, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0xf5, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, + 0x00, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0x00, 0x84, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, + 0x00, 0x9a, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x69, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7b, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, + 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, + 0x00, 0xac, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, + 0x00, 0x99, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, + 0x00, 0xe9, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0xef, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0xf5, 0x00, 0x00, + 0x00, 0xf5, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0xf5, 0x00, 0x00, + 0x00, 0xf5, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x28, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0xf3, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, + 0x00, 0x64, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, + 0x00, 0xac, 0x00, 0x00, 0x00, 0xf3, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0xcc, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x4a, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0xf6, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, + 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, + 0x00, 0x34, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +unsigned int gamepad_wireless_bmp_len = 1162; diff --git a/libs/SDL3/test/gamepadutils.c b/libs/SDL3/test/gamepadutils.c index 072bd945..910887fb 100644 --- a/libs/SDL3/test/gamepadutils.c +++ b/libs/SDL3/test/gamepadutils.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -26,6 +26,8 @@ #include "gamepad_axis.h" #include "gamepad_axis_arrow.h" #include "gamepad_button_background.h" +#include "gamepad_wired.h" +#include "gamepad_wireless.h" /* This is indexed by gamepad element */ @@ -95,6 +97,7 @@ struct GamepadImage SDL_Texture *face_abxy_texture; SDL_Texture *face_bayx_texture; SDL_Texture *face_sony_texture; + SDL_Texture *connection_texture[2]; SDL_Texture *battery_texture[2]; SDL_Texture *touchpad_texture; SDL_Texture *button_texture; @@ -103,6 +106,8 @@ struct GamepadImage float gamepad_height; float face_width; float face_height; + float connection_width; + float connection_height; float battery_width; float battery_height; float touchpad_width; @@ -121,6 +126,7 @@ struct GamepadImage bool elements[SDL_GAMEPAD_ELEMENT_MAX]; + SDL_JoystickConnectionState connection_state; SDL_PowerState battery_state; int battery_percent; @@ -157,6 +163,10 @@ GamepadImage *CreateGamepadImage(SDL_Renderer *renderer) ctx->face_sony_texture = CreateTexture(renderer, gamepad_face_sony_bmp, gamepad_face_sony_bmp_len); SDL_GetTextureSize(ctx->face_abxy_texture, &ctx->face_width, &ctx->face_height); + ctx->connection_texture[0] = CreateTexture(renderer, gamepad_wired_bmp, gamepad_wired_bmp_len); + ctx->connection_texture[1] = CreateTexture(renderer, gamepad_wireless_bmp, gamepad_wireless_bmp_len); + SDL_GetTextureSize(ctx->connection_texture[0], &ctx->connection_width, &ctx->connection_height); + ctx->battery_texture[0] = CreateTexture(renderer, gamepad_battery_bmp, gamepad_battery_bmp_len); ctx->battery_texture[1] = CreateTexture(renderer, gamepad_battery_wired_bmp, gamepad_battery_wired_bmp_len); SDL_GetTextureSize(ctx->battery_texture[0], &ctx->battery_width, &ctx->battery_height); @@ -463,6 +473,7 @@ void UpdateGamepadImageFromGamepad(GamepadImage *ctx, SDL_Gamepad *gamepad) } } + ctx->connection_state = SDL_GetGamepadConnectionState(gamepad); ctx->battery_state = SDL_GetGamepadPowerInfo(gamepad, &ctx->battery_percent); if (SDL_GetNumGamepadTouchpads(gamepad) > 0) { @@ -565,6 +576,24 @@ void RenderGamepadImage(GamepadImage *ctx) } } + if (ctx->display_mode == CONTROLLER_MODE_TESTING) { + dst.x = ctx->x + ctx->gamepad_width - ctx->battery_width - 4 - ctx->connection_width; + dst.y = ctx->y; + dst.w = ctx->connection_width; + dst.h = ctx->connection_height; + + switch (ctx->connection_state) { + case SDL_JOYSTICK_CONNECTION_WIRED: + SDL_RenderTexture(ctx->renderer, ctx->connection_texture[0], NULL, &dst); + break; + case SDL_JOYSTICK_CONNECTION_WIRELESS: + SDL_RenderTexture(ctx->renderer, ctx->connection_texture[1], NULL, &dst); + break; + default: + break; + } + } + if (ctx->display_mode == CONTROLLER_MODE_TESTING && ctx->battery_state != SDL_POWERSTATE_NO_BATTERY && ctx->battery_state != SDL_POWERSTATE_UNKNOWN) { diff --git a/libs/SDL3/test/gamepadutils.h b/libs/SDL3/test/gamepadutils.h index 5c54ef51..c08261d1 100644 --- a/libs/SDL3/test/gamepadutils.h +++ b/libs/SDL3/test/gamepadutils.h @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/loopwave.c b/libs/SDL3/test/loopwave.c index 77ed7316..901abaad 100644 --- a/libs/SDL3/test/loopwave.c +++ b/libs/SDL3/test/loopwave.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/pretest.c b/libs/SDL3/test/pretest.c index 9d81f873..d207d5ed 100644 --- a/libs/SDL3/test/pretest.c +++ b/libs/SDL3/test/pretest.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testasyncio.c b/libs/SDL3/test/testasyncio.c index b330b4a9..5a9f719c 100644 --- a/libs/SDL3/test/testasyncio.c +++ b/libs/SDL3/test/testasyncio.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -139,7 +139,7 @@ static void async_io_task_complete(const SDL_AsyncIOOutcome *outcome) #define RESCASE(x) case x: resultstr = #x; break RESCASE(SDL_ASYNCIO_COMPLETE); RESCASE(SDL_ASYNCIO_FAILURE); - RESCASE(SDL_ASYNCIO_CANCELLED); + RESCASE(SDL_ASYNCIO_CANCELED); #undef RESCASE } diff --git a/libs/SDL3/test/testatomic.c b/libs/SDL3/test/testatomic.c index bf45317f..52d3fd9a 100644 --- a/libs/SDL3/test/testatomic.c +++ b/libs/SDL3/test/testatomic.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testaudio.c b/libs/SDL3/test/testaudio.c index 49dbfb3c..c39861f3 100644 --- a/libs/SDL3/test/testaudio.c +++ b/libs/SDL3/test/testaudio.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testaudiohotplug.c b/libs/SDL3/test/testaudiohotplug.c index 7331405f..9b77e8f8 100644 --- a/libs/SDL3/test/testaudiohotplug.c +++ b/libs/SDL3/test/testaudiohotplug.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testaudioinfo.c b/libs/SDL3/test/testaudioinfo.c index d2425c67..b561fb7f 100644 --- a/libs/SDL3/test/testaudioinfo.c +++ b/libs/SDL3/test/testaudioinfo.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testaudiorecording.c b/libs/SDL3/test/testaudiorecording.c index 3c0f18b0..88cbc73d 100644 --- a/libs/SDL3/test/testaudiorecording.c +++ b/libs/SDL3/test/testaudiorecording.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -172,7 +172,7 @@ SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) SDL_AppResult SDL_AppIterate(void *appstate) { - if (!SDL_AudioDevicePaused(SDL_GetAudioStreamDevice(stream_in))) { + if (!SDL_AudioStreamDevicePaused(stream_in)) { SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255); } else { SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); diff --git a/libs/SDL3/test/testaudiostreamdynamicresample.c b/libs/SDL3/test/testaudiostreamdynamicresample.c index e0dbb909..0dbde731 100644 --- a/libs/SDL3/test/testaudiostreamdynamicresample.c +++ b/libs/SDL3/test/testaudiostreamdynamicresample.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testautomation.c b/libs/SDL3/test/testautomation.c index a813b315..5effc8ac 100644 --- a/libs/SDL3/test/testautomation.c +++ b/libs/SDL3/test/testautomation.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testautomation_clipboard.c b/libs/SDL3/test/testautomation_clipboard.c index b986ec9e..3a70d310 100644 --- a/libs/SDL3/test/testautomation_clipboard.c +++ b/libs/SDL3/test/testautomation_clipboard.c @@ -108,6 +108,13 @@ static int SDLCALL clipboard_testClipboardDataFunctions(void *arg) result == true, "Validate SDL_ClearClipboardData result, expected true, got %i", result); + expected_text = ""; + text = SDL_GetClipboardText(); + SDLTest_AssertCheck( + text && SDL_strcmp(text, expected_text) == 0, + "Verify clipboard text, expected \"%s\", got \"%s\"", + expected_text, text); + SDL_free(text); /* Test clearing clipboard data when it's already clear */ last_clipboard_update_count = clipboard_update_count; @@ -117,8 +124,8 @@ static int SDLCALL clipboard_testClipboardDataFunctions(void *arg) "Validate SDL_ClearClipboardData result, expected true, got %i", result); SDLTest_AssertCheck( - clipboard_update_count == last_clipboard_update_count, - "Verify clipboard update unchanged, got %d", + clipboard_update_count != last_clipboard_update_count, + "Verify clipboard update count changed, got %d", clipboard_update_count - last_clipboard_update_count); /* Validate error handling */ @@ -430,8 +437,8 @@ static int SDLCALL clipboard_testClipboardTextFunctions(void *arg) "Verify SDL_HasClipboardText returned false, got %s", (boolResult) ? "true" : "false"); SDLTest_AssertCheck( - clipboard_update_count == last_clipboard_update_count, - "Verify clipboard update unchanged, got %d", + clipboard_update_count == last_clipboard_update_count + 1, + "Verify clipboard update count incremented by 1, got %d", clipboard_update_count - last_clipboard_update_count); diff --git a/libs/SDL3/test/testautomation_images.c b/libs/SDL3/test/testautomation_images.c index f81dde6c..839c2a27 100644 --- a/libs/SDL3/test/testautomation_images.c +++ b/libs/SDL3/test/testautomation_images.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testautomation_images.h b/libs/SDL3/test/testautomation_images.h index a9a5f27d..f5b2c9af 100644 --- a/libs/SDL3/test/testautomation_images.h +++ b/libs/SDL3/test/testautomation_images.h @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testautomation_intrinsics.c b/libs/SDL3/test/testautomation_intrinsics.c index 9aba459c..4b9cb65c 100644 --- a/libs/SDL3/test/testautomation_intrinsics.c +++ b/libs/SDL3/test/testautomation_intrinsics.c @@ -2,7 +2,7 @@ * Intrinsics test suite */ -#ifndef NO_BUILD_CONFIG +#ifdef HAVE_BUILD_CONFIG /* Disable intrinsics that are unsupported by the current compiler */ #include "SDL_build_config.h" #endif @@ -19,13 +19,13 @@ /* Helper functions */ -static int allocate_random_int_arrays(Sint32 **dest, Sint32 **a, Sint32 **b, size_t *size) { +static int allocate_random_uint_arrays(Uint32 **dest, Uint32 **a, Uint32 **b, size_t *size) { size_t i; *size = (size_t)SDLTest_RandomIntegerInRange(127, 999); - *dest = SDL_malloc(sizeof(Sint32) * *size); - *a = SDL_malloc(sizeof(Sint32) * *size); - *b = SDL_malloc(sizeof(Sint32) * *size); + *dest = SDL_malloc(sizeof(Uint32) * *size); + *a = SDL_malloc(sizeof(Uint32) * *size); + *b = SDL_malloc(sizeof(Uint32) * *size); if (!*dest || !*a || !*b) { SDLTest_AssertCheck(false, "SDL_malloc failed"); @@ -33,8 +33,8 @@ static int allocate_random_int_arrays(Sint32 **dest, Sint32 **a, Sint32 **b, siz } for (i = 0; i < *size; ++i) { - (*a)[i] = SDLTest_RandomSint32(); - (*b)[i] = SDLTest_RandomSint32(); + (*a)[i] = SDLTest_RandomUint32(); + (*b)[i] = SDLTest_RandomUint32(); } return 0; } @@ -90,12 +90,12 @@ static void free_arrays(void *dest, void *a, void *b) { /** * Verify element-wise addition of 2 int arrays. */ -static void verify_ints_addition(const Sint32 *dest, const Sint32 *a, const Sint32 *b, size_t size, const char *desc) { +static void verify_uints_addition(const Uint32 *dest, const Uint32 *a, const Uint32 *b, size_t size, const char *desc) { size_t i; int all_good = 1; for (i = 0; i < size; ++i) { - Sint32 expected = a[i] + b[i]; + Uint32 expected = a[i] + b[i]; if (dest[i] != expected) { SDLTest_AssertCheck(false, "%" SDL_PRIs32 " + %" SDL_PRIs32 " = %" SDL_PRIs32 ", expected %" SDL_PRIs32 " ([%" SDL_PRIu32 "/%" SDL_PRIu32 "] %s)", a[i], b[i], dest[i], expected, (Uint32)i, (Uint32)size, desc); @@ -108,16 +108,16 @@ static void verify_ints_addition(const Sint32 *dest, const Sint32 *a, const Sint } /** - * Verify element-wise multiplication of 2 int arrays. + * Verify element-wise multiplication of 2 uint arrays. */ -static void verify_ints_multiplication(const Sint32 *dest, const Sint32 *a, const Sint32 *b, size_t size, const char *desc) { +static void verify_uints_multiplication(const Uint32 *dest, const Uint32 *a, const Uint32 *b, size_t size, const char *desc) { size_t i; int all_good = 1; for (i = 0; i < size; ++i) { - Sint32 expected = a[i] * b[i]; + Uint32 expected = a[i] * b[i]; if (dest[i] != expected) { - SDLTest_AssertCheck(false, "%" SDL_PRIs32 " * %" SDL_PRIs32 " = %" SDL_PRIs32 ", expected %" SDL_PRIs32 " ([%" SDL_PRIu32 "/%" SDL_PRIu32 "] %s)", + SDLTest_AssertCheck(false, "%" SDL_PRIu32 " * %" SDL_PRIu32 " = %" SDL_PRIu32 ", expected %" SDL_PRIu32 " ([%" SDL_PRIu32 "/%" SDL_PRIu32 "] %s)", a[i], b[i], dest[i], expected, (Uint32)i, (Uint32)size, desc); all_good = 0; } @@ -171,13 +171,13 @@ static void verify_doubles_addition(const double *dest, const double *a, const d /* Intrinsic kernels */ -static void kernel_ints_add_cpu(Sint32 *dest, const Sint32 *a, const Sint32 *b, size_t size) { +static void kernel_uints_add_cpu(Uint32 *dest, const Uint32 *a, const Uint32 *b, size_t size) { for (; size; --size, ++dest, ++a, ++b) { *dest = *a + *b; } } -static void kernel_ints_mul_cpu(Sint32 *dest, const Sint32 *a, const Sint32 *b, size_t size) { +static void kernel_uints_mul_cpu(Uint32 *dest, const Uint32 *a, const Uint32 *b, size_t size) { for (; size; --size, ++dest, ++a, ++b) { *dest = *a * *b; } @@ -196,7 +196,7 @@ static void kernel_doubles_add_cpu(double *dest, const double *a, const double * } #ifdef SDL_MMX_INTRINSICS -SDL_TARGETING("mmx") static void kernel_ints_add_mmx(Sint32 *dest, const Sint32 *a, const Sint32 *b, size_t size) { +SDL_TARGETING("mmx") static void kernel_uints_add_mmx(Uint32 *dest, const Uint32 *a, const Uint32 *b, size_t size) { for (; size >= 2; size -= 2, dest += 2, a += 2, b += 2) { *(__m64*)dest = _mm_add_pi32(*(__m64*)a, *(__m64*)b); } @@ -230,7 +230,7 @@ SDL_TARGETING("sse2") static void kernel_doubles_add_sse2(double *dest, const do #endif #ifdef SDL_SSE3_INTRINSICS -SDL_TARGETING("sse3") static void kernel_ints_add_sse3(Sint32 *dest, const Sint32 *a, const Sint32 *b, size_t size) { +SDL_TARGETING("sse3") static void kernel_uints_add_sse3(Uint32 *dest, const Uint32 *a, const Uint32 *b, size_t size) { for (; size >= 4; size -= 4, dest += 4, a += 4, b += 4) { _mm_storeu_si128((__m128i*)dest, _mm_add_epi32(_mm_lddqu_si128((__m128i*)a), _mm_lddqu_si128((__m128i*)b))); } @@ -241,7 +241,7 @@ SDL_TARGETING("sse3") static void kernel_ints_add_sse3(Sint32 *dest, const Sint3 #endif #ifdef SDL_SSE4_1_INTRINSICS -SDL_TARGETING("sse4.1") static void kernel_ints_mul_sse4_1(Sint32 *dest, const Sint32 *a, const Sint32 *b, size_t size) { +SDL_TARGETING("sse4.1") static void kernel_uints_mul_sse4_1(Uint32 *dest, const Uint32 *a, const Uint32 *b, size_t size) { for (; size >= 4; size -= 4, dest += 4, a += 4, b += 4) { _mm_storeu_si128((__m128i*)dest, _mm_mullo_epi32(_mm_lddqu_si128((__m128i*)a), _mm_lddqu_si128((__m128i*)b))); } @@ -294,7 +294,7 @@ SDL_TARGETING("avx") static void kernel_floats_add_avx(float *dest, const float #endif #ifdef SDL_AVX2_INTRINSICS -SDL_TARGETING("avx2") static void kernel_ints_add_avx2(Sint32 *dest, const Sint32 *a, const Sint32 *b, size_t size) { +SDL_TARGETING("avx2") static void kernel_uints_add_avx2(Uint32 *dest, const Uint32 *a, const Uint32 *b, size_t size) { for (; size >= 8; size -= 8, dest += 8, a += 8, b += 8) { _mm256_storeu_si256((__m256i*)dest, _mm256_add_epi32(_mm256_loadu_si256((__m256i*)a), _mm256_loadu_si256((__m256i*)b))); } @@ -321,22 +321,22 @@ static int SDLCALL intrinsics_selftest(void *arg) { { size_t size; - Sint32 *dest, *a, *b; - if (allocate_random_int_arrays(&dest, &a, &b, &size) < 0) { + Uint32 *dest, *a, *b; + if (allocate_random_uint_arrays(&dest, &a, &b, &size) < 0) { return TEST_ABORTED; } - kernel_ints_mul_cpu(dest, a, b, size); - verify_ints_multiplication(dest, a, b, size, "CPU"); + kernel_uints_mul_cpu(dest, a, b, size); + verify_uints_multiplication(dest, a, b, size, "CPU"); free_arrays(dest, a, b); } { size_t size; - Sint32 *dest, *a, *b; - if (allocate_random_int_arrays(&dest, &a, &b, &size) < 0) { + Uint32 *dest, *a, *b; + if (allocate_random_uint_arrays(&dest, &a, &b, &size) < 0) { return TEST_ABORTED; } - kernel_ints_add_cpu(dest, a, b, size); - verify_ints_addition(dest, a, b, size, "CPU"); + kernel_uints_add_cpu(dest, a, b, size); + verify_uints_addition(dest, a, b, size, "CPU"); free_arrays(dest, a, b); } { @@ -369,14 +369,14 @@ static int SDLCALL intrinsics_testMMX(void *arg) #ifdef SDL_MMX_INTRINSICS { size_t size; - Sint32 *dest, *a, *b; + Uint32 *dest, *a, *b; SDLTest_AssertCheck(true, "Test executable uses MMX intrinsics."); - if (allocate_random_int_arrays(&dest, &a, &b, &size) < 0) { + if (allocate_random_uint_arrays(&dest, &a, &b, &size) < 0) { return TEST_ABORTED; } - kernel_ints_add_mmx(dest, a, b, size); - verify_ints_addition(dest, a, b, size, "MMX"); + kernel_uints_add_mmx(dest, a, b, size); + verify_uints_addition(dest, a, b, size, "MMX"); free_arrays(dest, a, b); return TEST_COMPLETED; @@ -453,14 +453,14 @@ static int SDLCALL intrinsics_testSSE3(void *arg) #ifdef SDL_SSE3_INTRINSICS { size_t size; - Sint32 *dest, *a, *b; + Uint32 *dest, *a, *b; SDLTest_AssertCheck(true, "Test executable uses SSE3 intrinsics."); - if (allocate_random_int_arrays(&dest, &a, &b, &size) < 0) { + if (allocate_random_uint_arrays(&dest, &a, &b, &size) < 0) { return TEST_ABORTED; } - kernel_ints_add_sse3(dest, a, b, size); - verify_ints_addition(dest, a, b, size, "SSE3"); + kernel_uints_add_sse3(dest, a, b, size); + verify_uints_addition(dest, a, b, size, "SSE3"); free_arrays(dest, a, b); return TEST_COMPLETED; @@ -481,14 +481,14 @@ static int SDLCALL intrinsics_testSSE4_1(void *arg) #ifdef SDL_SSE4_1_INTRINSICS { size_t size; - Sint32 *dest, *a, *b; + Uint32 *dest, *a, *b; SDLTest_AssertCheck(true, "Test executable uses SSE4.1 intrinsics."); - if (allocate_random_int_arrays(&dest, &a, &b, &size) < 0) { + if (allocate_random_uint_arrays(&dest, &a, &b, &size) < 0) { return TEST_ABORTED; } - kernel_ints_mul_sse4_1(dest, a, b, size); - verify_ints_multiplication(dest, a, b, size, "SSE4.1"); + kernel_uints_mul_sse4_1(dest, a, b, size); + verify_uints_multiplication(dest, a, b, size, "SSE4.1"); free_arrays(dest, a, b); return TEST_COMPLETED; @@ -572,14 +572,14 @@ static int SDLCALL intrinsics_testAVX2(void *arg) #ifdef SDL_AVX2_INTRINSICS { size_t size; - Sint32 *dest, *a, *b; + Uint32 *dest, *a, *b; SDLTest_AssertCheck(true, "Test executable uses AVX2 intrinsics."); - if (allocate_random_int_arrays(&dest, &a, &b, &size) < 0) { + if (allocate_random_uint_arrays(&dest, &a, &b, &size) < 0) { return TEST_ABORTED; } - kernel_ints_add_avx2(dest, a, b, size); - verify_ints_addition(dest, a, b, size, "AVX2"); + kernel_uints_add_avx2(dest, a, b, size); + verify_uints_addition(dest, a, b, size, "AVX2"); free_arrays(dest, a, b); return TEST_COMPLETED; diff --git a/libs/SDL3/test/testautomation_main.c b/libs/SDL3/test/testautomation_main.c index 3699d7ce..89991c02 100644 --- a/libs/SDL3/test/testautomation_main.c +++ b/libs/SDL3/test/testautomation_main.c @@ -9,7 +9,9 @@ #include #include #include "testautomation_suites.h" +#ifdef HAVE_BUILD_CONFIG #include "SDL_build_config.h" +#endif /** * Tests SDL_InitSubSystem() and SDL_QuitSubSystem() diff --git a/libs/SDL3/test/testautomation_render.c b/libs/SDL3/test/testautomation_render.c index 9a74d7c1..25572ee0 100644 --- a/libs/SDL3/test/testautomation_render.c +++ b/libs/SDL3/test/testautomation_render.c @@ -1149,8 +1149,8 @@ static int SDLCALL render_testLogicalSize(void *arg) CHECK_FUNC(SDL_SetRenderLogicalPresentation, (renderer, w / factor, h / factor, SDL_LOGICAL_PRESENTATION_LETTERBOX)) viewport.x = (TESTRENDER_SCREEN_W / 4) / factor; viewport.y = (TESTRENDER_SCREEN_H / 4) / factor; - viewport.w = TESTRENDER_SCREEN_W / factor; - viewport.h = TESTRENDER_SCREEN_H / factor; + viewport.w = (TESTRENDER_SCREEN_W / 2) / factor; + viewport.h = (TESTRENDER_SCREEN_H / 2) / factor; CHECK_FUNC(SDL_SetRenderViewport, (renderer, &viewport)) CHECK_FUNC(SDL_SetRenderDrawColor, (renderer, 0, 255, 0, SDL_ALPHA_OPAQUE)) CHECK_FUNC(SDL_RenderFillRect, (renderer, NULL)) diff --git a/libs/SDL3/test/testautomation_sdltest.c b/libs/SDL3/test/testautomation_sdltest.c index 9a07b024..34941b49 100644 --- a/libs/SDL3/test/testautomation_sdltest.c +++ b/libs/SDL3/test/testautomation_sdltest.c @@ -1063,17 +1063,15 @@ static int SDLCALL sdltest_randomIntegerInRange(void *arg) SDLTest_AssertPass("Call to SDLTest_RandomIntegerInRange(max,min)"); SDLTest_AssertCheck(min <= result && result <= max, "Validated returned value; expected: [%" SDL_PRIs32 ",%" SDL_PRIs32 "], got: %" SDL_PRIs32, min, max, result); -#if 0 /* This test correctly triggers an asan warning: runtime error: signed integer overflow: 2147483647 + 4239 cannot be represented in type 'int' */ /* Range with min at integer limit */ min = long_min; - max = long_max + (Sint32)SDLTest_RandomSint16(); + max = long_min + (Sint32)SDLTest_RandomUint16(); result = SDLTest_RandomIntegerInRange(min, max); SDLTest_AssertPass("Call to SDLTest_RandomIntegerInRange(SINT32_MIN,...)"); SDLTest_AssertCheck(min <= result && result <= max, "Validated returned value; expected: [%" SDL_PRIs32 ",%" SDL_PRIs32 "], got: %" SDL_PRIs32, min, max, result); -#endif /* Range with max at integer limit */ - min = long_min - (Sint32)SDLTest_RandomSint16(); + min = long_max - (Sint32)SDLTest_RandomUint16(); max = long_max; result = SDLTest_RandomIntegerInRange(min, max); SDLTest_AssertPass("Call to SDLTest_RandomIntegerInRange(...,SINT32_MAX)"); diff --git a/libs/SDL3/test/testautomation_stdlib.c b/libs/SDL3/test/testautomation_stdlib.c index a2ac6719..30735106 100644 --- a/libs/SDL3/test/testautomation_stdlib.c +++ b/libs/SDL3/test/testautomation_stdlib.c @@ -386,6 +386,22 @@ static int SDLCALL stdlib_swprintf(void *arg) const wchar_t *expected; size_t size; + result = SDL_swprintf(text, SDL_arraysize(text), L"%s", "hello, world"); + expected = L"hello, world"; + SDLTest_AssertPass("Call to SDL_swprintf(\"%%s\", \"hello, world\")"); + SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: %S, got: %S", expected, text); + SDLTest_AssertCheck(result == SDL_wcslen(text), "Check result value, expected: %d, got: %d", (int)SDL_wcslen(text), result); + + result = SDL_swprintf(text, 2, L"%s", "hello, world"); + expected = L"h"; + SDLTest_AssertPass("Call to SDL_swprintf(\"%%s\", \"hello, world\") with buffer size 2"); + SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: %S, got: %S", expected, text); + SDLTest_AssertCheck(result == 12, "Check result value, expected: 12, got: %d", result); + + result = SDL_swprintf(NULL, 0, L"%s", "hello, world"); + SDLTest_AssertPass("Call to SDL_swprintf(NULL, 0, \"%%s\", \"hello, world\")"); + SDLTest_AssertCheck(result == 12, "Check result value, expected: 12, got: %d", result); + result = SDL_swprintf(text, SDL_arraysize(text), L"%s", "foo"); expected = L"foo"; SDLTest_AssertPass("Call to SDL_swprintf(\"%%s\", \"foo\")"); @@ -1324,6 +1340,9 @@ static int SDLCALL stdlib_strtox(void *arg) STRTOX_TEST_CASE(SDL_strtoull, unsigned long long, FMT_PRILLu, "-uvwxyz", 32, -991, 3); STRTOX_TEST_CASE(SDL_strtoull, unsigned long long, FMT_PRILLu, "ZzZzZzZzZzZzZzZzZzZzZzZzZ", 36, ullong_max, 25); + STRTOX_TEST_CASE(SDL_strtoull, unsigned long long, FMT_PRILLu, "0", 0, 0, 1); + STRTOX_TEST_CASE(SDL_strtoull, unsigned long long, FMT_PRILLu, "0", 10, 0, 1); + STRTOX_TEST_CASE(SDL_strtoull, unsigned long long, FMT_PRILLu, "-0", 0, 0, 2); STRTOX_TEST_CASE(SDL_strtoull, unsigned long long, FMT_PRILLu, "-0", 10, 0, 2); STRTOX_TEST_CASE(SDL_strtoull, unsigned long long, FMT_PRILLu, " - 1", 0, 0, 0); // invalid input @@ -1335,6 +1354,10 @@ static int SDLCALL stdlib_strtox(void *arg) // Since the CI runs the tests against a variety of targets, this should be fine in practice. if (sizeof(long) == 4) { + STRTOX_TEST_CASE(SDL_strtol, long, "%ld", "0", 0, 0, 1); + STRTOX_TEST_CASE(SDL_strtol, long, "%ld", "0", 10, 0, 1); + STRTOX_TEST_CASE(SDL_strtol, long, "%ld", "-0", 0, 0, 2); + STRTOX_TEST_CASE(SDL_strtol, long, "%ld", "-0", 10, 0, 2); STRTOX_TEST_CASE(SDL_strtol, long, "%ld", "2147483647", 10, 2147483647, 10); STRTOX_TEST_CASE(SDL_strtol, long, "%ld", "2147483648", 10, 2147483647, 10); STRTOX_TEST_CASE(SDL_strtol, long, "%ld", "-2147483648", 10, -2147483647L - 1, 11); @@ -1347,6 +1370,10 @@ static int SDLCALL stdlib_strtox(void *arg) } if (sizeof(long long) == 8) { + STRTOX_TEST_CASE(SDL_strtoll, long long, FMT_PRILLd, "0", 0, 0LL, 1); + STRTOX_TEST_CASE(SDL_strtoll, long long, FMT_PRILLd, "0", 10, 0LL, 1); + STRTOX_TEST_CASE(SDL_strtoll, long long, FMT_PRILLd, "-0", 0, 0LL, 2); + STRTOX_TEST_CASE(SDL_strtoll, long long, FMT_PRILLd, "-0", 10, 0LL, 2); STRTOX_TEST_CASE(SDL_strtoll, long long, FMT_PRILLd, "9223372036854775807", 10, 9223372036854775807LL, 19); STRTOX_TEST_CASE(SDL_strtoll, long long, FMT_PRILLd, "9223372036854775808", 10, 9223372036854775807LL, 19); STRTOX_TEST_CASE(SDL_strtoll, long long, FMT_PRILLd, "-9223372036854775808", 10, -9223372036854775807LL - 1, 20); diff --git a/libs/SDL3/test/testautomation_video.c b/libs/SDL3/test/testautomation_video.c index 5547f965..09c55e78 100644 --- a/libs/SDL3/test/testautomation_video.c +++ b/libs/SDL3/test/testautomation_video.c @@ -1006,10 +1006,6 @@ static int SDLCALL video_getSetWindowSize(void *arg) int referenceW, referenceH; int currentW, currentH; int desiredW, desiredH; - const bool restoreHint = SDL_GetHintBoolean("SDL_BORDERLESS_RESIZABLE_STYLE", true); - - /* Win32 borderless windows are not resizable by default and need this undocumented hint */ - SDL_SetHint("SDL_BORDERLESS_RESIZABLE_STYLE", "1"); /* Get display bounds for size range */ result = SDL_GetDisplayUsableBounds(SDL_GetPrimaryDisplay(), &display); @@ -1026,7 +1022,7 @@ static int SDLCALL video_getSetWindowSize(void *arg) } SDL_GetWindowSize(window, ¤tW, ¤tH); - if (SDL_SetWindowSize(window, currentW, currentH)) { + if (!SDL_SetWindowSize(window, currentW, currentH)) { SDLTest_Log("Skipping window resize tests: %s reports window resizing as unsupported", SDL_GetCurrentVideoDriver()); goto null_tests; } @@ -1188,9 +1184,6 @@ null_tests: SDLTest_AssertPass("Call to SDL_SetWindowSize(window=NULL)"); checkInvalidWindowError(); - /* Restore the hint to the previous value */ - SDL_SetHint("SDL_BORDERLESS_RESIZABLE_STYLE", restoreHint ? "1" : "0"); - return TEST_COMPLETED; } diff --git a/libs/SDL3/test/testbounds.c b/libs/SDL3/test/testbounds.c index bb0fb821..083772af 100644 --- a/libs/SDL3/test/testbounds.c +++ b/libs/SDL3/test/testbounds.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testcamera.c b/libs/SDL3/test/testcamera.c index 3855b3b1..f83347f2 100644 --- a/libs/SDL3/test/testcamera.c +++ b/libs/SDL3/test/testcamera.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -19,7 +19,6 @@ static SDL_Window *window = NULL; static SDL_Renderer *renderer = NULL; static SDLTest_CommonState *state = NULL; static SDL_Camera *camera = NULL; -static SDL_CameraSpec spec; static SDL_Texture *texture = NULL; static bool texture_updated = false; static SDL_Surface *frame_current = NULL; @@ -46,12 +45,34 @@ static void PrintCameraSpecs(SDL_CameraID camera_id) } } +static void PickCameraSpec(SDL_CameraID camera_id, SDL_CameraSpec *spec) +{ + SDL_CameraSpec **specs = SDL_GetCameraSupportedFormats(camera_id, NULL); + + SDL_zerop(spec); + + if (specs) { + int i; + + int max_size = (int)SDL_GetNumberProperty(SDL_GetRendererProperties(state->renderers[0]), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 0); + for (i = 0; specs[i]; ++i) { + const SDL_CameraSpec *s = specs[i]; + if (s->width <= max_size && s->height <= max_size) { + SDL_copyp(spec, s); + break; + } + } + SDL_free(specs); + } +} + SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) { char window_title[128]; int devcount = 0; int i; const char *camera_name = NULL; + SDL_CameraSpec spec; /* Initialize test framework */ state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO | SDL_INIT_CAMERA); @@ -78,7 +99,7 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) SDLTest_CommonLogUsage(state, argv[0], options); SDL_Quit(); SDLTest_CommonDestroyState(state); - return 1; + return SDL_APP_FAILURE; } i += consumed; } @@ -103,6 +124,8 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) return SDL_APP_FAILURE; } + SDL_Log("Using SDL camera driver: %s", SDL_GetCurrentCameraDriver()); + SDL_CameraID *devices = SDL_GetCameras(&devcount); if (!devices) { SDL_Log("SDL_GetCameras failed: %s", SDL_GetError()); @@ -118,16 +141,22 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) const SDL_CameraPosition position = SDL_GetCameraPosition(device); const char *posstr = ""; if (position == SDL_CAMERA_POSITION_FRONT_FACING) { - front_camera = device; + if (!front_camera) { + front_camera = device; + } posstr = "[front-facing] "; } else if (position == SDL_CAMERA_POSITION_BACK_FACING) { - back_camera = device; + if (!back_camera) { + back_camera = device; + } posstr = "[back-facing] "; } if (camera_name && SDL_strcasecmp(name, camera_name) == 0) { camera_id = device; } SDL_Log(" - Camera #%d: %s %s", i, posstr, name); + + PrintCameraSpecs(device); } if (!camera_id) { @@ -148,13 +177,8 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) return SDL_APP_FAILURE; } - PrintCameraSpecs(camera_id); - - SDL_CameraSpec *pspec = &spec; - spec.framerate_numerator = 30; - spec.framerate_denominator = 1; - - camera = SDL_OpenCamera(camera_id, pspec); + PickCameraSpec(camera_id, &spec); + camera = SDL_OpenCamera(camera_id, &spec); if (!camera) { SDL_Log("Failed to open camera device: %s", SDL_GetError()); return SDL_APP_FAILURE; @@ -184,6 +208,8 @@ static int FlipCamera(void) } if (nextcam) { + SDL_CameraSpec spec; + SDL_Log("Flip camera!"); if (frame_current) { @@ -198,7 +224,8 @@ static int FlipCamera(void) texture = NULL; /* will rebuild when new camera is approved. */ } - camera = SDL_OpenCamera(nextcam, NULL); + PickCameraSpec(nextcam, &spec); + camera = SDL_OpenCamera(nextcam, &spec); if (!camera) { SDL_Log("Failed to open camera device: %s", SDL_GetError()); return SDL_APP_FAILURE; @@ -232,7 +259,7 @@ SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) case SDL_EVENT_QUIT: SDL_Log("Quit!"); - return 1; + return SDL_APP_SUCCESS; case SDL_EVENT_CAMERA_DEVICE_APPROVED: SDL_Log("Camera approved!"); diff --git a/libs/SDL3/test/testclipboard.c b/libs/SDL3/test/testclipboard.c new file mode 100644 index 00000000..634f81c3 --- /dev/null +++ b/libs/SDL3/test/testclipboard.c @@ -0,0 +1,180 @@ +/* + Copyright (C) 1997-2025 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely. +*/ + +#define SDL_MAIN_USE_CALLBACKS 1 +#include +#include + +#include "icon.h" + +static SDL_Window *window = NULL; +static SDL_Renderer *renderer = NULL; + +static const char *mime_types[] = { + "text/plain", + "image/bmp", +}; + +static const void *ClipboardDataCallback(void *userdata, const char *mime_type, size_t *size) +{ + if (SDL_strcmp(mime_type, "text/plain") == 0) { + const char *text = "Hello world!"; + *size = SDL_strlen(text); + return text; + } else if (SDL_strcmp(mime_type, "image/bmp") == 0) { + *size = icon_bmp_len; + return icon_bmp; + } else { + return NULL; + } +} + +SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) +{ + if (!SDL_Init(SDL_INIT_VIDEO)) { + SDL_Log("Couldn't initialize SDL: %s\n", SDL_GetError()); + return SDL_APP_FAILURE; + } + + if (!SDL_CreateWindowAndRenderer("testclipboard", 640, 480, 0, &window, &renderer)) { + SDL_Log("Couldn't create window and renderer: %s\n", SDL_GetError()); + return SDL_APP_FAILURE; + } + return SDL_APP_CONTINUE; +} + + +SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) +{ + switch (event->type) { + case SDL_EVENT_KEY_DOWN: + if (event->key.key == SDLK_ESCAPE) { + return SDL_APP_SUCCESS; + } + if (event->key.key == SDLK_C && event->key.mod & SDL_KMOD_CTRL) { + SDL_SetClipboardData(ClipboardDataCallback, NULL, NULL, mime_types, SDL_arraysize(mime_types)); + break; + } + break; + + case SDL_EVENT_CLIPBOARD_UPDATE: + if (event->clipboard.num_mime_types > 0) { + int i; + SDL_Log("Clipboard updated:\n"); + for (i = 0; event->clipboard.mime_types[i]; ++i) { + SDL_Log(" %s\n", event->clipboard.mime_types[i]); + } + } else { + SDL_Log("Clipboard cleared\n"); + } + break; + + case SDL_EVENT_QUIT: + return SDL_APP_SUCCESS; + + default: + break; + } + + return SDL_APP_CONTINUE; +} + +static float PrintClipboardText(float x, float y, const char *mime_type) +{ + void *data = SDL_GetClipboardData(mime_type, NULL); + if (data) { + SDL_RenderDebugText(renderer, x, y, (const char *)data); + SDL_free(data); + return SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE + 2.0f; + } + return 0.0f; +} + +static float PrintClipboardImage(float x, float y, const char *mime_type) +{ + /* We don't actually need to read this data each frame, but this is a simple example */ + if (SDL_strcmp(mime_type, "image/bmp") == 0) { + size_t size; + void *data = SDL_GetClipboardData(mime_type, &size); + if (data) { + float w = 0.0f, h = 0.0f; + bool rendered = false; + SDL_IOStream *stream = SDL_IOFromConstMem(data, size); + if (stream) { + SDL_Surface *surface = SDL_LoadBMP_IO(stream, false); + if (surface) { + SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, surface); + if (texture) { + SDL_GetTextureSize(texture, &w, &h); + + SDL_FRect dst = { x, y, w, h }; + rendered = SDL_RenderTexture(renderer, texture, NULL, &dst); + SDL_DestroyTexture(texture); + } + SDL_DestroySurface(surface); + } + SDL_CloseIO(stream); + } + if (!rendered) { + SDL_RenderDebugText(renderer, x, y, SDL_GetError()); + } + SDL_free(data); + return h + 2.0f; + } + } + return 0.0f; +} + +static void PrintClipboardContents(float x, float y) +{ + char **clipboard_mime_types = SDL_GetClipboardMimeTypes(NULL); + if (clipboard_mime_types) { + int i; + + for (i = 0; clipboard_mime_types[i]; ++i) { + const char *mime_type = clipboard_mime_types[i]; + SDL_RenderDebugText(renderer, x, y, mime_type); + y += SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE + 2; + if (SDL_strncmp(mime_type, "text/", 5) == 0) { + y += PrintClipboardText(x + SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE * 2, y, mime_type); + } else if (SDL_strncmp(mime_type, "image/", 6) == 0) { + y += PrintClipboardImage(x + SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE * 2, y, mime_type); + } + } + SDL_free(clipboard_mime_types); + } +} + +SDL_AppResult SDL_AppIterate(void *appstate) +{ + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_RenderClear(renderer); + + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + float x = 4.0f; + float y = 4.0f; + SDL_RenderDebugText(renderer, x, y, "Press Ctrl+C to copy content to the clipboard"); + y += SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE * 2; + SDL_RenderDebugText(renderer, x, y, "Clipboard contents:"); + x += SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE * 2; + y += SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE + 2; + PrintClipboardContents(x, y); + + SDL_RenderPresent(renderer); + + return SDL_APP_CONTINUE; +} + +void SDL_AppQuit(void *appstate, SDL_AppResult result) +{ +} + diff --git a/libs/SDL3/test/testcolorspace.c b/libs/SDL3/test/testcolorspace.c index 152d639c..14877cbe 100644 --- a/libs/SDL3/test/testcolorspace.c +++ b/libs/SDL3/test/testcolorspace.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testcontroller.c b/libs/SDL3/test/testcontroller.c index 6b587415..da87c727 100644 --- a/libs/SDL3/test/testcontroller.c +++ b/libs/SDL3/test/testcontroller.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -12,6 +12,7 @@ /* Simple program to test the SDL controller routines */ +#define SDL_MAIN_USE_CALLBACKS #include #include #include @@ -64,6 +65,7 @@ typedef struct int trigger_effect; } Controller; +static SDLTest_CommonState *state; static SDL_Window *window = NULL; static SDL_Renderer *screen = NULL; static ControllerDisplayMode display_mode = CONTROLLER_MODE_TESTING; @@ -194,47 +196,47 @@ typedef struct static void CyclePS5AudioRoute(Controller *device) { - DS5EffectsState_t state; + DS5EffectsState_t effects; device->audio_route = (device->audio_route + 1) % 4; - SDL_zero(state); + SDL_zero(effects); switch (device->audio_route) { case 0: /* Audio disabled */ - state.ucEnableBits1 |= (0x80 | 0x20 | 0x10); /* Modify audio route and speaker / headphone volume */ - state.ucSpeakerVolume = 0; /* Minimum volume */ - state.ucHeadphoneVolume = 0; /* Minimum volume */ - state.ucAudioEnableBits = 0x00; /* Output to headphones */ + effects.ucEnableBits1 |= (0x80 | 0x20 | 0x10); /* Modify audio route and speaker / headphone volume */ + effects.ucSpeakerVolume = 0; /* Minimum volume */ + effects.ucHeadphoneVolume = 0; /* Minimum volume */ + effects.ucAudioEnableBits = 0x00; /* Output to headphones */ break; case 1: /* Headphones */ - state.ucEnableBits1 |= (0x80 | 0x10); /* Modify audio route and headphone volume */ - state.ucHeadphoneVolume = 50; /* 50% volume - don't blast into the ears */ - state.ucAudioEnableBits = 0x00; /* Output to headphones */ + effects.ucEnableBits1 |= (0x80 | 0x10); /* Modify audio route and headphone volume */ + effects.ucHeadphoneVolume = 50; /* 50% volume - don't blast into the ears */ + effects.ucAudioEnableBits = 0x00; /* Output to headphones */ break; case 2: /* Speaker */ - state.ucEnableBits1 |= (0x80 | 0x20); /* Modify audio route and speaker volume */ - state.ucSpeakerVolume = 100; /* Maximum volume */ - state.ucAudioEnableBits = 0x30; /* Output to speaker */ + effects.ucEnableBits1 |= (0x80 | 0x20); /* Modify audio route and speaker volume */ + effects.ucSpeakerVolume = 100; /* Maximum volume */ + effects.ucAudioEnableBits = 0x30; /* Output to speaker */ break; case 3: /* Both */ - state.ucEnableBits1 |= (0x80 | 0x20 | 0x10); /* Modify audio route and speaker / headphone volume */ - state.ucSpeakerVolume = 100; /* Maximum volume */ - state.ucHeadphoneVolume = 50; /* 50% volume - don't blast into the ears */ - state.ucAudioEnableBits = 0x20; /* Output to both speaker and headphones */ + effects.ucEnableBits1 |= (0x80 | 0x20 | 0x10); /* Modify audio route and speaker / headphone volume */ + effects.ucSpeakerVolume = 100; /* Maximum volume */ + effects.ucHeadphoneVolume = 50; /* 50% volume - don't blast into the ears */ + effects.ucAudioEnableBits = 0x20; /* Output to both speaker and headphones */ break; } - SDL_SendGamepadEffect(device->gamepad, &state, sizeof(state)); + SDL_SendGamepadEffect(device->gamepad, &effects, sizeof(effects)); } static void CyclePS5TriggerEffect(Controller *device) { - DS5EffectsState_t state; + DS5EffectsState_t effects; - Uint8 effects[3][11] = { + Uint8 trigger_effects[3][11] = { /* Clear trigger effect */ { 0x05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* Constant resistance across entire trigger pull */ @@ -243,13 +245,13 @@ static void CyclePS5TriggerEffect(Controller *device) { 0x06, 15, 63, 128, 0, 0, 0, 0, 0, 0, 0 }, }; - device->trigger_effect = (device->trigger_effect + 1) % SDL_arraysize(effects); + device->trigger_effect = (device->trigger_effect + 1) % SDL_arraysize(trigger_effects); - SDL_zero(state); - state.ucEnableBits1 |= (0x04 | 0x08); /* Modify right and left trigger effect respectively */ - SDL_memcpy(state.rgucRightTriggerEffect, effects[device->trigger_effect], sizeof(effects[0])); - SDL_memcpy(state.rgucLeftTriggerEffect, effects[device->trigger_effect], sizeof(effects[0])); - SDL_SendGamepadEffect(device->gamepad, &state, sizeof(state)); + SDL_zero(effects); + effects.ucEnableBits1 |= (0x04 | 0x08); /* Modify right and left trigger effect respectively */ + SDL_memcpy(effects.rgucRightTriggerEffect, trigger_effects[device->trigger_effect], sizeof(trigger_effects[0])); + SDL_memcpy(effects.rgucLeftTriggerEffect, trigger_effects[device->trigger_effect], sizeof(trigger_effects[0])); + SDL_SendGamepadEffect(device->gamepad, &effects, sizeof(effects)); } static void ClearButtonHighlights(void) @@ -910,8 +912,10 @@ static void AddController(SDL_JoystickID id, bool verbose) new_controller->id = id; new_controller->joystick = SDL_OpenJoystick(id); - new_controller->num_axes = SDL_GetNumJoystickAxes(new_controller->joystick); - new_controller->axis_state = (AxisState *)SDL_calloc(new_controller->num_axes, sizeof(*new_controller->axis_state)); + if (new_controller->joystick) { + new_controller->num_axes = SDL_GetNumJoystickAxes(new_controller->joystick); + new_controller->axis_state = (AxisState *)SDL_calloc(new_controller->num_axes, sizeof(*new_controller->axis_state)); + } joystick = new_controller->joystick; if (joystick) { @@ -1017,6 +1021,7 @@ static void HandleGamepadAdded(SDL_JoystickID id, bool verbose) if (i < 0) { return; } + SDL_Log("Gamepad %" SDL_PRIu32 " added\n", id); SDL_assert(!controllers[i].gamepad); controllers[i].gamepad = SDL_OpenGamepad(id); @@ -1088,6 +1093,7 @@ static void HandleGamepadRemoved(SDL_JoystickID id) if (i < 0) { return; } + SDL_Log("Gamepad %" SDL_PRIu32 " removed\n", id); if (controllers[i].mapping) { SDL_free(controllers[i].mapping); @@ -1569,360 +1575,361 @@ static void UpdateGamepadEffects(void) } } -static void loop(void *arg) +SDL_AppResult SDLCALL SDL_AppEvent(void *appstate, SDL_Event *event) { - SDL_Event event; + SDL_ConvertEventToRenderCoordinates(screen, event); + switch (event->type) { + case SDL_EVENT_JOYSTICK_ADDED: + AddController(event->jdevice.which, true); + break; + + case SDL_EVENT_JOYSTICK_REMOVED: + DelController(event->jdevice.which); + break; + + case SDL_EVENT_JOYSTICK_AXIS_MOTION: + if (display_mode == CONTROLLER_MODE_TESTING) { + if (event->jaxis.value <= (-SDL_JOYSTICK_AXIS_MAX / 2) || event->jaxis.value >= (SDL_JOYSTICK_AXIS_MAX / 2)) { + SetController(event->jaxis.which); + } + } else if (display_mode == CONTROLLER_MODE_BINDING && + event->jaxis.which == controller->id && + event->jaxis.axis < controller->num_axes && + binding_element != SDL_GAMEPAD_ELEMENT_INVALID) { + const int MAX_ALLOWED_JITTER = SDL_JOYSTICK_AXIS_MAX / 80; /* ShanWan PS3 gamepad needed 96 */ + AxisState *pAxisState = &controller->axis_state[event->jaxis.axis]; + int nValue = event->jaxis.value; + int nCurrentDistance, nFarthestDistance; + if (!pAxisState->m_bMoving) { + Sint16 nInitialValue; + pAxisState->m_bMoving = SDL_GetJoystickAxisInitialState(controller->joystick, event->jaxis.axis, &nInitialValue); + pAxisState->m_nLastValue = nValue; + pAxisState->m_nStartingValue = nInitialValue; + pAxisState->m_nFarthestValue = nInitialValue; + } else if (SDL_abs(nValue - pAxisState->m_nLastValue) <= MAX_ALLOWED_JITTER) { + break; + } else { + pAxisState->m_nLastValue = nValue; + } + nCurrentDistance = SDL_abs(nValue - pAxisState->m_nStartingValue); + nFarthestDistance = SDL_abs(pAxisState->m_nFarthestValue - pAxisState->m_nStartingValue); + if (nCurrentDistance > nFarthestDistance) { + pAxisState->m_nFarthestValue = nValue; + nFarthestDistance = SDL_abs(pAxisState->m_nFarthestValue - pAxisState->m_nStartingValue); + } + +#ifdef DEBUG_AXIS_MAPPING + SDL_Log("AXIS %d nValue %d nCurrentDistance %d nFarthestDistance %d\n", event->jaxis.axis, nValue, nCurrentDistance, nFarthestDistance); +#endif + /* If we've gone out far enough and started to come back, let's bind this axis */ + if (nFarthestDistance >= 16000 && nCurrentDistance <= 10000) { + char binding[12]; + int axis_min = StandardizeAxisValue(pAxisState->m_nStartingValue); + int axis_max = StandardizeAxisValue(pAxisState->m_nFarthestValue); + + if (axis_min == 0 && axis_max == SDL_JOYSTICK_AXIS_MIN) { + /* The negative half axis */ + (void)SDL_snprintf(binding, sizeof(binding), "-a%d", event->jaxis.axis); + } else if (axis_min == 0 && axis_max == SDL_JOYSTICK_AXIS_MAX) { + /* The positive half axis */ + (void)SDL_snprintf(binding, sizeof(binding), "+a%d", event->jaxis.axis); + } else { + (void)SDL_snprintf(binding, sizeof(binding), "a%d", event->jaxis.axis); + if (axis_min > axis_max) { + /* Invert the axis */ + SDL_strlcat(binding, "~", SDL_arraysize(binding)); + } + } +#ifdef DEBUG_AXIS_MAPPING + SDL_Log("AXIS %d axis_min = %d, axis_max = %d, binding = %s\n", event->jaxis.axis, axis_min, axis_max, binding); +#endif + CommitBindingElement(binding, false); + } + } + break; + + case SDL_EVENT_JOYSTICK_BUTTON_DOWN: + if (display_mode == CONTROLLER_MODE_TESTING) { + SetController(event->jbutton.which); + } + break; + + case SDL_EVENT_JOYSTICK_BUTTON_UP: + if (display_mode == CONTROLLER_MODE_BINDING && + event->jbutton.which == controller->id && + binding_element != SDL_GAMEPAD_ELEMENT_INVALID) { + char binding[12]; + + SDL_snprintf(binding, sizeof(binding), "b%d", event->jbutton.button); + CommitBindingElement(binding, false); + } + break; + + case SDL_EVENT_JOYSTICK_HAT_MOTION: + if (display_mode == CONTROLLER_MODE_BINDING && + event->jhat.which == controller->id && + event->jhat.value != SDL_HAT_CENTERED && + binding_element != SDL_GAMEPAD_ELEMENT_INVALID) { + char binding[12]; + + SDL_snprintf(binding, sizeof(binding), "h%d.%d", event->jhat.hat, event->jhat.value); + CommitBindingElement(binding, false); + } + break; + + case SDL_EVENT_GAMEPAD_ADDED: + HandleGamepadAdded(event->gdevice.which, true); + break; + + case SDL_EVENT_GAMEPAD_REMOVED: + HandleGamepadRemoved(event->gdevice.which); + break; + + case SDL_EVENT_GAMEPAD_REMAPPED: + HandleGamepadRemapped(event->gdevice.which); + break; + + case SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED: + RefreshControllerName(); + break; + +#ifdef VERBOSE_TOUCHPAD + case SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN: + case SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION: + case SDL_EVENT_GAMEPAD_TOUCHPAD_UP: + SDL_Log("Gamepad %" SDL_PRIu32 " touchpad %" SDL_PRIs32 " finger %" SDL_PRIs32 " %s %.2f, %.2f, %.2f\n", + event->gtouchpad.which, + event->gtouchpad.touchpad, + event->gtouchpad.finger, + (event->type == SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN ? "pressed at" : (event->type == SDL_EVENT_GAMEPAD_TOUCHPAD_UP ? "released at" : "moved to")), + event->gtouchpad.x, + event->gtouchpad.y, + event->gtouchpad.pressure); + break; +#endif /* VERBOSE_TOUCHPAD */ + +#ifdef VERBOSE_SENSORS + case SDL_EVENT_GAMEPAD_SENSOR_UPDATE: + SDL_Log("Gamepad %" SDL_PRIu32 " sensor %s: %.2f, %.2f, %.2f (%" SDL_PRIu64 ")\n", + event->gsensor.which, + GetSensorName((SDL_SensorType) event->gsensor.sensor), + event->gsensor.data[0], + event->gsensor.data[1], + event->gsensor.data[2], + event->gsensor.sensor_timestamp); + break; +#endif /* VERBOSE_SENSORS */ + +#ifdef VERBOSE_AXES + case SDL_EVENT_GAMEPAD_AXIS_MOTION: + if (display_mode == CONTROLLER_MODE_TESTING) { + if (event->gaxis.value <= (-SDL_JOYSTICK_AXIS_MAX / 2) || event->gaxis.value >= (SDL_JOYSTICK_AXIS_MAX / 2)) { + SetController(event->gaxis.which); + } + } + SDL_Log("Gamepad %" SDL_PRIu32 " axis %s changed to %d\n", + event->gaxis.which, + SDL_GetGamepadStringForAxis((SDL_GamepadAxis) event->gaxis.axis), + event->gaxis.value); + break; +#endif /* VERBOSE_AXES */ + + case SDL_EVENT_GAMEPAD_BUTTON_DOWN: + case SDL_EVENT_GAMEPAD_BUTTON_UP: + if (display_mode == CONTROLLER_MODE_TESTING) { + if (event->type == SDL_EVENT_GAMEPAD_BUTTON_DOWN) { + SetController(event->gbutton.which); + } + } +#ifdef VERBOSE_BUTTONS + SDL_Log("Gamepad %" SDL_PRIu32 " button %s %s\n", + event->gbutton.which, + SDL_GetGamepadStringForButton((SDL_GamepadButton) event->gbutton.button), + event->gbutton.state ? "pressed" : "released"); +#endif /* VERBOSE_BUTTONS */ + + if (display_mode == CONTROLLER_MODE_TESTING) { + if (event->type == SDL_EVENT_GAMEPAD_BUTTON_DOWN && + controller && SDL_GetGamepadType(controller->gamepad) == SDL_GAMEPAD_TYPE_PS5) { + /* Cycle PS5 audio routing when the microphone button is pressed */ + if (event->gbutton.button == SDL_GAMEPAD_BUTTON_MISC1) { + CyclePS5AudioRoute(controller); + } + + /* Cycle PS5 trigger effects when the triangle button is pressed */ + if (event->gbutton.button == SDL_GAMEPAD_BUTTON_NORTH) { + CyclePS5TriggerEffect(controller); + } + } + } + break; + + case SDL_EVENT_MOUSE_BUTTON_DOWN: + if (virtual_joystick && controller && controller->joystick == virtual_joystick) { + VirtualGamepadMouseDown(event->button.x, event->button.y); + } + UpdateButtonHighlights(event->button.x, event->button.y, event->button.down); + break; + + case SDL_EVENT_MOUSE_BUTTON_UP: + if (virtual_joystick && controller && controller->joystick == virtual_joystick) { + VirtualGamepadMouseUp(event->button.x, event->button.y); + } + + if (display_mode == CONTROLLER_MODE_TESTING) { + if (GamepadButtonContains(setup_mapping_button, event->button.x, event->button.y)) { + SetDisplayMode(CONTROLLER_MODE_BINDING); + } + } else if (display_mode == CONTROLLER_MODE_BINDING) { + if (GamepadButtonContains(done_mapping_button, event->button.x, event->button.y)) { + if (controller->mapping) { + SDL_Log("Mapping complete:\n"); + SDL_Log("%s\n", controller->mapping); + } + SetDisplayMode(CONTROLLER_MODE_TESTING); + } else if (GamepadButtonContains(cancel_button, event->button.x, event->button.y)) { + CancelMapping(); + } else if (GamepadButtonContains(clear_button, event->button.x, event->button.y)) { + ClearMapping(); + } else if (controller->has_bindings && + GamepadButtonContains(copy_button, event->button.x, event->button.y)) { + CopyMapping(); + } else if (GamepadButtonContains(paste_button, event->button.x, event->button.y)) { + PasteMapping(); + } else if (title_pressed) { + SetCurrentBindingElement(SDL_GAMEPAD_ELEMENT_NAME, false); + } else if (type_pressed) { + SetCurrentBindingElement(SDL_GAMEPAD_ELEMENT_TYPE, false); + } else if (binding_element == SDL_GAMEPAD_ELEMENT_TYPE) { + int type = GetGamepadTypeDisplayAt(gamepad_type, event->button.x, event->button.y); + if (type != SDL_GAMEPAD_TYPE_UNSELECTED) { + CommitGamepadType((SDL_GamepadType)type); + StopBinding(); + } + } else { + int gamepad_element = SDL_GAMEPAD_ELEMENT_INVALID; + char *joystick_element; + + if (controller->joystick != virtual_joystick) { + gamepad_element = GetGamepadImageElementAt(image, event->button.x, event->button.y); + } + if (gamepad_element == SDL_GAMEPAD_ELEMENT_INVALID) { + gamepad_element = GetGamepadDisplayElementAt(gamepad_elements, controller->gamepad, event->button.x, event->button.y); + } + if (gamepad_element != SDL_GAMEPAD_ELEMENT_INVALID) { + /* Set this to false if you don't want to start the binding flow at this point */ + const bool should_start_flow = true; + SetCurrentBindingElement(gamepad_element, should_start_flow); + } + + joystick_element = GetJoystickDisplayElementAt(joystick_elements, controller->joystick, event->button.x, event->button.y); + if (joystick_element) { + CommitBindingElement(joystick_element, true); + SDL_free(joystick_element); + } + } + } + UpdateButtonHighlights(event->button.x, event->button.y, event->button.down); + break; + + case SDL_EVENT_MOUSE_MOTION: + if (virtual_joystick && controller && controller->joystick == virtual_joystick) { + VirtualGamepadMouseMotion(event->motion.x, event->motion.y); + } + UpdateButtonHighlights(event->motion.x, event->motion.y, event->motion.state ? true : false); + break; + + case SDL_EVENT_KEY_DOWN: + if (display_mode == CONTROLLER_MODE_TESTING) { + if (event->key.key >= SDLK_0 && event->key.key <= SDLK_9) { + if (controller && controller->gamepad) { + int player_index = (event->key.key - SDLK_0); + + SDL_SetGamepadPlayerIndex(controller->gamepad, player_index); + } + break; + } else if (event->key.key == SDLK_A) { + OpenVirtualGamepad(); + } else if (event->key.key == SDLK_D) { + CloseVirtualGamepad(); + } else if (event->key.key == SDLK_R && (event->key.mod & SDL_KMOD_CTRL)) { + SDL_ReloadGamepadMappings(); + } else if (event->key.key == SDLK_ESCAPE) { + done = true; + } + } else if (display_mode == CONTROLLER_MODE_BINDING) { + if (event->key.key == SDLK_C && (event->key.mod & SDL_KMOD_CTRL)) { + if (binding_element == SDL_GAMEPAD_ELEMENT_NAME) { + CopyControllerName(); + } else { + CopyMapping(); + } + } else if (event->key.key == SDLK_V && (event->key.mod & SDL_KMOD_CTRL)) { + if (binding_element == SDL_GAMEPAD_ELEMENT_NAME) { + ClearControllerName(); + PasteControllerName(); + } else { + PasteMapping(); + } + } else if (event->key.key == SDLK_X && (event->key.mod & SDL_KMOD_CTRL)) { + if (binding_element == SDL_GAMEPAD_ELEMENT_NAME) { + CopyControllerName(); + ClearControllerName(); + } else { + CopyMapping(); + ClearMapping(); + } + } else if (event->key.key == SDLK_SPACE) { + if (binding_element != SDL_GAMEPAD_ELEMENT_NAME) { + ClearBinding(); + } + } else if (event->key.key == SDLK_BACKSPACE) { + if (binding_element == SDL_GAMEPAD_ELEMENT_NAME) { + BackspaceControllerName(); + } + } else if (event->key.key == SDLK_RETURN) { + if (binding_element == SDL_GAMEPAD_ELEMENT_NAME) { + StopBinding(); + } + } else if (event->key.key == SDLK_ESCAPE) { + if (binding_element != SDL_GAMEPAD_ELEMENT_INVALID) { + StopBinding(); + } else { + CancelMapping(); + } + } + } + break; + case SDL_EVENT_TEXT_INPUT: + if (display_mode == CONTROLLER_MODE_BINDING) { + if (binding_element == SDL_GAMEPAD_ELEMENT_NAME) { + AddControllerNameText(event->text.text); + } + } + break; + case SDL_EVENT_QUIT: + done = true; + break; + default: + break; + } + + if (done) { + return SDL_APP_SUCCESS; + } else { + return SDL_APP_CONTINUE; + } +} + +SDL_AppResult SDLCALL SDL_AppIterate(void *appstate) +{ /* If we have a virtual controller, send a virtual accelerometer sensor reading */ if (virtual_joystick) { float data[3] = { 0.0f, SDL_STANDARD_GRAVITY, 0.0f }; SDL_SendJoystickVirtualSensorData(virtual_joystick, SDL_SENSOR_ACCEL, SDL_GetTicksNS(), data, SDL_arraysize(data)); } - /* Update to get the current event state */ - SDL_PumpEvents(); - - /* Process all currently pending events */ - while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_EVENT_FIRST, SDL_EVENT_LAST) == 1) { - SDL_ConvertEventToRenderCoordinates(screen, &event); - - switch (event.type) { - case SDL_EVENT_JOYSTICK_ADDED: - AddController(event.jdevice.which, true); - break; - - case SDL_EVENT_JOYSTICK_REMOVED: - DelController(event.jdevice.which); - break; - - case SDL_EVENT_JOYSTICK_AXIS_MOTION: - if (display_mode == CONTROLLER_MODE_TESTING) { - if (event.jaxis.value <= (-SDL_JOYSTICK_AXIS_MAX / 2) || event.jaxis.value >= (SDL_JOYSTICK_AXIS_MAX / 2)) { - SetController(event.jaxis.which); - } - } else if (display_mode == CONTROLLER_MODE_BINDING && - event.jaxis.which == controller->id && - event.jaxis.axis < controller->num_axes && - binding_element != SDL_GAMEPAD_ELEMENT_INVALID) { - const int MAX_ALLOWED_JITTER = SDL_JOYSTICK_AXIS_MAX / 80; /* ShanWan PS3 gamepad needed 96 */ - AxisState *pAxisState = &controller->axis_state[event.jaxis.axis]; - int nValue = event.jaxis.value; - int nCurrentDistance, nFarthestDistance; - if (!pAxisState->m_bMoving) { - Sint16 nInitialValue; - pAxisState->m_bMoving = SDL_GetJoystickAxisInitialState(controller->joystick, event.jaxis.axis, &nInitialValue); - pAxisState->m_nLastValue = nValue; - pAxisState->m_nStartingValue = nInitialValue; - pAxisState->m_nFarthestValue = nInitialValue; - } else if (SDL_abs(nValue - pAxisState->m_nLastValue) <= MAX_ALLOWED_JITTER) { - break; - } else { - pAxisState->m_nLastValue = nValue; - } - nCurrentDistance = SDL_abs(nValue - pAxisState->m_nStartingValue); - nFarthestDistance = SDL_abs(pAxisState->m_nFarthestValue - pAxisState->m_nStartingValue); - if (nCurrentDistance > nFarthestDistance) { - pAxisState->m_nFarthestValue = nValue; - nFarthestDistance = SDL_abs(pAxisState->m_nFarthestValue - pAxisState->m_nStartingValue); - } - -#ifdef DEBUG_AXIS_MAPPING - SDL_Log("AXIS %d nValue %d nCurrentDistance %d nFarthestDistance %d\n", event.jaxis.axis, nValue, nCurrentDistance, nFarthestDistance); -#endif - /* If we've gone out far enough and started to come back, let's bind this axis */ - if (nFarthestDistance >= 16000 && nCurrentDistance <= 10000) { - char binding[12]; - int axis_min = StandardizeAxisValue(pAxisState->m_nStartingValue); - int axis_max = StandardizeAxisValue(pAxisState->m_nFarthestValue); - - if (axis_min == 0 && axis_max == SDL_JOYSTICK_AXIS_MIN) { - /* The negative half axis */ - (void)SDL_snprintf(binding, sizeof(binding), "-a%d", event.jaxis.axis); - } else if (axis_min == 0 && axis_max == SDL_JOYSTICK_AXIS_MAX) { - /* The positive half axis */ - (void)SDL_snprintf(binding, sizeof(binding), "+a%d", event.jaxis.axis); - } else { - (void)SDL_snprintf(binding, sizeof(binding), "a%d", event.jaxis.axis); - if (axis_min > axis_max) { - /* Invert the axis */ - SDL_strlcat(binding, "~", SDL_arraysize(binding)); - } - } -#ifdef DEBUG_AXIS_MAPPING - SDL_Log("AXIS %d axis_min = %d, axis_max = %d, binding = %s\n", event.jaxis.axis, axis_min, axis_max, binding); -#endif - CommitBindingElement(binding, false); - } - } - break; - - case SDL_EVENT_JOYSTICK_BUTTON_DOWN: - if (display_mode == CONTROLLER_MODE_TESTING) { - SetController(event.jbutton.which); - } - break; - - case SDL_EVENT_JOYSTICK_BUTTON_UP: - if (display_mode == CONTROLLER_MODE_BINDING && - event.jbutton.which == controller->id && - binding_element != SDL_GAMEPAD_ELEMENT_INVALID) { - char binding[12]; - - SDL_snprintf(binding, sizeof(binding), "b%d", event.jbutton.button); - CommitBindingElement(binding, false); - } - break; - - case SDL_EVENT_JOYSTICK_HAT_MOTION: - if (display_mode == CONTROLLER_MODE_BINDING && - event.jhat.which == controller->id && - event.jhat.value != SDL_HAT_CENTERED && - binding_element != SDL_GAMEPAD_ELEMENT_INVALID) { - char binding[12]; - - SDL_snprintf(binding, sizeof(binding), "h%d.%d", event.jhat.hat, event.jhat.value); - CommitBindingElement(binding, false); - } - break; - - case SDL_EVENT_GAMEPAD_ADDED: - HandleGamepadAdded(event.gdevice.which, true); - break; - - case SDL_EVENT_GAMEPAD_REMOVED: - HandleGamepadRemoved(event.gdevice.which); - break; - - case SDL_EVENT_GAMEPAD_REMAPPED: - HandleGamepadRemapped(event.gdevice.which); - break; - - case SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED: - RefreshControllerName(); - break; - -#ifdef VERBOSE_TOUCHPAD - case SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN: - case SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION: - case SDL_EVENT_GAMEPAD_TOUCHPAD_UP: - SDL_Log("Gamepad %" SDL_PRIu32 " touchpad %" SDL_PRIs32 " finger %" SDL_PRIs32 " %s %.2f, %.2f, %.2f\n", - event.gtouchpad.which, - event.gtouchpad.touchpad, - event.gtouchpad.finger, - (event.type == SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN ? "pressed at" : (event.type == SDL_EVENT_GAMEPAD_TOUCHPAD_UP ? "released at" : "moved to")), - event.gtouchpad.x, - event.gtouchpad.y, - event.gtouchpad.pressure); - break; -#endif /* VERBOSE_TOUCHPAD */ - -#ifdef VERBOSE_SENSORS - case SDL_EVENT_GAMEPAD_SENSOR_UPDATE: - SDL_Log("Gamepad %" SDL_PRIu32 " sensor %s: %.2f, %.2f, %.2f (%" SDL_PRIu64 ")\n", - event.gsensor.which, - GetSensorName((SDL_SensorType) event.gsensor.sensor), - event.gsensor.data[0], - event.gsensor.data[1], - event.gsensor.data[2], - event.gsensor.sensor_timestamp); - break; -#endif /* VERBOSE_SENSORS */ - -#ifdef VERBOSE_AXES - case SDL_EVENT_GAMEPAD_AXIS_MOTION: - if (display_mode == CONTROLLER_MODE_TESTING) { - if (event.gaxis.value <= (-SDL_JOYSTICK_AXIS_MAX / 2) || event.gaxis.value >= (SDL_JOYSTICK_AXIS_MAX / 2)) { - SetController(event.gaxis.which); - } - } - SDL_Log("Gamepad %" SDL_PRIu32 " axis %s changed to %d\n", - event.gaxis.which, - SDL_GetGamepadStringForAxis((SDL_GamepadAxis) event.gaxis.axis), - event.gaxis.value); - break; -#endif /* VERBOSE_AXES */ - - case SDL_EVENT_GAMEPAD_BUTTON_DOWN: - case SDL_EVENT_GAMEPAD_BUTTON_UP: - if (display_mode == CONTROLLER_MODE_TESTING) { - if (event.type == SDL_EVENT_GAMEPAD_BUTTON_DOWN) { - SetController(event.gbutton.which); - } - } -#ifdef VERBOSE_BUTTONS - SDL_Log("Gamepad %" SDL_PRIu32 " button %s %s\n", - event.gbutton.which, - SDL_GetGamepadStringForButton((SDL_GamepadButton) event.gbutton.button), - event.gbutton.state ? "pressed" : "released"); -#endif /* VERBOSE_BUTTONS */ - - if (display_mode == CONTROLLER_MODE_TESTING) { - if (event.type == SDL_EVENT_GAMEPAD_BUTTON_DOWN && - controller && SDL_GetGamepadType(controller->gamepad) == SDL_GAMEPAD_TYPE_PS5) { - /* Cycle PS5 audio routing when the microphone button is pressed */ - if (event.gbutton.button == SDL_GAMEPAD_BUTTON_MISC1) { - CyclePS5AudioRoute(controller); - } - - /* Cycle PS5 trigger effects when the triangle button is pressed */ - if (event.gbutton.button == SDL_GAMEPAD_BUTTON_NORTH) { - CyclePS5TriggerEffect(controller); - } - } - } - break; - - case SDL_EVENT_MOUSE_BUTTON_DOWN: - if (virtual_joystick && controller && controller->joystick == virtual_joystick) { - VirtualGamepadMouseDown(event.button.x, event.button.y); - } - UpdateButtonHighlights(event.button.x, event.button.y, event.button.down); - break; - - case SDL_EVENT_MOUSE_BUTTON_UP: - if (virtual_joystick && controller && controller->joystick == virtual_joystick) { - VirtualGamepadMouseUp(event.button.x, event.button.y); - } - - if (display_mode == CONTROLLER_MODE_TESTING) { - if (GamepadButtonContains(setup_mapping_button, event.button.x, event.button.y)) { - SetDisplayMode(CONTROLLER_MODE_BINDING); - } - } else if (display_mode == CONTROLLER_MODE_BINDING) { - if (GamepadButtonContains(done_mapping_button, event.button.x, event.button.y)) { - if (controller->mapping) { - SDL_Log("Mapping complete:\n"); - SDL_Log("%s\n", controller->mapping); - } - SetDisplayMode(CONTROLLER_MODE_TESTING); - } else if (GamepadButtonContains(cancel_button, event.button.x, event.button.y)) { - CancelMapping(); - } else if (GamepadButtonContains(clear_button, event.button.x, event.button.y)) { - ClearMapping(); - } else if (controller->has_bindings && - GamepadButtonContains(copy_button, event.button.x, event.button.y)) { - CopyMapping(); - } else if (GamepadButtonContains(paste_button, event.button.x, event.button.y)) { - PasteMapping(); - } else if (title_pressed) { - SetCurrentBindingElement(SDL_GAMEPAD_ELEMENT_NAME, false); - } else if (type_pressed) { - SetCurrentBindingElement(SDL_GAMEPAD_ELEMENT_TYPE, false); - } else if (binding_element == SDL_GAMEPAD_ELEMENT_TYPE) { - int type = GetGamepadTypeDisplayAt(gamepad_type, event.button.x, event.button.y); - if (type != SDL_GAMEPAD_TYPE_UNSELECTED) { - CommitGamepadType((SDL_GamepadType)type); - StopBinding(); - } - } else { - int gamepad_element = SDL_GAMEPAD_ELEMENT_INVALID; - char *joystick_element; - - if (controller->joystick != virtual_joystick) { - gamepad_element = GetGamepadImageElementAt(image, event.button.x, event.button.y); - } - if (gamepad_element == SDL_GAMEPAD_ELEMENT_INVALID) { - gamepad_element = GetGamepadDisplayElementAt(gamepad_elements, controller->gamepad, event.button.x, event.button.y); - } - if (gamepad_element != SDL_GAMEPAD_ELEMENT_INVALID) { - /* Set this to false if you don't want to start the binding flow at this point */ - const bool should_start_flow = true; - SetCurrentBindingElement(gamepad_element, should_start_flow); - } - - joystick_element = GetJoystickDisplayElementAt(joystick_elements, controller->joystick, event.button.x, event.button.y); - if (joystick_element) { - CommitBindingElement(joystick_element, true); - SDL_free(joystick_element); - } - } - } - UpdateButtonHighlights(event.button.x, event.button.y, event.button.down); - break; - - case SDL_EVENT_MOUSE_MOTION: - if (virtual_joystick && controller && controller->joystick == virtual_joystick) { - VirtualGamepadMouseMotion(event.motion.x, event.motion.y); - } - UpdateButtonHighlights(event.motion.x, event.motion.y, event.motion.state ? true : false); - break; - - case SDL_EVENT_KEY_DOWN: - if (display_mode == CONTROLLER_MODE_TESTING) { - if (event.key.key >= SDLK_0 && event.key.key <= SDLK_9) { - if (controller && controller->gamepad) { - int player_index = (event.key.key - SDLK_0); - - SDL_SetGamepadPlayerIndex(controller->gamepad, player_index); - } - break; - } else if (event.key.key == SDLK_A) { - OpenVirtualGamepad(); - } else if (event.key.key == SDLK_D) { - CloseVirtualGamepad(); - } else if (event.key.key == SDLK_R && (event.key.mod & SDL_KMOD_CTRL)) { - SDL_ReloadGamepadMappings(); - } else if (event.key.key == SDLK_ESCAPE) { - done = true; - } - } else if (display_mode == CONTROLLER_MODE_BINDING) { - if (event.key.key == SDLK_C && (event.key.mod & SDL_KMOD_CTRL)) { - if (binding_element == SDL_GAMEPAD_ELEMENT_NAME) { - CopyControllerName(); - } else { - CopyMapping(); - } - } else if (event.key.key == SDLK_V && (event.key.mod & SDL_KMOD_CTRL)) { - if (binding_element == SDL_GAMEPAD_ELEMENT_NAME) { - ClearControllerName(); - PasteControllerName(); - } else { - PasteMapping(); - } - } else if (event.key.key == SDLK_X && (event.key.mod & SDL_KMOD_CTRL)) { - if (binding_element == SDL_GAMEPAD_ELEMENT_NAME) { - CopyControllerName(); - ClearControllerName(); - } else { - CopyMapping(); - ClearMapping(); - } - } else if (event.key.key == SDLK_SPACE) { - if (binding_element != SDL_GAMEPAD_ELEMENT_NAME) { - ClearBinding(); - } - } else if (event.key.key == SDLK_BACKSPACE) { - if (binding_element == SDL_GAMEPAD_ELEMENT_NAME) { - BackspaceControllerName(); - } - } else if (event.key.key == SDLK_RETURN) { - if (binding_element == SDL_GAMEPAD_ELEMENT_NAME) { - StopBinding(); - } - } else if (event.key.key == SDLK_ESCAPE) { - if (binding_element != SDL_GAMEPAD_ELEMENT_INVALID) { - StopBinding(); - } else { - CancelMapping(); - } - } - } - break; - case SDL_EVENT_TEXT_INPUT: - if (display_mode == CONTROLLER_MODE_BINDING) { - if (binding_element == SDL_GAMEPAD_ELEMENT_NAME) { - AddControllerNameText(event.text.text); - } - } - break; - case SDL_EVENT_QUIT: - done = true; - break; - default: - break; - } - } - /* Wait 30 ms for joystick events to stop coming in, in case a gamepad sends multiple events for a single control (e.g. axis and button for trigger) */ @@ -1978,14 +1985,10 @@ static void loop(void *arg) SDL_Delay(16); SDL_RenderPresent(screen); -#ifdef SDL_PLATFORM_EMSCRIPTEN - if (done) { - emscripten_cancel_main_loop(); - } -#endif + return SDL_APP_CONTINUE; } -int main(int argc, char *argv[]) +SDL_AppResult SDLCALL SDL_AppInit(void **appstate, int argc, char *argv[]) { bool show_mappings = false; int i; @@ -1993,17 +1996,15 @@ int main(int argc, char *argv[]) int screen_width, screen_height; SDL_FRect area; int gamepad_index = -1; - SDLTest_CommonState *state; /* Initialize test framework */ state = SDLTest_CommonCreateState(argv, 0); if (!state) { - return 1; + return SDL_APP_FAILURE; } SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI, "1"); - SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE, "1"); - SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE, "1"); + SDL_SetHint(SDL_HINT_JOYSTICK_ENHANCED_REPORTS, "auto"); SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_STEAM, "1"); SDL_SetHint(SDL_HINT_JOYSTICK_ROG_CHAKRAM, "1"); SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1"); @@ -2035,7 +2036,7 @@ int main(int argc, char *argv[]) if (consumed <= 0) { static const char *options[] = { "[--mappings]", "[--virtual]", "[index]", NULL }; SDLTest_CommonLogUsage(state, argv[0], options); - return 1; + return SDL_APP_FAILURE; } i += consumed; @@ -2047,7 +2048,7 @@ int main(int argc, char *argv[]) /* Initialize SDL (Note: video is required to start event loop) */ if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_GAMEPAD)) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError()); - return 1; + return SDL_APP_FAILURE; } SDL_AddGamepadMappingsFromFile("gamecontrollerdb.txt"); @@ -2074,14 +2075,14 @@ int main(int argc, char *argv[]) window = SDL_CreateWindow("SDL Controller Test", screen_width, screen_height, 0); if (!window) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create window: %s\n", SDL_GetError()); - return 2; + return SDL_APP_FAILURE; } screen = SDL_CreateRenderer(window, NULL); if (!screen) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create renderer: %s\n", SDL_GetError()); SDL_DestroyWindow(window); - return 2; + return SDL_APP_FAILURE; } SDL_SetRenderDrawColor(screen, 0x00, 0x00, 0x00, SDL_ALPHA_OPAQUE); @@ -2107,7 +2108,7 @@ int main(int argc, char *argv[]) if (!image) { SDL_DestroyRenderer(screen); SDL_DestroyWindow(window); - return 2; + return SDL_APP_FAILURE; } SetGamepadImagePosition(image, PANEL_WIDTH + PANEL_SPACING, TITLE_HEIGHT); @@ -2175,7 +2176,7 @@ int main(int argc, char *argv[]) SetGamepadButtonArea(done_mapping_button, &area); /* Process the initial gamepad list */ - loop(NULL); + SDL_AppIterate(NULL); if (gamepad_index < num_controllers) { SetController(controllers[gamepad_index].id); @@ -2183,15 +2184,11 @@ int main(int argc, char *argv[]) SetController(controllers[0].id); } - /* Loop, getting gamepad events! */ -#ifdef SDL_PLATFORM_EMSCRIPTEN - emscripten_set_main_loop_arg(loop, NULL, 0, 1); -#else - while (!done) { - loop(NULL); - } -#endif + return SDL_APP_CONTINUE; +} +void SDLCALL SDL_AppQuit(void *appstate, SDL_AppResult result) +{ CloseVirtualGamepad(); while (num_controllers > 0) { HandleGamepadRemoved(controllers[0].id); @@ -2214,5 +2211,4 @@ int main(int argc, char *argv[]) SDL_DestroyWindow(window); SDL_Quit(); SDLTest_CommonDestroyState(state); - return 0; } diff --git a/libs/SDL3/test/testcustomcursor.c b/libs/SDL3/test/testcustomcursor.c index d7f6e3ed..54722916 100644 --- a/libs/SDL3/test/testcustomcursor.c +++ b/libs/SDL3/test/testcustomcursor.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testdialog.c b/libs/SDL3/test/testdialog.c index 7561d7e6..92f453bb 100644 --- a/libs/SDL3/test/testdialog.c +++ b/libs/SDL3/test/testdialog.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testdisplayinfo.c b/libs/SDL3/test/testdisplayinfo.c index 0acac188..2c5063e9 100644 --- a/libs/SDL3/test/testdisplayinfo.c +++ b/libs/SDL3/test/testdisplayinfo.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testdraw.c b/libs/SDL3/test/testdraw.c index fd79bc60..9f07f3a2 100644 --- a/libs/SDL3/test/testdraw.c +++ b/libs/SDL3/test/testdraw.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testdrawchessboard.c b/libs/SDL3/test/testdrawchessboard.c index 06429a26..6c58482a 100644 --- a/libs/SDL3/test/testdrawchessboard.c +++ b/libs/SDL3/test/testdrawchessboard.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testdropfile.c b/libs/SDL3/test/testdropfile.c index c7d8dcd0..de5b5736 100644 --- a/libs/SDL3/test/testdropfile.c +++ b/libs/SDL3/test/testdropfile.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testerror.c b/libs/SDL3/test/testerror.c index 8ac93ecb..07056ecb 100644 --- a/libs/SDL3/test/testerror.c +++ b/libs/SDL3/test/testerror.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testevdev.c b/libs/SDL3/test/testevdev.c index e2442e39..cdb16a9b 100644 --- a/libs/SDL3/test/testevdev.c +++ b/libs/SDL3/test/testevdev.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga Copyright (C) 2020-2022 Collabora Ltd. This software is provided 'as-is', without any express or implied @@ -21,7 +21,7 @@ #endif #define SDL_DYNAMIC_API 0 -#ifndef NO_BUILD_CONFIG +#ifdef HAVE_BUILD_CONFIG #include "../src/SDL_internal.h" #endif diff --git a/libs/SDL3/test/testffmpeg.c b/libs/SDL3/test/testffmpeg.c index 9411bb9d..5c072fcd 100644 --- a/libs/SDL3/test/testffmpeg.c +++ b/libs/SDL3/test/testffmpeg.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testffmpeg_vulkan.c b/libs/SDL3/test/testffmpeg_vulkan.c index 6a208f27..e0a0ad45 100644 --- a/libs/SDL3/test/testffmpeg_vulkan.c +++ b/libs/SDL3/test/testffmpeg_vulkan.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testffmpeg_vulkan.h b/libs/SDL3/test/testffmpeg_vulkan.h index 593eae5e..b0c6e13f 100644 --- a/libs/SDL3/test/testffmpeg_vulkan.h +++ b/libs/SDL3/test/testffmpeg_vulkan.h @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testfile.c b/libs/SDL3/test/testfile.c index e40f286c..352b57fb 100644 --- a/libs/SDL3/test/testfile.c +++ b/libs/SDL3/test/testfile.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testfilesystem.c b/libs/SDL3/test/testfilesystem.c index 76087998..bdd0bac5 100644 --- a/libs/SDL3/test/testfilesystem.c +++ b/libs/SDL3/test/testfilesystem.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -20,14 +20,7 @@ static SDL_EnumerationResult SDLCALL enum_callback(void *userdata, const char *o SDL_PathInfo info; char *fullpath = NULL; - /* you can use '/' for a path separator on Windows, but to make the log output look correct, we'll #ifdef this... */ - #ifdef SDL_PLATFORM_WINDOWS - const char *pathsep = "\\"; - #else - const char *pathsep = "/"; - #endif - - if (SDL_asprintf(&fullpath, "%s%s%s", origdir, *origdir ? pathsep : "", fname) < 0) { + if (SDL_asprintf(&fullpath, "%s%s", origdir, fname) < 0) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Out of memory!"); return SDL_ENUM_FAILURE; } @@ -43,7 +36,7 @@ static SDL_EnumerationResult SDLCALL enum_callback(void *userdata, const char *o } else { type = "OTHER"; } - SDL_Log("%s (type=%s, size=%" SDL_PRIu64 ", create=%" SDL_PRIu64 ", mod=%" SDL_PRIu64 ", access=%" SDL_PRIu64 ")", + SDL_Log("DIRECTORY %s (type=%s, size=%" SDL_PRIu64 ", create=%" SDL_PRIu64 ", mod=%" SDL_PRIu64 ", access=%" SDL_PRIu64 ")", fullpath, type, info.size, info.modify_time, info.create_time, info.access_time); if (info.type == SDL_PATHTYPE_DIRECTORY) { @@ -58,6 +51,42 @@ static SDL_EnumerationResult SDLCALL enum_callback(void *userdata, const char *o } +static SDL_EnumerationResult SDLCALL enum_storage_callback(void *userdata, const char *origdir, const char *fname) +{ + SDL_Storage *storage = (SDL_Storage *) userdata; + SDL_PathInfo info; + char *fullpath = NULL; + + if (SDL_asprintf(&fullpath, "%s%s", origdir, fname) < 0) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Out of memory!"); + return SDL_ENUM_FAILURE; + } + + if (!SDL_GetStoragePathInfo(storage, fullpath, &info)) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't stat '%s': %s", fullpath, SDL_GetError()); + } else { + const char *type; + if (info.type == SDL_PATHTYPE_FILE) { + type = "FILE"; + } else if (info.type == SDL_PATHTYPE_DIRECTORY) { + type = "DIRECTORY"; + } else { + type = "OTHER"; + } + SDL_Log("STORAGE %s (type=%s, size=%" SDL_PRIu64 ", create=%" SDL_PRIu64 ", mod=%" SDL_PRIu64 ", access=%" SDL_PRIu64 ")", + fullpath, type, info.size, info.modify_time, info.create_time, info.access_time); + + if (info.type == SDL_PATHTYPE_DIRECTORY) { + if (!SDL_EnumerateStorageDirectory(storage, fullpath, enum_storage_callback, userdata)) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Enumeration failed!"); + } + } + } + + SDL_free(fullpath); + return SDL_ENUM_CONTINUE; /* keep going */ +} + int main(int argc, char *argv[]) { SDLTest_CommonState *state; @@ -118,8 +147,10 @@ int main(int argc, char *argv[]) if (base_path) { char **globlist; + SDL_Storage *storage = NULL; SDL_IOStream *stream; const char *text = "foo\n"; + SDL_PathInfo pathinfo; if (!SDL_EnumerateDirectory(base_path, enum_callback, NULL)) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Base path enumeration failed!"); @@ -131,7 +162,7 @@ int main(int argc, char *argv[]) } else { int i; for (i = 0; globlist[i]; i++) { - SDL_Log("GLOB[%d]: '%s'", i, globlist[i]); + SDL_Log("DIRECTORY GLOB[%d]: '%s'", i, globlist[i]); } SDL_free(globlist); } @@ -198,6 +229,84 @@ int main(int argc, char *argv[]) } else { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_IOFromFile('testfilesystem-A', 'w') failed: %s", SDL_GetError()); } + + storage = SDL_OpenFileStorage(base_path); + if (!storage) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to open base path storage object: %s", SDL_GetError()); + } else { + if (!SDL_EnumerateStorageDirectory(storage, "CMakeFiles", enum_storage_callback, storage)) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Storage Base path enumeration failed!"); + } + + globlist = SDL_GlobStorageDirectory(storage, "", "C*/test*/T?st*", SDL_GLOB_CASEINSENSITIVE, NULL); + if (!globlist) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Base path globbing failed!"); + } else { + int i; + for (i = 0; globlist[i]; i++) { + SDL_Log("STORAGE GLOB[%d]: '%s'", i, globlist[i]); + } + SDL_free(globlist); + } + + /* these should fail: */ + if (!SDL_GetStoragePathInfo(storage, "CMakeFiles/../testsprite.c", &pathinfo)) { + SDL_Log("Storage access on path with internal '..' refused correctly."); + } else { + SDL_Log("Storage access on path with internal '..' accepted INCORRECTLY."); + } + + if (!SDL_GetStoragePathInfo(storage, "CMakeFiles/./TargetDirectories.txt", &pathinfo)) { + SDL_Log("Storage access on path with internal '.' refused correctly."); + } else { + SDL_Log("Storage access on path with internal '.' accepted INCORRECTLY."); + } + + if (!SDL_GetStoragePathInfo(storage, "../test", &pathinfo)) { + SDL_Log("Storage access on path with leading '..' refused correctly."); + } else { + SDL_Log("Storage access on path with leading '..' accepted INCORRECTLY."); + } + + if (!SDL_GetStoragePathInfo(storage, "./CMakeFiles", &pathinfo)) { + SDL_Log("Storage access on path with leading '.' refused correctly."); + } else { + SDL_Log("Storage access on path with leading '.' accepted INCORRECTLY."); + } + + if (!SDL_GetStoragePathInfo(storage, "CMakeFiles/..", &pathinfo)) { + SDL_Log("Storage access on path with trailing '..' refused correctly."); + } else { + SDL_Log("Storage access on path with trailing '..' accepted INCORRECTLY."); + } + + if (!SDL_GetStoragePathInfo(storage, "CMakeFiles/.", &pathinfo)) { + SDL_Log("Storage access on path with trailing '.' refused correctly."); + } else { + SDL_Log("Storage access on path with trailing '.' accepted INCORRECTLY."); + } + + if (!SDL_GetStoragePathInfo(storage, "..", &pathinfo)) { + SDL_Log("Storage access on path '..' refused correctly."); + } else { + SDL_Log("Storage access on path '..' accepted INCORRECTLY."); + } + + if (!SDL_GetStoragePathInfo(storage, ".", &pathinfo)) { + SDL_Log("Storage access on path '.' refused correctly."); + } else { + SDL_Log("Storage access on path '.' accepted INCORRECTLY."); + } + + if (!SDL_GetStoragePathInfo(storage, "CMakeFiles\\TargetDirectories.txt", &pathinfo)) { + SDL_Log("Storage access on path with Windows separator refused correctly."); + } else { + SDL_Log("Storage access on path with Windows separator accepted INCORRECTLY."); + } + + SDL_CloseStorage(storage); + } + } SDL_Quit(); diff --git a/libs/SDL3/test/testgeometry.c b/libs/SDL3/test/testgeometry.c index dde8e8cf..cd00b5b0 100644 --- a/libs/SDL3/test/testgeometry.c +++ b/libs/SDL3/test/testgeometry.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testgl.c b/libs/SDL3/test/testgl.c index 44e1ca42..f109def3 100644 --- a/libs/SDL3/test/testgl.c +++ b/libs/SDL3/test/testgl.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -263,6 +263,9 @@ int main(int argc, char *argv[]) state->gl_green_size = 5; state->gl_blue_size = 5; state->gl_depth_size = 16; + /* For release_behavior to work, at least on Windows, you'll most likely need to set state->gl_major_version = 3 */ + /* state->gl_major_version = 3; */ + state->gl_release_behavior = 0; state->gl_double_buffer = 1; if (fsaa) { state->gl_multisamplebuffers = 1; @@ -331,6 +334,11 @@ int main(int argc, char *argv[]) } else { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_DEPTH_SIZE: %s\n", SDL_GetError()); } + if (SDL_GL_GetAttribute(SDL_GL_CONTEXT_RELEASE_BEHAVIOR, &value)) { + SDL_Log("SDL_GL_CONTEXT_RELEASE_BEHAVIOR: requested %d, got %d\n", 0, value); + } else { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get SDL_GL_CONTEXT_RELEASE_BEHAVIOR: %s\n", SDL_GetError()); + } if (fsaa) { if (SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &value)) { SDL_Log("SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n", value); diff --git a/libs/SDL3/test/testgles.c b/libs/SDL3/test/testgles.c index 14d4f2e1..09f426f6 100644 --- a/libs/SDL3/test/testgles.c +++ b/libs/SDL3/test/testgles.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testgles2.c b/libs/SDL3/test/testgles2.c index 9c7ecf6a..6183c2f7 100644 --- a/libs/SDL3/test/testgles2.c +++ b/libs/SDL3/test/testgles2.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testgles2_sdf.c b/libs/SDL3/test/testgles2_sdf.c index d406d041..37890684 100644 --- a/libs/SDL3/test/testgles2_sdf.c +++ b/libs/SDL3/test/testgles2_sdf.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testgpu_simple_clear.c b/libs/SDL3/test/testgpu_simple_clear.c index b2afba88..5c48607e 100644 --- a/libs/SDL3/test/testgpu_simple_clear.c +++ b/libs/SDL3/test/testgpu_simple_clear.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testgpu_spinning_cube.c b/libs/SDL3/test/testgpu_spinning_cube.c index 97a229b8..ff9ece81 100644 --- a/libs/SDL3/test/testgpu_spinning_cube.c +++ b/libs/SDL3/test/testgpu_spinning_cube.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -538,23 +538,25 @@ init_render_state(int msaa) buffer_desc.usage = SDL_GPU_BUFFERUSAGE_VERTEX; buffer_desc.size = sizeof(vertex_data); - buffer_desc.props = 0; + buffer_desc.props = SDL_CreateProperties(); + SDL_SetStringProperty(buffer_desc.props, SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING, "космонавт"); render_state.buf_vertex = SDL_CreateGPUBuffer( gpu_device, &buffer_desc ); CHECK_CREATE(render_state.buf_vertex, "Static vertex buffer") - - SDL_SetGPUBufferName(gpu_device, render_state.buf_vertex, "космонавт"); + SDL_DestroyProperties(buffer_desc.props); transfer_buffer_desc.usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD; transfer_buffer_desc.size = sizeof(vertex_data); - transfer_buffer_desc.props = 0; + transfer_buffer_desc.props = SDL_CreateProperties(); + SDL_SetStringProperty(transfer_buffer_desc.props, SDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING, "Transfer Buffer"); buf_transfer = SDL_CreateGPUTransferBuffer( gpu_device, &transfer_buffer_desc ); CHECK_CREATE(buf_transfer, "Vertex transfer buffer") + SDL_DestroyProperties(transfer_buffer_desc.props); /* We just need to upload the static data once. */ map = SDL_MapGPUTransferBuffer(gpu_device, buf_transfer, false); diff --git a/libs/SDL3/test/testhittesting.c b/libs/SDL3/test/testhittesting.c index 05d8362e..24ff250d 100644 --- a/libs/SDL3/test/testhittesting.c +++ b/libs/SDL3/test/testhittesting.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testhotplug.c b/libs/SDL3/test/testhotplug.c index fb94b961..6a7df424 100644 --- a/libs/SDL3/test/testhotplug.c +++ b/libs/SDL3/test/testhotplug.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testiconv.c b/libs/SDL3/test/testiconv.c index b11c8fca..e339e5fa 100644 --- a/libs/SDL3/test/testiconv.c +++ b/libs/SDL3/test/testiconv.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testime.c b/libs/SDL3/test/testime.c index 54c722d3..bcc1f3cd 100644 --- a/libs/SDL3/test/testime.c +++ b/libs/SDL3/test/testime.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testintersections.c b/libs/SDL3/test/testintersections.c index 5e04c6fb..d3e42182 100644 --- a/libs/SDL3/test/testintersections.c +++ b/libs/SDL3/test/testintersections.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testkeys.c b/libs/SDL3/test/testkeys.c index c098eca5..166b4a19 100644 --- a/libs/SDL3/test/testkeys.c +++ b/libs/SDL3/test/testkeys.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testloadso.c b/libs/SDL3/test/testloadso.c index f1b19708..0a8d1659 100644 --- a/libs/SDL3/test/testloadso.c +++ b/libs/SDL3/test/testloadso.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testlocale.c b/libs/SDL3/test/testlocale.c index 65549ad7..14083ad1 100644 --- a/libs/SDL3/test/testlocale.c +++ b/libs/SDL3/test/testlocale.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testlock.c b/libs/SDL3/test/testlock.c index 17a27e22..60aab55d 100644 --- a/libs/SDL3/test/testlock.c +++ b/libs/SDL3/test/testlock.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testmanymouse.c b/libs/SDL3/test/testmanymouse.c index 4ef6ccb8..d4a7efa7 100644 --- a/libs/SDL3/test/testmanymouse.c +++ b/libs/SDL3/test/testmanymouse.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testmessage.c b/libs/SDL3/test/testmessage.c index c17f229a..30c70054 100644 --- a/libs/SDL3/test/testmessage.c +++ b/libs/SDL3/test/testmessage.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -11,13 +11,17 @@ */ /* Simple test of the SDL MessageBox API */ - #include #include #include #include +/* This enables themed Windows dialogs when building with Visual Studio */ +#if defined(SDL_PLATFORM_WINDOWS) && defined(_MSC_VER) +#pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") +#endif + /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ static void quit(int rc) diff --git a/libs/SDL3/test/testmodal.c b/libs/SDL3/test/testmodal.c index 1d4650cf..156d61e2 100644 --- a/libs/SDL3/test/testmodal.c +++ b/libs/SDL3/test/testmodal.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testmouse.c b/libs/SDL3/test/testmouse.c index d995df8f..7d475864 100644 --- a/libs/SDL3/test/testmouse.c +++ b/libs/SDL3/test/testmouse.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testmultiaudio.c b/libs/SDL3/test/testmultiaudio.c index 9c898a43..1e8f020b 100644 --- a/libs/SDL3/test/testmultiaudio.c +++ b/libs/SDL3/test/testmultiaudio.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testnative.c b/libs/SDL3/test/testnative.c index 1a623841..cf91250a 100644 --- a/libs/SDL3/test/testnative.c +++ b/libs/SDL3/test/testnative.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testnative.h b/libs/SDL3/test/testnative.h index e40ab13d..85666d79 100644 --- a/libs/SDL3/test/testnative.h +++ b/libs/SDL3/test/testnative.h @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testnativew32.c b/libs/SDL3/test/testnativew32.c index ea5ee08f..815c9327 100644 --- a/libs/SDL3/test/testnativew32.c +++ b/libs/SDL3/test/testnativew32.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testnativewayland.c b/libs/SDL3/test/testnativewayland.c index 6f5c00cc..30db9713 100644 --- a/libs/SDL3/test/testnativewayland.c +++ b/libs/SDL3/test/testnativewayland.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testnativex11.c b/libs/SDL3/test/testnativex11.c index e10a6fbd..5934e4e9 100644 --- a/libs/SDL3/test/testnativex11.c +++ b/libs/SDL3/test/testnativex11.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testoffscreen.c b/libs/SDL3/test/testoffscreen.c index 69ba6238..249c87b9 100644 --- a/libs/SDL3/test/testoffscreen.c +++ b/libs/SDL3/test/testoffscreen.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testoverlay.c b/libs/SDL3/test/testoverlay.c index f4bf7f75..7e9f97c5 100644 --- a/libs/SDL3/test/testoverlay.c +++ b/libs/SDL3/test/testoverlay.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testpen.c b/libs/SDL3/test/testpen.c index ef58c0fc..bb6e7d2c 100644 --- a/libs/SDL3/test/testpen.c +++ b/libs/SDL3/test/testpen.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testplatform.c b/libs/SDL3/test/testplatform.c index 7d780a3e..e48dc08c 100644 --- a/libs/SDL3/test/testplatform.c +++ b/libs/SDL3/test/testplatform.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -180,8 +180,8 @@ static int TestEndian(bool verbose) static int TST_allmul(void *a, void *b, int arg, void *result, void *expected) { - (*(long long *)result) = ((*(long long *)a) * (*(long long *)b)); - return (*(long long *)result) == (*(long long *)expected); + (*(unsigned long long *)result) = ((*(unsigned long long *)a) * (*(unsigned long long *)b)); + return (*(unsigned long long *)result) == (*(unsigned long long *)expected); } static int TST_alldiv(void *a, void *b, int arg, void *result, void *expected) diff --git a/libs/SDL3/test/testpopup.c b/libs/SDL3/test/testpopup.c index c2964e63..786f03c2 100644 --- a/libs/SDL3/test/testpopup.c +++ b/libs/SDL3/test/testpopup.c @@ -1,5 +1,5 @@ /* -Copyright (C) 1997-2024 Sam Lantinga +Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testpower.c b/libs/SDL3/test/testpower.c index 88e32218..3bd056d8 100644 --- a/libs/SDL3/test/testpower.c +++ b/libs/SDL3/test/testpower.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testqsort.c b/libs/SDL3/test/testqsort.c index bf20c4ab..38d14701 100644 --- a/libs/SDL3/test/testqsort.c +++ b/libs/SDL3/test/testqsort.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testrelative.c b/libs/SDL3/test/testrelative.c index 545303dc..b2306063 100644 --- a/libs/SDL3/test/testrelative.c +++ b/libs/SDL3/test/testrelative.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testrendercopyex.c b/libs/SDL3/test/testrendercopyex.c index 22f5cc7c..0b3b3073 100644 --- a/libs/SDL3/test/testrendercopyex.c +++ b/libs/SDL3/test/testrendercopyex.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testrendertarget.c b/libs/SDL3/test/testrendertarget.c index 739cb7f4..4e33210a 100644 --- a/libs/SDL3/test/testrendertarget.c +++ b/libs/SDL3/test/testrendertarget.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testresample.c b/libs/SDL3/test/testresample.c index 122b12dd..0ca95c49 100644 --- a/libs/SDL3/test/testresample.c +++ b/libs/SDL3/test/testresample.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testrumble.c b/libs/SDL3/test/testrumble.c index 38acafd9..0dc06cd9 100644 --- a/libs/SDL3/test/testrumble.c +++ b/libs/SDL3/test/testrumble.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testrwlock.c b/libs/SDL3/test/testrwlock.c index d416a15c..d39b74fb 100644 --- a/libs/SDL3/test/testrwlock.c +++ b/libs/SDL3/test/testrwlock.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testscale.c b/libs/SDL3/test/testscale.c index 6f53d3bb..4082a455 100644 --- a/libs/SDL3/test/testscale.c +++ b/libs/SDL3/test/testscale.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testsem.c b/libs/SDL3/test/testsem.c index 232a2fdd..a8390c4e 100644 --- a/libs/SDL3/test/testsem.c +++ b/libs/SDL3/test/testsem.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testsensor.c b/libs/SDL3/test/testsensor.c index dac09762..2574b4e7 100644 --- a/libs/SDL3/test/testsensor.c +++ b/libs/SDL3/test/testsensor.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testshader.c b/libs/SDL3/test/testshader.c index 1b6c66e2..ca9b0c37 100644 --- a/libs/SDL3/test/testshader.c +++ b/libs/SDL3/test/testshader.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testshape.c b/libs/SDL3/test/testshape.c index c4f0988b..dd85b36c 100644 --- a/libs/SDL3/test/testshape.c +++ b/libs/SDL3/test/testshape.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testsprite.c b/libs/SDL3/test/testsprite.c index fa04bfcf..e8d8a7dc 100644 --- a/libs/SDL3/test/testsprite.c +++ b/libs/SDL3/test/testsprite.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testspriteminimal.c b/libs/SDL3/test/testspriteminimal.c index 2ec938f5..19bb200d 100644 --- a/libs/SDL3/test/testspriteminimal.c +++ b/libs/SDL3/test/testspriteminimal.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testspritesurface.c b/libs/SDL3/test/testspritesurface.c index ccde675b..80d61a39 100644 --- a/libs/SDL3/test/testspritesurface.c +++ b/libs/SDL3/test/testspritesurface.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/teststreaming.c b/libs/SDL3/test/teststreaming.c index 23b73117..2ed8c462 100644 --- a/libs/SDL3/test/teststreaming.c +++ b/libs/SDL3/test/teststreaming.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testsurround.c b/libs/SDL3/test/testsurround.c index 9c1aaae7..0c66163d 100644 --- a/libs/SDL3/test/testsurround.c +++ b/libs/SDL3/test/testsurround.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testthread.c b/libs/SDL3/test/testthread.c index 67a31b0b..5a4c4781 100644 --- a/libs/SDL3/test/testthread.c +++ b/libs/SDL3/test/testthread.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testtime.c b/libs/SDL3/test/testtime.c index fadc1511..008d8681 100644 --- a/libs/SDL3/test/testtime.c +++ b/libs/SDL3/test/testtime.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testtimer.c b/libs/SDL3/test/testtimer.c index bdf7e908..f099a8f4 100644 --- a/libs/SDL3/test/testtimer.c +++ b/libs/SDL3/test/testtimer.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testtray.c b/libs/SDL3/test/testtray.c index df3a5488..f3cf8ba4 100644 --- a/libs/SDL3/test/testtray.c +++ b/libs/SDL3/test/testtray.c @@ -9,6 +9,18 @@ static void SDLCALL tray_quit(void *ptr, SDL_TrayEntry *entry) SDL_PushEvent(&e); } +static bool trays_destroyed = false; + +static void SDLCALL tray_close(void *ptr, SDL_TrayEntry *entry) +{ + SDL_Tray **trays = (SDL_Tray **) ptr; + + trays_destroyed = true; + + SDL_DestroyTray(trays[0]); + SDL_DestroyTray(trays[1]); +} + static void SDLCALL apply_icon(void *ptr, const char * const *filelist, int filter) { if (!*filelist) { @@ -471,6 +483,7 @@ static void SDLCALL append_submenu_to(void *ptr, SDL_TrayEntry *entry) int main(int argc, char **argv) { + SDL_Tray **trays = NULL; SDLTest_CommonState *state; int i; @@ -500,6 +513,13 @@ int main(int argc, char **argv) return 1; } + SDL_Window *w = SDL_CreateWindow("testtray", 640, 480, 0); + + if (!w) { + SDL_Log("Couldn't create window: %s", SDL_GetError()); + goto quit; + } + /* TODO: Resource paths? */ SDL_Surface *icon = SDL_LoadBMP("../test/sdl-test_round.bmp"); @@ -517,7 +537,7 @@ int main(int argc, char **argv) if (!tray) { SDL_Log("Couldn't create control tray: %s", SDL_GetError()); - goto quit; + goto clean_window; } SDL_Tray *tray2 = SDL_CreateTray(icon2, "SDL Tray example"); @@ -545,7 +565,20 @@ int main(int argc, char **argv) SDL_TrayEntry *entry_quit = SDL_InsertTrayEntryAt(menu, -1, "Quit", SDL_TRAYENTRY_BUTTON); CHECK(entry_quit); + SDL_TrayEntry *entry_close = SDL_InsertTrayEntryAt(menu, -1, "Close", SDL_TRAYENTRY_BUTTON); + CHECK(entry_close); + + /* TODO: Track memory! */ + trays = SDL_malloc(sizeof(SDL_Tray *) * 2); + if (!trays) { + goto clean_all; + } + + trays[0] = tray; + trays[1] = tray2; + SDL_SetTrayEntryCallback(entry_quit, tray_quit, NULL); + SDL_SetTrayEntryCallback(entry_close, tray_close, trays); SDL_InsertTrayEntryAt(menu, -1, NULL, 0); @@ -582,14 +615,27 @@ int main(int argc, char **argv) while (SDL_WaitEvent(&e)) { if (e.type == SDL_EVENT_QUIT) { break; + } else if (e.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED) { + SDL_DestroyWindow(w); + w = NULL; } } clean_all: - SDL_DestroyTray(tray2); + if (!trays_destroyed) { + SDL_DestroyTray(tray2); + } clean_tray1: - SDL_DestroyTray(tray); + if (!trays_destroyed) { + SDL_DestroyTray(tray); + } + SDL_free(trays); + +clean_window: + if (w) { + SDL_DestroyWindow(w); + } quit: SDL_Quit(); diff --git a/libs/SDL3/test/testurl.c b/libs/SDL3/test/testurl.c index 17d63052..3f4b2231 100644 --- a/libs/SDL3/test/testurl.c +++ b/libs/SDL3/test/testurl.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testutils.c b/libs/SDL3/test/testutils.c index ea1c3266..6ca778dc 100644 --- a/libs/SDL3/test/testutils.c +++ b/libs/SDL3/test/testutils.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga Copyright 2022 Collabora Ltd. This software is provided 'as-is', without any express or implied diff --git a/libs/SDL3/test/testutils.h b/libs/SDL3/test/testutils.h index 5a2f7e18..1429d756 100644 --- a/libs/SDL3/test/testutils.h +++ b/libs/SDL3/test/testutils.h @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga Copyright 2022 Collabora Ltd. This software is provided 'as-is', without any express or implied diff --git a/libs/SDL3/test/testver.c b/libs/SDL3/test/testver.c index e259fc5f..bed2a6a6 100644 --- a/libs/SDL3/test/testver.c +++ b/libs/SDL3/test/testver.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testviewport.c b/libs/SDL3/test/testviewport.c index d4480b86..904cc901 100644 --- a/libs/SDL3/test/testviewport.c +++ b/libs/SDL3/test/testviewport.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testvulkan.c b/libs/SDL3/test/testvulkan.c index 3139d5d0..9d9d80a0 100644 --- a/libs/SDL3/test/testvulkan.c +++ b/libs/SDL3/test/testvulkan.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testwaylandcustom.c b/libs/SDL3/test/testwaylandcustom.c index 6c58185f..b77464ae 100644 --- a/libs/SDL3/test/testwaylandcustom.c +++ b/libs/SDL3/test/testwaylandcustom.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testwm.c b/libs/SDL3/test/testwm.c index f6a1f029..0d25c0fd 100644 --- a/libs/SDL3/test/testwm.c +++ b/libs/SDL3/test/testwm.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testyuv.c b/libs/SDL3/test/testyuv.c index 35279af8..0cd28238 100644 --- a/libs/SDL3/test/testyuv.c +++ b/libs/SDL3/test/testyuv.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testyuv_cvt.c b/libs/SDL3/test/testyuv_cvt.c index e6d052f7..ef449329 100644 --- a/libs/SDL3/test/testyuv_cvt.c +++ b/libs/SDL3/test/testyuv_cvt.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/testyuv_cvt.h b/libs/SDL3/test/testyuv_cvt.h index c8a87daa..460026de 100644 --- a/libs/SDL3/test/testyuv_cvt.h +++ b/libs/SDL3/test/testyuv_cvt.h @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/libs/SDL3/test/torturethread.c b/libs/SDL3/test/torturethread.c index b57116c3..cbc254dc 100644 --- a/libs/SDL3/test/torturethread.c +++ b/libs/SDL3/test/torturethread.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1997-2024 Sam Lantinga + Copyright (C) 1997-2025 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages